Salvar cartão a partir de um token
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"token": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({token: '<string>'})
};
fetch('https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards"
payload = { "token": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "crd_hqx4mkpi8dcxbrb2nzynxnjky",
"customerId": "cust_j43n74fbt2geb8c1y86ssf6iw",
"brand": "visa",
"firstDigits": "411111",
"lastDigits": "1111",
"holderName": "JOAO DA SILVA",
"expirationMonth": "12",
"expirationYear": "2030",
"status": "active",
"createdAt": "2026-07-02T19:26:17.000Z",
"updatedAt": "2026-07-02T19:26:17.000Z"
}{
"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": "Card not found"
}
}{
"error": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}Cartões
Salvar cartão a partir de um token
Guarda um cartão no cliente sem passar pelo gateway — para ter a forma de pagamento antes da primeira compra.
POST
/
customers
/
{customerId}
/
cards
Salvar cartão a partir de um token
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"token": "<string>"
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({token: '<string>'})
};
fetch('https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/customers/{customerId}/cards"
payload = { "token": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "crd_hqx4mkpi8dcxbrb2nzynxnjky",
"customerId": "cust_j43n74fbt2geb8c1y86ssf6iw",
"brand": "visa",
"firstDigits": "411111",
"lastDigits": "1111",
"holderName": "JOAO DA SILVA",
"expirationMonth": "12",
"expirationYear": "2030",
"status": "active",
"createdAt": "2026-07-02T19:26:17.000Z",
"updatedAt": "2026-07-02T19:26:17.000Z"
}{
"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": "Card not found"
}
}{
"error": "A request with this idempotency key is already being processed"
}{
"error": "Idempotency key already used with a different request body"
}POST /customers/{customerId}/cards
Faz parte do recurso Cartões — como um cartão nasce e como cobrá-lo depois estão lá.
Salva o cartão a partir de um token do Tokenizer e devolve o crd_ reutilizável.
O corpo tem um campo só, token, e nada é cobrado: a chamada não passa pelo gateway.
Na maior parte das integrações você não precisa desta rota. Criar uma transação de cartão com
customerId e token já salva o crd_ sozinho. Esta existe para o caso inverso — guardar a forma
de pagamento antes de haver o que cobrar, como num cadastro de assinatura que só começa depois.O token é de uso único e morre aqui. O
tok_ do Tokenizer vale 24 horas e é consumido nesta
chamada — reenviá-lo responde 400 Token inválido ou expirado, mesmo que ainda esteja dentro do
prazo. Para salvar outro cartão, gere um token novo.Salvar o mesmo cartão duas vezes não cria dois. A gravação deduplica pela impressão digital do
cartão no escopo daquele cliente, então a segunda chamada devolve o mesmo
crd_ — com 201,
não com erro. Em clientes diferentes, os crd_ são distintos.Cliente inexistente responde
404 sem gastar o token. A validação do cliente acontece antes de
consumir o tok_ — de propósito, para que um customerId errado não queime um token que ainda
poderia ser usado.Endpoint idempotente. Envie o header
Idempotency-Key para que um retry por timeout não repita a
operação. Veja Convenções.Authorizations
API Key da Credential (gerada no Backoffice)
Headers
Chave única para garantir idempotência da requisição
Path Parameters
ID do cliente
Body
application/json
Token one-shot do Tokenizer (tok_*) usado para salvar o cartão sem cobrança.
Response
Cartão criado
ID do cartão (crd_).
Cliente dono do cartão (cust_).
Bandeira (ex.: visa, mastercard).
Seis primeiros dígitos.
Quatro últimos dígitos.
Nome impresso no cartão.
Mês de validade (MM).
Ano de validade (YYYY).
Situação do cartão.
Criação, ISO 8601.
Última alteração, ISO 8601.