Pular para o conteúdo
openapi.yaml ↓

API do hub de pagamentos

Endereços: https://api-payments.abeesys.com, https://api-payments.dev.abeesys.com. Nos exemplos, $HUB_URL é o endereço do seu ambiente.

Contrato 0.14.0 · OpenAPI 3.1.0 · baixar o openapi.yaml

Visão geral do contrato

Hub de pagamentos da plataforma Abeesys. Cada sistema cliente (tenant) se autentica com a própria API key e só enxerga o que é seu.

Autenticação. Toda rota de negócio exige a API key (Authorization: Bearer <key>). As exceções são as de saúde, os avisos de gateway (webhooks, autenticados pela assinatura), o retorno da autorização do recebedor e as quatro rotas de documentação (/openapi.yaml, /openapi.json, /llms.txt, /llms-full.txt), que não levam dado de sistema nenhum e só respondem pela rede privada e pelo endereço local — pedidas por um endereço público, são 404 (desde a 0.13.0; quem as publica é o portal de documentação).

Valores sempre em unidade mínima da moeda (centavos para BRL), inteiros, com a moeda ISO 4217 ao lado. Nunca decimal.

Erros seguem a RFC 9457 (application/problem+json), com type em https://abeesys.com/errors/<slug>.

O sistema pede o quê; o hub decide como. O sistema informa valor, meio, pagador e referência — nunca o gateway. O hub escolhe o gateway pela política de roteamento do sistema (ordem de preferência por meio, configurada por quem opera a plataforma), entre as contas que o próprio sistema conectou. O gateway que atendeu aparece na resposta, como informação para suporte e conciliação.

Avisos. A cada mudança de cobrança o hub envia um aviso assinado ao endereço que o sistema cadastrou com quem opera a plataforma — ver webhooks.chargeUpdated.

Estornos. O sistema pede o estorno de uma cobrança capturada, inteiro ou em partes (POST /api/v1/charges/{id}/refunds). O estorno é feito no mesmo gateway e na mesma conta em que a cobrança foi criada. Estornos feitos no painel do gateway também aparecem, com origin provider_dashboard.

Taxas do gateway. O gateway informa a taxa de cada cobrança — da captura e, quando cobra, de cada estorno — e o hub a lança no ledger (provider_fee; a correção que o gateway fizer depois entra como provider_fee_adjustment, para mais ou para menos). O saldo da carteira passa a ser o líquido: bruto menos as taxas lançadas. Enquanto o gateway não informa a taxa da captura, a cobrança mostra a taxa como pending, nunca como zero. A taxa não gera aviso: consulte a cobrança ou a carteira.

Conta da plataforma e subconta virtual (desde a 0.8.0, ADR 0007). Para cada gateway que a política tenta, a cobrança vai na conta do próprio sistema, se ele tem credencial naquele gateway; se não tem, e o sistema é da Lopes Tech (mesmo CNPJ) e foi liberado por quem opera, vai na conta da plataforma daquele gateway, e o valor capturado fica na subconta virtual do sistema. settles_in diz qual dos dois, como informação. O fallback é sempre entre gateways, nunca entre contas do mesmo gateway. O saldo e o extrato da subconta saem em GET /api/v1/subaccounts e GET /api/v1/subaccounts/entries, separados das carteiras; os lançamentos do modo plataforma não aparecem em GET /api/v1/ledger/entries, que é a listagem das carteiras espelho. O repasse do saldo da subconta é feito por quem opera, fora do hub, e registrado nele: aparece no extrato e no aviso subaccount.payout.

Endereço de volta do cartão (desde a 0.9.0). Há gateway que, quando o emissor pede uma autenticação extra (3-D Secure), devolve a ação ao pagador só se souber para onde ele volta depois. O formulário de cartão declara isso em return_url_required; quando true, a cobrança de cartão daquele formulário exige card.return_url (422 nomeando o campo, sem chamar o gateway). Para os outros gateways o campo é aceito e ignorado.

Split — venda dividida com um recebedor (desde a 0.10.0, spec 0017). O sistema cadastra o recebedor (POST /api/v1/recipients) e pede a autorização da conta dele no gateway (POST /api/v1/recipients/{id}/links): o recebedor autoriza a conta dele numa página do gateway e volta ao endereço que o sistema informou, com status=linked ou status=failed. Na cobrança, split diz a parte do recebedor, em valor ou em pontos-base; o resto é a comissão do sistema. A cobrança nasce na conta do recebedor no gateway (settles_in recipient_account) e a comissão vai como taxa de marketplace para a conta da plataforma, alocada na subconta virtual do sistema. A parte do recebedor nunca passa pela conta da plataforma. Por enquanto: um recebedor por cobrança e a taxa do gateway na conta do recebedor.

Estorno e disputa de cobrança dividida (desde a 0.11.0, spec 0061). O estorno, inteiro ou parcial, é proporcional à divisão: devolve a parte do recebedor e a comissão na proporção da cobrança. O centavo do arredondamento fica com a comissão até o fim (a comissão devolve o piso da proporção acumulada), e quando tudo foi devolvido cada parte voltou inteira. O estorno confirmado traz as duas partes em split, e a cobrança, o total devolvido de cada uma (split.refunded_recipient_amount, split.refunded_commission). A disputa perdida também é proporcional quando o gateway devolve a comissão; quando ele a mantém na conta da plataforma, a disputa fica em análise de quem opera, e a cobrança continua disputed. Sistema declarado marketplace por quem opera só cobra pela conta da plataforma com divisão: sem split, 422 no campo split.

Listas abertas. Os campos de saída documentados como lista aberta podem trazer valores novos sem aviso prévio: o sistema trata o valor desconhecido como genérico, sem recusar a resposta. São eles: o tipo do aviso, failure_reason da cobrança, kind do lançamento, status, origin, reason e failure_reason do estorno, fee.status e fee.origins[].origin da cobrança, settles_in da cobrança, e kind, counterparty.type e payout.status do extrato da subconta, e status e deactivation_reason do vínculo de recebedor. O status da cobrança é conjunto fechado.

Correlação (desde a 0.12.0). Toda resposta traz X-Request-Id: 32 caracteres hexadecimais minúsculos, gerados pelo hub a cada requisição. É a referência do detail de um 500 e o que quem opera procura no log; informe-a ao suporte. O X-Request-Id que o sistema enviar não é devolvido nem substitui o do hub: fica registrado à parte, só para casar com o log do sistema (antes da 0.12.0, o hub ecoava o valor recebido).

Cabeçalhos de segurança (desde a 0.12.0). Toda resposta traz também Strict-Transport-Security, X-Content-Type-Options: nosniff e Referrer-Policy: no-referrer.

Corpo acima do limite (desde a 0.12.0). Nas rotas de aviso de gateway, corpo acima de 1 MiB é 413 payload-too-large.

Limite de taxa (desde a 0.14.0). Acima do limite, a resposta é 429 rate-limited, com Retry-After em segundos inteiros e o mesmo número no detail. Nas rotas com API key, nada é gravado, nenhum gateway é chamado e a Idempotency-Key não é consumida: repetir depois tem o efeito de sempre. Nos avisos de gateway, nada é gravado; o 429 por origem e o de assinatura inválida saem antes de a assinatura ser conferida, e o gateway reenvia. Os limites valem por sistema (API key) e por endereço de origem — em toda rota, menos as de saúde, inclusive rota inexistente. Tentativas repetidas de key inválida, ou de assinatura inválida num mesmo endereço de aviso, bloqueiam a origem por um tempo: a origem bloqueada recebe 429 sem a key (ou a assinatura) ser conferida, e o 429 não revela se a key existe. Os números são configuração da plataforma e não fazem parte do contrato.

