Pular para o conteúdo

Clientes (customers)

O recurso customers expõe a base de clientes da sua conta: dados de cadastro, contato por e-mail e telefone, endereço e status. É um recurso de leitura e escrita: você lista, busca por id, cria, atualiza e desativa clientes pela API.

Móduloclientes — precisa estar habilitado no contrato
Escoposcustomers:read para ler; customers:write para criar, atualizar e desativar
Operaçõesleitura e escrita
MétodoEndpointEscopoDescrição
GET/v1/customerscustomers:readLista clientes com paginação por cursor
GET/v1/customers/{id}customers:readBusca um cliente pelo id
POST/v1/customerscustomers:writeCria um cliente e responde 201
PATCH/v1/customers/{id}customers:writeAtualização parcial: envie só os campos que mudam
DELETE/v1/customers/{id}customers:writeDesativa o cliente (is_active=false) e responde 204
CampoTipoEscritaDescrição
iduuidIdentificador único do cliente
full_namestringcriar, atualizarNome completo, de 1 a 255 caracteres. Obrigatório na criação
emailstring | nullcriar, atualizarE-mail válido. A criação exige e-mail ou telefone
phonestring | nullcriar, atualizarTelefone, até 40 caracteres. A criação exige e-mail ou telefone
documentstring | nullcriar, atualizarCPF, CNPJ ou outro documento
birth_datestring | nullcriar, atualizarData de nascimento no formato YYYY-MM-DD
genderstring | nullcriar, atualizarGênero, em texto livre
notesstring | nullcriar, atualizarObservações internas
is_activeboolean | nullatualizarStatus do cliente. true na criação; false depois de DELETE
accepts_communicationsboolean | nullcriar, atualizarSe o cliente aceita receber comunicações
address_countrystring | nullcriar, atualizarPaís
address_statestring | nullcriar, atualizarEstado (UF)
address_citystring | nullcriar, atualizarCidade
address_neighborhoodstring | nullcriar, atualizarBairro
address_streetstring | nullcriar, atualizarLogradouro
address_numberstring | nullcriar, atualizarNúmero
address_complementstring | nullcriar, atualizarComplemento
address_zip_codestring | nullcriar, atualizarCEP
valid_whatsappboolean | nullSe o telefone foi validado como WhatsApp, mantido pelo aplicativo
profile_photo_urlstring | nullURL da foto de perfil, mantida pelo aplicativo
whatsapp_photostring | nullFoto do WhatsApp, mantida pelo aplicativo
created_atstring (ISO 8601)Data de criação
updated_atstring (ISO 8601) | nullData da última atualização

Campos com na coluna Escrita são somente leitura pela API.

O formato do filtro é ?filter[<campo>][<operador>]=<valor>. Os operadores disponíveis são eq, neq, gt, gte, lt, lte, in, nin, ilike e is_null.

CampoUso típicoExemplo
full_namebusca por nome, com ilike e %filter[full_name][ilike]=%maria%
emailbusca por e-mailfilter[email][eq]=maria@exemplo.com
phonebusca por telefonefilter[phone][eq]=%2B5541999998888
documentbusca por CPF ou CNPJfilter[document][eq]=12345678900
is_activesomente ativosfilter[is_active][eq]=true
genderpor gênerofilter[gender][eq]=feminino
address_citypor cidadefilter[address_city][ilike]=%curitiba%
address_statepor UFfilter[address_state][eq]=PR
accepts_communicationsaptos a receber campanhasfilter[accepts_communications][eq]=true
created_atcriados a partir de uma datafilter[created_at][gte]=2026-06-01
updated_atalterados recentemente, para sincronização incrementalfilter[updated_at][gte]=2026-07-01T00:00:00Z
  • Ordenação: sort=created_at, sort=updated_at ou sort=full_name. O padrão é -created_at, dos mais recentes para os mais antigos.
  • Paginação por cursor: ?limit=50&cursor=<next_cursor>. O limit vai de 1 a 100 e o padrão é 20.
  • Campos parciais: ?fields=id,full_name,email,phone.
  • customers não aceita include: este recurso não tem relações incluídas.

Os detalhes de cada parâmetro estão em Paginação, filtros e ordenação.

Terminal window
curl "$LIGGA_BASE/v1/customers?limit=2\
&filter[is_active][eq]=true\
&filter[address_state][eq]=PR\
&sort=-created_at" \
-H "Authorization: Bearer $LIGGA_API_KEY"
{
"data": [
{
"id": "c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"full_name": "Maria Oliveira Santos",
"email": "maria.oliveira@exemplo.com",
"phone": "+5541999998888",
"document": "123.456.789-00",
"birth_date": "1992-03-15",
"notes": "Prefere atendimento à tarde",
"is_active": true,
"gender": "feminino",
"address_country": "Brasil",
"address_state": "PR",
"address_city": "Curitiba",
"address_neighborhood": "Batel",
"address_street": "Av. do Batel",
"address_number": "1230",
"address_complement": "Ap 502",
"address_zip_code": "80420-090",
"accepts_communications": true,
"valid_whatsapp": true,
"profile_photo_url": null,
"whatsapp_photo": null,
"created_at": "2026-06-20T14:22:31Z",
"updated_at": "2026-07-01T09:05:12Z"
},
{
"id": "9f8e7d6c-5b4a-4392-8170-6e5d4c3b2a19",
"full_name": "João Pedro Almeida",
"email": null,
"phone": "+5541988887777",
"document": null,
"birth_date": null,
"notes": null,
"is_active": true,
"gender": null,
"address_country": "Brasil",
"address_state": "PR",
"address_city": "Curitiba",
"address_neighborhood": null,
"address_street": null,
"address_number": null,
"address_complement": null,
"address_zip_code": null,
"accepts_communications": false,
"valid_whatsapp": null,
"profile_photo_url": null,
"whatsapp_photo": null,
"created_at": "2026-06-18T10:00:00Z",
"updated_at": null
}
],
"pagination": {
"next_cursor": "eyJpZCI6IjlmOGU3ZDZjLi4uIiwidiI6IjIwMjYtMDYtMThUMTA6MDA6MDBaIn0",
"has_more": true,
"limit": 2
},
"meta": { "request_id": "req_01JXXXYYYZZZ" }
}

