API REST v1 · Cash In & Cash Out

Documentação da API

Integração de alta conversão para recebimento via PIX, saques automatizados, gestão de webhooks e conciliação em tempo real.

Base URL
https://api.diamond-payments.com

Visão geral #

A API do DiamondPay segue a arquitetura REST, processa dados exclusivamente em formato JSON e utiliza autenticação segura via chaves de API. O ecossistema suporta tanto operações de recebimento (Cash In) quanto solicitações de saque instantâneo (Cash Out) e transferências via PIX.

1

Gere sua chave

Em Integrações > API Keys, gere chaves seguras (pública ou secreta).

2

Crie a cobrança

Envie POST /api/pix para obter QR Code e Copia e Cola instantâneos.

3

Pagamento no PIX

O cliente paga pelo banco. A liquidação é confirmada em segundos.

4

Webhook ativo

Disparamos notificações instantâneas assinadas via HMAC-SHA256.

Autenticação #

Todas as requisições autenticadas exigem o envio da sua chave de API através do cabeçalho HTTP X-Api-Key:

curl -X GET "https://api.diamond-payments.com/api/pix/balance" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
Segurança da Chave Secreta: Mantenha sua chave secreta (sk_live_) em segredo absoluto no servidor backend. Nunca a exponha em código Javascript de frontend, aplicativos mobile ou repositórios públicos.

Tipos de chave e escopos

TipoPrefixoPermissões e Uso
Chave Secreta sk_live_ Acesso completo: Criar cobranças (/api/pix), solicitar e consultar saques (/api/pix/withdrawal), consultar saldo (/api/pix/balance) e gerenciar webhooks via API.
Chave Pública pk_live_ Somente leitura: Consulta de status de cobranças e listagem. Operações financeiras com esta chave retornam status 403 Forbidden.

Restrição de IP (IP Whitelist)

No painel administrativo (Integrações > API Keys), você pode restringir cada chave de API a um ou múltiplos endereços IPv4 ou blocos CIDR. Requisições originadas de IPs não autorizados serão rejeitadas com HTTP 403 Forbidden.

Convenções #

ProtocoloHTTPS obrigatório em produção (TLS 1.2+).
Content-TypeEnvie Content-Type: application/json nas requisições POST/PUT/PATCH.
Valores FinanceirosNúmero decimal com ponto (ex.: 149.90). Moeda padrão: BRL.
DocumentosCPF (11 dígitos) ou CNPJ (14 dígitos). A validação de dígitos verificadores é rigorosa.
Datas e HoráriosPadrão ISO 8601 com fuso horário (ex.: 2026-10-24T14:30:00-03:00).
Formato de RespostaObjetos JSON contendo a flag booleana success e os dados em data. Em caso de falha, retornam error e error_code.

Criar cobrança PIX #

Gera uma cobrança PIX instantânea com código Copia e Cola (EMV) e imagem do QR Code em Base64.

POST https://api.diamond-payments.com/api/pix

Parâmetros do corpo (JSON)

CampoTipoDescrição
amountobrigatórionumberValor em reais (ex.: 149.90). Deve ser maior que zero.
customer_nameobrigatóriostringNome completo do pagador.
customer_emailobrigatóriostringE-mail válido para envio de comprovante.
customer_phoneobrigatóriostringTelefone com DDD (apenas números ou formatado).
customer_documentobrigatóriostringCPF (11 dígitos) ou CNPJ (14 dígitos) do pagador.
postback_urlopcionalstring (URL)URL de retorno dinâmico desta transação (ex.: Typebot, funil, webhook n8n/Make). Aliases aceitos: webhook_url, callback_url. Recebe notificações de status diretamente.
offer_refopcionalstringIdentificador da oferta cadastrada na sua conta.
product_nameopcionalstringNome do produto exibido ao cliente (padrão: Pedido via API).
product_descriptionopcionalstringDescrição complementar da cobrança.
metadataopcionalobjectParâmetros de rastreamento e tracking (UTMs, src, sck).

Exemplo de requisição

curl -X POST "https://api.diamond-payments.com/api/pix" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{
    "amount": 149.90,
    "customer_name": "Cliente Exemplo Martins",
    "customer_email": "[email protected]",
    "customer_phone": "11984217390",
    "customer_document": "52998224725",
    "product_name": "Plano Pro Anual",
    "postback_url": "https://meusite.com.br/api/postback",
    "metadata": {
      "utm": { "utm_source": "meta_ads", "utm_campaign": "vendas_q4" }
    }
  }'
<?php
$payload = [
    'amount'            => 149.90,
    'customer_name'     => 'Cliente Exemplo Martins',
    'customer_email'    => '[email protected]',
    'customer_phone'    => '11984217390',
    'customer_document' => '52998224725',
    'product_name'      => 'Plano Pro Anual',
    'postback_url'      => 'https://meusite.com.br/api/postback',
    'metadata'          => ['utm' => ['utm_source' => 'meta_ads']],
];

