Estornar transação
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/transactions/{id}/refund \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"reason": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.sandbox.z2pay.com/v1/transactions/{id}/refund', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/transactions/{id}/refund"
payload = { "reason": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"refunds": [
{
"id": "rfd_dt8xoet16jhqxrgn76f0x25vg",
"transactionId": "txn_raqtaj22an9s5dexc1vthopl8",
"paymentId": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"amount": 19990,
"currency": "BRL",
"status": "refunded",
"reason": "Solicitação do cliente",
"requestedByType": "api",
"paymentMethod": "credit_card",
"customerId": "cust_lhsmn6ugmjotm5qvnunrr2hz1",
"customerName": "Maria Silva",
"customerEmail": "maria.silva@example.com",
"customerDocument": "12345678909",
"customerDocumentType": "cpf",
"additionalInfo": {
"checkoutLinkId": "chk_byd8p3p79re859jpkmr0j65n3"
},
"failureReason": null,
"reviewedAt": null,
"refundedAt": "2025-06-29T14:10:00.000Z",
"createdAt": "2025-06-29T14:09:55.000Z",
"updatedAt": "2025-06-29T14:10:00.000Z"
}
],
"processResults": [
{
"success": true,
"refund": {
"id": "rfd_dt8xoet16jhqxrgn76f0x25vg",
"transactionId": "txn_raqtaj22an9s5dexc1vthopl8",
"paymentId": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"amount": 19990,
"currency": "BRL",
"status": "refunded",
"reason": "Solicitação do cliente",
"requestedByType": "api",
"paymentMethod": "credit_card",
"customerId": "cust_lhsmn6ugmjotm5qvnunrr2hz1",
"customerName": "Maria Silva",
"customerEmail": "maria.silva@example.com",
"customerDocument": "12345678909",
"customerDocumentType": "cpf",
"additionalInfo": {
"checkoutLinkId": "chk_byd8p3p79re859jpkmr0j65n3"
},
"failureReason": null,
"reviewedAt": null,
"refundedAt": "2025-06-29T14:10:00.000Z",
"createdAt": "2025-06-29T14:09:55.000Z",
"updatedAt": "2025-06-29T14:10:00.000Z"
},
"message": "Refund processado com sucesso"
}
]
}{
"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": "Transaction not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}Transações
Estornar transação
Cria pedidos de estorno para todos os pagamentos pagos de uma transação de uma só vez.
POST
/
transactions
/
{id}
/
refund
Estornar transação
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/transactions/{id}/refund \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"reason": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: '<string>'})
};
fetch('https://api.sandbox.z2pay.com/v1/transactions/{id}/refund', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/transactions/{id}/refund"
payload = { "reason": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"refunds": [
{
"id": "rfd_dt8xoet16jhqxrgn76f0x25vg",
"transactionId": "txn_raqtaj22an9s5dexc1vthopl8",
"paymentId": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"amount": 19990,
"currency": "BRL",
"status": "refunded",
"reason": "Solicitação do cliente",
"requestedByType": "api",
"paymentMethod": "credit_card",
"customerId": "cust_lhsmn6ugmjotm5qvnunrr2hz1",
"customerName": "Maria Silva",
"customerEmail": "maria.silva@example.com",
"customerDocument": "12345678909",
"customerDocumentType": "cpf",
"additionalInfo": {
"checkoutLinkId": "chk_byd8p3p79re859jpkmr0j65n3"
},
"failureReason": null,
"reviewedAt": null,
"refundedAt": "2025-06-29T14:10:00.000Z",
"createdAt": "2025-06-29T14:09:55.000Z",
"updatedAt": "2025-06-29T14:10:00.000Z"
}
],
"processResults": [
{
"success": true,
"refund": {
"id": "rfd_dt8xoet16jhqxrgn76f0x25vg",
"transactionId": "txn_raqtaj22an9s5dexc1vthopl8",
"paymentId": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"amount": 19990,
"currency": "BRL",
"status": "refunded",
"reason": "Solicitação do cliente",
"requestedByType": "api",
"paymentMethod": "credit_card",
"customerId": "cust_lhsmn6ugmjotm5qvnunrr2hz1",
"customerName": "Maria Silva",
"customerEmail": "maria.silva@example.com",
"customerDocument": "12345678909",
"customerDocumentType": "cpf",
"additionalInfo": {
"checkoutLinkId": "chk_byd8p3p79re859jpkmr0j65n3"
},
"failureReason": null,
"reviewedAt": null,
"refundedAt": "2025-06-29T14:10:00.000Z",
"createdAt": "2025-06-29T14:09:55.000Z",
"updatedAt": "2025-06-29T14:10:00.000Z"
},
"message": "Refund processado com sucesso"
}
]
}{
"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": "Transaction not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}POST /transactions/:id/refund
Faz parte do recurso Transações — o conceito, o ciclo de vida e a
tabela de status estão lá.
Cria pedidos de estorno para todos os pagamentos pagos da transação de uma só vez — cada um
pelo saldo que ainda resta: um pagamento já parcialmente estornado entra pelo restante, e um já
esgotado (ou com estorno em andamento) fica de fora sem derrubar os demais. O corpo tem
um único campo, e ele é obrigatório: reason, o motivo do estorno (1 a 4000 caracteres). O
comportamento de aprovação depende da configuração refund.auto_approve da sua conta (default:
ativado):
- Com auto-approve (cartão/Pix): o estorno é criado, aprovado e processado no gateway na própria
requisição — a resposta síncrona já traz o estorno em
refunded(sucesso) oufailed(recusa do gateway). - Boleto: nasce
pendingmesmo com auto-approve — a devolução é feita por transferência bancária e depende de aprovação e da coleta de dados bancários. Veja reembolsos. - Sem auto-approve: os estornos ficam
pending, aguardando aprovação manual.
Endpoint idempotente — envie
Idempotency-Key. Para estornar um pagamento específico (estorno
parcial), use o endpoint de reembolsos / pagamentos.curl -X POST https://api.sandbox.z2pay.com/v1/transactions/txn_ebgsvfsb4151nmbgvj4sek6ol/refund \
-H "x-api-key: SUA_CHAVE_DE_SANDBOX" \
-H "Idempotency-Key: refund-pedido-0001" \
-H "Content-Type: application/json" \
-d '{ "reason": "Cliente solicitou cancelamento" }'
{
"refunds": [
{
"id": "rfd_mns5px8uguquq81wdhal522n5",
"paymentId": "pay_kd6z67zbp52rgtg2idms96fhm",
"status": "refunded",
"amount": 9990,
"reason": "Cliente solicitou cancelamento"
}
],
"processResults": [
{
"success": true,
"refund": {
"id": "rfd_mns5px8uguquq81wdhal522n5",
"status": "refunded"
}
}
]
}
A resposta traz
refunds (os estornos criados) e processResults (o resultado do processamento
de cada um, com success e o estorno atualizado). Já o estorno de um pagamento específico
(POST /payments/{paymentId}/refund) responde no singular:
{ "refund": { ... }, "processResult": { ... } }.Transação sem nenhum pagamento pago responde
409, não 200 com lista vazia. Se nada é
estornável — porque nada foi pago, ou porque tudo já foi estornado — a chamada falha em vez de não
fazer nada. Reenviar não muda o resultado enquanto o estado da transação for o mesmo.Authorizations
API Key da Credential (gerada no Backoffice)
Headers
Chave única para garantir idempotência da requisição
Path Parameters
ID da transação
Body
application/json
Motivo do estorno da transação inteira (obrigatório).
Required string length:
1 - 4000