O cursor da próxima página está em pagination.next_cursor. Enquanto pagination.has_more for true, repita a chamada com cursor igual a esse valor.

Terminal window
curl "$LIGGA_BASE/v1/customers/c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d" \
-H "Authorization: Bearer $LIGGA_API_KEY"
{
"data": {
"id": "c1a2b3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"full_name": "Maria Oliveira Santos",
"email": "maria.oliveira@exemplo.com",
"phone": "+5541999998888",
"document": "123.456.789-00",
"birth_date": "1992-03-15",
"notes": "Prefere atendimento à tarde",
"is_active": true,
"gender": "feminino",
"address_country": "Brasil",
"address_state": "PR",
"address_city": "Curitiba",
"address_neighborhood": "Batel",
"address_street": "Av. do Batel",
"address_number": "1230",
"address_complement": "Ap 502",
"address_zip_code": "80420-090",
"accepts_communications": true,
"valid_whatsapp": true,
"profile_photo_url": null,
"whatsapp_photo": null,
"created_at": "2026-06-20T14:22:31Z",
"updated_at": "2026-07-01T09:05:12Z"
},
"meta": { "request_id": "req_01JXXXYYYZZZ" }
}

Um id que não existe, ou que pertence a outra conta, responde 404 not_found.

As regras de validação são: full_name obrigatório, pelo menos um entre email e phone, e birth_date no formato YYYY-MM-DD.

Terminal window
curl -X POST "$LIGGA_BASE/v1/customers" \
-H "Authorization: Bearer $LIGGA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"full_name": "Ana Beatriz Costa",
"email": "ana.costa@exemplo.com",
"phone": "+5541977776666",
"document": "987.654.321-00",
"birth_date": "1988-11-02",
"accepts_communications": true,
"address_state": "PR",
"address_city": "Curitiba",
"address_zip_code": "80010-000"
}'

Resposta 201 Created:

{
"data": {
"id": "7b6a5948-3c2d-4e1f-a0b9-c8d7e6f5a4b3",
"full_name": "Ana Beatriz Costa",
"email": "ana.costa@exemplo.com",
"phone": "+5541977776666",
"document": "987.654.321-00",
"birth_date": "1988-11-02",
"notes": null,
"is_active": true,
"gender": null,
"address_country": null,
"address_state": "PR",
"address_city": "Curitiba",
"address_neighborhood": null,
"address_street": null,
"address_number": null,
"address_complement": null,
"address_zip_code": "80010-000",
"accepts_communications": true,
"valid_whatsapp": null,
"profile_photo_url": null,
"whatsapp_photo": null,
"created_at": "2026-07-10T16:40:00Z",
"updated_at": null
},
"meta": { "request_id": "req_01JAAABBBCCC" }
}

O PATCH é parcial: só os campos enviados mudam.

Terminal window
curl -X PATCH "$LIGGA_BASE/v1/customers/7b6a5948-3c2d-4e1f-a0b9-c8d7e6f5a4b3" \
-H "Authorization: Bearer $LIGGA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"notes": "Cliente VIP", "accepts_communications": false}'

A resposta é o cliente completo, no mesmo envelope da busca por id. Para reativar um cliente desativado, envie {"is_active": true}.

Terminal window
curl -X DELETE "$LIGGA_BASE/v1/customers/7b6a5948-3c2d-4e1f-a0b9-c8d7e6f5a4b3" \
-H "Authorization: Bearer $LIGGA_API_KEY"

A resposta é 204 No Content, sem corpo.

As respostas de erro usam application/problem+json, com type, title, status e request_id. Os detalhes estão em Erros.

HTTPtypeQuando acontece
401invalid_tokenCabeçalho Authorization ausente ou chave inexistente
401token_revokedA chave foi revogada
401token_expiredA chave passou da data de expiração
403insufficient_scopeA chave não tem customers:read ou customers:write
403module_not_enabledMódulo clientes não habilitado no contrato
404not_foundid inexistente ou de outra conta em GET, PATCH e DELETE
409idempotency_conflictMesma Idempotency-Key reenviada com outro corpo da requisição
422validationCorpo ou filtro inválido, por exemplo full_name vazio, birth_date fora de YYYY-MM-DD, criação sem email e sem phone, ou operador não permitido
429rate-limit-exceededLimite de requisições do plano excedido