$ch = curl_init('https://api.diamond-payments.com/api/pix');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Content-Type: application/json',
        'X-Api-Key: sk_live_SUA_CHAVE_SECRETA',
    ],
    CURLOPT_POSTFIELDS     => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($response['success']) {
    $copiaECola = $response['data']['pix']['qrCode']['emv'];
    $transacao  = $response['data']['id'];
}
const response = await fetch("https://api.diamond-payments.com/api/pix", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "X-Api-Key": process.env.GATEWAY_API_KEY, // sk_live_SUA_CHAVE_SECRETA
  },
  body: JSON.stringify({
    amount: 149.9,
    customer_name: "Cliente Exemplo Martins",
    customer_email: "[email protected]",
    customer_phone: "11984217390",
    customer_document: "52998224725",
    product_name: "Plano Pro Anual",
    postback_url: "https://meusite.com.br/api/postback",
    metadata: { utm: { utm_source: "meta_ads" } },
  }),
});

const { success, data, error } = await response.json();
if (success) {
  console.log("Copia e Cola:", data.pix.qrCode.emv);
  console.log("ID da transação:", data.id);
}
import requests

resp = requests.post(
    "https://api.diamond-payments.com/api/pix",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={
        "amount": 149.90,
        "customer_name": "Cliente Exemplo Martins",
        "customer_email": "[email protected]",
        "customer_phone": "11984217390",
        "customer_document": "52998224725",
        "product_name": "Plano Pro Anual",
        "postback_url": "https://meusite.com.br/api/postback",
        "metadata": {"utm": {"utm_source": "meta_ads"}},
    },
    timeout=60,
)
body = resp.json()
if body["success"]:
    print("Copia e Cola:", body["data"]["pix"]["qrCode"]["emv"])
    print("ID da transação:", body["data"]["id"])

Respostas da API

Cobrança criada com sucesso201 Created
{
    "success": true,
    "data": {
        "id": "tx_8f406f9ae5e7bb85919e",
        "status": "PENDING",
        "amount": 149.9,
        "currency": "BRL",
        "paymentMethod": "pix",
        "postbackUrl": "https://meusite.com.br/api/postback",
        "customerName": "Cliente Exemplo Martins",
        "customerEmail": "[email protected]",
        "feeDetails": {
            "totalFee": 9.24,
            "userFeeAmount": 9.24,
            "calculationType": "custom",
            "feeBreakdown": {
                "fixed_fee": 1,
                "percentage_fee": 5.5,
                "percentage_amount": 8.2445
            }
        },
        "netAmount": 140.66,
        "createdAt": "2026-10-15T21:00:00-03:00",
        "expiresAt": "2026-10-15T21:30:00-03:00",
        "message": "Transação criada com sucesso",
        "pix": {
            "qrCode": {
                "emv": "00020126580014br.gov.bcb.pix0136...5204000053039865406149.905802BR...6304ABCD",
                "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
            }
        }
    }
}
Erro de validação400 Bad Request
{
    "success": false,
    "error": "customer_document inválido. CPF inválido.",
    "error_code": "API-400"
}

Consultar status simplificado #

Consulta rápida que retorna o status atualizado da transação.

POST https://api.diamond-payments.com/api/pix/status

Corpo da requisição

CampoTipoDescrição
transaction_codeobrigatóriostringCódigo único retornado na criação da cobrança (data.id).

Exemplo de requisição

curl -X POST "https://api.diamond-payments.com/api/pix/status" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{ "transaction_code": "tx_8f406f9ae5e7bb85919e" }'
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/status');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
    CURLOPT_POSTFIELDS     => json_encode(['transaction_code' => 'tx_8f406f9ae5e7bb85919e']),
]);
$status = json_decode(curl_exec($ch), true)['status'] ?? null; // pending | approved | failed
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/status", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
  body: JSON.stringify({ transaction_code: "tx_8f406f9ae5e7bb85919e" }),
});
const { status } = await res.json(); // pending | approved | failed
import requests

resp = requests.post(
    "https://api.diamond-payments.com/api/pix/status",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={"transaction_code": "tx_8f406f9ae5e7bb85919e"},
)
print(resp.json()["status"])  # pending | approved | failed

Respostas da API

Status retornado200 OK
{
    "success": true,
    "status": "approved"
}
Cobrança não encontrada404 Not Found
{
    "success": false,
    "error": "Pedido não encontrado",
    "error_code": "API-404"
}

Detalhes da transação #

Recupera a representação completa da cobrança PIX pelo ID, incluindo valores líquidos, taxas, dados do cliente, payload PIX e horários.

GET https://api.diamond-payments.com/api/pix/transactions/{id}

Exemplo de requisição

curl -X GET "https://api.diamond-payments.com/api/pix/transactions/tx_8f406f9ae5e7bb85919e" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/transactions/tx_8f406f9ae5e7bb85919e');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$tx = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($tx['data']);
const res = await fetch("https://api.diamond-payments.com/api/pix/transactions/tx_8f406f9ae5e7bb85919e", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data } = await res.json();
console.log(data);
import requests

resp = requests.get(
    "https://api.diamond-payments.com/api/pix/transactions/tx_8f406f9ae5e7bb85919e",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
)
print(resp.json()["data"])

Resposta da API