Autenticação

As rotas da API levam a API key do tenant no cabeçalho Authorization: Bearer <key>. Sem chave, ou com chave inválida: 401. A chave é entregue uma vez, a quem opera o sistema; nenhuma página deste site pede ou mostra chave.

  • apiKey: http bearer — API key do tenant (abs_live_...), gerada pelo CLI tenant create.

Sem API key: GET /api/v1/health, GET /api/v1/health/ready, GET /api/v1/recipient-links/callback, POST /api/v1/webhooks/{provider}/{tenantID}, POST /api/v1/marketplace-webhooks/{accountID}, POST /api/v1/platform-webhooks/{accountID}.

curl "$HUB_URL/api/v1/charges/<id>" \
  -H "Authorization: Bearer $HUB_KEY"

Erros

Todo erro sai como application/problem+json (RFC 9457), com type, title, status e detail; no 422, também errors[]. Id de outro tenant responde 404, igual a um id que não existe.

  • 429 RateLimited — acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado https://abeesys.com/errors/rate-limited
  • Health — estado do serviço
  • 404 NotFound — recurso inexistente — ou de outro sistema, ou rota de documentação pedida por endereço público https://abeesys.com/errors/not-found
  • 413 PayloadTooLarge — corpo acima de 1 MiB (1048576 bytes) https://abeesys.com/errors/payload-too-large
  • 422 Problem — erro (RFC 9457) https://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable

Outras

GET /api/v1/health

Liveness — não toca no banco

Sem API key.

Respostas

  • 200 estado do serviço application/json objeto

GET /api/v1/health/ready

Readiness — confere o banco

Sem API key.

Respostas

  • 200 estado do serviço application/json objeto
  • 503 estado do serviço application/json objeto

GET /api/v1/charges

Lista as cobranças do tenant, da mais recente à mais antiga

Exige a API key do tenant.

Só as cobranças do sistema autenticado, com qualquer filtro: a referência de um pedido de outro sistema devolve lista vazia, não erro.

Os filtros são opcionais e se combinam com E. Ordem total: created_at decrescente e, no empate, id decrescente — uma cobrança nunca aparece em duas páginas nem falta entre elas enquanto o conjunto não muda. Página além do fim devolve items vazio, com o total.

Percorrer sem deslocamento. Uma cobrança criada durante a leitura entra no topo e desloca as páginas seguintes. Para percorrer um conjunto fixo, guarde o instante da primeira consulta e mande-o em created_to em todas as páginas: o que nasce depois fica fora da janela.

Parâmetro que não está aqui, parâmetro repetido, ou valor fora do que o parâmetro aceita (status inexistente, gateway que o hub não conhece, data inválida, created_from igual ou depois de created_to, página fora da faixa, texto fora de UTF-8): 422, com o parâmetro em errors[].field — escapado como na URL (%FF) quando o próprio nome não é UTF-8. Query string malformada: 400.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
statusqueryChargeStatus pending authorized captured refunded failed canceled disputednão
providerquerystring de 1 a 40 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoO gateway que atende a cobrança. Gateway que o hub não conhece é 422.
referencequerystring de 1 a 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoA referência do pedido, por igualdade exata. Devolve todas as tentativas.
created_fromquerystring formato date-timenãoCriadas a partir deste instante, inclusive.
created_toquerystring formato date-timenãoCriadas antes deste instante (exclusivo).
pagequeryinteger de 1 a 10000 · padrão 1não
page_sizequeryinteger de 1 a 100 · padrão 20não

Respostas

  • 200 página de cobranças application/json objeto
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/charges

Cria uma cobrança — o hub escolhe o gateway

Exige a API key do tenant.

Idempotente pela Idempotency-Key, única por tenant. Mesma chave e mesmo corpo devolvem a cobrança original com 200, sem chamar gateway nenhum — qualquer que tenha sido o gateway que a atendeu, e mesmo que a política tenha mudado depois. Mesma chave com outro corpo é 409.

Roteamento. O hub tenta o primeiro gateway da política daquele meio que aceita o valor e as condições (parcelas, validade do pix, vencimento do boleto). Se ele recusar antes de criar a cobrança (fora do ar, com certeza de que nada foi criado), o hub tenta o próximo. Nunca depois de um timeout: aí a cobrança fica pending naquele gateway. Se nenhum gateway da política atende o meio, o valor e as condições — inclusive política vazia —, 422 no-route, sem nome de gateway.

A cobrança nasce pending; a mudança de status chega pelo webhook do gateway. Se o gateway não responder (502), a cobrança fica pending — timeout não prova recusa — e é resolvida pelo webhook ou pela conciliação.

Pagador. Cada gateway exige um subconjunto diferente do pagador para cada meio (por exemplo: pix pede nome, e-mail e documento; boleto pede também o endereço). O hub confere contra o gateway escolhido antes de chamá-lo e responde 422 nomeando o campo que falta (errors[].field, como payer.email) — sem procurar outro gateway que exija menos. Texto vazio equivale a ausente.

Cartão. O hub nunca recebe número, validade nem código do cartão: só o token gerado pelo formulário do gateway no navegador do pagador. Antes, o sistema pede ao hub o formulário (POST /api/v1/card-forms) e manda de volta card.form_id: a cobrança vai ao gateway daquele formulário — sem fallback, porque o token não serve em outro —, mesmo que ele tenha saído da política depois, desde que a conta continue conectada; senão, 422 em card.form_id. O token é de uso único e não é guardado; a repetição com a mesma Idempotency-Key devolve a cobrança sem reenviá-lo. Parcelas acima do que o gateway aceita, ou em gateway que não parcela, são 422. Quando o gateway exige uma ação do pagador (3-D Secure), a cobrança fica pending e a resposta traz card.action_url.

Gateway indisponível. 502 em dois casos, com detail diferente: (1) o gateway não respondeu — a cobrança fica pending, e pode ter sido criada lá; consulte-a antes de tentar de novo; (2) todos os gateways possíveis recusaram antes de criar — a cobrança fica failed com failure_reason provider_unavailable, e nada foi cobrado.

Recusa do gateway (cartão negado, token gasto ou expirado) não é erro HTTP: a cobrança volta com status failed e failure_reason.

card, pix e boleto só valem para o method de mesmo nome; enviados com outro meio, 422.

Referência e metadados. reference é o pedido no sistema (não é única: um pedido pode ter várias tentativas) e metadata é um conjunto pequeno de pares chave-valor. O hub não interpreta nenhum dos dois, devolve-os em toda leitura e em todo aviso da cobrança, e não os muda depois da criação. Eles fazem parte do corpo para a idempotência: mesma chave com outra referência ou outros metadados é 409 (a ordem das chaves de metadata não importa).

Divisão (desde a 0.10.0). Com split, a cobrança vai ao primeiro gateway da política com split nativo em que o recebedor tem vínculo ativo, e nasce na conta dele. Nenhum gateway da política com split nativo: 422 capability-not-supported; o recebedor sem vínculo em nenhum deles: 422 no-route. Recebedor que não existe ou é de outro sistema: 422 em split.recipients[0].recipient_id. A divisão faz parte do corpo para a idempotência.

Nenhum campo aceita null: para não informar, omita o campo. null em qualquer nível é 422 nomeando o campo.

O corpo precisa ser UTF-8 válido (RFC 8259); fora disso, 400 — o hub não troca bytes em silêncio. Idempotency-Key fora de UTF-8 ou com caractere de controle é 422.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
Idempotency-Keyheaderstring de 1 a 255 caracteressim

Corpo application/json

CreateCharge

