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.
Gere sua chave
Em Integrações > API Keys, gere chaves seguras (pública ou secreta).
Crie a cobrança
Envie POST /api/pix para obter QR Code e Copia e Cola instantâneos.
Pagamento no PIX
O cliente paga pelo banco. A liquidação é confirmada em segundos.
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"Tipos de chave e escopos
| Tipo | Prefixo | Permissõ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 #
| Protocolo | HTTPS obrigatório em produção (TLS 1.2+). |
| Content-Type | Envie Content-Type: application/json nas requisições POST/PUT/PATCH. |
| Valores Financeiros | Número decimal com ponto (ex.: 149.90). Moeda padrão: BRL. |
| Documentos | CPF (11 dígitos) ou CNPJ (14 dígitos). A validação de dígitos verificadores é rigorosa. |
| Datas e Horários | Padrão ISO 8601 com fuso horário (ex.: 2026-10-24T14:30:00-03:00). |
| Formato de Resposta | Objetos 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.
Parâmetros do corpo (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
| amountobrigatório | number | Valor em reais (ex.: 149.90). Deve ser maior que zero. |
| customer_nameobrigatório | string | Nome completo do pagador. |
| customer_emailobrigatório | string | E-mail válido para envio de comprovante. |
| customer_phoneobrigatório | string | Telefone com DDD (apenas números ou formatado). |
| customer_documentobrigatório | string | CPF (11 dígitos) ou CNPJ (14 dígitos) do pagador. |
| postback_urlopcional | string (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_refopcional | string | Identificador da oferta cadastrada na sua conta. |
| product_nameopcional | string | Nome do produto exibido ao cliente (padrão: Pedido via API). |
| product_descriptionopcional | string | Descrição complementar da cobrança. |
| metadataopcional | object | Parâ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
{
"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..."
}
}
}
}{
"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.
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| transaction_codeobrigatório | string | Có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 | failedimport 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 | failedRespostas da API
{
"success": true,
"status": "approved"
}{
"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.
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
{
"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.
Parâmetros de consulta (Query params)
| Parâmetro | Tipo | Descrição |
|---|---|---|
| statusopcional | string | Filtra por status: pending, approved, failed, expired, med, chargeback, refunded. |
| start_dateopcional | string | Data inicial (ex.: 2026-10-01). |
| end_dateopcional | string | Data final (ex.: 2026-10-31). |
| pageopcional | integer | Número da página (padrão: 1). |
| limitopcional | integer | Itens 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
{
"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_).
Parâmetros do corpo (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
| amountobrigatório | number | Valor do saque em reais. Mínimo de R$ 45,00. |
| pix_keyobrigatório | string | Chave PIX de destino do favorecido. |
| pix_key_typeopcional | string | Tipo 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
{
"success": true,
"data": {
"withdrawal_id": "wd_6ad6ea5458",
"status": "pending",
"amount": 250,
"net_amount": 245,
"fee": 5,
"message": "Saque solicitado com sucesso."
}
}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_).
Corpo da requisição
| Campo | Tipo | Descrição |
|---|---|---|
| withdrawal_idobrigatório | string | Identificador ú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 | cancelledconst 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 | cancelledimport 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
{
"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"
}
}{
"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_).
Parâmetros de consulta (Query params)
| Campo | Tipo | Descrição |
|---|---|---|
| statusopcional | string | pending, processing, approved, rejected, failed ou cancelled. |
| pageopcional | integer | Página desejada (padrão: 1). |
| limitopcional | integer | Itens 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
{
"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_).
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
{
"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.
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
{
"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_).
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
{
"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.
Parâmetros do corpo (JSON)
| Campo | Tipo | Descrição |
|---|---|---|
| endpointobrigatório | string | URL pública válida (https://...) que receberá os POSTs. Endereços locais ou privados são bloqueados por proteção anti-SSRF. |
| eventsobrigatório | array<string> | Lista de eventos a escutar (ex.: ["approved", "failed", "withdrawal.approved"]). |
| nameopcional | string | Rótulo de identificação amigável. |
| secretopcional | string | Chave secreta customizada (mínimo 30 caracteres). Se omitida, a API gera uma chave forte com prefixo whsec_. |
| is_activeopcional | boolean | Ativa 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
{
"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."
}Obter webhook por ID #
Retorna a configuração detalhada de um webhook específico pertencente à sua conta.
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
{
"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.
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
{
"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.
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
{
"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
| Evento | Categoria | Gatilho de Disparo |
|---|---|---|
| pending | Cobrança | A cobrança PIX foi gerada e aguarda o pagamento do pagador. |
| approved | Cobrança | Pagamento PIX liquidado e creditado no saldo disponível. Momento de liberar o pedido. |
| failed | Cobrança | A tentativa de pagamento falhou ou foi rejeitada pela adquirente. |
| expired | Cobrança | O QR Code PIX atingiu a data de validade sem que houvesse pagamento. |
| med | Disputa | Mecanismo Especial de Devolução (MED) aberto pelo pagador no Banco Central. O valor líquido fica bloqueado em reserva cautelar. |
| med_cancelled | Disputa | Disputa MED vencida pelo lojista ou encerrada. O valor da reserva retorna ao saldo disponível. |
| chargeback | Disputa | Devolução consumada (MED perdida ou estorno concluído). O valor bloqueado é debitado definitivamente. |
| withdrawal.processing | Saque | Solicitação de saque aceita e enviada para processamento bancário. |
| withdrawal.approved | Saque | Saque PIX liquidado com sucesso na conta bancária de destino. |
| withdrawal.failed | Saque | Falha 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)
{
"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)
{
"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 Sucesso | Seu endpoint deve responder com qualquer status HTTP na faixa 2xx (ex.: 200 OK ou 204 No Content). |
| Timeout | Limite de 10 segundos por requisição. Processe integrações pesadas de forma assíncrona. |
| User-Agent | Identificado pelo cabeçalho diamondpay-webhook/1.0. |
| Idempotência | O 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 segundosValidar 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 HTTP | Formato | Descrição |
|---|---|---|
| X-Webhook-Signature | Hexadecimal puro | Hash HMAC-SHA256 padrão (ex.: 7f83b1657ff...). |
| X-Signature | Hexadecimal puro | Alias com o mesmo valor para compatibilidade. |
| X-Hub-Signature-256 | sha256={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 "", 200Tabela de status da transação e saque #
Status de cobranças PIX (Orders)
| Status | Significado | Estado Final? |
|---|---|---|
| pending | Cobrança criada, aguardando pagamento no PIX. | Não |
| approved | Pagamento confirmado e liquidado no saldo. | Sim |
| failed | Transação falhou ou foi rejeitada pela adquirente. | Sim |
| expired | QR Code expirado por limite de tempo. | Sim |
| med | Disputa MED aberta pelo cliente no Banco Central. Valor em reserva cautelar. | Não |
| med_cancelled | Disputa cancelada ou ganha pelo lojista. Valor desbloqueado. | Sim |
| chargeback | Devolução forçada via MED / contestação concluída. | Sim |
| refunded | Valor estornado ao cliente. | Sim |
Status de saques PIX (Withdrawals)
| Status | Significado | Estado Final? |
|---|---|---|
| pending | Saque solicitado. Valor reservado atomicamente do saldo. | Não |
| processing | Ordem de transferência PIX enviada à adquirente/banco. | Não |
| approved | PIX liquidado com sucesso na conta bancária de destino. | Sim |
| failed | Falha de transferência ou recusa pelo banco recebedor. Saldo e taxa estornados. | Sim |
| rejected | Saque rejeitado administrativamente. Saldo estornado. | Sim |
| cancelled | Saque 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:
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.
{
"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:
{
"success": false,
"error": "Chave API não informada. Envie o header X-Api-Key com sua chave de API.",
"error_code": "API-401"
}| HTTP | error_code | Causa Provável | Ação Recomendada |
|---|---|---|---|
| 400 | API-400 | JSON inválido, parâmetros ausentes ou formato incorreto. | Corrija o payload conforme indicado no campo error. |
| 401 | API-401 | Chave de API ausente ou inválida. | Verifique o envio do cabeçalho X-Api-Key. |
| 403 | API-403 | Chave 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. |
| 404 | API-404 | Recurso inexistente (transação, saque ou webhook não encontrado). | Confira se o ID informado pertence à sua conta. |
| 405 | API-405 | Método HTTP incorreto para a rota chamada. | Consulte o método documentado para o endpoint (GET, POST, PUT, DELETE). |
| 409 | API-409 | Conflito (endpoint de webhook já cadastrado ou idempotência). | Utilize outro endpoint ou confira os registros existentes. |
| 422 | API-422 | Regra de negócio violada (saldo insuficiente, valor abaixo do mínimo). | Ajuste o valor ou verifique o saldo disponível. |
| 429 | API-429 | Limite de requisições excedido (Rate Limit). | Aguarde alguns segundos antes de repetir a requisição. |
| 500 | API-500 / API-5000 | Instabilidade 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.