Detalhes completos200 OK
{
    "success": true,
    "data": {
        "id": "tx_8f406f9ae5e7bb85919e",
        "status": "APPROVED",
        "amount": 149.9,
        "fee_amount": 9.24,
        "net_amount": 140.66,
        "currency": "BRL",
        "payment_method": "pix",
        "customer": {
            "name": "Cliente Exemplo Martins",
            "email": "[email protected]",
            "phone": "11984217390",
            "document": "52998224725",
            "document_type": "CPF"
        },
        "product": {
            "name": "Plano Pro Anual",
            "description": "Acesso anual com suporte VIP"
        },
        "created_at": "2026-10-15T21:00:00-03:00",
        "updated_at": "2026-10-15T21:02:13-03:00",
        "paid_at": "2026-10-15T21:02:13-03:00",
        "pix": {
            "emv": "00020126580014br.gov.bcb.pix...",
            "qr_code": "https://quickchart.io/qr?text=..."
        }
    }
}

Listar transações #

Lista cobranças da sua conta com suporte a paginação e filtros por status e período.

GET https://api.diamond-payments.com/api/pix/transactions

Parâmetros de consulta (Query params)

ParâmetroTipoDescrição
statusopcionalstringFiltra por status: pending, approved, failed, expired, med, chargeback, refunded.
start_dateopcionalstringData inicial (ex.: 2026-10-01).
end_dateopcionalstringData final (ex.: 2026-10-31).
pageopcionalintegerNúmero da página (padrão: 1).
limitopcionalintegerItens por página (1 a 100, padrão: 10).

Exemplo de requisição

curl -G "https://api.diamond-payments.com/api/pix/transactions" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d status=approved -d page=1 -d limit=10
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/transactions?status=approved&page=1&limit=10');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($res['data']);
const res = await fetch("https://api.diamond-payments.com/api/pix/transactions?status=approved&page=1&limit=10", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data, pagination } = await res.json();
console.log(data, pagination);
import requests

resp = requests.get(
    "https://api.diamond-payments.com/api/pix/transactions",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    params={"status": "approved", "page": 1, "limit": 10},
)
print(resp.json())

Resposta da API

Listagem com paginação200 OK
{
    "success": true,
    "data": [
        {
            "id": "tx_8f406f9ae5e7bb85919e",
            "status": "APPROVED",
            "amount": 149.9,
            "fee_amount": 9.24,
            "net_amount": 140.66,
            "currency": "BRL",
            "payment_method": "pix",
            "customer": {
                "name": "Cliente Exemplo Martins",
                "email": "[email protected]",
                "phone": "11984217390",
                "document": "52998224725",
                "document_type": "CPF"
            },
            "created_at": "2026-10-15T21:00:00-03:00",
            "paid_at": "2026-10-15T21:02:13-03:00"
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 10,
        "total": 1,
        "totalPages": 1
    }
}

Solicitar saque PIX #

Transfere recursos do seu saldo disponível para uma chave PIX cadastrada. Exige chave secreta (sk_live_).

POST https://api.diamond-payments.com/api/pix/withdrawal

Parâmetros do corpo (JSON)

CampoTipoDescrição
amountobrigatórionumberValor do saque em reais. Mínimo de R$ 45,00.
pix_keyobrigatóriostringChave PIX de destino do favorecido.
pix_key_typeopcionalstringTipo da chave: cpf, cnpj, email, phone ou evp (padrão: email).

Exemplo de requisição

curl -X POST "https://api.diamond-payments.com/api/pix/withdrawal" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{
    "amount": 250.00,
    "pix_key_type": "email",
    "pix_key": "[email protected]"
  }'
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/withdrawal');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
    CURLOPT_POSTFIELDS     => json_encode([
        'amount'       => 250.00,
        'pix_key_type' => 'email',
        'pix_key'      => '[email protected]',
    ]),
]);
$saque = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/withdrawal", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
  body: JSON.stringify({
    amount: 250,
    pix_key_type: "email",
    pix_key: "[email protected]",
  }),
});
const saque = await res.json();
import requests

resp = requests.post(
    "https://api.diamond-payments.com/api/pix/withdrawal",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={"amount": 250.00, "pix_key_type": "email", "pix_key": "[email protected]"},
)
print(resp.json())

Resposta da API

Saque registrado201 Created
{
    "success": true,
    "data": {
        "withdrawal_id": "wd_6ad6ea5458",
        "status": "pending",
        "amount": 250,
        "net_amount": 245,
        "fee": 5,
        "message": "Saque solicitado com sucesso."
    }
}
Tarifa fixa de saque: R$ 5,00 por transferência, debitada do montante solicitado. O saldo é reservado atomicamente com travas anti-duplicidade.

Consultar saque #

Verifica o status atualizado de um saque a partir do withdrawal_id retornado no ato da solicitação. Exige chave secreta (sk_live_).

POST https://api.diamond-payments.com/api/pix/withdrawal/status

Corpo da requisição

CampoTipoDescrição
withdrawal_idobrigatóriostringIdentificador único do saque (ex.: wd_6ad6ea5458).

Exemplo de requisição

curl -X POST "https://api.diamond-payments.com/api/pix/withdrawal/status" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{ "withdrawal_id": "wd_6ad6ea5458" }'
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/withdrawal/status');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
    CURLOPT_POSTFIELDS     => json_encode(['withdrawal_id' => 'wd_6ad6ea5458']),
]);
$saque = json_decode(curl_exec($ch), true)['data'] ?? null;
curl_close($ch);
echo $saque['status']; // pending | processing | approved | rejected | failed | cancelled
const res = await fetch("https://api.diamond-payments.com/api/pix/withdrawal/status", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
  body: JSON.stringify({ withdrawal_id: "wd_6ad6ea5458" }),
});
const { data } = await res.json();
console.log(data.status); // pending | processing | approved | rejected | failed | cancelled
import requests

