Processar payments
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/transactions/{transactionId}/payments/process \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customer": {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>"
},
"creditCard": {
"cardId": "<string>",
"token": "<string>",
"billingAddress": {
"street": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"postalCode": "<string>"
}
},
"boleto": {
"expirationDate": "2023-11-07T05:31:56Z",
"instructions": "<string>"
},
"pix": {
"expirationDate": "2023-11-07T05:31:56Z"
},
"ip": "<string>",
"paymentIds": [
"<string>"
]
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer: {name: '<string>', email: 'jsmith@example.com', document: '<string>'},
creditCard: {
cardId: '<string>',
token: '<string>',
billingAddress: {
street: '<string>',
number: '<string>',
complement: '<string>',
neighborhood: '<string>',
city: '<string>',
state: '<string>',
country: '<string>',
postalCode: '<string>'
}
},
boleto: {expirationDate: '2023-11-07T05:31:56Z', instructions: '<string>'},
pix: {expirationDate: '2023-11-07T05:31:56Z'},
ip: '<string>',
paymentIds: ['<string>']
})
};
fetch('https://api.sandbox.z2pay.com/v1/transactions/{transactionId}/payments/process', 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/{transactionId}/payments/process"
payload = {
"customer": {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>"
},
"creditCard": {
"cardId": "<string>",
"token": "<string>",
"billingAddress": {
"street": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"postalCode": "<string>"
}
},
"boleto": {
"expirationDate": "2023-11-07T05:31:56Z",
"instructions": "<string>"
},
"pix": { "expirationDate": "2023-11-07T05:31:56Z" },
"ip": "<string>",
"paymentIds": ["<string>"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"processed": 1,
"results": [
{
"payments": [
{
"id": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"status": "paid"
}
]
}
]
}{
"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": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}Transações
Processar pagamentos
Cobra os pagamentos que foram criados sem dados de pagamento — a segunda etapa de quem separa o pedido da cobrança.
POST
/
transactions
/
{transactionId}
/
payments
/
process
Processar payments
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/transactions/{transactionId}/payments/process \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customer": {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>"
},
"creditCard": {
"cardId": "<string>",
"token": "<string>",
"billingAddress": {
"street": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"postalCode": "<string>"
}
},
"boleto": {
"expirationDate": "2023-11-07T05:31:56Z",
"instructions": "<string>"
},
"pix": {
"expirationDate": "2023-11-07T05:31:56Z"
},
"ip": "<string>",
"paymentIds": [
"<string>"
]
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer: {name: '<string>', email: 'jsmith@example.com', document: '<string>'},
creditCard: {
cardId: '<string>',
token: '<string>',
billingAddress: {
street: '<string>',
number: '<string>',
complement: '<string>',
neighborhood: '<string>',
city: '<string>',
state: '<string>',
country: '<string>',
postalCode: '<string>'
}
},
boleto: {expirationDate: '2023-11-07T05:31:56Z', instructions: '<string>'},
pix: {expirationDate: '2023-11-07T05:31:56Z'},
ip: '<string>',
paymentIds: ['<string>']
})
};
fetch('https://api.sandbox.z2pay.com/v1/transactions/{transactionId}/payments/process', 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/{transactionId}/payments/process"
payload = {
"customer": {
"name": "<string>",
"email": "jsmith@example.com",
"document": "<string>"
},
"creditCard": {
"cardId": "<string>",
"token": "<string>",
"billingAddress": {
"street": "<string>",
"number": "<string>",
"complement": "<string>",
"neighborhood": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"postalCode": "<string>"
}
},
"boleto": {
"expirationDate": "2023-11-07T05:31:56Z",
"instructions": "<string>"
},
"pix": { "expirationDate": "2023-11-07T05:31:56Z" },
"ip": "<string>",
"paymentIds": ["<string>"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"processed": 1,
"results": [
{
"payments": [
{
"id": "pay_k0fg3q4jjcbi56hdhbi7xlj5e",
"status": "paid"
}
]
}
]
}{
"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": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}POST /transactions/:transactionId/payments/process
Faz parte do recurso Transações — o status da transação está lá, e o de cada
pagamento em Pagamentos.
Cobra os pagamentos que já existem na transação mas ainda não foram ao gateway.
Quando você precisa deste endpoint
Na maior parte das integrações, você não precisa. Ao criar a transação com o objeto do meio de pagamento dentro depayments — creditCard, boleto ou pix — a cobrança
acontece na mesma requisição, e a resposta já diz se foi aprovada.
Este endpoint existe para quem separa o pedido da cobrança em duas etapas:
1
Crie a transação declarando o pagamento, sem os dados dele
POST /transactions
{
"items": [{ "description": "Camiseta", "quantity": 1, "amount": 9990 }],
"payments": [{ "paymentMethod": "credit_card", "amount": 9990 }]
}
pending — registrado, não cobrado. Nada foi ao gateway.2
Cobre, quando tiver os dados
POST /transactions/txn_ebgsvfsb4151nmbgvj4sek6ol/payments/process
{
"customer": { "name": "Maria Souza", "email": "maria@example.com",
"type": "individual", "document": "12345678909", "documentType": "cpf" },
"creditCard": { "token": "tok_abc" }
}
txn_ para exibir o
número do pedido, gravar no seu banco e mandar o e-mail de “pedido recebido”. A cobrança vem na tela
seguinte. Numa chamada só, você teria de esperar o cartão para a transação sequer existir.
O outro uso é retentar: o cartão foi recusado, o comprador informa outro, e você chama este
endpoint de novo com o cartão novo.
O que enviar
O objeto
customer é obrigatório aqui, mesmo que a transação tenha sido criada com
customerId. O gateway exige os dados do comprador (name, email, document, documentType,
type) no momento da cobrança, e este endpoint não os busca do cadastro.Cartão exige o objeto
creditCard — com token (do Tokenizer) ou
cardId (de um cartão salvo). Sem ele não há o que enviar ao gateway, e o pagamento termina em
failed.Pix e boleto dispensam o objeto.
pix e boleto existem só para mudar a expiração — omitidos,
valem os mesmos defaults da criação: 30 minutos no Pix, 3 dias no boleto. O campo é
expirationDate, o mesmo nome de POST /transactions.Os dados enviados valem para todos os pagamentos processados na chamada. Se a transação tem dois
pagamentos e você não restringe, os dois recebem o mesmo
creditCard. Para cobrar cartões
diferentes em cada um, faça uma chamada por pagamento, usando paymentIds.paymentIds restringe quais pagamentos processar. Omitido, a Z2Pay processa todos os que estão
em pending ou waiting_payment. Informe apenas IDs de pagamentos ainda não pagos — o campo
serve para escolher entre os pendentes, não para reprocessar o que já foi cobrado.Envie o header
Idempotency-Key — idempotência evita cobrança duplicada se a
requisição for reenviada por timeout ou retry.Nada pendente é
409. Se nenhum pagamento se qualifica, a resposta é 409 com
error.details.code: "NO_PENDING_PAYMENTS" — não um 200 vazio. Repare no caminho: o
error.code é sempre a classe do erro ("CONFLICT", neste caso); o código específico vem
dentro de error.details.code. Costuma significar que a transação já foi cobrada, ou que os
paymentIds informados não estão pendentes.O mesmo 409 responde quando outra requisição com a mesma Idempotency-Key ainda está em
curso. Nesse caso o corpo é { "error": "texto" }, sem objeto nenhum — trate pelo status, não
pelo código.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
Dados do comprador exigidos pelo gateway.
Show child attributes
Show child attributes
Cartão a processar: cardId do vault ou token do Tokenizer.
Show child attributes
Show child attributes
Dados do boleto para processamento via gateway.
Show child attributes
Show child attributes
Dados do Pix para processamento via gateway.
Show child attributes
Show child attributes
IP do comprador (antifraude).
IDs específicos de payments a processar; omitido/vazio processa todos os pendentes.