Documentação de integração
API de loja direta
Integração direta entre a loja parceira e a Cashbanx — o pedido nasce na loja, a pontuação é apurada aqui.
01Arquitetura
O fluxo tem duas comunicações obrigatórias da loja para a Cashbanx, sempre nesta ordem: a notificação do pedido e, depois, a atualização do status para concluído ou cancelado.
- Dentro de uma página da Cashbanx específica do parceiro é disponibilizado um link para o site
da loja. Esse link carrega o identificador do clique — um valor no formato
hub_<número>, entregue num parâmetro de URL cujo nome é combinado com cada loja no momento do cadastro. - Ao clicar, uma nova aba abre o site da loja. Ex.:
https://www.paginadolojaxpto.com.br/?token=hub_1234567 - No site da loja o cliente seleciona os produtos e fecha o pedido. A loja deve guardar o identificador do clique recebido na URL e associá-lo ao pedido.
- Após a confirmação do pedido, a loja notifica a Cashbanx
(
purchase-made), devolvendo o identificador do clique no campoclick_id. Nesse momento a Cashbanx comunica a Esfera, que informa o cliente por e-mail sobre a compra. O pedido nasce pendente: nenhuma pontuação é liberada ainda. - Após o prazo legal de cancelamento e a negociação com o time comercial da Cashbanx, a loja
atualiza o status do pedido (
confirm-purchase) — concluído ou cancelado.
| Status do pedido | Efeito para o cliente |
|---|---|
| PEDIDO CONCLUÍDO | A pontuação é liberada conforme a regra de liberação acordada para a loja, refletindo no extrato do cliente. |
| PEDIDO CANCELADO | Nenhuma pontuação é liberada para o cliente. |
Os fluxos dentro do ambiente da loja podem mudar. Porém, é obrigatório manter as duas chamadas para a Cashbanx: a de notificação da compra e a de atualização para concluído ou cancelado. Um pedido que nunca receba a segunda chamada permanece pendente indefinidamente, e nenhuma pontuação é creditada.
Quem calcula a pontuação
A loja informa o valor do pedido; quem apura a pontuação é a Cashbanx, a partir da
comissão registrada no cadastro da loja e da regra do programa. O campo points da
notificação é informativo: ele é armazenado junto ao pedido, mas não determina o que o
cliente recebe.
02Ambientes
Todos os endpoints deste documento são publicados sob o prefixo /api. Substitua
{cashbanx_url} pelo host do ambiente:
| Ambiente | {cashbanx_url} |
|---|---|
| Homologação (Stage) | https://dev-api.cashbanx.site |
| Produção | https://api.cashbanx.site |
A homologação é o ambiente de desenvolvimento da Cashbanx: os dados são independentes dos de produção, mas o ambiente recebe atualizações com frequência e não tem compromisso de disponibilidade. As credenciais são distintas por ambiente e não são intercambiáveis.
03Credenciais e identificação
A Cashbanx entrega à loja, por ambiente:
client_ideclient_secret— usados apenas para obter o token de acesso. Oclient_secreté exibido uma única vez no momento da criação; perdido, ele é substituído por um novo, não recuperado.partner_id— o identificador da loja no cadastro da Cashbanx, enviado no corpo das duas chamadas.
A credencial é o que determina a loja e o programa em que o pedido será lançado. O
partner_id enviado no corpo precisa ser exatamente o da credencial usada; qualquer
outro valor é recusado com partner not found. Nenhum campo do corpo altera o destino
do lançamento.
04Autenticação
OAuth 2.0, fluxo client_credentials. O token tem validade de 30 minutos
(expires_in: 1800) e deve ser reutilizado enquanto for válido — obtenha um novo apenas
quando o anterior expirar.
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=<client_id>&client_secret=<client_secret>Retorno 200 · sucesso
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 1800,
"token_type": "bearer"
}O fluxo client_credentials não emite refresh_token nem
refresh_expires_in (RFC 6749, §4.4.3): a loja já possui as credenciais e solicita um
novo token quando precisar. O parâmetro encrypted não é aceito.
Retorno 4xx · erro — o corpo de erro é sempre o mesmo formato:
{ "errorCode": "invalid_client", "errorMessage": "client_id or client_secret is incorrect" }| Código | errorCode | errorMessage | Situação |
|---|---|---|---|
| 400 | unsupported_grant_type | grant_type is incorrect | grant_type diferente de client_credentials. |
| 400 | invalid_request | client_id or client_secret is incorrect | client_id ou client_secret não enviado. |
| 400 | invalid_client | client_id or client_secret is incorrect | Credencial inválida, inexistente ou revogada — os três casos respondem igual, por segurança. |
| 429 | invalid_request | Too many requests | Mais de 20 solicitações de token por minuto para o mesmo
client_id. |
| 500 | internal_error | Internal Server Error | Falha interna de processamento na Cashbanx. |
05API · Notificação de Pedido
Informa que um pedido foi realizado. O pedido é registrado como pendente e aguarda a atualização de status descrita na seção 6.
Authorization: Bearer {access_token}
Content-Type: application/json| Campo | Descrição | Tipo | Obrig. |
|---|---|---|---|
| customer_id | Identificação do cliente | Texto | Sim |
| customer_id_type | Tipo da identificação: Token, CPF ou CNPJ (grafia exata) | Texto | Sim |
| customer_name | Nome do cliente | Texto | Não |
| customer_mail | E-mail do cliente | Texto | Não |
| customer_phone | Telefone do cliente (DDD + número) | Texto | Não |
| click_id | Identificador do clique recebido na URL de entrada, no formato hub_<número> | Texto | Não * |
| partner_id | Identificação do parceiro | Texto | Sim |
| campaign_id | Identificação de campanha | Texto | Sim |
| order_id | Número do pedido | Texto | Sim |
| order_date | Data do pedido (yyyy-mm-dd) | Data | Sim |
| points | Quantidade de pontos — informativo, não determina o crédito | Inteiro | Não |
| order_total | Valor do pedido em Reais, sem frete. Maior que zero e no máximo 1000000.00, com até duas casas decimais | Numérico | Sim |
| order_item_quantity | Quantidade de itens do pedido | Numérico | Não |
| order_item_sku | Número da SKU no parceiro | Texto | Não |
| address_street | Endereço da entrega do pedido | Texto | Não |
| address_number | Número | Texto | Não |
| address_complement | Complemento | Texto | Não |
| address_city | Cidade | Texto | Não |
| address_uf | Estado | Texto | Não |
| address_country | País | Texto | Não |
click_id não é obrigatório, mas é o que garante a pontuação
O click_id identifica a visita originada na Cashbanx e é o que liga o pedido à
taxa acordada. Ele só é aproveitado quando pertence à mesma loja e à mesma pessoa que o
pedido identifica em customer_id — por isso os dois campos são separados, e por isso
o identificador do clique deve ser guardado por pedido, nunca por cliente.
Sem click_id, ou quando ele não corresponde ao cliente informado, o pedido
não é recusado: ele é registrado sem vínculo, com pontuação zero, e passa a ser tratado
comercialmente entre a loja e a Cashbanx.
Exemplo de requisição
{
"customer_id": "01245678901",
"customer_id_type": "CPF",
"customer_name": "João da Silva",
"customer_mail": "joaodasilva@hotmail.com",
"customer_phone": "11999999999",
"click_id": "hub_1234567",
"partner_id": "ABC",
"campaign_id": "DEFG1234",
"order_id": "1234567891",
"order_date": "2026-01-01",
"points": 100,
"order_total": 100.50,
"order_item_quantity": 1,
"order_item_sku": "0987654321",
"address_street": "Rua XPTO",
"address_number": "200",
"address_complement": "AP 100",
"address_city": "São Paulo",
"address_uf": "SP",
"address_country": "Brasil"
}Retorno 200 · sucesso
{ "message": "Purchase received." }| Código | errorCode | errorMessage | Situação |
|---|---|---|---|
| 400 | order_id_duplicated | order_id duplicated | Já existe pedido recebido com o mesmo order_id para essa loja. |
| 400 | partner_not_found | partner not found | O partner_id não é o da credencial usada, ou a loja está inativa na
Cashbanx. |
| 400 | missing_field | <campo> cannot be null | Campo obrigatório não informado, nulo ou vazio: customer_id,
customer_id_type, partner_id, campaign_id,
order_id, order_date ou order_total. |
| 400 | bad_request | Bad Request | Algo preenchido incorretamente: tipo inválido, campo não previsto neste documento, data
inexistente (2026-02-31) ou order_total fora da faixa
publicada. |
| 401 | invalid_client | access_token is incorrect | Token ausente, expirado ou revogado. |
| 500 | internal_error | Internal Server Error | Falha interna de processamento na Cashbanx. |
06API · Atualização de Pedido
Conclui ou cancela um pedido notificado anteriormente. É esta chamada que libera ou cancela a pontuação do cliente.
Authorization: Bearer {access_token}
Content-Type: application/json| Campo | Descrição | Tipo | Obrig. |
|---|---|---|---|
| partner_id | Identificação do parceiro | Texto | Sim |
| order_id | Número do pedido, o mesmo enviado na notificação | Texto | Sim |
| order_update_date | Data da atualização do status (yyyy-mm-dd) | Data | Sim |
| order_date | Data do pedido (yyyy-mm-dd) — informativa | Data | Não |
| order_status | Status final: COMPLETED ou CANCELED | Texto | Sim |
| status_description | Descrição do motivo do status | Texto | Se CANCELED |
Pedido concluído · libera a pontuação
{
"partner_id": "ABC",
"order_id": "1234567891",
"order_status": "COMPLETED",
"order_date": "2026-01-01",
"order_update_date": "2026-02-15",
"status_description": "Pedido entregue"
}{ "message": "Confirmed order." }Pedido cancelado · não libera a pontuação
{
"partner_id": "ABC",
"order_id": "1234567891",
"order_status": "CANCELED",
"order_update_date": "2026-02-15",
"status_description": "Cancelado por motivo específico"
}{ "message": "Order canceled." }Um pedido aceita uma única atualização de status. Depois de concluído ou cancelado,
qualquer nova chamada — inclusive um CANCELED após um COMPLETED — é
recusada com Order already processed, e não há caminho de volta pela API.
Por isso a atualização deve ser enviada somente após o prazo de troca e devolução. Devoluções posteriores à confirmação são tratadas comercialmente entre a loja e a Cashbanx.
| Código | errorCode | errorMessage | Situação |
|---|---|---|---|
| 400 | order_not_found | Order not found | O order_id não foi encontrado para essa loja. |
| 400 | order_already_processed | Order already processed | O pedido já foi concluído ou cancelado. |
| 400 | partner_not_found | partner not found | O partner_id não é o da credencial usada, ou a loja está inativa na
Cashbanx. |
| 400 | missing_field | <campo> cannot be null | Campo obrigatório não informado ou nulo: partner_id, order_id,
order_update_date, order_status — e
status_description quando o status for CANCELED. |
| 400 | bad_request | Bad Request | Algo preenchido incorretamente: order_status fora dos valores publicados,
data inexistente ou campo não previsto neste documento. |
| 401 | invalid_client | access_token is incorrect | Token ausente, expirado ou revogado. |
| 500 | internal_error | Internal Server Error | Falha interna de processamento na Cashbanx. |
07E-mails transacionais
Quando a loja notifica que o pedido foi realizado, a Cashbanx informa a Esfera para que ela faça a comunicação ao cliente por e-mail. Quem dispara o e-mail é a Esfera, não a Cashbanx.
Assunto: "Você vai ganhar pontos na Esfera!"
Olá, [Nome do cliente],
A loja parceira XPTO avisou sobre a sua compra com a Esfera. O prazo para crédito dos pontos começa a partir da entrega do seu pedido. Para consultar mais informações, acesse a página relacionada em Lojas Parceiras no site.
Resumo do pedido: nome da loja parceira, data da compra, valor em reais (sem frete) e número do pedido.
08Notas de integração
- Reenvio após timeout é seguro. O
order_idé a chave de idempotência: um reenvio da notificação respondeorder_id duplicatede uma segunda atualização respondeOrder already processed. Em nenhum dos casos há crédito em duplicidade. - Não existe valor negativo. Estorno e devolução não são representados por
order_totalnegativo — o caminho publicado é oCANCELED, e apenas enquanto o pedido não tiver sido atualizado. - Guarde o
click_idpor pedido. Reaproveitar o identificador de um clique antigo em um pedido novo faz a pontuação ser apurada pela taxa errada, sem que nada acuse o problema. - Reutilize o token durante os 30 minutos de validade. Solicitações de token são
limitadas a 20 por minuto por
client_id. - Campo não previsto neste documento é recusado com
Bad Request. Envie apenas os campos publicados.