resp = requests.post(
    "https://api.diamond-payments.com/api/pix/withdrawal/status",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={"withdrawal_id": "wd_6ad6ea5458"},
)
print(resp.json()["data"]["status"])

Respostas da API

Status do saque200 OK
{
    "success": true,
    "data": {
        "withdrawal_id": "wd_6ad6ea5458",
        "status": "approved",
        "amount": 250,
        "net_amount": 245,
        "fee": 5,
        "pix_key_type": "email",
        "created_at": "2026-10-15T21:00:00-03:00",
        "processed_at": "2026-10-15T21:03:12-03:00"
    }
}
Saque não encontrado404 Not Found
{
    "success": false,
    "error": "Saque não encontrado",
    "error_code": "API-404"
}

Listar saques #

Retorna o histórico paginado de saques realizados na conta. Exige chave secreta (sk_live_).

GET https://api.diamond-payments.com/api/pix/withdrawals

Parâmetros de consulta (Query params)

CampoTipoDescrição
statusopcionalstringpending, processing, approved, rejected, failed ou cancelled.
pageopcionalintegerPágina desejada (padrão: 1).
limitopcionalintegerItens por página (1 a 100, padrão: 10).

Exemplo de requisição

curl -G "https://api.diamond-payments.com/api/pix/withdrawals" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d status=approved -d page=1 -d limit=10
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/withdrawals?status=approved&page=1&limit=10');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$lista = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/withdrawals?status=approved&page=1&limit=10", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data, pagination } = await res.json();
import requests

resp = requests.get(
    "https://api.diamond-payments.com/api/pix/withdrawals",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    params={"status": "approved", "page": 1, "limit": 10},
)
print(resp.json()["pagination"])

Resposta da API

Histórico de saques200 OK
{
    "success": true,
    "data": [
        {
            "withdrawal_id": "wd_6ad6ea5458",
            "status": "approved",
            "amount": 250,
            "net_amount": 245,
            "fee": 5,
            "pix_key_type": "email",
            "created_at": "2026-10-15T21:00:00-03:00",
            "processed_at": "2026-10-15T21:03:12-03:00"
        }
    ],
    "pagination": {
        "page": 1,
        "limit": 10,
        "total": 1,
        "totalPages": 1
    }
}

Consultar saldo #

Retorna o saldo líquido disponível para saque em tempo real. Exige chave secreta (sk_live_).

GET https://api.diamond-payments.com/api/pix/balance

Exemplo de requisição

curl "https://api.diamond-payments.com/api/pix/balance" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/balance');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$saldo = json_decode(curl_exec($ch), true)['data']['balance'] ?? null;
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/balance", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data } = await res.json();
console.log(data.balance);
import requests

