Push Transaction
Transações push (payout) transferem fundos para um destinatário — para uma conta bancária, carteira, chave PIX, endereço UPI ou cartão.
Endpoint
POST https://{FQDN}/v2/payment
Headers:
| Header | Valor |
|---|---|
Authorization | Bearer {accessToken} |
Content-Type | application/json |
O schema do país é o contrato
Cada país de payout tem seu próprio JSON Schema draft-07. Ele decide quais campos de paymentMethod existem, quais são obrigatórios, o pattern que cada um deve casar, os valores permitidos de walletOperator, se recipient.documents é obrigatório e qual moeda o recipientAmount pode carregar. Essas regras diferem por corredor e mudam conforme corredores são adicionados — um recipient fixado para um país será rejeitado pelo próximo.
Busque o schema do país de destino e construa a requisição a partir dele:
GET https://{FQDN}/schema/{countryCode}
O countryCode é ISO 3166-1 alpha-3 (BRA, IND, PHL). A resposta cobre recipient, recipientAmount e additionalData — e, nos corredores que o restringem, sender. Veja Schemas para a referência completa do endpoint.
O
senderestá presente em alguns schemas de país e ausente em outros. Onde aparece, ele aperta as regras do lado do remetente além do schema genérico de push; onde está ausente, valem apenas as regras genéricas. Isso está sendo preenchido — trate um blocosenderausente como "ainda não restrito aqui", não como "nunca será restrito". Ler o bloco no momento da requisição, em vez de guardar uma cópia, é o que mantém você à frente disso.
Este é o schema contra o qual o gateway valida o
POST /v2/payment, então é o único que responde "esse payload vai ser aceito?" para um push.
flowchart TD
A[Escolha o país de destino] --> B["GET /schema/{countryCode}"]
B --> C{"paymentMethod.type<br/>oferecido pelo corredor"}
C -->|BANK_DEPOSIT| D["accountNumber + os<br/>campos que o schema exige"]
C -->|WALLET| E["walletId + walletType<br/>+ walletOperator"]
C -->|PIX| F["key + keyType"]
C -->|CARD| G["cardTokenId"]
D --> H["Inclua recipient.documents e<br/>additionalData.paymentPurpose<br/>se o schema exigir"]
E --> H
F --> H
G --> H
H --> I["POST /v2/foreign-exchange<br/>para um fxId cotado"]
I --> J["POST /v2/payment"]
Estrutura da Requisição
Objeto Raiz
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
externalPaymentId | string | Sim | Seu identificador único do pagamento (chave de idempotência) |
ipAddress | string | Sim | Endereço IPv4 ou IPv6 do originador |
paymentType | string | Sim | "PUSH" |
amount | object | Sim | Valor de origem (o que você está enviando) |
recipientAmount | object | Sim | Valor de destino (o que o destinatário recebe) |
sender | object | Sim | Dados e endereço do remetente |
recipient | object | Sim | Dados, endereço e método de payout do destinatário |
fxId | string | Sim | Identificador da cotação de câmbio do endpoint Câmbio |
dynamicDescriptor | string | Não | Texto a exibir no extrato do destinatário |
additionalData | object | Não | Extras do corredor — veja additionalData |
Cote uma taxa de câmbio e envie o
fxIddela em todo push. É ele que vincula o pagamento à taxa que você cotou; sem ele o gateway precifica a conversão por conta própria e o destinatário pode receber um valor diferente do que você mostrou ao seu usuário. O mesmo vale para oPULLPUSH.
Não existe campo
capturenum push. Captura e pré-autorização são conceitos do lado pull; um push não tem autorização a segurar.
amount / recipientAmount
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
total | number | Sim | Valor, mínimo 0 |
currency | string | Sim | Código ISO 4217 |
O amount é o lado de origem, o recipientAmount o de destino. A moeda de destino é fixa por país — cada schema de país trava o recipientAmount.currency num enum, então BRA aceita apenas BRL e DEU apenas EUR. A única exceção é a Guiné (GIN), que aceita GNF ou XOF.
Objeto sender
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
firstName | string | Sim | Primeiro nome do remetente |
lastName | string | Sim | Sobrenome do remetente |
address | object | Sim | Endereço do remetente |
birthDate | string | Varia | YYYY-MM-DD. Obrigatório em KOR |
birthCountryCode | string | Varia | ISO alpha-3. Obrigatório em KOR |
Objeto sender.address
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
countryCode | string | Varia | Código ISO alpha-3 (ex.: "USA") |
city | string | Varia | Cidade |
line1 | string | Varia | Logradouro, linha 1 |
stateCode | string | Não | Sigla do estado (ex.: "MA") |
line2 | string | Não | Logradouro, linha 2 |
zipCode | string | Não | CEP / código postal |
O schema genérico de push exige o objeto address mas não marca nenhum campo dentro dele como obrigatório. Vários países de destino sobrescrevem isso e exigem countryCode, city e line1:
BGD, CHL, CHN, CIV, GIN, IDN, KEN, LKA, MDG, MLI, MYS, NGA, PAK, PHL, SGP, TUR
A Coreia do Sul (KOR) é a exceção no formato: ela adiciona sender.birthDate e sender.birthCountryCode — ambos validados por pattern — em vez de apertar o endereço. A China (CHN) aceita um sender.birthDate opcional além da regra de endereço.
Preencher
countryCode,cityeline1em todo push é o padrão mais seguro. Não custam nada nos corredores que não os exigem, e são justamente o que a lista acima vai continuar crescendo para abranger.
Objeto recipient
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
firstName | string | Sim | Primeiro nome do destinatário |
lastName | string | Sim | Sobrenome do destinatário |
paymentMethod | object | Sim | Método de payout e seus dados |
address | object | Varia | Exigido por muitos corredores — veja Cobertura por país |
documents | array | Varia | Documentos de identidade — exigidos por BRA, CHL, COL, TUR, e por KEN em BANK_DEPOSIT |
email | string | Varia | Exigido por COL |
phoneNumber | string | Varia | Exigido por KOR, MNG |
birthDate | string | Varia | Exigido por KOR |
birthCountryCode | string | Varia | Exigido por KOR |
O schema do país é a autoridade em toda linha "Varia" acima.
Array recipient.documents
Cada entrada:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
document | string | Sim | O número do documento |
type | string | Sim | Tipo do documento — o enum do schema é específico por país |
countryCode | string | Não | País emissor do documento |
O campo se chama document, não value. Tipos aceitos por país:
| País | Valores de type | Obrigatório? |
|---|---|---|
Brasil (BRA) | CPF — 11 dígitos, ou formatado 123.456.789-09 | Sim |
Colômbia (COL) | CC | Sim |
Turquia (TUR) | ID, PASSPORT, DRIVER_LICENSE | Sim |
Chile (CHL) | RUT | Sim |
Quênia (KEN) | ID, PASSPORT | Em BANK_DEPOSIT |
additionalData
| Campo | Tipo | Descrição |
|---|---|---|
paymentPurpose | string | Código regulatório de finalidade do pagamento. Exigido por vários corredores, e os códigos aceitos são um enum específico por país — alguns têm meia dúzia, outros bem mais de cem |
statementNarrative | string | Texto livre descrevendo a transação |
O paymentPurpose é sempre obrigatório em CAN, CHN, COL, EGY, GMB, IDN, IND, KOR, MYS, NPL, PAK, SGP, THA, VNM, e obrigatório em BANK_DEPOSIT para BGD e PHL. Leia os códigos aceitos direto do schema do país — não são uma lista compartilhada, e um código válido na Tailândia não vale na Malásia.
Vários corredores exigem o objeto
additionalDatapresente mesmo sem nada dentro. O schema pede a chave mas não obriga propriedade alguma, então um payload sem"additionalData": {}é rejeitado comVE_001 — additionalData can't be emptyenquanto um objeto vazio passa. A Cobertura por país marca esses casos.
Câmbio (FX)
Para pushes entre moedas, busque uma taxa antes de enviar e passe o fxId retornado — o gateway então aplica a taxa vinculada àquela cotação.
As taxas diferem por método de pagamento, então cote para o método pelo qual você vai pagar. Veja Foreign Exchange para os schemas completos de requisição/resposta.
Exemplo rápido:
curl -X POST https://{FQDN}/v2/foreign-exchange \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIs...' \
-H 'Content-Type: application/json' \
-d '{
"sourceCurrencyCode": "USD",
"destinationCurrencyCode": "BRL",
"paymentMethod": "BANK_ACCOUNT"
}'
{
"fxId": "b2c3d4e5-...",
"conversionRate": 4.975,
"sourceCurrencyCode": "USD",
"destinationCurrencyCode": "BRL",
"paymentMethod": "BANK_ACCOUNT",
"quoteIdExpiryDateTime": "2025-03-31T15:30:00Z"
}
Nota: cotações de câmbio têm validade limitada. Verifique o
quoteIdExpiryDateTimee renove se expirou.
Resposta
Um push é aceito de forma assíncrona. Um 200 com status: "PENDING" significa que o gateway recebeu o pagamento, não que o destinatário foi pago:
{
"paymentId": "bda24392-cac5-4fcf-af80-4a29df3ba0ff",
"parentPaymentId": "bda24392-cac5-4fcf-af80-4a29df3ba0ff",
"externalPaymentId": "push-bgd-001",
"amount": 20.0,
"created": "2026-07-15 21:29:50",
"status": "PENDING",
"approved": false,
"captured": false,
"voided": false,
"responseCode": "01",
"automaticReversed": false
}
Consulte GET /v2/payment/{externalId} ou aguarde o webhook para o desfecho liquidado. Não trate approved: false num push PENDING como recusa — isso apenas reflete que nenhuma autorização foi aprovada ainda, que é o estado normal de um push em trânsito.
Próximos passos
- Métodos de payout — Referência de campos para
BANK_DEPOSIT,WALLET,PIXeCARD - Cobertura por país — Todos os corredores e o que cada um exige
- Exemplos — Corpos de requisição completos, por região
- Erros —
PAY_001ePAY_271