Campos do corpo
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simUnidade mínima da moeda. Em cartão parcelado é o total — o hub não calcula juros de parcelamento.
currencystring padrão ^[A-Z]{3}$sim
methodstring card pix boletosim
descriptionstring máximo 500 caracteres · padrão ^[^\x00]*$nãoQuebra de linha vale; o caractere NUL (\\u0000) é 422.
payerPayernão
cardCardInputnão
pixPixInputnão
boletoBoletoInputnão
referenceReferencenão
metadataMetadatanão
device_idstring máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoIdentificador antifraude do dispositivo do pagador, quando o gateway usa um. O hub o repassa sem interpretar e não o guarda.
splitSplitInputnão

Respostas

  • 200 repetição da mesma Idempotency-Key — a cobrança original application/json Charge
  • 201 criada application/json Charge
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 409 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited
  • 502 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable

POST /api/v1/recipients

Cadastra um recebedor do sistema

Exige a API key do tenant.

Desde a 0.10.0 (spec 0017). O recebedor é quem fica com a parte de uma venda dividida — a loja parceira, o prestador —, numa conta em nome próprio no gateway. É do sistema que o cadastrou: o de outro sistema é 404.

Idempotente pela reference (o id do recebedor no seu sistema), única por sistema: a mesma referência com o mesmo nome devolve o recebedor já cadastrado com 200; com outro nome, 409. O recebedor nasce sem vínculo: a conta dele no gateway entra pela autorização (POST /api/v1/recipients/{id}/links).

Corpo application/json

CreateRecipient

Campos do corpo
CampoTipoObrigatórioDescrição
namestring de 1 a 100 caracteressim
referencestring de 1 a 255 caracteressimo id do recebedor no seu sistema — única por sistema

Respostas

  • 200 a mesma referência — o recebedor já cadastrado application/json Recipient
  • 201 cadastrado application/json Recipient
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 409 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/recipients/{id}

Consulta um recebedor do sistema, com os vínculos

Exige a API key do tenant.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
idpathstring formato uuidsim

Respostas

  • 200 o recebedor application/json Recipient
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 404 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/card-forms

Qual formulário de cartão usar para esta cobrança

Exige a API key do tenant.

O sistema pergunta "vou cobrar cartão de R$ X" e o hub responde com o gateway, a chave pública do formulário dele e o que ele exige — o máximo de parcelas e os campos do pagador. O sistema monta o formulário do gateway no navegador do pagador com a public_key, recebe o token e cria a cobrança com card.form_id = id.

O gateway é o primeiro da política de cartão do sistema que aceita o valor e as parcelas e tem conta conectada. Nenhum: 422 no-route, sem nome de gateway. O formulário não cobra nada e não expira no hub — o token é que expira, no gateway.

Cobrança dividida (desde a 0.10.0): informe recipient_id, e o formulário é o da conta do recebedor — a cobrança de cartão com split exige este formulário, do mesmo recebedor (422 em card.form_id se não for).

O corpo precisa ser UTF-8 válido (RFC 8259); fora disso, 400.

Corpo application/json

CardFormRequest

Campos do corpo
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simunidade mínima da moeda
currencystring padrão ^[A-Z]{3}$sim
installmentsinteger de 1 a 24 · padrão 1não
recipient_idstring formato uuidnãodesde a 0.10.0 — o recebedor da cobrança dividida; o formulário é o da conta dele

Respostas

  • 201 o formulário a usar application/json CardForm
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/charges/{id}

Consulta uma cobrança do tenant

Exige a API key do tenant.

Cobrança de outro tenant responde 404, igual a uma que não existe.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
idpathstring formato uuidsim

Respostas

  • 200 a cobrança application/json Charge
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 404 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/charges/{id}/refunds

Lista os estornos de uma cobrança, do mais antigo ao mais novo

Exige a API key do tenant.

Todos os estornos da cobrança — pedidos pela API e feitos no painel do gateway —, em qualquer estado, na ordem total created_at crescente e, no empate, id crescente. Cobrança de outro tenant responde 404, igual a uma que não existe. Parâmetro de consulta desconhecido é 422.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
idpathstring formato uuidsim
pagequeryinteger de 1 a 10000 · padrão 1não
page_sizequeryinteger de 1 a 100 · padrão 20não

Respostas

  • 200 página de estornos application/json objeto
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 404 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/charges/{id}/refunds

Pede o estorno de uma cobrança capturada, inteiro ou em parte

Exige a API key do tenant.

Idempotente pela Idempotency-Key, única por tenant entre os pedidos de estorno (o espaço de chaves é separado do da criação de cobrança). Mesma chave e mesmo corpo devolvem o mesmo estorno com 200, no estado em que ele está; mesma chave com outro corpo, ou para outra cobrança, é 409.

Estornável. Cabe pedir enquanto amount ≤ capturado − estornos confirmados − estornos pendentes − disputa perdida. O estorno pendente reserva o valor: outro pedido não pode usá-lo até ele se resolver; o que falha libera a reserva. Acima do estornável é 409, sem chamar o gateway. Vários parciais valem, enquanto couberem.

Quando a cobrança muda. Ela passa a refunded quando a soma dos estornos confirmados chega ao capturado — antes disso continua captured, com refunded_amount e pending_refund_amount dizendo quanto. A mudança de status sai num aviso charge.updated, como hoje.

Resultado. 201 com o estorno em um destes estados:

- succeeded — confirmado pelo gateway; lançado no ledger. - pending — o gateway aceitou e confirma depois; o valor fica reservado, e a confirmação chega pelo aviso refund.updated. - failed — recusa de negócio do gateway (prazo vencido, saldo insuficiente na conta, estorno não permitido), com failure_reason. Não é erro HTTP: a requisição deu certo, o estorno não. A reserva é liberada.

Gateway sem resposta. 502, e o estorno fica pending com o valor reservado: timeout não prova recusa — o gateway pode ter estornado, e o aviso de confirmação que chegar depois é aplicado normalmente. Repita o pedido com a mesma Idempotency-Key: o hub refaz a chamada com o mesmo id de estorno (o gateway não estorna duas vezes) e devolve o estado atual.

409 quando a cobrança não está captured (pendente, autorizada, falha, cancelada, estornada — inclusive depois de uma disputa perdida, que sempre a leva a refunded), quando está em disputa (disputed), ou quando o valor passa do estornável. 422 quando o gateway da cobrança não faz estorno parcial e amount é diferente do valor da cobrança, ou quando o gateway não estorna pela API o meio da cobrança (o boleto, em alguns gateways) — capability-not-supported, sem gravar estorno e sem chamar o gateway.

Cobrança dividida (desde a 0.11.0; antes, o parcial era 422). O estorno parcial é aceito como o de qualquer cobrança e é proporcional à divisão: numa cobrança de 10000 com comissão 2000, estornar 5000 devolve 4000 da parte do recebedor e 1000 da comissão. A divisão é feita sobre o valor lançado do estorno, quando o gateway o confirma, e aparece em split no estorno succeeded.

Descrição. description é do sistema: fica no hub, volta na consulta e nunca é enviada ao gateway. Ao gateway vai só reason.

Nenhum campo aceita null; o corpo precisa ser UTF-8 válido (fora disso, 400).

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
idpathstring formato uuidsim
Idempotency-Keyheaderstring de 1 a 255 caracteressim

Corpo application/json

CreateRefund

Campos do corpo
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simUnidade mínima da moeda da cobrança. Igual ao valor da cobrança é estorno total; menor, parcial.
reasonstring requested_by_customer duplicate fraudulent othersimLista fechada na entrada: fora dela, 422. Pedido do pagador, cobrança duplicada, suspeita de fraude, outro.
descriptionstring máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoDo sistema: fica no hub e volta na consulta. Nunca é enviada ao gateway — não ponha dado do pagador aqui.