resp = requests.get("https://api.diamond-payments.com/api/pix/balance", headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"})
print(resp.json()["data"]["balance"])

Resposta da API

Saldo da conta200 OK
{
    "success": true,
    "data": {
        "balance": 1500.5,
        "currency": "BRL"
    }
}

Catálogo de eventos de webhooks #

Retorna a lista oficial de todos os eventos suportados pela plataforma para inscrição de webhooks.

GET https://api.diamond-payments.com/api/pix/webhooks/events

Exemplo de requisição

curl -X GET "https://api.diamond-payments.com/api/pix/webhooks/events"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks/events');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$events = json_decode(curl_exec($ch), true)['data'];
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks/events");
const { data } = await res.json();
console.log(data);
import requests
events = requests.get("https://api.diamond-payments.com/api/pix/webhooks/events").json()["data"]
print(events)

Resposta da API

Eventos suportados200 OK
{
    "success": true,
    "data": [
        {
            "event": "pending",
            "category": "order",
            "description": "Cobrança PIX criada (aguardando pagamento)"
        },
        {
            "event": "approved",
            "category": "order",
            "description": "Cobrança PIX paga"
        },
        {
            "event": "failed",
            "category": "order",
            "description": "Cobrança PIX falhou"
        },
        {
            "event": "expired",
            "category": "order",
            "description": "Cobrança PIX expirada"
        },
        {
            "event": "med",
            "category": "order",
            "description": "MED (devolução especial) aberta sobre a cobrança"
        },
        {
            "event": "med_cancelled",
            "category": "order",
            "description": "MED cancelada (valor mantido)"
        },
        {
            "event": "chargeback",
            "category": "order",
            "description": "Cobrança estornada (chargeback\/MED aceita)"
        },
        {
            "event": "refunded",
            "category": "order",
            "description": "Cobrança reembolsada (reembolso manual)"
        },
        {
            "event": "withdrawal.processing",
            "category": "withdrawal",
            "description": "Saque em processamento"
        },
        {
            "event": "withdrawal.approved",
            "category": "withdrawal",
            "description": "Saque concluído"
        },
        {
            "event": "withdrawal.failed",
            "category": "withdrawal",
            "description": "Saque falhou (valor devolvido ao saldo)"
        }
    ]
}

Listar webhooks configurados #

Lista todos os endpoints de webhook cadastrados na sua conta, incluindo o secret para assinatura HMAC. Exige chave secreta (sk_live_).

GET https://api.diamond-payments.com/api/pix/webhooks

Exemplo de requisição

curl -X GET "https://api.diamond-payments.com/api/pix/webhooks" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$webhooks = json_decode(curl_exec($ch), true)['data'];
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data } = await res.json();
console.log(data);
import requests
res = requests.get("https://api.diamond-payments.com/api/pix/webhooks", headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"})
print(res.json()["data"])

Resposta da API

Webhooks cadastrados200 OK
{
    "success": true,
    "data": [
        {
            "id": 1,
            "name": "Meu Servidor de Produção",
            "endpoint": "https://api.meusite.com.br/webhooks/pix",
            "events": [
                "approved",
                "failed",
                "withdrawal.approved",
                "withdrawal.failed"
            ],
            "secret": "whsec_7b9a48f1c8e310...",
            "is_active": true,
            "created_at": "2026-10-15T20:30:00-03:00",
            "updated_at": "2026-10-15T20:30:00-03:00"
        }
    ]
}

Criar webhook via API #

Registra um novo endpoint para receber disparos automatizados de eventos. Exige chave secreta (sk_live_) e autenticação em dois fatores (2FA) ativa na conta.

POST https://api.diamond-payments.com/api/pix/webhooks

Parâmetros do corpo (JSON)

CampoTipoDescrição
endpointobrigatóriostringURL pública válida (https://...) que receberá os POSTs. Endereços locais ou privados são bloqueados por proteção anti-SSRF.
eventsobrigatórioarray<string>Lista de eventos a escutar (ex.: ["approved", "failed", "withdrawal.approved"]).
nameopcionalstringRótulo de identificação amigável.
secretopcionalstringChave secreta customizada (mínimo 30 caracteres). Se omitida, a API gera uma chave forte com prefixo whsec_.
is_activeopcionalbooleanAtiva ou pausa os disparos (padrão: true).

Exemplo de requisição

curl -X POST "https://api.diamond-payments.com/api/pix/webhooks" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{
    "name": "Meu Servidor de Produção",
    "endpoint": "https://api.meusite.com.br/webhooks/pix",
    "events": ["approved", "failed", "withdrawal.approved", "withdrawal.failed"],
    "is_active": true
  }'
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
    CURLOPT_POSTFIELDS     => json_encode([
        'name'      => 'Meu Servidor de Produção',
        'endpoint'  => 'https://api.meusite.com.br/webhooks/pix',
        'events'    => ['approved', 'failed', 'withdrawal.approved', 'withdrawal.failed'],
        'is_active' => true,
    ]),
]);
$webhook = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks", {
  method: "POST",
  headers: { "Content-Type": "application/json", "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
  body: JSON.stringify({
    name: "Meu Servidor de Produção",
    endpoint: "https://api.meusite.com.br/webhooks/pix",
    events: ["approved", "failed", "withdrawal.approved", "withdrawal.failed"],
    is_active: true,
  }),
});
const { data } = await res.json();
console.log("Secret gerado:", data.secret);
import requests
resp = requests.post(
    "https://api.diamond-payments.com/api/pix/webhooks",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={
        "name": "Meu Servidor de Produção",
        "endpoint": "https://api.meusite.com.br/webhooks/pix",
        "events": ["approved", "failed", "withdrawal.approved", "withdrawal.failed"],
        "is_active": True,
    },
)
print("Secret:", resp.json()["data"]["secret"])

Resposta da API

Webhook criado com secret201 Created
{
    "success": true,
    "data": {
        "id": 2,
        "name": "Servidor de Notificações",
        "endpoint": "https://api.meusite.com.br/webhooks/pix",
        "events": [
            "approved",
            "failed",
            "withdrawal.approved",
            "withdrawal.failed"
        ],
        "secret": "whsec_e4b1029c9a48fe8102a9b31f7c...",
        "is_active": true,
        "created_at": "2026-10-15T21:00:00-03:00",
        "updated_at": "2026-10-15T21:00:00-03:00"
    },
    "message": "Webhook criado com sucesso."
}
Limite operacional de 5 webhooks por conta. Guarde o valor do secret retornado para validar as assinaturas no seu endpoint.

Obter webhook por ID #

Retorna a configuração detalhada de um webhook específico pertencente à sua conta.

GET https://api.diamond-payments.com/api/pix/webhooks/{id}

Exemplo de requisição

