Lista e exportação de clientes
Lista os clientes do seller com totais de compra, abre o detalhe de um cliente, resume a base e exporta tudo em CSV.
Estas quatro leituras mostram ao seller quem compra dele. Todos os totais (pedidos, valor gasto, primeiro e último pedido) consideram só os pedidos do próprio seller, nunca o histórico do cliente em outros sellers. Não há privilégio fino: qualquer usuário do seller consegue ler.
Listar clientes
/api/v1/vendor/customersSellerLista paginada de clientes do seller
Devolve os clientes que já pediram ao seller e os que estão na carteira própria, com totais. Passando id, a mesma rota devolve o detalhe de um cliente (veja abaixo).
Parâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 20searchstringsort_bystringpadrão: total_spentfirst_namelast_namedisplay_nameemailorder_counttotal_spentlast_order_atcreated_atsort_dirstringpadrão: ascascdescsort_by é informado. Qualquer valor que não seja desc vale asc.filterstringoverduenever_orderedportfoliooverdue: passou da frequência esperada (precisa estar configurada). never_ordered: está na carteira e nunca comprou. portfolio: só quem foi posto na carteira. Vazio traz todos; outro valor é ignorado.iduuidExemplo de requisição: listar
curl "$BASE_URL/api/v1/vendor/customers?per_page=20&sort_by=total_spent&sort_dir=desc" \
-H "Authorization: Bearer $TOKEN"Resposta: listar
{
"customers": [
{
"user_id": "4f44f104-bbe0-4d2e-b497-c1afbe19d7c5",
"first_name": "Vinícius",
"last_name": "Nunes",
"email": "vinicius.nunes@example.com",
"phone": "+5551953268977",
"order_count": 45,
"total_spent": 4366331,
"last_order_at": "2026-09-04T19:44:46.593557Z",
"first_order_at": "2026-05-31T16:46:46Z",
"city": "",
"state": "",
"status": "A",
"user_type": "customer",
"email_verified": true,
"registered_at": "2026-05-31T15:59:45Z",
"person_type": "F",
"cpf": "123.456.789-09",
"display_name": "Vinícius Nunes",
"in_portfolio": false,
"days_since_last_order": 37,
"days_overdue": 0,
"expected_order_freq_days": 0
}
],
"total": 7187,
"page": 1,
"per_page": 20,
"total_pages": 360
}Campos da resposta
customersarraynull quando nenhum cliente combina.totalintegerpageintegerper_pageintegertotal_pagesintegercustomers[].user_iduuidcustomers[].first_namestringcustomers[].last_namestringcustomers[].emailstringcustomers[].phonestringcustomers[].order_countinteger0 para quem só está na carteira.customers[].total_spentintegercustomers[].first_order_atstringcustomers[].last_order_atstringcustomers[].citystringcustomers[].statestringcustomers[].statusstringA, ativo).customers[].user_typestringcustomer.customers[].email_verifiedbooleancustomers[].registered_atstringcustomers[].person_typestringFJF pessoa física, J pessoa jurídica.customers[].cpfstringcustomers[].cnpjstringcustomers[].legal_namestringcustomers[].trade_namestringcustomers[].display_namestringcustomers[].in_portfoliobooleancustomers[].days_since_last_orderintegercustomers[].days_overdueinteger0 quando em dia ou quando a frequência não está configurada.customers[].expected_order_freq_daysinteger0 = não configurada). É igual para todos os clientes.Detalhe de um cliente
Chamando GET /api/v1/vendor/customers?id={uuid} você recebe um único objeto, sem envelope. Só funciona para clientes que já têm pedido com o seller: qualquer outro usuário responde 404, para o seller não inspecionar contas alheias.
{
"user_id": "4f44f104-bbe0-4d2e-b497-c1afbe19d7c5",
"first_name": "Vinícius",
"last_name": "Nunes",
"email": "vinicius.nunes@example.com",
"phone": "+5551953268977",
"cpf": "123.456.789-09",
"language": "pt-BR",
"registered_at": "2026-05-31T15:59:45Z",
"city": "",
"state": "",
"person_type": "F",
"display_name": "Vinícius Nunes",
"order_count": 45,
"total_spent": 4366331,
"first_order_at": "2026-05-31T16:46:46Z",
"last_order_at": "2026-09-04T19:44:46.593557Z",
"in_portfolio": false,
"days_since_last_order": 37,
"days_overdue": 0,
"expected_order_freq_days": 0
}O detalhe repete os campos da lista e acrescenta language (idioma do cliente). Não traz status, user_type nem email_verified. Como na lista, pedidos cancelados e reembolsados não entram nos totais.
Resumo da base
/api/v1/vendor/customers/statsSellerTotais da base de clientes do seller
Resume a base de clientes do seller em cinco números.
{
"total_customers": 7187,
"repeat_customers": 4596,
"total_revenue": 2737977730,
"avg_order_value": 67354,
"total_orders": 40650
}Campos da resposta
total_customersintegerrepeat_customersintegertotal_revenueintegeravg_order_valueintegertotal_ordersintegerExportar em CSV
/api/v1/vendor/customers/exportSellerBaixa todos os clientes do seller em CSV
Devolve todos os clientes (sem paginação) como arquivo text/csv em UTF-8 com BOM, para abrir direto no Excel. O nome vem em Content-Disposition: vendor-customers-AAAA-MM-DD.csv. Aqui o valor gasto vem em reais com ponto decimal, não em centavos.
Colunas, nesta ordem: User ID, First Name, Last Name, Email, Phone, City, State, Order Count, Total Spent (BRL), First Order (AAAA-MM-DD), Last Order, Person Type, Legal Name, Trade Name, CPF, CNPJ, In Portfolio (Y ou N), Days Since Last Order (- para quem nunca comprou), Days Overdue. Os cabeçalhos ficam em inglês.
Exemplo de requisição: exportar
curl "$BASE_URL/api/v1/vendor/customers/export" \
-H "Authorization: Bearer $TOKEN" \
-o clientes.csvErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Sem token. | {"error":"AUTH_REQUIRED"} |
| 404 | O usuário não tem seller, ou o cliente do ?id= não comprou deste seller. | {"error":"VENDOR_NOT_FOUND"} ou {"error":"VENDOR_CUSTOMER_NOT_FOUND"} |
| 500 | id que não é UUID válido. | {"error":"VENDOR_CUSTOMER_DETAIL_FAILED","detail":"o valor \"abc\" não é um uuid válido. ..."} |
| 500 | Falha ao montar a lista, o resumo ou o CSV. O código depende da rota: VENDOR_CUSTOMERS_LIST_FAILED (lista), VENDOR_CUSTOMER_STATS_FAILED (resumo), VENDOR_CUSTOMERS_EXPORT_FAILED (exportação). | {"error":"VENDOR_CUSTOMERS_LIST_FAILED","detail":"..."} |