curl --request POST \
--url https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"description": "<string>",
"amount": 1,
"reasonDetails": "<string>",
"quantity": 1
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({description: '<string>', amount: 1, reasonDetails: '<string>', quantity: 1})
};
fetch('https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items"
payload = {
"description": "<string>",
"amount": 1,
"reasonDetails": "<string>",
"quantity": 1
}
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": "Subscription not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}Lançar cobrança extra
Enfileira um item avulso que entra na próxima fatura de ciclo da assinatura, junto da mensalidade.
curl --request POST \
--url https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"description": "<string>",
"amount": 1,
"reasonDetails": "<string>",
"quantity": 1
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({description: '<string>', amount: 1, reasonDetails: '<string>', quantity: 1})
};
fetch('https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sandbox.z2pay.com/v1/subscriptions/{id}/extra-items"
payload = {
"description": "<string>",
"amount": 1,
"reasonDetails": "<string>",
"quantity": 1
}
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": "Subscription not found"
}
}{
"error": {
"code": "CONFLICT",
"message": "No refundable payment found"
}
}{
"error": "Idempotency key already used with a different request body"
}POST /subscriptions/:id/extra-items
Faz parte do recurso Assinaturas — o conceito e os dez estados estão lá. As
faturas que essa fila alimenta são o recurso Faturas.
Cria um item com description, amount (centavos) e quantity opcional (default 1). O item não
gera cobrança nem fatura própria: fica pending até a próxima fatura de ciclo recolhê-lo, como uma
linha one_time ao lado da mensalidade.
Para cobrar antes da virada do ciclo há dois caminhos:
criar uma fatura avulsa, que é uma cobrança separada com
vencimento próprio, ou fechar a fila inteira agora, que
emite uma fatura com tudo que está pendente.
pending no momento do
cancelamento vira uma fatura avulsa final, uma linha por item — pela mesma régua que decide o
destino das faturas vencidas em cancel: com
keepOverdueInvoices: false, as vencidas e a fila são descartadas juntas.Exemplo
curl -X POST https://api.sandbox.z2pay.com/v1/subscriptions/sub_x33m4yn6brazh71en4mki6f5c/extra-items \
-H "x-api-key: SUA_CHAVE_DE_SANDBOX" \
-H "Content-Type: application/json" \
-d '{
"description": "Segunda via da carteirinha",
"amount": 4990,
"quantity": 1,
"reason": "extra_service",
"reasonDetails": "Cliente perdeu a carteirinha e pediu a segunda via"
}'
{
"id": "xitm_xusdt7vquv0sjrj8k6er6xn6y",
"description": "Segunda via da carteirinha",
"amount": 4990,
"quantity": 1,
"currency": "BRL",
"reason": "extra_service",
"reasonDetails": "Cliente perdeu a carteirinha e pediu a segunda via",
"status": "pending",
"consumedInvoiceId": null,
"createdAt": "2026-08-10T18:20:00.000Z"
}
Authorizations
API Key da Credential (gerada no Backoffice)
Headers
Chave única para garantir idempotência da requisição
Path Parameters
ID da assinatura
Body
O que está sendo cobrado (aparece na linha da fatura).
1 - 255Valor unitário, em centavos (menor unidade da moeda). A moeda é a da assinatura.
x > 0Classificação da cobrança, para auditoria e relatório. Mesmo vocabulário da fatura avulsa, sem ad_hoc — um item que entra na fatura do ciclo não é avulso.
extra_service, adjustment, penalty, other Justificativa em texto livre (1 a 500 caracteres). Fica na trilha de auditoria do lançamento, não aparece na fatura do pagador — o que o pagador vê é description.
1 - 500Quantidade. Default 1 — o total lançado é amount * quantity.
x >= 1Response
Cobrança extra lançada, com status pending