curl -X GET "https://api.diamond-payments.com/api/pix/webhooks/1" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks/1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$webhook = json_decode(curl_exec($ch), true)['data'];
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks/1", {
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const { data } = await res.json();
import requests
res = requests.get("https://api.diamond-payments.com/api/pix/webhooks/1", headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"})
print(res.json()["data"])

Resposta da API

Dados do webhook200 OK
{
    "success": true,
    "data": {
        "id": 1,
        "name": "Meu Servidor de Produção",
        "endpoint": "https://api.meusite.com.br/webhooks/pix",
        "events": [
            "approved",
            "failed",
            "withdrawal.approved",
            "withdrawal.failed"
        ],
        "secret": "whsec_7b9a48f1c8e310...",
        "is_active": true,
        "created_at": "2026-10-15T20:30:00-03:00",
        "updated_at": "2026-10-15T20:30:00-03:00"
    }
}

Atualizar webhook #

Altera a URL do endpoint, lista de eventos ou status ativo/inativo de um webhook existente. Também permite regerar a chave secreta via regenerate_secret: true.

PUT https://api.diamond-payments.com/api/pix/webhooks/{id}

Exemplo de requisição

curl -X PUT "https://api.diamond-payments.com/api/pix/webhooks/1" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA" \
  -d '{
    "events": ["approved", "pending", "med", "chargeback"],
    "is_active": true
  }'
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks/1');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json', 'X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
    CURLOPT_POSTFIELDS     => json_encode([
        'events'    => ['approved', 'pending', 'med', 'chargeback'],
        'is_active' => true,
    ]),
]);
$webhook = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks/1", {
  method: "PUT",
  headers: { "Content-Type": "application/json", "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
  body: JSON.stringify({
    events: ["approved", "pending", "med", "chargeback"],
    is_active: true,
  }),
});
const { data } = await res.json();
import requests
resp = requests.put(
    "https://api.diamond-payments.com/api/pix/webhooks/1",
    headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"},
    json={"events": ["approved", "pending", "med", "chargeback"], "is_active": True},
)
print(resp.json())

Resposta da API

Webhook atualizado200 OK
{
    "success": true,
    "data": {
        "id": 1,
        "name": "Meu Servidor de Produção",
        "endpoint": "https://api.meusite.com.br/webhooks/pix",
        "events": [
            "approved",
            "pending",
            "med",
            "chargeback"
        ],
        "secret": "whsec_7b9a48f1c8e310...",
        "is_active": true,
        "created_at": "2026-10-15T20:30:00-03:00",
        "updated_at": "2026-10-15T21:15:00-03:00"
    },
    "message": "Webhook atualizado com sucesso."
}

Excluir webhook #

Remove definitivamente um webhook cadastrado na conta. Disparos futuros para este endpoint cessam imediatamente.

DELETE https://api.diamond-payments.com/api/pix/webhooks/{id}

Exemplo de requisição

curl -X DELETE "https://api.diamond-payments.com/api/pix/webhooks/1" \
  -H "X-Api-Key: sk_live_SUA_CHAVE_SECRETA"
<?php
$ch = curl_init('https://api.diamond-payments.com/api/pix/webhooks/1');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['X-Api-Key: sk_live_SUA_CHAVE_SECRETA'],
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
const res = await fetch("https://api.diamond-payments.com/api/pix/webhooks/1", {
  method: "DELETE",
  headers: { "X-Api-Key": "sk_live_SUA_CHAVE_SECRETA" },
});
const result = await res.json();
import requests
res = requests.delete("https://api.diamond-payments.com/api/pix/webhooks/1", headers={"X-Api-Key": "sk_live_SUA_CHAVE_SECRETA"})
print(res.json())

Resposta da API

Webhook removido200 OK
{
    "success": true,
    "message": "Webhook removido com sucesso."
}

Notificações em tempo real (Webhooks) #

Webhooks eliminam a necessidade de polling contínuo, notificando seu servidor imediatamente após qualquer alteração de status em cobranças ou saques. Cada requisição é enviada como um POST HTTP com payload JSON assinado.

Catálogo completo de eventos

EventoCategoriaGatilho de Disparo
pendingCobrançaA cobrança PIX foi gerada e aguarda o pagamento do pagador.
approvedCobrançaPagamento PIX liquidado e creditado no saldo disponível. Momento de liberar o pedido.
failedCobrançaA tentativa de pagamento falhou ou foi rejeitada pela adquirente.
expiredCobrançaO QR Code PIX atingiu a data de validade sem que houvesse pagamento.
medDisputaMecanismo Especial de Devolução (MED) aberto pelo pagador no Banco Central. O valor líquido fica bloqueado em reserva cautelar.
med_cancelledDisputaDisputa MED vencida pelo lojista ou encerrada. O valor da reserva retorna ao saldo disponível.
chargebackDisputaDevolução consumada (MED perdida ou estorno concluído). O valor bloqueado é debitado definitivamente.
withdrawal.processingSaqueSolicitação de saque aceita e enviada para processamento bancário.
withdrawal.approvedSaqueSaque PIX liquidado com sucesso na conta bancária de destino.
withdrawal.failedSaqueFalha no PIX de saída (chave inválida ou recusa bancária). O valor e a tarifa voltam integralmente ao saldo.

Payload de evento de cobrança (order)

Exemplo de evento approvedPOST JSON
{
    "event": "approved",
    "order": {
        "id": 1024,
        "transaction_code": "tx_8f406f9ae5e7bb85919e",
        "external_id": "ped_2026_94821",
        "postback_url": "https://meusite.com.br/api/postback",
        "amount": "149.90",
        "fee_amount": "9.24",
        "net_amount": "140.66",
        "status": "approved",
        "payment_method": "pix",
        "customer_name": "Cliente Exemplo Martins",
        "customer_email": "[email protected]",
        "customer_phone": "11984217390",
        "customer_document": "52998224725",
        "product_name": "Plano Pro Anual",
        "created_at": "2026-10-15 21:00:00",
        "paid_at": "2026-10-15 21:02:13",
        "updated_at": "2026-10-15 21:02:13"
    },
    "timestamp": "2026-10-15T21:02:13-03:00"
}

