List contacts in the current organization
GET/contacts
Returns a paginated list. Filters: tag, optInStatus, source, externalId, listId, updatedSince, q, limit, skip.
`externalId=` acha o contato pelo Customer ID do seu sistema (igualdade exata, no máximo um resultado).
`q=` searches name, whatsappProfileName, email and phone (phone matches by DIGITS, so (11) 96459-8816 finds +5511964598816).
Until 2026-09-26 this filter was documented as requiring pii:full and being silently dropped otherwise. It was in fact never implemented in the repository layer — every caller, including pii:full ones, got the unfiltered list back.
PII_SENSITIVE fields (phone) are masked unless the caller has pii:full.
Parâmetros
| Campo | Onde | Tipo | Descrição |
|---|---|---|---|
tagopcional | query | string | |
optInStatusopcional | query | string | Valores:granteddeniedunknown |
sourceopcional | query | string | Valores:manualimportapiwebhook |
externalIdopcional | query | string | Customer ID do seu sistema (DBM/CRM). Único na organização quando presente; aceita UUID, número, hash hex ou composto como loja:45:cliente:123. |
listIdopcional | query | string | Só os contatos desta lista estática (lst_…). |
qopcional | query | string | Free-text prefix search on name/email. Requires `pii:full`; otherwise silently dropped and a warnings entry is emitted. |
updatedSinceopcional | query | string · date-time | ISO-8601 timestamp in UTC. |
limitopcional | query | integer | |
skipopcional | query | integer |
Respostas
200Default ResponseCampos e exemplo da resposta
Campo Tipo Descrição itemsobrigatórioobject[]items[].idobrigatóriostringBranded Contact id ( cnt_prefix + 21 nano-id chars).items[].organizationIdobrigatóriostringBranded Organization id ( org_prefix + 21 nano-id chars).items[].phoneobrigatóriostringE.164 phone (PII_SENSITIVE — masked unless caller has pii:full).items[].phoneHashobrigatóriostringDeterministic blind index sha256(orgId + ':' + e164phone).items[].nameopcionalstringitems[].emailopcionalstring · emailitems[].avatarUrlopcionalstring · uriPublic avatar URL displayed in the chat list and contact card. Accepts http(s) URLs and inline data:URIs (≤64 KB) for click-to-upload avatars stored without external storage.items[].whatsappProfileNameopcionalstringDisplay name reported by WhatsApp on inbound messages ( contacts[0].profile.name). Updated automatically; does not overwrite an operator-setname.items[].cpfCipheropcionalstringPII_CRITICAL — encrypted CPF blob (JSON-serialized EncryptedBlob). Never returned plaintext via routes; decryption requires reason+actoraudit at the service layer.items[].cnpjCipheropcionalstringPII_CRITICAL — encrypted CNPJ. items[].birthDateCipheropcionalstringPII_CRITICAL — encrypted birth date. items[].attributesobrigatórioobjectFree-form key/value attributes: text, number, boolean, null or a list of short texts (no nested objects). items[].documentosopcionalobjectOs documentos que o contato TEM, já mascarados no servidor (o valor completo nunca sai aqui). Só no GET de um único contato ( /contacts/:id). Para ver um por inteiro:POST /v2/contacts/:id/documentos/revelar(só sessão,contacts:pii, auditado).items[].documentos.cpfopcionalstringitems[].documentos.cnpjopcionalstringitems[].documentos.nascimentoopcionalstringitems[].debtorGroupsopcionalobject[]Grupos de cobrança do contato: cada grupo é uma empresa devedora e os telefones daquele contexto. items[].debtorGroups[].idobrigatóriostringitems[].debtorGroups[].companyobrigatóriostringitems[].debtorGroups[].phonesobrigatóriostring[]items[].debtorGroups[].amountCentsopcionalintegerValor em aberto daquela dívida, em centavos de BRL. items[].debtorGroups[].statusopcionalstringSituação da dívida daquele grupo.Valores: vencidaem_atrasoem_diaitems[].debtorGroups[].referenceopcionalstringReferência livre: nº do contrato, dias de atraso, observação. items[].tagsobrigatóriostring[]items[].optInobrigatórioobjectitems[].optIn.statusobrigatóriostringValores: granteddeniedunknownitems[].optIn.sourceopcionalstringitems[].optIn.atopcionalstring · date-timeISO-8601 timestamp in UTC. items[].optIn.ipopcionalstringitems[].optIn.userAgentopcionalstringitems[].optIn.revokedAtopcionalstring · date-timeISO-8601 timestamp in UTC. items[].optIn.revokedReasonopcionalstringitems[].sourceobrigatóriostringValores: manualimportapiwebhookitems[].externalIdopcionalstringCustomer ID do seu sistema (DBM/CRM). Único na organização quando presente; aceita UUID, número, hash hex ou composto como loja:45:cliente:123.items[].externalIdsopcionalobjectOs ids do contato nos sistemas integrados (HubSpot, Pipedrive, RD Station, Zendesk) — a chave que a sincronização com cada um usa. Ausente = o contato não está em nenhuma integração. items[].externalIds.hubspotopcionalstringitems[].externalIds.pipedriveopcionalstringitems[].externalIds.rd_stationopcionalstringitems[].externalIds.zendeskopcionalstringitems[].companyIdopcionalstringEmpresa do CRM ( emp_+ 21 caracteres) —GET /v2/companies.items[].papelNaEmpresaopcionalstringO papel do contato na empresa ( companyId): decisor, financeiro, operacao ou outro.Valores:decisorfinanceirooperacaooutroitems[].lastInteractionAtopcionalstring · date-timeISO-8601 timestamp in UTC. items[].createdAtobrigatóriostring · date-timeISO-8601 timestamp in UTC. items[].updatedAtobrigatóriostring · date-timeISO-8601 timestamp in UTC. totalobrigatóriointegerwarningsopcionalstring[]Set when a filter was silently dropped (e.g. q=withoutpii:full).JSON{ "items": [ { "id": "cnt_aB3xY9zQ1pTkLmNoPqRsT", "organizationId": "org_pGgniw5L7CTDSZDwjDrQ2", "phone": "+5511999998888", "phoneHash": "string", "name": "Alice Andersen", "email": "alice@example.com", "avatarUrl": "https://cdn.example.com/avatars/alice.png", "whatsappProfileName": "string", "cpfCipher": "string", "cnpjCipher": "string", "birthDateCipher": "string", "attributes": {}, "documentos": { "cpf": "•••.456.789-••", "cnpj": "••.•••.678/0001-••", "nascimento": "••/••/1990" }, "debtorGroups": [ { "id": "grp_9f1c2a3b4d5e6f70", "company": "Casas Bahia", "phones": [ "+5511988887777", "1140042000" ], "amountCents": 248000, "status": "vencida", "reference": "Contrato 8842-01 · atraso 47 dias" } ], "tags": [ "string" ], "optIn": { "status": "granted", "source": "landing-page", "at": "2026-04-07T17:30:00.000Z", "ip": "203.0.113.42", "userAgent": "string", "revokedAt": "2026-04-07T17:30:00.000Z", "revokedReason": "string" }, "source": "manual", "externalId": "123", "externalIds": { "hubspot": "9001", "pipedrive": "string", "rd_station": "string", "zendesk": "string" }, "companyId": "emp_aB3xY9zQ1pTkLmNoPqRsT", "papelNaEmpresa": "decisor", "lastInteractionAt": "2026-04-07T17:30:00.000Z", "createdAt": "2026-04-07T17:30:00.000Z", "updatedAt": "2026-04-07T17:30:00.000Z" } ], "total": 42, "warnings": [ "string" ]}
401RFC 7807 problem details for UNAUTHORIZED (401).403RFC 7807 problem details for FORBIDDEN (403).
As respostas de erro seguem o formato RFC 7807 (application/problem+json), com um código estável no campo code. Ver os códigos de erro
Exemplo em curl
curl 'https://api.messages.ccxcompany.co/contacts' \ -H "Authorization: Bearer $CCX_API_KEY"