Clientes
Crie, liste, recupere e atualize clientes de Merchants no Tokeflow — os registros canônicos de compradores que ancoram transações, pedidos e assinaturas.
Um Cliente é o registro canônico do comprador para um único Merchant. Ele armazena a identidade do comprador (e-mail, nome, telefone, documento fiscal) e um endereço de cobrança, e ancora as transações, os pedidos e as assinaturas do comprador em um único registro.
Os clientes são únicos por e-mail por Merchant. A criação de um cliente é idempotente por e-mail: se já existir um cliente com o mesmo e-mail para o Merchant, o Tokeflow retorna o registro existente em vez de criar um duplicado. Isso torna a criação de clientes segura para repetir a partir de fluxos de checkout e de servidor para servidor.
O Tokeflow é uma plataforma de orquestração de pagamentos — ele padroniza os registros de compradores em todos os provedores conectados, para que você mantenha uma única identidade de cliente, independentemente de qual provedor efetivamente processa uma cobrança. O Tokeflow não processa nem liquida fundos; isso é feito pelos seus provedores conectados.
O objeto cliente
| Field | Type | Description |
|---|---|---|
id | string | Identificador único, prefixado com cust_. |
merchant_id | string | Merchant proprietário deste cliente, prefixado com mrc_. |
email | string | null | E-mail do comprador. Armazenado em minúsculas; único por Merchant. |
name | string | null | Nome completo do comprador. |
phone | string | null | Telefone do comprador no formato E.164 (ex.: +5511999990000). |
document_type | string | null | Um dos valores cpf, cnpj, passport, tax_id. |
metadata | object | null | Pares chave/valor arbitrários que você anexa. Máximo de 5 KB serializado. |
created_at | string | Carimbo de data/hora de criação (ISO 8601 UTC). |
updated_at | string | Carimbo de data/hora da última atualização (ISO 8601 UTC). |
O número do documento fiscal (document_number) e o billing_address são aceitos na escrita para fins de conformidade e processamento, mas nunca são retornados nas respostas da API. O objeto cliente expõe apenas o document_type.
Autenticação e escopos
Todos os endpoints de clientes exigem uma chave secreta de Merchant (sk_live_mer_…). O Merchant é inferido a partir da chave, então você nunca precisa passar um merchant_id. Use o escopo customers:read para operações de leitura e customers:write para criação/atualização.
Authorization: Bearer sk_live_mer_xxxxxxxxxxxxxxxxxxxxxxxxAs chaves secretas são apenas para uso no lado do servidor. Nunca incorpore uma chave sk_* em código de navegador ou mobile. Consulte Autenticação para entender a anatomia das chaves e os escopos.
POST/api/v1/customers
Auth: Merchant key (scope customers:write)
Cria um cliente para o Merchant resolvido a partir da chave de API. Idempotente por e-mail: se já existir um cliente com o mesmo e-mail, o registro existente é retornado com HTTP 200; um novo cliente retorna HTTP 201.
Parâmetros do corpo
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Sim | E-mail do comprador. Normalizado para minúsculas; único por Merchant. |
name | string | Sim | Nome completo do comprador. |
phone | string | Sim | Telefone em formato E.164, com pelo menos 10 dígitos incl. código de país/área (ex.: +5511999990000). |
document_type | string | Sim | Um dos valores cpf, cnpj, passport, tax_id. |
document_number | string | Sim | Documento fiscal (máx. 40 caracteres). Armazenado criptografado em repouso; nunca retornado. |
billing_address | object | Sim | Endereço de cobrança (veja abaixo). |
metadata | object | Não | Pares chave/valor arbitrários. Máximo de 5 KB serializado. |
Objeto billing_address
| Field | Type | Required | Description |
|---|---|---|---|
line_1 | string | Sim | Rua e número (máx. 255). |
line_2 | string | Não | Apartamento, sala, etc. (máx. 255). |
zip_code | string | Sim | CEP/código postal (máx. 20). |
city | string | Sim | Cidade (máx. 100). |
state | string | Sim | Código de estado/província (máx. 100). |
country | string | Sim | Código de país ISO 3166-1 alpha-2, ex.: BR (máx. 2). |
Envie um cabeçalho Idempotency-Key na criação. Combinado com a idempotência por e-mail, isso garante que novas tentativas nunca produzam clientes duplicados e sempre retornem o resultado original.
Requisição
curl -X POST https://api.tokeflow.com/api/v1/customers \
-H "Authorization: Bearer sk_live_mer_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 4f1d8c2a-9b07-4f3e-9a1c-7e2b6d0c5a11" \
-d '{
"email": "joao@example.com",
"name": "Joao da Silva",
"phone": "+5511999990000",
"document_type": "cpf",
"document_number": "123.456.789-00",
"billing_address": {
"line_1": "Av Paulista, 1000",
"line_2": "Apto 42",
"zip_code": "01310-100",
"city": "São Paulo",
"state": "SP",
"country": "BR"
},
"metadata": { "source": "checkout_web" }
}'Resposta 201 Created
{
"success": true,
"data": {
"id": "cust_a1b2c3d4e5",
"merchant_id": "mrc_9f8e7d6c5b",
"email": "joao@example.com",
"name": "Joao da Silva",
"created_at": "2026-01-15T12:30:00.000Z"
},
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T12:30:00.000Z"
}A resposta de criação é um payload de confirmação contendo id, merchant_id, email, name e created_at. Para ler o objeto cliente completo, chame GET /api/v1/customers/:id.
Quando o e-mail já existe, o mesmo corpo é retornado com status 200 OK em vez de 201.
GET/api/v1/customers
Auth: Merchant key (scope customers:read)
Lista os clientes do Merchant, do mais recente para o mais antigo. Suporta um filtro email e paginação.
Parâmetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Não | Filtro de e-mail exato, sem diferenciação entre maiúsculas e minúsculas. |
page | integer | Não | Número da página (padrão 1, mínimo 1). |
limit | integer | Não | Itens por página (padrão 20, máx. 100). |
Requisição
curl -X GET "https://api.tokeflow.com/api/v1/customers?page=1&limit=20&email=joao@example.com" \
-H "Authorization: Bearer sk_live_mer_xxxxxxxxxxxxxxxxxxxxxxxx"Resposta 200 OK
{
"success": true,
"data": [
{
"id": "cust_a1b2c3d4e5",
"merchant_id": "mrc_9f8e7d6c5b",
"email": "joao@example.com",
"name": "Joao da Silva",
"phone": "+5511999990000",
"document_type": "cpf",
"metadata": { "source": "checkout_web" },
"created_at": "2026-01-15T12:30:00.000Z",
"updated_at": "2026-01-15T12:30:00.000Z"
}
],
"meta": {
"pagination": {
"page": 1,
"limit": 20,
"total": 42,
"total_pages": 3,
"has_next": true,
"has_prev": false
}
},
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T12:30:00.000Z"
}Como o e-mail é único por Merchant, filtrar por email retorna no máximo um cliente — uma forma conveniente de consulta antes de decidir se deve criar um novo.
GET/api/v1/customers/:customerId
Auth: Merchant key (scope customers:read)
Recupera um único cliente pelo ID.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Sim | ID do cliente, prefixado com cust_. |
Requisição
curl -X GET https://api.tokeflow.com/api/v1/customers/cust_a1b2c3d4e5 \
-H "Authorization: Bearer sk_live_mer_xxxxxxxxxxxxxxxxxxxxxxxx"Resposta 200 OK
{
"success": true,
"data": {
"id": "cust_a1b2c3d4e5",
"merchant_id": "mrc_9f8e7d6c5b",
"email": "joao@example.com",
"name": "Joao da Silva",
"phone": "+5511999990000",
"document_type": "cpf",
"metadata": { "source": "checkout_web" },
"created_at": "2026-01-15T12:30:00.000Z",
"updated_at": "2026-01-15T12:30:00.000Z"
},
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T12:30:00.000Z"
}Resposta 404 Not Found
{
"error": {
"type": "not_found_error",
"code": "RESOURCE_NOT_FOUND",
"message": "Customer with ID \"cust_a1b2c3d4e5\" not found",
"details": {},
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T12:30:00.000Z"
}
}PATCH/api/v1/customers/:customerId
Auth: Merchant key (scope customers:write)
Atualiza um cliente. Todos os campos do corpo são opcionais; apenas os campos enviados são alterados. Alterar o email para um já usado por outro cliente do Merchant retorna 409 Conflict.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Sim | ID do cliente, prefixado com cust_. |
Parâmetros do corpo
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Não | Novo e-mail. Deve ser único por Merchant. |
name | string | Não | Novo nome. |
phone | string | Não | Novo telefone em formato E.164. |
document_type | string | Não | Um dos valores cpf, cnpj, passport, tax_id. |
document_number | string | Não | Documento fiscal (máx. 40 caracteres). Nunca retornado. |
metadata | object | Não | Substitui os metadados armazenados. Máximo de 5 KB serializado. |
billing_address | object | Não | Endereço de cobrança (mesmo formato usado na criação). |
Requisição
curl -X PATCH https://api.tokeflow.com/api/v1/customers/cust_a1b2c3d4e5 \
-H "Authorization: Bearer sk_live_mer_xxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Joao P. da Silva",
"phone": "+5511988887777",
"metadata": { "source": "checkout_web", "tier": "gold" }
}'Resposta 200 OK
{
"success": true,
"data": {
"id": "cust_a1b2c3d4e5",
"merchant_id": "mrc_9f8e7d6c5b",
"email": "joao@example.com",
"name": "Joao P. da Silva",
"phone": "+5511988887777",
"document_type": "cpf",
"metadata": { "source": "checkout_web", "tier": "gold" },
"created_at": "2026-01-15T12:30:00.000Z",
"updated_at": "2026-01-15T13:05:00.000Z"
},
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T13:05:00.000Z"
}Resposta 409 Conflict
Retornado quando o novo email já pertence a outro cliente do Merchant. O ID do cliente conflitante é incluído em details.
{
"error": {
"type": "conflict_error",
"code": "CUSTOMER_EMAIL_EXISTS",
"message": "A customer with this email already exists for this merchant",
"details": { "existing_customer_id": "cust_f6e5d4c3b2" },
"request_id": "req_8f3c1a2b4d",
"timestamp": "2026-01-15T13:05:00.000Z"
}
}DELETE/api/v1/customers/:customerId
Auth: Organization key (with merchant_id) or Merchant key.
Exclui permanentemente um cliente sem histórico. Um cliente com qualquer assinatura, pedido, transação, método de pagamento salvo ou registro em provedor de pagamento é recusado com 409, porque clientes com atividade são mantidos para relatórios e reconciliação. Espere que a recusa seja o resultado comum: isso existe para um cliente criado por engano — um erro de digitação, um duplicado, dados de teste. O e-mail fica disponível para a criação de um novo cliente.
Parâmetros de caminho
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Sim | ID do cliente |
Exemplo de requisição
curl -X DELETE https://api.tokeflow.com/api/v1/customers/cust_2f9a71d4 \
-H "Authorization: Bearer sk_live_mer_…"Exemplo de resposta — 204 No Content
Um corpo vazio é retornado em caso de sucesso.
Erros
Os endpoints de clientes usam o envelope de erro padrão do Tokeflow. Casos comuns:
| HTTP | type | Quando |
|---|---|---|
| 400 | validation_error | Campo ausente/inválido, document_type inválido, telefone malformado, ou metadata acima de 5 KB. |
| 401 | authentication_error | Chave de API ausente ou inválida. |
| 403 | authorization_error | A chave não possui o escopo necessário, ou foi usada uma chave que não é de Merchant. |
| 404 | not_found_error | Nenhum cliente com esse ID para este Merchant. |
| 409 | conflict_error | E-mail já em uso por outro cliente (PATCH). |
| 429 | rate_limit_error | Limite de taxa excedido — recue exponencialmente. |
Relacionados
- Transações — cobrar um cliente.
- Pedidos — agrupar as compras de um cliente.
- Assinaturas — cobrança recorrente para um cliente.
- Autenticação — chaves, escopos e cabeçalhos.