API de Pagamentos v2
Crie transações avulsas ou assinaturas (Pix Automático ou cartão recorrente), consulte, estorne e receba tudo em tempo real por webhook — com um schema consistente do início ao fim.
Checklist rápido
- Crie uma credencial v2 no painel, em Integrações → API.
- Envie as duas chaves em todo request, nos headers
x-api-keyex-api-secret. - Configure uma URL de webhook para receber atualizações de status em tempo real.
URL Base
Todas as requisições da v2 usam este domínio base:
https://api.sunize.com.br/v2/transactions.
Autenticação
Toda requisição precisa dos dois cabeçalhos abaixo:
x-api-key: SEU_API_KEY x-api-secret: SEU_API_SECRET Content-Type: application/json
x-api-secret, ou com o valor errado, retorna
401.
Criar Transação
Cria uma nova transação avulsa (PIX ou cartão de crédito).
Requisição
curl -X POST https://api.sunize.com.br/v2/transactions \
-H "x-api-key: SEU_API_KEY" \
-H "x-api-secret: SEU_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"external_id": "pedido-1029",
"amount": 149.90,
"payment_method": "PIX",
"items": [
{
"id": "prod-1",
"title": "Curso de Marketing",
"description": "Acesso vitalício",
"price": 149.90,
"quantity": 1,
"is_physical": false
}
],
"ip": "203.0.113.10",
"customer": {
"name": "Maria Silva",
"email": "maria@example.com",
"phone": "+5511999999999",
"document_type": "CPF",
"document": "12345678900"
},
"tracking": {
"utm_source": "instagram",
"utm_medium": "cpc",
"utm_campaign": "lancamento-julho"
}
}'const response = await fetch("https://api.sunize.com.br/v2/transactions", {
method: "POST",
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
"Content-Type": "application/json",
},
body: JSON.stringify({
external_id: "pedido-1029",
amount: 149.90,
payment_method: "PIX",
items: [
{
id: "prod-1",
title: "Curso de Marketing",
description: "Acesso vitalício",
price: 149.90,
quantity: 1,
is_physical: false,
},
],
ip: "203.0.113.10",
customer: {
name: "Maria Silva",
email: "maria@example.com",
phone: "+5511999999999",
document_type: "CPF",
document: "12345678900",
},
tracking: {
utm_source: "instagram",
utm_medium: "cpc",
utm_campaign: "lancamento-julho",
},
}),
});
const transaction = await response.json();
console.log(transaction);<?php
$body = [
"external_id" => "pedido-1029",
"amount" => 149.90,
"payment_method" => "PIX",
"items" => [
[
"id" => "prod-1",
"title" => "Curso de Marketing",
"description" => "Acesso vitalício",
"price" => 149.90,
"quantity" => 1,
"is_physical" => false,
],
],
"ip" => "203.0.113.10",
"customer" => [
"name" => "Maria Silva",
"email" => "maria@example.com",
"phone" => "+5511999999999",
"document_type" => "CPF",
"document" => "12345678900",
],
"tracking" => [
"utm_source" => "instagram",
"utm_medium" => "cpc",
"utm_campaign" => "lancamento-julho",
],
];
$ch = curl_init("https://api.sunize.com.br/v2/transactions");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($body),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);import os
import requests
response = requests.post(
"https://api.sunize.com.br/v2/transactions",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
json={
"external_id": "pedido-1029",
"amount": 149.90,
"payment_method": "PIX",
"items": [
{
"id": "prod-1",
"title": "Curso de Marketing",
"description": "Acesso vitalício",
"price": 149.90,
"quantity": 1,
"is_physical": False,
}
],
"ip": "203.0.113.10",
"customer": {
"name": "Maria Silva",
"email": "maria@example.com",
"phone": "+5511999999999",
"document_type": "CPF",
"document": "12345678900",
},
"tracking": {
"utm_source": "instagram",
"utm_medium": "cpc",
"utm_campaign": "lancamento-julho",
},
},
)
transaction = response.json()
print(transaction)Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| external_id | string | Identificador único externo da transação |
| amount | number | Valor total em reais (mínimo R$ 5,00) |
| payment_method | string | PIX ou CREDIT_CARD |
| items | array | Itens da transação (id, title, description, price, quantity, is_physical) |
| ip | string | Endereço IP do cliente |
| customer | object | name, email, phone (E.164, ex: +5511999999999), document_type (CPF/CNPJ), document |
| card | object | Obrigatório se payment_method for CREDIT_CARD: card_number, card_holder_name, card_expiration_date (MM/AAAA), card_cvv, installment |
| splits | array | Opcional. user_id, type (percentage/fixed), value |
| tracking novo | object | Opcional. utm_source, utm_medium, utm_campaign, utm_content, utm_term — voltam no webhook |
Resposta
{ "id": "string", "external_id": "string", "status": "AUTHORIZED" | "PENDING" | "CHARGEBACK" | "REFUNDED" | "FAILED" | "IN_DISPUTE", "amount": 149.9, "customer": { "email": "string", "name": "string" }, "payment_method": "string", "pix": { "payload": "string" }, "hasError": false }
Status possíveis
Consultar Transação
Consulta os detalhes de uma transação criada anteriormente.
curl https://api.sunize.com.br/v2/transactions/TRANSACTION_ID \ -H "x-api-key: SEU_API_KEY" \ -H "x-api-secret: SEU_API_SECRET"
const response = await fetch(
`https://api.sunize.com.br/v2/transactions/${transactionId}`,
{
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
},
}
);
const transaction = await response.json();<?php
$ch = curl_init("https://api.sunize.com.br/v2/transactions/{$transactionId}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import os
import requests
response = requests.get(
f"https://api.sunize.com.br/v2/transactions/{transaction_id}",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
)
transaction = response.json()Resposta
{ "id": "c22dc7e1-8b10-4580-9dc4-ebf78ceca475", "external_id": "pedido-1029", "status": "AUTHORIZED", "amount": 149.9, "payment_method": "PIX", "customer": { "name": "Maria Silva", "email": "maria@example.com", "phone": "+5511999999999", "document": "12345678900", "address": null }, "created_at": "2026-08-19T20:45:33.855Z" }
Estornar Transação
Estorna uma venda avulsa criada via API — a mesma operação disponível no painel em "Estornar venda".
curl -X POST https://api.sunize.com.br/v2/transactions/TRANSACTION_ID/refund \ -H "x-api-key: SEU_API_KEY" \ -H "x-api-secret: SEU_API_SECRET"
const response = await fetch(
`https://api.sunize.com.br/v2/transactions/${transactionId}/refund`,
{
method: "POST",
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
},
}
);
const result = await response.json();<?php
$ch = curl_init("https://api.sunize.com.br/v2/transactions/{$transactionId}/refund");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import os
import requests
response = requests.post(
f"https://api.sunize.com.br/v2/transactions/{transaction_id}/refund",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
)
result = response.json()Resposta
{ "id": "c22dc7e1-8b10-4580-9dc4-ebf78ceca475", "status": "REFUNDED" }
Criar Assinatura novo
Cria uma venda recorrente. Suporta dois trilhos: cartão de crédito (cobrança automática a cada ciclo) e Pix Automático (débito automático via Pix, autorizado uma única vez pelo comprador).
Requisição — Cartão de crédito
curl -X POST https://api.sunize.com.br/v2/subscriptions \
-H "x-api-key: SEU_API_KEY" \
-H "x-api-secret: SEU_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"external_id": "assinatura-482",
"amount": 97.00,
"payment_method": "CREDIT_CARD",
"membership_period": "MENSAL",
"items": [
{ "id": "plano-pro", "title": "Plano PRO", "description": "Assinatura mensal", "price": 97.00, "quantity": 1, "is_physical": false }
],
"ip": "203.0.113.10",
"customer": {
"name": "João Souza",
"email": "joao@example.com",
"phone": "+5511988888888",
"document_type": "CPF",
"document": "98765432100"
},
"card": {
"card_number": "4111111111111111",
"card_holder_name": "JOAO SOUZA",
"card_expiration_date": "12/2030",
"card_cvv": "123",
"installment": 1
}
}'const response = await fetch("https://api.sunize.com.br/v2/subscriptions", {
method: "POST",
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
"Content-Type": "application/json",
},
body: JSON.stringify({
external_id: "assinatura-482",
amount: 97.0,
payment_method: "CREDIT_CARD",
membership_period: "MENSAL",
items: [
{
id: "plano-pro",
title: "Plano PRO",
description: "Assinatura mensal",
price: 97.0,
quantity: 1,
is_physical: false,
},
],
ip: "203.0.113.10",
customer: {
name: "João Souza",
email: "joao@example.com",
phone: "+5511988888888",
document_type: "CPF",
document: "98765432100",
},
card: {
card_number: "4111111111111111",
card_holder_name: "JOAO SOUZA",
card_expiration_date: "12/2030",
card_cvv: "123",
installment: 1,
},
}),
});
const subscription = await response.json();<?php
$body = [
"external_id" => "assinatura-482",
"amount" => 97.00,
"payment_method" => "CREDIT_CARD",
"membership_period" => "MENSAL",
"items" => [
[
"id" => "plano-pro",
"title" => "Plano PRO",
"description" => "Assinatura mensal",
"price" => 97.00,
"quantity" => 1,
"is_physical" => false,
],
],
"ip" => "203.0.113.10",
"customer" => [
"name" => "João Souza",
"email" => "joao@example.com",
"phone" => "+5511988888888",
"document_type" => "CPF",
"document" => "98765432100",
],
"card" => [
"card_number" => "4111111111111111",
"card_holder_name" => "JOAO SOUZA",
"card_expiration_date" => "12/2030",
"card_cvv" => "123",
"installment" => 1,
],
];
$ch = curl_init("https://api.sunize.com.br/v2/subscriptions");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($body),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import os
import requests
response = requests.post(
"https://api.sunize.com.br/v2/subscriptions",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
json={
"external_id": "assinatura-482",
"amount": 97.00,
"payment_method": "CREDIT_CARD",
"membership_period": "MENSAL",
"items": [
{
"id": "plano-pro",
"title": "Plano PRO",
"description": "Assinatura mensal",
"price": 97.00,
"quantity": 1,
"is_physical": False,
}
],
"ip": "203.0.113.10",
"customer": {
"name": "João Souza",
"email": "joao@example.com",
"phone": "+5511988888888",
"document_type": "CPF",
"document": "98765432100",
},
"card": {
"card_number": "4111111111111111",
"card_holder_name": "JOAO SOUZA",
"card_expiration_date": "12/2030",
"card_cvv": "123",
"installment": 1,
},
},
)
subscription = response.json()Resposta — Cartão de crédito
{ "id": "rs_8f2a...", "external_id": "assinatura-482", "status": "ACTIVE", "amount": 97, "membership_period": "MENSAL", "payment_method": "CREDIT_CARD", "next_payment_date": "2026-09-19T14:32:10.000Z" }
Requisição — Pix Automático
Mesmo endpoint — troque payment_method para PIX e remova card.
curl -X POST https://api.sunize.com.br/v2/subscriptions \
-H "x-api-key: SEU_API_KEY" \
-H "x-api-secret: SEU_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"external_id": "assinatura-483",
"amount": 97.00,
"payment_method": "PIX",
"membership_period": "MENSAL",
"items": [
{ "id": "plano-pro", "title": "Plano PRO", "description": "Assinatura mensal", "price": 97.00, "quantity": 1, "is_physical": false }
],
"ip": "203.0.113.10",
"customer": {
"name": "João Souza",
"email": "joao@example.com",
"phone": "+5511988888888",
"document_type": "CPF",
"document": "98765432100"
}
}'const response = await fetch("https://api.sunize.com.br/v2/subscriptions", {
method: "POST",
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
"Content-Type": "application/json",
},
body: JSON.stringify({
external_id: "assinatura-483",
amount: 97.0,
payment_method: "PIX",
membership_period: "MENSAL",
items: [
{
id: "plano-pro",
title: "Plano PRO",
description: "Assinatura mensal",
price: 97.0,
quantity: 1,
is_physical: false,
},
],
ip: "203.0.113.10",
customer: {
name: "João Souza",
email: "joao@example.com",
phone: "+5511988888888",
document_type: "CPF",
document: "98765432100",
},
}),
});
const subscription = await response.json();
// subscription.pix.qr_code -> mostre este código pro comprador autorizar<?php
$body = [
"external_id" => "assinatura-483",
"amount" => 97.00,
"payment_method" => "PIX",
"membership_period" => "MENSAL",
"items" => [
[
"id" => "plano-pro",
"title" => "Plano PRO",
"description" => "Assinatura mensal",
"price" => 97.00,
"quantity" => 1,
"is_physical" => false,
],
],
"ip" => "203.0.113.10",
"customer" => [
"name" => "João Souza",
"email" => "joao@example.com",
"phone" => "+5511988888888",
"document_type" => "CPF",
"document" => "98765432100",
],
];
$ch = curl_init("https://api.sunize.com.br/v2/subscriptions");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($body),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
// $response['pix']['qr_code'] -> mostre este código pro comprador autorizarimport os
import requests
response = requests.post(
"https://api.sunize.com.br/v2/subscriptions",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
json={
"external_id": "assinatura-483",
"amount": 97.00,
"payment_method": "PIX",
"membership_period": "MENSAL",
"items": [
{
"id": "plano-pro",
"title": "Plano PRO",
"description": "Assinatura mensal",
"price": 97.00,
"quantity": 1,
"is_physical": False,
}
],
"ip": "203.0.113.10",
"customer": {
"name": "João Souza",
"email": "joao@example.com",
"phone": "+5511988888888",
"document_type": "CPF",
"document": "98765432100",
},
},
)
subscription = response.json()
# subscription["pix"]["qr_code"] -> mostre este código pro comprador autorizarResposta — Pix Automático
{ "id": "rs_9c31...", "external_id": "assinatura-483", "status": "PENDING_AUTHORIZATION", "amount": 97, "membership_period": "MENSAL", "payment_method": "PIX", "pix": { "qr_code": "00020126...6304ABCD", "payment_link": "https://pay.sunize.com.br/pix-automatico/..." } }
Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| external_id | string | Identificador único externo da assinatura |
| amount | number | Valor cobrado a cada ciclo, em reais |
| payment_method | string | PIX (Pix Automático) ou CREDIT_CARD |
| membership_period | string | SEMANAL, MENSAL, BIMESTRAL, SEMESTRAL ou ANUAL. Pix Automático só aceita SEMANAL/MENSAL/ANUAL. |
| items | array | Mesmo formato de itens da transação avulsa |
| ip | string | Endereço IP do comprador |
| customer | object | Mesmo formato da transação avulsa |
| card | object | Obrigatório se payment_method for CREDIT_CARD — dados do cartão usados na 1ª cobrança e salvos para as próximas. Envie installment: 1. |
| splits | array | Opcional — mesmo formato da transação avulsa |
| tracking | object | Opcional — mesmo formato da transação avulsa |
Erros específicos
| Código | Descrição |
|---|---|
| 400 | Cartão recorrente não habilitado para esta credencial — fale com a nossa equipe |
| 400 | Pagamento com cartão recusado — assinatura não foi criada |
| 400 | Período incompatível com Pix Automático (use SEMANAL, MENSAL ou ANUAL) |
Consultar Assinatura novo
Consulta o status atual de uma assinatura.
curl https://api.sunize.com.br/v2/subscriptions/SUBSCRIPTION_ID \ -H "x-api-key: SEU_API_KEY" \ -H "x-api-secret: SEU_API_SECRET"
const response = await fetch(
`https://api.sunize.com.br/v2/subscriptions/${subscriptionId}`,
{
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
},
}
);
const subscription = await response.json();<?php
$ch = curl_init("https://api.sunize.com.br/v2/subscriptions/{$subscriptionId}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import os
import requests
response = requests.get(
f"https://api.sunize.com.br/v2/subscriptions/{subscription_id}",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
)
subscription = response.json()Resposta
{ "id": "rs_8f2a...", "external_id": "assinatura-482", "status": "ACTIVE" | "PENDING_AUTHORIZATION" | "LATE" | "PAUSED" | "CANCELED", "amount": 97, "membership_period": "MENSAL", "payment_method": "CREDIT_CARD", "next_payment_date": "2026-09-19T14:32:10.000Z", "last_payment_date": "2026-08-19T14:32:10.000Z" }
Cancelar Assinatura novo
Cancela uma assinatura ativa. O comprador mantém acesso até o fim do ciclo já pago.
curl -X POST https://api.sunize.com.br/v2/subscriptions/SUBSCRIPTION_ID/cancel \ -H "x-api-key: SEU_API_KEY" \ -H "x-api-secret: SEU_API_SECRET"
const response = await fetch(
`https://api.sunize.com.br/v2/subscriptions/${subscriptionId}/cancel`,
{
method: "POST",
headers: {
"x-api-key": process.env.SUNIZE_API_KEY,
"x-api-secret": process.env.SUNIZE_API_SECRET,
},
}
);
const result = await response.json();<?php
$ch = curl_init("https://api.sunize.com.br/v2/subscriptions/{$subscriptionId}/cancel");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"x-api-key: " . getenv("SUNIZE_API_KEY"),
"x-api-secret: " . getenv("SUNIZE_API_SECRET"),
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);import os
import requests
response = requests.post(
f"https://api.sunize.com.br/v2/subscriptions/{subscription_id}/cancel",
headers={
"x-api-key": os.environ["SUNIZE_API_KEY"],
"x-api-secret": os.environ["SUNIZE_API_SECRET"],
},
)
result = response.json()Resposta
{ "id": "rs_8f2a...", "status": "CANCELED" }
Webhook de Transações
Enviado para a URL configurada sempre que o status de uma transação muda.
{ "id": "string", "external_id": "string", "amount": 149.9, "status": "AUTHORIZED" | "PENDING" | "CHARGEBACK" | "REFUNDED" | "FAILED" | "IN_DISPUTE", "payment_method": "string", "tracking": { "utm_source": "string" | null, "utm_medium": "string" | null, "utm_campaign": "string" | null, "utm_content": "string" | null, "utm_term": "string" | null } }
x-api-secret — valide-o pra confirmar
que a chamada veio da Sunize.
Webhook de Assinaturas novo
Enviado para a mesma URL configurada, sempre que uma assinatura mudar de estado.
{ "event": "SUBSCRIPTION_CREATED" | "SUBSCRIPTION_AUTHORIZED" | "SUBSCRIPTION_RENEWED" | "SUBSCRIPTION_LATE" | "SUBSCRIPTION_CANCELED" | "SUBSCRIPTION_RECOVERED", "id": "string", "external_id": "string", "status": "ACTIVE" | "PENDING_AUTHORIZATION" | "LATE" | "CANCELED", "amount": 97, "payment_method": "PIX" | "CREDIT_CARD", "membership_period": "string", "next_payment_date": "string" | null }
| Evento | Quando dispara |
|---|---|
| SUBSCRIPTION_CREATED | Assinatura criada (cartão: já ativa; Pix: aguardando autorização) |
| SUBSCRIPTION_AUTHORIZED | Comprador autorizou o Pix Automático — assinatura passa a ACTIVE |
| SUBSCRIPTION_RENEWED | Uma nova cobrança do ciclo foi aprovada |
| SUBSCRIPTION_LATE | Cobrança do ciclo falhou (produtor pode configurar tentativas automáticas) |
| SUBSCRIPTION_CANCELED | Assinatura cancelada (pelo comprador, produtor ou plataforma) |
| SUBSCRIPTION_RECOVERED | Uma cobrança que havia falhado foi recuperada com sucesso |
Erros
Códigos de erro comuns a todos os endpoints da v2:
| Código | Descrição |
|---|---|
| 401 | API Key ou API Secret ausentes ou inválidos |
| 400 | Dados inválidos na requisição |
| 500 | Erro interno do servidor |
Integrando com ajuda de uma IA?
Publicamos um guia único em Markdown com toda a API v2 — cole no ChatGPT, Claude ou Copilot e peça pra gerar a integração na sua linguagem.