Fidelidade: saldo e resgates
Mostre ao cliente quanto ele tem de pontos ou cashback e deixe ele trocar pontos por prêmios do seu catálogo.
https://app.reton.com.br/api/v1Atualizado em 30 de setembro de 2026Navegar na API
Estes endpoints só fazem sentido se a sua loja usa o programa de fidelidade do Reton. Os pontos e o cashback nascem das vendas que você registra — não há endpoint para "dar pontos" avulsos pela API.
| Seu programa é de… | Como o cliente usa o que juntou |
|---|---|
| Pontos | Troca por um prêmio do catálogo: Resgatar recompensa. |
| Cashback | Abate na próxima compra: mande cashbackUsar ao registrar a venda. |
| Carimbos | O cartão completa sozinho com as vendas; a entrega do prêmio é feita no painel do Reton. |
Os comandos desta página saem prontos para copiar. A chave fica só nesta aba — não é salva nem enviada.
Consultar saldo
/api/v1/fidelidade/saldoQuanto o cliente tem hoje — já descontado o que venceu — e quanto vence em breve. Pelo celular ou CPF.
É a pergunta do caixa antes de fechar a venda: "quantos pontos você tem?". Envie apenas um parâmetro na URL para dizer quem é o cliente: o celular, ou o documento (CPF/CNPJ), ou o idExterno. Mandar dois na mesma chamada dá erro 400. Ex.: /fidelidade/saldo?celular=11987654321.
O formato da resposta segue o modelo do seu programa (campo modelo). No de pontos, olhe saldoReal; no de cashback, saldoCashback (em reais).
8024 pontos, 42.5 de cashback. Formate só na hora de mostrar ao cliente — "8.024 pontos", "R$ 42,50". Não troque o ponto por vírgula antes de fazer contas: no JSON, 8.024 seria oito vírgula zero vinte e quatro.Parâmetros da URL
celularstringCelular do cliente, com DDD. Com ou sem máscara.
documentostringCPF ou CNPJ, com ou sem pontuação.
idExternostringO código do cliente no seu sistema.
diasExpiracaointegerJanela de "vence em breve", em dias: quanto do saldo vence nos próximos N dias.
Padrão:
30.
Erros que você deve tratar
400 VALIDATION_ERRORNenhum parâmetro de cliente na URL, ou mais de um; oudiasExpiracaonão é um inteiro de 1 a 365.404 NOT_FOUNDNenhum cliente com esse celular/documento/código na sua conta (ou está na Lixeira).
curl "https://app.reton.com.br/api/v1/fidelidade/saldo?celular=11987654321" \ -H "X-API-Key: $RETON_API_KEY"# O mesmo saldo, pelo CPF do cliente (só os números)curl "https://app.reton.com.br/api/v1/fidelidade/saldo?documento=52998224725" \ -H "X-API-Key: $RETON_API_KEY"{ "success": true, "data": { "contatoId": "con_LC4dQtpwbrLudiRS", "modelo": "pontos", "saldoReal": 350, "pontosExpirando": 50, "dataExpiracao": "2026-10-15T03:00:00.000Z" }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}{ "success": true, "data": { "contatoId": "con_LC4dQtpwbrLudiRS", "modelo": "cashback", "saldoPontos": 0, "saldoCashback": 42.5, "cashbackExpirando": 12.5, "cashbackExpiraEm": "2026-10-15T03:00:00.000Z", "totalAcumulado": 80, "totalUsado": 37.5, "minimoParaUsar": 10, "limitePorUso": { "tipo": "sem_limite", "valor": null } }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}{ "success": false, "error": { "code": "NOT_FOUND", "message": "Cliente não encontrado." }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Consultar saldo pelo id
/api/v1/fidelidade/saldo/:contatoIdO mesmo saldo, para quem já guardou o id do cliente no Reton.
A resposta é igual à de Consultar saldo — só muda como você aponta o cliente.
Parâmetros do caminho
contatoIdstringobrigatórioO id do cliente (
con_…).
Parâmetros da URL
diasExpiracaointegerJanela de "vence em breve", em dias.
Padrão:
30.
Erros que você deve tratar
400 VALIDATION_ERRORO id não tem o formatocon_…, oudiasExpiracaoinválido.404 NOT_FOUNDO cliente não existe na sua conta (ou está na Lixeira).
curl "https://app.reton.com.br/api/v1/fidelidade/saldo/con_LC4dQtpwbrLudiRS" \ -H "X-API-Key: $RETON_API_KEY"{ "success": true, "data": { "contatoId": "con_LC4dQtpwbrLudiRS", "modelo": "pontos", "saldoReal": 350, "pontosExpirando": 50, "dataExpiracao": "2026-10-15T03:00:00.000Z" }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Resgatar recompensa
/api/v1/fidelidade/resgatarTroca pontos do cliente por um prêmio do seu catálogo e gera o voucher.
O recompensaId (começa com rec_) é o id do prêmio no catálogo do Reton — você o encontra em Fidelidade › Recompensas, no painel. O Reton confere saldo, estoque e as regras do prêmio antes de debitar.
canalResgate: "operador"— o prêmio foi entregue na hora, no balcão. O resgate já nasceentregue.canalResgate: "portal"ou"app"(padrãoportal) — o cliente pediu e vai retirar depois. O resgate nascependentee a loja entrega pelo painel, com o voucher.
Corpo da requisição (JSON)
contatoIdstringobrigatórioO id do cliente (
con_…).recompensaIdstringobrigatórioO id do prêmio (
rec_…).quantidadeintegerQuantas unidades do prêmio. Gera um voucher para cada.
Padrão:
1.canalResgatestringoperador= entregue na hora;portal/app= fica pendente até a retirada.Valores:
operador,portal,app. Padrão:portal.varianteSelecionadaobjectPara prêmios com variação:
{ "tamanho": "M" }. As opções são as cadastradas no prêmio.observacaostringAnotação livre.
Até 1000 caracteres.
operadorIdstringQuem fez o resgate (
op_…). Sem isso, fica com o operador "API".unidadeCodigostringCódigo da loja onde o resgate aconteceu.
Até 50 caracteres.
unidadeIdstringOu o id da loja (
uni_…).
Erros que você deve tratar
400 VALIDATION_ERRORCampo inválido; cliente ou prêmio não encontrado; saldo insuficiente; sem estoque; limite de resgates do prêmio atingido. Amessagediz qual.
curl -X POST "https://app.reton.com.br/api/v1/fidelidade/resgatar" \ -H "X-API-Key: $RETON_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "contatoId": "con_LC4dQtpwbrLudiRS", "recompensaId": "rec_vpyTEeCYIYURK01b", "canalResgate": "operador" }'{ "success": true, "data": { "resgateIds": [ "res_WhnxINUFrRdQKFXS" ], "voucherCodes": [ "RES-W4S6TY" ], "pontosGastos": 100, "saldoApos": 250 }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}{ "success": false, "error": { "code": "VALIDATION_ERROR", "message": "Saldo insuficiente. Tem 80 pontos, precisa de 100" }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Listar resgates
/api/v1/fidelidade/resgatesOs resgates da sua conta, do mais novo para o mais antigo, com filtros e paginação.
Para percorrer tudo, some limit ao offset a cada página até o offset passar do total.
Parâmetros da URL
statusstringSó os resgates nesse estado.
Valores:
pendente,entregue,cancelado.buscastringProcura no nome ou celular do cliente, no nome do prêmio e no voucher.
operadorIdstringSó os feitos por esse operador (
op_…).limitintegerItens por página (máximo 100).
Padrão:
20.offsetintegerQuantos itens pular.
Padrão:
0.
curl "https://app.reton.com.br/api/v1/fidelidade/resgates?status=pendente&limit=20" \ -H "X-API-Key: $RETON_API_KEY"{ "success": true, "data": { "items": [ { "id": "res_WhnxINUFrRdQKFXS", "voucherCode": "RES-W4S6TY", "pontosUsados": 100, "status": "pendente", "canalResgate": "site", "varianteSelecionada": null, "observacao": null, "motivoCancelamento": null, "criadoEm": "2026-09-30T14:51:42.608Z", "entregueEm": null, "canceladoEm": null, "contato": { "id": "con_LC4dQtpwbrLudiRS", "nome": "Maria", "celular": "11987654321", "foto": null }, "recompensa": { "id": "rec_vpyTEeCYIYURK01b", "nome": "Café grátis", "tipo": "brinde", "icone": null }, "operador": { "id": "op_avNMa0IQROfQV7Nq", "nome": "API" }, "canceladoPorNome": null } ], "total": 1, "limit": 20, "offset": 0 }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Consultar resgate
/api/v1/fidelidade/resgates/:idUm resgate pelo id (res_…) ou pelo código do voucher (RES-…).
Útil no balcão: o cliente mostra o voucher, você consulta pelo código e confere se ele ainda está pendente antes de entregar.
canalResgate: "site".Parâmetros do caminho
idstringobrigatórioO id (
res_…) ou o voucher (RES-W4S6TY).
Erros que você deve tratar
404 NOT_FOUNDNenhum resgate com esse id ou voucher na sua conta.
curl "https://app.reton.com.br/api/v1/fidelidade/resgates/RES-W4S6TY" \ -H "X-API-Key: $RETON_API_KEY"{ "success": true, "data": { "id": "res_WhnxINUFrRdQKFXS", "voucherCode": "RES-W4S6TY", "pontosUsados": 100, "status": "entregue", "canalResgate": "operador", "varianteSelecionada": null, "observacao": null, "motivoCancelamento": null, "criadoEm": "2026-09-30T14:51:42.608Z", "entregueEm": "2026-09-30T14:51:42.535Z", "canceladoEm": null, "contato": { "id": "con_LC4dQtpwbrLudiRS", "nome": "Maria", "celular": "11987654321" }, "recompensa": { "id": "rec_vpyTEeCYIYURK01b", "nome": "Café grátis", "tipo": "brinde" }, "operador": { "id": "op_avNMa0IQROfQV7Nq", "nome": "API" } }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}{ "success": false, "error": { "code": "NOT_FOUND", "message": "Resgate não encontrado." }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Cancelar resgate
/api/v1/fidelidade/resgates/:idCancela um resgate e devolve os pontos ao cliente.
Aqui o id precisa ser o do resgate (res_…) — o voucher não vale para cancelar.
Parâmetros do caminho
idstringobrigatórioO id do resgate (
res_…).
Corpo da requisição (JSON)
motivoCancelamentostringobrigatórioPor que foi cancelado (fica no histórico).
Até 500 caracteres.
Erros que você deve tratar
400 VALIDATION_ERRORSem motivo; resgate não encontrado; resgate já cancelado. Amessagediz qual.
curl -X PATCH "https://app.reton.com.br/api/v1/fidelidade/resgates/res_WhnxINUFrRdQKFXS" \ -H "X-API-Key: $RETON_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "motivoCancelamento": "Cliente desistiu do prêmio" }'{ "success": true, "data": { "cancelado": true, "resgateId": "res_WhnxINUFrRdQKFXS" }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Estornar só os pontos de uma venda (exceção)
O ideal é cancelar a venda (Estornar venda): ela sai do faturamento e a pontuação é desfeita junto, e o histórico do cliente fica coerente. Este estorno aqui é diferente: tira só os pontos, o cashback ou o carimbo e deixa a venda valendo.
Quando faz sentido
Só quando a venda aconteceu de verdade (o cliente pagou e levou), mas não devia ter pontuado:
- uma regra ou promoção estava configurada errada e pontuou quem não devia (ex.: "pontos em dobro" ligado por engano);
- o produto não participa do programa de fidelidade, mas a venda foi enviada como se participasse;
- a venda foi para uso interno ou funcionário, que não deveria acumular.
O que saber antes
- Saem todos os pontos (ou o cashback, ou o carimbo) daquela venda — não só o excesso. Se ela deu 300 em vez de 150, saem os 300; para devolver os 150 certos, use o Dar pontos no painel.
- Não dá para desfazer pela API.
- Se o cliente já usou o que a venda gerou, é recusado (
409 ESTORNO_RECOMPENSA_BLOQUEADO). - Aponte a venda pelo
codigoItemou pelointeracaoId— nunca pelocodigoTransacao(é uma venda de cada vez).
# Tira só a pontuação desta venda; a venda continua no faturamentocurl -X POST "https://app.reton.com.br/api/v1/interacoes/estorno" \ -H "X-API-Key: $RETON_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "codigoItem": "PDV1-000123-1", "escopo": "recompensa", "motivo": "Promoção de pontos em dobro ligada por engano" }'{ "success": true, "data": { "interacaoId": "int_b7o9FVDzy4cg1fzk", "pontosEstornados": 150, "cashbackEstornado": 0, "carimbosRevertidos": 0, "vendaMantida": true }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}{ "success": false, "error": { "code": "SEM_RECOMPENSA", "message": "Esta venda não gerou ponto, cashback nem carimbo." }, "meta": { "requestId": "req_V1StGXR8Z5jdHi6B" }}Isso foi útil?
Ainda precisa de ajuda?
Não achou o que procurava? A gente responde de gente pra gente.