Respostas

  • 200 repetição da mesma Idempotency-Key — o estorno, no estado atual application/json Refund
  • 201 estorno registrado — succeeded, pending ou failed application/json Refund
  • 400 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 404 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 409 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited
  • 502 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable

GET /api/v1/refunds/{id}

Consulta um estorno do tenant

Exige a API key do tenant.

Estorno de outro tenant responde 404, igual a um que não existe.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
idpathstring formato uuidsim

Respostas

  • 200 o estorno application/json Refund
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 404 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/wallets

Saldo de cada carteira do tenant, por gateway e moeda

Exige a API key do tenant.

Derivado do ledger — soma das partidas, nunca um campo guardado. balance é o líquido (gross − fees, no centavo); gross e fees o decompõem, e pending_fee_charges/pending_fee_gross contam as cobranças cuja taxa ainda não foi informada pelo gateway.

Respostas

  • 200 carteiras application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/ledger/entries

Lançamentos do tenant, do mais recente ao mais antigo

Exige a API key do tenant.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
pagequeryinteger mínimo 1 · padrão 1não
page_sizequeryinteger de 1 a 100 · padrão 20não

Respostas

  • 200 página de lançamentos application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/subaccounts

Saldo de cada subconta virtual do tenant, por gateway e moeda

Exige a API key do tenant.

A subconta virtual registra quanto do dinheiro da conta da plataforma num gateway foi gerado por este sistema e ainda não foi repassado a ele (ADR 0007). Derivado do ledger — soma dos lançamentos, nunca um campo guardado. Um sistema que só cobra com credencial própria não tem subconta (lista vazia): o dinheiro dele vai direto para a conta dele, e o saldo está em GET /api/v1/wallets.

O saldo é um número só (balance), e pode ficar negativo — um estorno ou uma disputa perdida depois do repasse. As disputas abertas e as taxas ainda não informadas aparecem só como informação, sem lançamento: não estão no saldo.

Respostas

  • 200 subcontas application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

GET /api/v1/subaccounts/entries

Extrato de uma subconta, do lançamento mais recente ao mais antigo

Exige a API key do tenant.

Cada lançamento que mexeu na subconta, com a cobrança, o estorno ou o repasse que o causou. Ordem total: created_at decrescente, id decrescente — nenhum lançamento se repete nem some entre páginas. Parâmetro desconhecido é 422. Subconta que não existe devolve a página vazia.

A contrapartida de cada lançamento é a conta da plataforma no gateway, mostrada só como counterparty {type: platform_account, provider} — sem saldo, sem identificador e sem nada de outro sistema.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
providerquerystring de 1 a 64 caracteressim
currencyquerystring padrão ^[A-Z]{3}$sim
pagequeryinteger de 1 a 100000 · padrão 1não
page_sizequeryinteger de 1 a 100 · padrão 20não

Respostas

  • 200 página do extrato application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 422 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/webhooks/{provider}/{tenantID}

Recebe o webhook de um gateway

Sem API key.

Sem API key: quem chama é o gateway. A autenticação é a assinatura, verificada com o segredo de webhook daquele tenant naquele gateway. Evento repetido, fora de ordem ou de cobrança desconhecida responde 200 — devolver erro faria o gateway reenviar para sempre — e fica registrado com o desfecho.

Estornos. O evento de estorno se casa com o estorno pelo id que o gateway deu a ele: resposta do pedido, webhook e consulta, em qualquer ordem, lançam uma vez só. Estorno feito no painel do gateway vira estorno novo da cobrança, lançado pelo valor informado; sem valor, fica registrado sem efeito para investigação (under_review) — nunca pelo total.

Taxas. O evento pode trazer a taxa do gateway, da captura ou de um estorno. O hub lança a diferença entre o total informado e o que já lançou para aquela origem: a mesma taxa repetida não lança nada; a corrigida lança o ajuste. Informação mais antiga que a última aplicada, ou da mesma hora com outro total, fica registrada sem efeito. Taxa que chega antes da captura (ou do estorno) espera e é lançada junto com ela. Taxa de cobrança falha, cancelada, em outra moeda, ou de estorno que falhou fica registrada como divergência, sem lançamento — assim como a taxa malformada (total negativo, moeda fora do formato); taxa de cobrança desconhecida, sem efeito. O desfecho é o do status; um evento sem efeito no status vira applied só quando a taxa foi lançada.

Antes da assinatura, uma resposta só (desde a 0.11.1). Identificador do caminho mal formado, sistema ou conta que não existe, sistema sem conta naquele gateway, gateway desconhecido e assinatura inválida ou ausente respondem o mesmo 401 invalid-signature, sem dizer o motivo: quem não assina não descobre o que existe.

Limite de taxa (desde a 0.14.0). O 429 por origem e o de assinatura inválida (por origem e caminho) saem antes de a assinatura ser conferida; o gateway reenvia depois. Nada é gravado.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
providerpathstringsim
tenantIDpathstring formato uuidsim

Corpo application/json

object

Respostas

  • 200 evento processado application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 413 corpo acima de 1 MiB (1048576 bytes) application/problem+json Problemhttps://abeesys.com/errors/payload-too-large
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/marketplace-webhooks/{accountID}

Recebe o aviso do gateway ao marketplace de uma conta da plataforma

Sem API key.

Desde a 0.10.0 (spec 0017). O aviso de uma cobrança criada pelo marketplace da conta da plataforma na conta de um recebedor. O caminho identifica a conta da plataforma, nunca um sistema; a autenticação é a assinatura com o segredo do marketplace dela. A cobrança é achada pelo id do gateway, só entre as criadas por este marketplace na conta daquele recebedor; o sistema sai dela. Aviso desta rota nunca mexe em cobrança da conta de um sistema nem da conta da plataforma, e vice-versa.

Como nas outras rotas: repetido, fora de ordem ou sem cobrança deste marketplace responde 200 e fica registrado com o desfecho.

Antes da assinatura, uma resposta só (desde a 0.11.1). Identificador do caminho mal formado, conta que não existe, conta sem marketplace neste gateway e assinatura inválida ou ausente respondem o mesmo 401 invalid-signature, sem dizer o motivo: quem não assina não descobre o que existe.

Limite de taxa (desde a 0.14.0). O 429 por origem e o de assinatura inválida (por origem e caminho) saem antes de a assinatura ser conferida; o gateway reenvia depois. Nada é gravado.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
accountIDpathstring formato uuidsim

Corpo application/json

object

Respostas

  • 200 aviso processado application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 413 corpo acima de 1 MiB (1048576 bytes) application/problem+json Problemhttps://abeesys.com/errors/payload-too-large
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

POST /api/v1/platform-webhooks/{accountID}

Recebe o webhook de uma conta da plataforma num gateway

Sem API key.

A conta da plataforma (da Lopes Tech) atende vários sistemas: por isso o caminho identifica a conta, nunca um tenant. Sem API key: quem chama é o gateway. A autenticação é a assinatura, verificada com o segredo daquela conta, antes de qualquer leitura do corpo.

A cobrança é achada pelo identificador que o gateway deu na criação, buscado só entre as cobranças criadas nesta conta — nunca por referência ou metadado do corpo. O sistema dono da cobrança sai dela. Evento desta conta nunca mexe em cobrança criada na conta própria de um sistema, e vice-versa. Nos gateways que não assinam o webhook, o evento só move dinheiro depois de confirmado por consulta com a credencial da conta; divergência entre evento e consulta fica registrada sem efeito (under_review).

