curl --request POST \
--url https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"holderName": "<string>",
"holderDocument": "<string>",
"pixKey": "<string>",
"bankCode": "<string>",
"branch": "<string>",
"branchDigit": "<string>",
"accountNumber": "<string>",
"accountDigit": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
holderName: '<string>',
holderDocument: '<string>',
pixKey: '<string>',
bankCode: '<string>',
branch: '<string>',
branchDigit: '<string>',
accountNumber: '<string>',
accountDigit: '<string>'
})
};
fetch('https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details"
payload = {
"holderName": "<string>",
"holderDocument": "<string>",
"pixKey": "<string>",
"bankCode": "<string>",
"branch": "<string>",
"branchDigit": "<string>",
"accountNumber": "<string>",
"accountDigit": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"issues": [
{
"path": "status",
"message": "Status inválido. Valores aceitos: pending, waiting_payment, paid, refused, canceled, refunded"
},
{
"path": "startDate",
"message": "Data deve ser ISO 8601 com timezone (ex.: 2026-06-24T00:00:00Z)"
}
]
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Refund not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}Informar dados bancários do reembolso
Registra a conta de destino de um reembolso de boleto que aguarda dados bancários, quando é você que coleta esses dados do comprador.
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"holderName": "<string>",
"holderDocument": "<string>",
"pixKey": "<string>",
"bankCode": "<string>",
"branch": "<string>",
"branchDigit": "<string>",
"accountNumber": "<string>",
"accountDigit": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
holderName: '<string>',
holderDocument: '<string>',
pixKey: '<string>',
bankCode: '<string>',
branch: '<string>',
branchDigit: '<string>',
accountNumber: '<string>',
accountDigit: '<string>'
})
};
fetch('https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/refunds/{id}/bank-details"
payload = {
"holderName": "<string>",
"holderDocument": "<string>",
"pixKey": "<string>",
"bankCode": "<string>",
"branch": "<string>",
"branchDigit": "<string>",
"accountNumber": "<string>",
"accountDigit": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"issues": [
{
"path": "status",
"message": "Status inválido. Valores aceitos: pending, waiting_payment, paid, refused, canceled, refunded"
},
{
"path": "startDate",
"message": "Data deve ser ISO 8601 com timezone (ex.: 2026-06-24T00:00:00Z)"
}
]
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Refund not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}POST /refunds/:id/bank-details
Faz parte do recurso Reembolsos — o objeto, os status e o ciclo estão lá.
Boleto não estorna pela bandeira: o valor volta por transferência, e é preciso saber para qual
conta. Enquanto ninguém informa esse destino, o reembolso fica em awaiting_bank_details. Este
endpoint registra a conta e leva o reembolso a bank_details_received, disparando o webhook
refund.bank_details_received.
Por padrão quem pergunta ao comprador somos nós, por e-mail, e você não precisa fazer nada — mas a
sua conta pode ser configurada, no painel, para que esse e-mail não seja enviado. É o caso de quem
já atende o próprio comprador e prefere coletar a conta pelo canal dele. Aí este endpoint passa a
ser o caminho: sem ele, o reembolso esperaria um e-mail que não sai. Com o e-mail ligado ele também
funciona — vale quem responder primeiro, você ou o comprador.
400. Com
transferMethod: "pix", pixKeyType e pixKey são obrigatórios. Com "bank_account", são
bankCode, branch, accountNumber, accountDigit e accountType. Não há preenchimento
parcial: uma conta sem destino utilizável seria um reembolso marcado como pronto que nunca liquida."pix" responde
400. Quem executa a devolução é definido em contrato; a sua tela de configurações de reembolso
mostra qual dos dois vale para a sua conta.400: banco fora dos que atendemos, agência ou conta fora do formato daquele banco, valores
que não podem ser reais (0000, 99999) e tipo de conta que não recebe crédito de terceiros —
conta salário não recebe. Leia error.issues[]: cada item traz o campo e o motivo, para você
corrigir a conta inteira numa rodada em vez de descobrir um problema por tentativa.0 para “passar” acerta em cerca de um caso
em onze; nos outros dez a transferência era recusada pelo banco dias depois, com o reembolso já
registrado como pronto e o comprador esperando. O campo aceita um único caractere: 0-9, ou
X/P nos bancos que usam letra no lugar do dez. O dígito está impresso no extrato.409, e reenviar não corrige. O endpoint não
sobrescreve conta: se os dados estiverem errados, fale com o nosso time — a operação invalida o
registro, o reembolso volta para awaiting_bank_details e aí a conta certa é aceita. Não há
caminho automático para isso.Idempotency-Key para que um retry por timeout não registre
a conta duas vezes. Veja Convenções.Exemplo
curl -X POST https://api.sandbox.z2pay.com/v1/refunds/rfd_j3cpkaysqmix17mxhcmv8qypl/bank-details \
-H "x-api-key: $Z2PAY_API_KEY" \
-H "Idempotency-Key: 4f8c1e9a-7b21-4c3d-9f10-2ab8c5d6e7f0" \
-H "Content-Type: application/json" \
-d '{
"transferMethod": "bank_account",
"holderName": "Maria Silva",
"holderDocument": "52998224725",
"bankCode": "237",
"branch": "1850",
"branchDigit": "3",
"accountNumber": "208734",
"accountDigit": "5",
"accountType": "checking"
}'
{
"id": "rfd_j3cpkaysqmix17mxhcmv8qypl",
"transactionId": "txn_aqbcw2lky42xfidw5pcdss8h1",
"paymentId": "pay_jxt9b5qv1x0h0h8ustleqjgr8",
"amount": 14990,
"currency": "BRL",
"status": "bank_details_received",
"reason": "Cliente solicitou cancelamento da compra",
"requestedByType": "api",
"paymentMethod": "boleto",
"customerId": "cust_lhsmn6ugmjotm5qvnunrr2hz1",
"customerName": "Maria Silva",
"customerEmail": "maria.silva@example.com",
"customerDocument": "12345678909",
"customerDocumentType": "cpf",
"additionalInfo": null,
"failureReason": null,
"reviewedAt": "2025-06-29T14:02:11.000Z",
"refundedAt": null,
"createdAt": "2025-06-29T13:45:30.000Z",
"updatedAt": "2025-06-29T15:10:44.000Z"
}
Authorizations
API Key da Credential (gerada no Backoffice)
Headers
Chave única para garantir idempotência da requisição
Path Parameters
ID do refund
Body
Destino do dinheiro: bank_account (TED) ou pix. pix só é aceito quando a devolução é executada pela própria conta, não pela plataforma.
pix, bank_account Nome do titular da conta, como consta no banco.
3CPF ou CNPJ do titular da conta, somente dígitos.
11 - 14cpf, email, phone, random Código COMPE do banco, três dígitos (ex: 341).
Agência sem o dígito, somente números.
Dígito da agência. Obrigatório nos bancos que o emitem — o valor é conferido, então não preencha com 0 para "passar".
Número da conta sem o dígito, somente números.
Dígito verificador da conta.
checking (corrente) ou savings (poupança). Conta salário não recebe crédito.
checking, savings Response
Dados bancários registrados