Payload de evento de saque (withdrawal)

Exemplo de evento withdrawal.approvedPOST JSON
{
    "event": "withdrawal.approved",
    "withdrawal": {
        "withdrawal_id": "wd_6ad6ea5458",
        "status": "approved",
        "amount": 250,
        "fee_amount": 5,
        "net_amount": 245,
        "pix_key_type": "email",
        "created_at": "2026-10-15 21:00:00",
        "processed_at": "2026-10-15 21:03:12"
    },
    "timestamp": "2026-10-15T21:03:12-03:00"
}

Requisitos do endpoint receptor

Código de SucessoSeu endpoint deve responder com qualquer status HTTP na faixa 2xx (ex.: 200 OK ou 204 No Content).
TimeoutLimite de 10 segundos por requisição. Processe integrações pesadas de forma assíncrona.
User-AgentIdentificado pelo cabeçalho diamondpay-webhook/1.0.
IdempotênciaO mesmo evento pode ser retransmitido em caso de instabilidade na sua rede. Utilize transaction_code ou withdrawal_id como chave de desduplicação.

Exemplo de implementação do endpoint

<?php
// endpoint receptor cadastrado em Webhooks
$payload = json_decode(file_get_contents('php://input'), true);

if (!$payload || empty($payload['event'])) {
    http_response_code(400);
    exit;
}

$event = $payload['event'];

// Eventos de cobrança (order)
if (!empty($payload['order'])) {
    $code = $payload['order']['transaction_code'];
    if ($event === 'approved') {
        // Libere o pedido / produto para o cliente
    } elseif ($event === 'failed' || $event === 'expired') {
        // Cancele o pedido
    } elseif ($event === 'med' || $event === 'chargeback') {
        // Notifique seu financeiro sobre a disputa / estorno
    }
}

// Eventos de saque (withdrawal)
if (!empty($payload['withdrawal'])) {
    $wdId = $payload['withdrawal']['withdrawal_id'];
    if ($event === 'withdrawal.approved') {
        // Saque concluído no banco
    } elseif ($event === 'withdrawal.failed') {
        // Saque falhou e o valor foi devolvido ao saldo
    }
}

http_response_code(200); // responda 2xx em até 10 segundos
echo 'ok';
import express from "express";
const app = express();
app.use(express.json());

app.post("/webhook", async (req, res) => {
  const { event, order, withdrawal } = req.body ?? {};
  if (!event) return res.sendStatus(400);

  if (order) {
    if (event === "approved") {
      // await liberarPedido(order.transaction_code);
    }
  } else if (withdrawal) {
    if (event === "withdrawal.approved") {
      // Saque concluído
    }
  }

  res.sendStatus(200); // responda 2xx em até 10 segundos
});

app.listen(3000);
from flask import Flask, request

app = Flask(__name__)

@app.post("/webhook")
def webhook():
    payload = request.get_json(silent=True) or {}
    event = payload.get("event")
    if not event:
        return "", 400

    order = payload.get("order")
    if order and event == "approved":
        pass  # liberar_pedido(order["transaction_code"])

    return "ok", 200  # responda 2xx em até 10 segundos

Validar assinatura HMAC-SHA256 #

Para garantir a autenticidade e inviolabilidade dos webhooks, cada disparo é assinado com HMAC SHA-256 calculado sobre o corpo bruto (raw body) da requisição HTTP, utilizando como chave o secret do seu webhook.

Cabeçalho HTTPFormatoDescrição
X-Webhook-SignatureHexadecimal puroHash HMAC-SHA256 padrão (ex.: 7f83b1657ff...).
X-SignatureHexadecimal puroAlias com o mesmo valor para compatibilidade.
X-Hub-Signature-256sha256={hash}Padrão GitHub/Meta com prefixo de algoritmo.

Código para validação no seu servidor

<?php
$secret   = getenv('WEBHOOK_SECRET');            // secret whsec_... retornado na criação
$raw      = file_get_contents('php://input');    // corpo bruto, sem decodificar
$sent     = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? ($_SERVER['HTTP_X_SIGNATURE'] ?? '');
$expected = hash_hmac('sha256', $raw, $secret);

if (!hash_equals($expected, $sent)) {
    http_response_code(401);
    exit;
}
// assinatura válida: processe o evento
http_response_code(200);
import crypto from "crypto";

// express.raw preserva o corpo bruto necessário para o cálculo
app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const expected = crypto
    .createHmac("sha256", process.env.WEBHOOK_SECRET)
    .update(req.body)
    .digest("hex");
  const sent = req.get("X-Webhook-Signature") || req.get("X-Signature") || "";
  const ok = sent.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(sent), Buffer.from(expected));
  if (!ok) return res.sendStatus(401);
  // assinatura válida: processe o evento
  res.sendStatus(200);
});
import hashlib, hmac, os
from flask import Flask, request, abort

app = Flask(__name__)

@app.post("/webhook")
def webhook():
    expected = hmac.new(
        os.environ["WEBHOOK_SECRET"].encode(), request.get_data(), hashlib.sha256
    ).hexdigest()
    sent = request.headers.get("X-Webhook-Signature") or request.headers.get("X-Signature") or ""
    if not hmac.compare_digest(expected, sent):
        abort(401)
    # assinatura válida: processe o evento
    return "", 200