Como na rota do tenant: evento repetido, fora de ordem ou sem cobrança desta conta responde 200 e fica registrado com o desfecho; o repetido não produz efeito.

Antes da assinatura, uma resposta só (desde a 0.11.1). Identificador do caminho mal formado, conta que não existe e assinatura inválida ou ausente respondem o mesmo 401 invalid-signature, sem dizer o motivo: quem não assina não descobre o que existe.

Limite de taxa (desde a 0.14.0). O 429 por origem e o de assinatura inválida (por origem e caminho) saem antes de a assinatura ser conferida; o gateway reenvia depois. Nada é gravado.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
accountIDpathstring formato uuidsim

Corpo application/json

object

Respostas

  • 200 evento processado application/json objeto
  • 401 erro (RFC 9457) application/problem+json Problemhttps://abeesys.com/errors/no-route https://abeesys.com/errors/conflict https://abeesys.com/errors/provider-unavailable
  • 413 corpo acima de 1 MiB (1048576 bytes) application/problem+json Problemhttps://abeesys.com/errors/payload-too-large
  • 429 acima do limite de taxa — nada foi gravado e nenhum gateway foi chamado application/problem+json Problemhttps://abeesys.com/errors/rate-limited

Avisos

POST aviso chargeUpdated

O aviso de mudança de cobrança — quem implementa é o sistema cliente

Enviado pelo hub ao endereço do sistema.