Atenção ao corpo da requisição: O cálculo da assinatura deve ser executado sobre o payload binário original exatamente como trafegou na rede. Se o seu framework reformatar o JSON ou reordenar chaves antes da validação, o hash calculado será diferente. Utilize sempre funções de comparação de tempo constante (hash_equals em PHP, timingSafeEqual em Node.js).

Tabela de status da transação e saque #

Status de cobranças PIX (Orders)

StatusSignificadoEstado Final?
pendingCobrança criada, aguardando pagamento no PIX.Não
approvedPagamento confirmado e liquidado no saldo.Sim
failedTransação falhou ou foi rejeitada pela adquirente.Sim
expiredQR Code expirado por limite de tempo.Sim
medDisputa MED aberta pelo cliente no Banco Central. Valor em reserva cautelar.Não
med_cancelledDisputa cancelada ou ganha pelo lojista. Valor desbloqueado.Sim
chargebackDevolução forçada via MED / contestação concluída.Sim
refundedValor estornado ao cliente.Sim

Status de saques PIX (Withdrawals)

StatusSignificadoEstado Final?
pendingSaque solicitado. Valor reservado atomicamente do saldo.Não
processingOrdem de transferência PIX enviada à adquirente/banco.Não
approvedPIX liquidado com sucesso na conta bancária de destino.Sim
failedFalha de transferência ou recusa pelo banco recebedor. Saldo e taxa estornados.Sim
rejectedSaque rejeitado administrativamente. Saldo estornado.Sim
cancelledSaque cancelado. Saldo estornado.Sim

Taxas aplicadas na sua conta #

As taxas aplicadas a cada cobrança aprovada são debitadas automaticamente do valor bruto. As taxas vigentes para a sua conta são:

Percentual por venda
5,5%
Taxa fixa por venda
R$ 1,00
Tarifa de saque
R$ 5,00
Simulação de cálculo: Cobrança de R$ 149,90 → Taxa de 5,5% + R$ 1,00 = R$ 9,24. Valor líquido creditado: R$ 140,66.

Rastreamento UTM e atribuição #

Envie parâmetros de tráfego pago dentro do objeto metadata na criação da cobrança para rastreamento de ROI e atribuição no painel. Chaves reconhecidas nativamente: utm_source, utm_medium, utm_campaign, utm_content, utm_term, src e sck.

Estrutura de metadados de marketingJSON
{
    "metadata": {
        "utm": {
            "utm_source": "meta_ads",
            "utm_medium": "cpc",
            "utm_campaign": "lancamento_q4",
            "utm_content": "video_criativo_01",
            "utm_term": "publico_aberto",
            "src": "checkout_direct",
            "sck": "btn_compra_topo"
        }
    }
}

Códigos de erro e status HTTP #

Em situações de erro, a API responde com status HTTP semântico e corpo JSON estruturado contendo a descrição amigável e o código interno error_code:

Exemplo de resposta de erro401 Unauthorized
{
    "success": false,
    "error": "Chave API não informada. Envie o header X-Api-Key com sua chave de API.",
    "error_code": "API-401"
}
HTTPerror_codeCausa ProvávelAção Recomendada
400API-400JSON inválido, parâmetros ausentes ou formato incorreto.Corrija o payload conforme indicado no campo error.
401API-401Chave de API ausente ou inválida.Verifique o envio do cabeçalho X-Api-Key.
403API-403Chave pública usada em escrita, IP não autorizado, conta suspensa ou 2FA inativo.Utilize chave secreta (sk_live_), autorize o IP ou ative o 2FA.
404API-404Recurso inexistente (transação, saque ou webhook não encontrado).Confira se o ID informado pertence à sua conta.
405API-405Método HTTP incorreto para a rota chamada.Consulte o método documentado para o endpoint (GET, POST, PUT, DELETE).
409API-409Conflito (endpoint de webhook já cadastrado ou idempotência).Utilize outro endpoint ou confira os registros existentes.
422API-422Regra de negócio violada (saldo insuficiente, valor abaixo do mínimo).Ajuste o valor ou verifique o saldo disponível.
429API-429Limite de requisições excedido (Rate Limit).Aguarde alguns segundos antes de repetir a requisição.
500API-500 / API-5000Instabilidade temporária na adquirente ou erro de processamento.Tente novamente em instantes utilizando backoff exponencial.

Boas práticas de integração #

Guarde as chaves em variáveis de ambiente

Nunca coloque credenciais em código versionado no Git. Utilize arquivos .env ou secret managers.

Valide assinaturas HMAC em todos os webhooks

Garanta que cada requisição recebida partiu efetivamente do gateway antes de liberar produtos ou saldos.

Implemente idempotência no receptor

Armazene os transaction_code processados para ignorar duplicatas decorrentes de reenvios automáticos de rede.

Responda rapidamente aos webhooks

Envie HTTP 200 em até 2 segundos e processe entregas de produto em filas ou background jobs assíncronos.

Configure timeouts de rede generosos

Operações de geração de QR Code e consultas de adquirente podem levar alguns segundos. Utilize timeout de 30 a 60 segundos.

Utilize IP Whitelist em produção

Restrinja suas chaves secretas aos IPs fixos dos seus servidores de produção para proteção máxima.

Copiado para a área de transferência