A cada mudança de cobrança, o hub envia um POST ao endereço que o sistema cadastrou com quem opera a plataforma (tenant notify --slug <sistema> --url https://…). O cadastro devolve o segredo de assinatura do sistema uma vez (whsec_…); guarde-o como credencial. Cada sistema recebe só avisos das próprias cobranças, assinados com o próprio segredo.

O que o aviso leva: o id do aviso, o tipo, o instante da mudança, o status anterior e a cobrança no mesmo formato de GET /api/v1/charges/{id} — sem payer. Quem precisar do pagador consulta a cobrança. O aviso nunca leva credencial, dado de cartão nem resposta do gateway.

Tipos (lista aberta — ignore com 2xx o que não conhece):

- charge.updated — a cobrança mudou de status. - refund.updated — um estorno chegou a succeeded ou failed. Leva também refund, o estorno no formato de GET /api/v1/refunds/{id}. Um estorno que leva a cobrança a refunded produz os dois avisos, nesta ordem: refund.updated e charge.updated. - subaccount.payout — quem opera registrou um repasse do saldo de uma subconta virtual do sistema (feito fora do hub, pela conta da plataforma no gateway), ou o reverso de um. Leva payout e não leva charge nem previous_status. - recipient.link_updated — desde a 0.10.0: o vínculo de um recebedor foi gravado, ou ficou inativo (a autorização foi desfeita, ou o gateway recusou a renovação). Leva recipient_id e recipient_link; não leva charge.

Assinatura — padrão [Standard Webhooks](https://www.standardwebhooks.com/), que tem biblioteca pronta em várias linguagens:

  1. tire o prefixo whsec_ do segredo e decodifique o resto em base64: são os 32 bytes da chave;
  2. monte o conteúdo assinado: <webhook-id>.<webhook-timestamp>.<corpo> — o corpo cru, byte a byte como chegou, antes de qualquer parse;
  3. calcule HMAC-SHA256(chave, conteúdo) e codifique em base64 (padrão, com =);
  4. webhook-signature traz uma ou mais assinaturas separadas por espaço, cada uma no formato v1,<base64>; aceite o aviso se alguma for igual à sua, comparando em tempo constante.

Anti-replay: recuse o aviso se webhook-timestamp estiver a mais de 5 minutos do seu relógio, para trás ou para a frente — um aviso capturado não pode ser reapresentado depois. Cada tentativa é assinada de novo com o instante do envio, então uma repetição legítima nunca chega com instante velho.

Exemplo que bate (corpo curto, para caber):

`` segredo whsec_AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyA= webhook-id 5f0c1a52-8f5e-4d7a-9a3e-2b1c4d6e8f90 webhook-timestamp 1791115200 corpo {"id":"5f0c1a52-8f5e-4d7a-9a3e-2b1c4d6e8f90","type":"charge.updated"} webhook-signature v1,StqoxgeT0W+w6bY3yMQDrlug4zz1qK/xxAbJGZMPfeA= ``

Repetição e ordem. O mesmo aviso pode chegar mais de uma vez (o hub reinicia, a sua resposta se perde): o id — igual ao cabeçalho webhook-id — não muda entre tentativas; guarde-o e ignore o repetido. Os avisos de uma mesma cobrança chegam na ordem em que aconteceram: o seguinte só sai depois de o anterior ser entregue. Avisos de cobranças diferentes não têm ordem entre si.

Resposta. Qualquer 2xx, com qualquer corpo, é entregue. Qualquer outra coisa é falha: outro status (inclusive 3xx — redirecionamento não é seguido), mais de 10 segundos sem resposta, conexão recusada, TLS inválido. Responda rápido e processe depois.

Tentativas. Depois de uma falha, o hub espera 10 s e tenta de novo, dobrando a espera a cada falha até 1 hora entre tentativas, por até 24 horas contadas da primeira tentativa. Esgotado o prazo, o aviso fica como não entregue, visível a quem opera, que pode pedir o reenvio; os avisos seguintes da mesma cobrança esperam o reenvio, para não chegarem fora de ordem. Avisos de outras cobranças seguem normalmente.

Endereço. Só https. Endereço de rede interna (localhost, IP privado ou link-local, *.railway.internal, nome sem domínio) é recusado no cadastro e na hora de conectar, pelo IP resolvido.

Parâmetros

Parâmetros
NomeOndeTipoObrigatórioDescrição
webhook-idheaderstring formato uuidsimo id do aviso — igual a id no corpo; estável entre tentativas
webhook-timestampheaderstring padrão ^[0-9]+$simo instante do envio, em segundos desde 1970-01-01T00:00:00Z
webhook-signatureheaderstringsimv1,<base64 do HMAC-SHA256> — uma ou mais, separadas por espaço

Corpo application/json

Notice

Campos do corpo
CampoTipoObrigatórioDescrição
idstring formato uuidsimo id do aviso — estável entre tentativas; o sistema deduplica por ele
typestringsimO tipo do aviso: charge.updated, refund.updated, subaccount.payout ou recipient.link_updated. Lista aberta: ignore (com 2xx) o tipo que não conhece. charge e previous_status estão em todo charge.updated e refund.updated; payout, só em subaccount.payout; recipient_id e recipient_link, só em recipient.link_updated.
created_atstring formato date-timesimo instante da mudança — não o do envio, que vai em webhook-timestamp
previous_statusqualquer valornãoO status da cobrança antes do fato. Em refund.updated, é igual ao status de charge quando o estorno não mudou a cobrança.
chargequalquer valornãoA cobrança como ficou depois desta mudança, no formato da consulta, sem payer e sem fee — a taxa não gera aviso, e o retrato não a acompanha. É o retrato daquele momento: dois avisos da mesma cobrança contam a história, não repetem o estado atual.
refundqualquer valornãoSó em refund.updated — o estorno como ficou.
payoutqualquer valornãoSó em subaccount.payout — o repasse como ficou.
recipient_idstring formato uuidnãoSó em recipient.link_updated — o recebedor do vínculo.
recipient_linkqualquer valornãoSó em recipient.link_updated — o vínculo como ficou.

Respostas

  • 2XX entregue; o corpo da resposta é ignorado
  • default falha; o hub tenta de novo com espera crescente

Tipos

CreateCharge

objeto

Não há campo de gateway: quem escolhe é o hub. provider enviado é 422 (campo desconhecido).

Campos de CreateCharge
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simUnidade mínima da moeda. Em cartão parcelado é o total — o hub não calcula juros de parcelamento.
currencystring padrão ^[A-Z]{3}$sim
methodstring card pix boletosim
descriptionstring máximo 500 caracteres · padrão ^[^\x00]*$nãoQuebra de linha vale; o caractere NUL (\\u0000) é 422.
payerPayernão
cardCardInputnão
pixPixInputnão
boletoBoletoInputnão
referenceReferencenão
metadataMetadatanão
device_idstring máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoIdentificador antifraude do dispositivo do pagador, quando o gateway usa um. O hub o repassa sem interpretar e não o guarda.
splitSplitInputnão

SplitInput

objeto

Desde a 0.10.0. A parte do recebedor; o resto do valor é a comissão do sistema. No percentual, a parte é o piso de amount × percentage_bps / 10000 e o resto do arredondamento fica na comissão — parte + comissão = valor, sempre.

Campos de SplitInput
CampoTipoObrigatórioDescrição
recipientslista de objeto de 1 a 1 itenssim
recipients[].recipient_idstring formato uuidsim
recipients[].amountinteger formato int64 · mínimo 1nãoa parte do recebedor, em unidade mínima, até o valor da cobrança
recipients[].percentage_bpsinteger de 1 a 10000nãoa parte do recebedor em pontos-base (10000 = 100%)
fee_payerstring recipient padrão "recipient"nãoQuem arca com a taxa do gateway. Hoje só recipient: a taxa é debitada na conta do recebedor, onde a cobrança nasce.

SplitDetails

objeto

Campos de SplitDetails
CampoTipoObrigatórioDescrição
recipientslista de objetosim
recipients[].recipient_idstring formato uuidsim
recipients[].amountinteger formato int64sima parte pedida do recebedor
commissioninteger formato int64sima comissão pedida
applied_commissioninteger formato int64nãoA comissão que o gateway diz ter aplicado, quando informa. Diferente da pedida, é ela que o ledger lança — a diferença fica visível aqui.
fee_payerstring recipientsim
refunded_recipient_amountinteger formato int64nãoDesde a 0.11.0. O total já devolvido da parte do recebedor pelos estornos confirmados. Com refunded_commission, soma o refunded_amount da cobrança.
refunded_commissioninteger formato int64nãoDesde a 0.11.0. O total já devolvido da comissão pelos estornos confirmados.

CreateRecipient

objeto

Campos de CreateRecipient
CampoTipoObrigatórioDescrição
namestring de 1 a 100 caracteressim
referencestring de 1 a 255 caracteressimo id do recebedor no seu sistema — única por sistema

Recipient

objeto

Campos de Recipient
CampoTipoObrigatórioDescrição
idstring formato uuidsim
namestringsim
referencestringsim
linkslista de RecipientLinksim
created_atstring formato date-timesim

RecipientLinkAuthorization

objeto

Campos de RecipientLinkAuthorization
CampoTipoObrigatórioDescrição
authorization_urlstring formato urisim
expires_atstring formato date-timesim

Payer

objeto

Quem paga. O que é obrigatório depende do gateway e do meio. Dado pessoal: só o tenant dono da cobrança o vê, e o hub não o escreve em log.

Campos de Payer
CampoTipoObrigatórioDescrição
namestring máximo 200 caracteres · padrão ^[^\x00-\x1F\x7F]*$não
emailstring formato email · máximo 254 caracteresnão
documentDocumentnão
phonestring padrão ^\+[1-9][0-9]{7,14}$nãoE.164, com o código do país. O exemplo é fictício.
addressAddressnão

Document

objeto

Campos de Document
CampoTipoObrigatórioDescrição
typestring cpf cnpjsim
numberstring padrão ^[0-9A-Z]{11,14}$simSem pontuação. CPF com 11 dígitos; CNPJ com 14 posições, inclusive no formato alfanumérico da Receita. O dígito verificador é conferido: inválido é 422. Os exemplos são números fictícios de teste, de ninguém.

Address

objeto

Para country = BR, state é a UF (duas letras) e postal_code o CEP com 8 dígitos, sem hífen.

Campos de Address
CampoTipoObrigatórioDescrição
streetstring máximo 200 caracteres · padrão ^[^\x00-\x1F\x7F]*$sim
numberstring máximo 20 caracteres · padrão ^[^\x00-\x1F\x7F]*$sim
complementstring máximo 100 caracteres · padrão ^[^\x00-\x1F\x7F]*$não
districtstring máximo 100 caracteres · padrão ^[^\x00-\x1F\x7F]*$sim
citystring máximo 100 caracteres · padrão ^[^\x00-\x1F\x7F]*$sim
statestring máximo 64 caracteres · padrão ^[^\x00-\x1F\x7F]*$sim
postal_codestring máximo 16 caracteres · padrão ^[0-9A-Za-z -]*$sim
countrystring padrão ^[A-Z]{2}$simISO 3166-1 alfa-2

CardInput

objeto

Campos de CardInput
CampoTipoObrigatórioDescrição
form_idstring formato uuidsimO id devolvido por POST /api/v1/card-forms. Diz ao hub de qual gateway é o token. Formulário inexistente, de outro sistema, ou de um gateway cuja conta foi desconectada: 422 neste campo.
tokenstring máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F]*$simGerado pelo formulário do gateway no navegador do pagador. Uso único.
installmentsinteger de 1 a 24 · padrão 1nãoCada gateway aceita até um número próprio; acima dele, 422.
return_urlstring formato uri · máximo 2048 caracteres · padrão ^https://[^/\x00-\x20\x7F-\x9F][^\x00-\x20\x7F-\x9F]*$nãoDesde a 0.9.0. Para onde o pagador volta depois de uma autenticação extra do emissor (3-D Secure): uma página do sistema, em https, com host, sem espaço nem caractere de controle. Obrigatório quando o formulário declarou return_url_required (422 neste campo se faltar); para os outros gateways, aceito e ignorado. O gateway pode acrescentar parâmetros dele ao endereço na volta; o resultado da cobrança chega pelo aviso, não pela volta.

PixInput

objeto

Campos de PixInput
CampoTipoObrigatórioDescrição
expires_ininteger de 1 a 2592000nãoValidade do código, em segundos. Ausente: o padrão do gateway. Fora da faixa que o gateway aceita, 422.

BoletoInput

objeto

Campos de BoletoInput
CampoTipoObrigatórioDescrição
due_datestring formato datenãoVencimento. Ausente: o padrão do gateway. Fora da faixa que o gateway aceita (contada em dias a partir de hoje, em UTC), 422.

Reference

string máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$

A referência do pedido no sistema cliente (o ingresso reservado, a mensalidade). O hub não a interpreta e ela não é única: várias cobranças do mesmo pedido — uma que falhou, outra que passou — têm a mesma referência, e a listagem por referência devolve todas. Texto vazio equivale a ausente. Na resposta e no aviso está sempre presente: texto vazio quando a cobrança não tem referência.

Metadata

object

Pares chave-valor que o sistema quer ver de volta em toda leitura e em todo aviso da cobrança. Até 20 chaves; chave com 1 a 40 caracteres, valor com até 500, ambos texto sem caractere de controle. Acima disso, 422 nomeando o campo (metadata ou metadata.<chave>).

Não é lugar para dado de cartão nem dado pessoal do pagador (documento, e-mail, telefone, nome): o pagador tem campo próprio, com o tratamento que dado pessoal exige. Metadados são guardados e repetidos nos avisos como vieram.

Objeto vazio equivale a ausente. Na resposta e no aviso está sempre presente: objeto vazio quando a cobrança não tem metadados.

PageMeta

objeto

Campos de PageMeta
CampoTipoObrigatórioDescrição
totalinteger mínimo 0simquantas cobranças atendem aos filtros
pageinteger mínimo 1sim
page_sizeinteger de 1 a 100sim

ChargeStatus

string pending authorized captured refunded failed canceled disputed

Charge

objeto

Campos de Charge
CampoTipoObrigatórioDescrição
idstring formato uuidsim
settles_instringsimOnde a cobrança liquida — informação, desde a 0.8.0. Lista aberta. tenant_account: na conta do próprio sistema no gateway (o saldo aparece em GET /api/v1/wallets). virtual_subaccount: na conta da plataforma naquele gateway, alocado na subconta virtual do sistema (GET /api/v1/subaccounts). recipient_account (desde a 0.10.0): na conta do recebedor da divisão; só a comissão vai à subconta virtual. Não muda depois de a cobrança chegar ao gateway.
providerstringsimO gateway que atende a cobrança — informação para suporte e conciliação, não para o sistema decidir nada. Enquanto pending depois de um 502, é o gateway que não respondeu. Em failed com failure_reason provider_unavailable, é o último gateway que recusou — nenhum deles criou a cobrança.
external_idstringnãoid no gateway
amountinteger formato int64sim
currencystringsim
methodstring card pix boletosim
statusChargeStatus pending authorized captured refunded failed canceled disputedsim
descriptionstringsim
referenceReferencesim
metadataMetadatasim
payerqualquer valornãoSó na consulta, na listagem e na resposta da criação — nunca no aviso: o dado pessoal do pagador não sai do hub por um canal que repete a mensagem por até 24 h.
cardCardDetailsnão
pixPixInstructionsnão
boletoBoletoInstructionsnão
splitqualquer valornãoSó na cobrança dividida (desde a 0.10.0).
failure_reasonstringnãoSó em failed. Vocabulário do hub, igual em todo gateway, e lista aberta — trate valor desconhecido como recusa genérica. Hoje: card_declined, insufficient_funds, card_token_invalid (token expirado, já usado ou desconhecido), payer_action_failed (3-D Secure não concluído), provider_rejected (recusa sem motivo mais específico), provider_unavailable (todos os gateways possíveis recusaram antes de criar; nada foi cobrado).
pix_copy_pastestringnãosó em cobrança pix. Use pix.copy_paste.
refunded_amountinteger formato int64 · mínimo 0nãoQuanto já foi estornado e lançado no ledger: a soma dos estornos succeeded. Não inclui disputa perdida. Na resposta está sempre presente (0 sem estorno).
pending_refund_amountinteger formato int64 · mínimo 0nãoQuanto está reservado por estornos pending: não pode ser pedido de novo até eles se resolverem. Na resposta está sempre presente (0 sem estorno pendente).
feequalquer valornãoA taxa do gateway (spec 0008). Só em cobrança que chegou a ser capturada (captured, disputed, refunded) — antes disso não há taxa a esperar. Não vem no aviso: consulte a cobrança.
created_atstring formato date-timesim
updated_atstring formato date-timesim

ChargeFee

objeto

Campos de ChargeFee
CampoTipoObrigatórioDescrição
statusstringsimLista aberta. pending: o gateway ainda não informou a taxa da captura — ela não é zero, é desconhecida. posted: informou, e o total está lançado (pode ser 0, se o gateway não cobrou).
amountinteger formato int64simO lançado de taxa da cobrança, todas as origens somadas (captura e estornos), na moeda da cobrança. 0 enquanto nada foi lançado.
currencystringsim
originslista de objetosimO lançado por origem, para as origens com taxa lançada. A soma é amount. A taxa de um estorno não volta quando o estorno acontece: ela é dele, separada da taxa da captura.
origins[].originstringsimLista aberta. capture (a captura), refund (um estorno) ou, desde a 0.9.0, dispute (a tarifa que o gateway cobra pela contestação da cobrança, quando cobra; uma origem por cobrança, sem refund_id).
origins[].refund_idstring formato uuidnãosó em refund — o estorno que é a origem da taxa
origins[].amountinteger formato int64sim

CardFormRequest

objeto

Campos de CardFormRequest
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simunidade mínima da moeda
currencystring padrão ^[A-Z]{3}$sim
installmentsinteger de 1 a 24 · padrão 1não
recipient_idstring formato uuidnãodesde a 0.10.0 — o recebedor da cobrança dividida; o formulário é o da conta dele

CardForm

objeto

Campos de CardForm
CampoTipoObrigatórioDescrição
idstring formato uuidsimvai de volta em card.form_id
providerstringsimO gateway do formulário — informação; o sistema não decide nada com ela.
public_keystringsimChave pública (publicável) do formulário do gateway. Não é segredo.
max_installmentsinteger de 1 a 24sim
payer_fieldslista de string payer.name payer.email payer.document payer.phone payer.addresssimOs campos do pagador que este gateway exige para cartão.
return_url_requiredbooleansimDesde a 0.9.0. true: o gateway deste formulário exige card.return_url na cobrança — para onde o pagador volta depois de uma autenticação extra do emissor (3-D Secure). Sem ele, 422 em card.return_url.
created_atstring formato date-timesim

CardDetails

objeto

Campos de CardDetails
CampoTipoObrigatórioDescrição
installmentsinteger de 1 a 24sim
action_urlstring formato urinãoSó enquanto pending, quando o gateway exige uma ação do pagador (3-D Secure). O sistema leva o pagador até ela; o resultado chega pelo webhook.

PixInstructions

objeto

Campos de PixInstructions
CampoTipoObrigatórioDescrição
copy_pastestringsimo código "copia e cola"
qr_code_imagestringnãoImagem do QR — URL https ou data URI (data:image/png;base64,...).
expires_atstring formato date-timenão

BoletoInstructions

objeto

Campos de BoletoInstructions
CampoTipoObrigatórioDescrição
digitable_linestringsimlinha digitável
urlstring formato urinãoendereço do boleto para o pagador
due_datestring formato datenão

Notice

objeto

Campos de Notice
CampoTipoObrigatórioDescrição
idstring formato uuidsimo id do aviso — estável entre tentativas; o sistema deduplica por ele
typestringsimO tipo do aviso: charge.updated, refund.updated, subaccount.payout ou recipient.link_updated. Lista aberta: ignore (com 2xx) o tipo que não conhece. charge e previous_status estão em todo charge.updated e refund.updated; payout, só em subaccount.payout; recipient_id e recipient_link, só em recipient.link_updated.
created_atstring formato date-timesimo instante da mudança — não o do envio, que vai em webhook-timestamp
previous_statusqualquer valornãoO status da cobrança antes do fato. Em refund.updated, é igual ao status de charge quando o estorno não mudou a cobrança.
chargequalquer valornãoA cobrança como ficou depois desta mudança, no formato da consulta, sem payer e sem fee — a taxa não gera aviso, e o retrato não a acompanha. É o retrato daquele momento: dois avisos da mesma cobrança contam a história, não repetem o estado atual.
refundqualquer valornãoSó em refund.updated — o estorno como ficou.
payoutqualquer valornãoSó em subaccount.payout — o repasse como ficou.
recipient_idstring formato uuidnãoSó em recipient.link_updated — o recebedor do vínculo.
recipient_linkqualquer valornãoSó em recipient.link_updated — o vínculo como ficou.

CreateRefund

objeto

Campos de CreateRefund
CampoTipoObrigatórioDescrição
amountinteger formato int64 · mínimo 1simUnidade mínima da moeda da cobrança. Igual ao valor da cobrança é estorno total; menor, parcial.
reasonstring requested_by_customer duplicate fraudulent othersimLista fechada na entrada: fora dela, 422. Pedido do pagador, cobrança duplicada, suspeita de fraude, outro.
descriptionstring máximo 255 caracteres · padrão ^[^\x00-\x1F\x7F-\x9F]*$nãoDo sistema: fica no hub e volta na consulta. Nunca é enviada ao gateway — não ponha dado do pagador aqui.

Refund

objeto

Campos de Refund
CampoTipoObrigatórioDescrição
idstring formato uuidsim
charge_idstring formato uuidsim
amountinteger formato int64 · mínimo 0simO valor do estorno, na moeda da cobrança: o pedido, ou o informado pelo gateway no estorno feito no painel. 0 só em under_review (o gateway não informou o valor).
currencystringsim
statusstringsimLista aberta. pending (reserva o valor; aguarda o gateway), succeeded (confirmado e lançado), failed (recusado pelo gateway, com failure_reason; a reserva é liberada), under_review (estorno do painel sem valor informado: registrado sem efeito, para investigação — não reserva, não lança).
originstringsimLista aberta. api (pedido por esta API) ou provider_dashboard (feito no painel do gateway, fora do hub).
reasonstringnãoLista aberta na saída: requested_by_customer, duplicate, fraudulent, other. Ausente em estorno do painel quando o gateway não informa.
descriptionstringsima descrição do pedido; texto vazio quando não houve
failure_reasonstringnãoSó em failed. Lista aberta: refund_window_expired (prazo do gateway vencido), insufficient_balance (saldo insuficiente na conta), refund_not_allowed, provider_rejected (recusa sem motivo mais específico).
external_idstringnãoo id do estorno no gateway, quando conhecido
created_atstring formato date-timesim
updated_atstring formato date-timesim
confirmed_atstring formato date-timenãosó em succeeded — quando o hub registrou a confirmação do gateway
splitqualquer valornãoDesde a 0.11.0. Só no estorno succeeded de cobrança dividida: quanto do valor lançado saiu da parte do recebedor e quanto saiu da comissão.

RefundSplit

objeto

Campos de RefundSplit
CampoTipoObrigatórioDescrição
recipient_amountinteger formato int64 · mínimo 0sima parte do recebedor devolvida por este estorno
commissioninteger formato int64 · mínimo 0sima comissão devolvida por este estorno; as duas partes somam o valor lançado

Wallet

objeto

Campos de Wallet
CampoTipoObrigatórioDescrição
providerstringsim
balanceinteger formato int64simO saldo: a soma das partidas da carteira (créditos menos débitos). Desde a 0.7.0, com as taxas do gateway lançadas, é o líquido — gross − fees, no centavo — e bate com o que o gateway entrega à conta do sistema.
currencystringsim
grossinteger formato int64simo bruto — capturado menos estornado menos disputa perdida
feesinteger formato int64simAs taxas do gateway lançadas, correções incluídas (taxa paga).
pending_fee_chargesinteger mínimo 0simQuantas cobranças capturadas neste gateway e moeda ainda não têm a taxa da captura informada. Informação: a taxa delas não está em fees nem em balance.
pending_fee_grossinteger formato int64simo bruto dessas cobranças (capturado menos estornado menos disputa perdida)

Subaccount

objeto

Campos de Subaccount
CampoTipoObrigatórioDescrição
providerstringsimo gateway da conta da plataforma em que o dinheiro está
currencystringsim
balanceinteger formato int64simA soma dos lançamentos da subconta: capturado − estornado − disputa perdida − taxas lançadas − repassado. Pode ser negativo (estorno ou disputa depois do repasse).
pending_fee_chargesinteger mínimo 0simInformação, sem lançamento: quantas cobranças desta subconta ainda não têm a taxa da captura informada pelo gateway. A taxa delas é pendente, não zero, e não está em balance.
pending_fee_grossinteger formato int64simo bruto dessas cobranças
open_dispute_chargesinteger mínimo 0simInformação, sem lançamento: quantas cobranças desta subconta estão em disputa aberta. O saldo só muda no desfecho.
open_dispute_amountinteger formato int64simo valor dessas cobranças (capturado − estornado)

SubaccountEntry

objeto

Campos de SubaccountEntry
CampoTipoObrigatórioDescrição
idstring formato uuidsim
kindstringsimLista aberta. charge_captured, charge_refunded, dispute_lost, provider_fee, provider_fee_adjustment, subaccount_payout (repasse), subaccount_payout_reversal (reverso de um repasse), platform_adjustment (ajuste de quem opera) e, desde a 0.11.0, subaccount_shortfall_coverage (a plataforma cobre o saldo que a devolução de uma comissão deixaria negativo). Tipo desconhecido: some amount como o de qualquer outro.
amountinteger formato int64simo efeito na subconta, com sinal — positivo entra, negativo sai
currencystringsim
charge_idstring formato uuidnãoa cobrança que causou o lançamento, quando há uma
refund_idstring formato uuidnãoo estorno que causou o lançamento (ou que é a origem da taxa)
payoutobjetonãosó nos lançamentos de repasse
payout.referencestringsima referência da transferência no extrato da conta no gateway
payout.transferred_onstring formato datesim
payout.statusstringsimLista aberta. registered ou reversed.
counterpartyobjetosim
counterparty.typestringsimLista aberta. Hoje sempre platform_account.
counterparty.providerstringsim
created_atstring formato date-timesim

EntryPageMeta

objeto

Campos de EntryPageMeta
CampoTipoObrigatórioDescrição
totalinteger mínimo 0simquantos lançamentos a subconta tem
pageinteger mínimo 1sim
page_sizeinteger de 1 a 100sim

Payout

objeto

Campos de Payout
CampoTipoObrigatórioDescrição
idstring formato uuidsim
providerstringsimo gateway da conta da plataforma de onde saiu
currencystringsim
amountinteger formato int64 · mínimo 1sim
transferred_onstring formato datesim
referencestringsim
statusstringsimLista aberta. registered (o repasse foi registrado) ou reversed (um registro errado foi revertido por inteiro; a mesma referência pode voltar com o valor certo).

LedgerEntry

objeto

Campos de LedgerEntry
CampoTipoObrigatórioDescrição
idstring formato uuidsim
charge_idstring formato uuidsim
kindstringsimO tipo do lançamento. Lista aberta (ADR 0010): hoje charge_captured (captura), charge_refunded (estorno — inteiro ou parcial, com refund_id; lançamentos de antes da 0006 não o têm), dispute_lost (disputa perdida), provider_fee (a taxa do gateway de uma origem — a captura ou um estorno — pelo total que ele informou: débito na carteira) e provider_fee_adjustment (a correção que o gateway fez depois na taxa daquela origem, pela diferença: débito na carteira para mais, crédito para menos). Um tipo desconhecido é um lançamento genérico: some as partidas dele como as de qualquer outro, senão o saldo calculado diverge do de GET /api/v1/wallets.
refund_idstring formato uuidnãoEm charge_refunded, o estorno que gerou o lançamento. Em provider_fee e provider_fee_adjustment, o estorno que é a origem da taxa — ausente quando a origem é a captura.
currencystringsim
postingslista de objeto mínimo 2 itenssim
postings[].accountstring wallet provider_clearingsim
postings[].providerstringsim
postings[].directionstring debit creditsim
postings[].amountinteger formato int64 · mínimo 1sim
created_atstring formato date-timesim

Problem

objeto

Campos de Problem
CampoTipoObrigatórioDescrição
typestring formato urisim
titlestringsim
statusintegersim
detailstringnão
errorslista de objetonão
errors[].fieldstringsim
errors[].messagestringsim