Droppay

Documentação para desenvolvedores

API da Droppay

Pix, cartão, USDT, split, saques e webhooks assinados. Tudo o que você precisa para integrar seu sistema, com exemplos prontos.

Base URL
https://droppayofc.net/api/v1
OpenAPI (YAML)

API REST v1

Integração estável para gateway, marketplace e plataforma

Crie cobranças Pix, consulte e concilie transações, leia saldo/extrato, faça saques Pix e receba webhooks assinados. O contrato importável é o OpenAPI disponível nesta página.

Contrato oficial: valores monetários são em reais; novas integrações usam Bearer + X-Client-ID; criação de Pix/saque deve usar Idempotency-Key; libere pedidos somente após completed.

URL base das integrações

Use exclusivamente https://droppayofc.net/api/v1. Não use endereços técnicos da hospedagem como base da API.

Se o erro for de DNS, revise a URL base. Se receber 401 ou 403 em JSON, verifique o token, o X-Client-ID, a aprovação Gateway e a permissão payments:write. Não envie tokens ao suporte.

Início rápido

Primeiro Pix

cURL
curl -X POST "https://droppayofc.net/api/v1/payments/pix" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-Client-ID: SEU_CLIENT_ID" \
  -H "Idempotency-Key: pedido-1042-pix" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 49.90,
    "payer_name": "Maria Souza",
    "payer_email": "[email protected]",
    "payer_cpf": "52998224725",
    "payer_phone": "5511999999999",
    "reference": "pedido-1042"
  }'
JSON · 201
{
  "success": true,
  "data": {
    "transaction_uuid": "9d3f1c1e-6a2b-4d7e-9a51-2f0c8b7e4a10",
    "reference": "pedido-1042",
    "merchant": { "id": 42, "name": "Gateway Exemplo", "email": "[email protected]", "document": "11222333000181", "phone": "5511999999999" },
    "integration": { "client_id": "cli_gateway_01", "name": "Produção", "project": "Gateway Exemplo" },
    "amount": 49.90,
    "fee": 1.50,
    "amount_net": 48.40,
    "status": "pending",
    "pix_code": "000201010212...",
    "qr_code_base64": "data:image/svg+xml;base64,...",
    "expires_at": "2026-10-25T23:30:00-03:00",
    "expires_in_seconds": 86400
  }
}

Guarde transaction_uuid junto do pedido. O vencimento varia por adquirente: trate expires_at da resposta como fonte da verdade. Para confirmar pagamento use webhook deposit.completed ou GET /payments/{uuid}.

Segurança

Autenticação

Headers oficiais
Authorization: Bearer SEU_TOKEN
X-Client-ID: SEU_CLIENT_ID
Accept: application/json
Content-Type: application/json

Contrato novo

Envie sempre Bearer + X-Client-ID. Token deve ficar somente no servidor. Se houver IPs permitidos na credencial, chamadas de outros IPs recebem 403.

Compatibilidade

Integrações antigas que enviam somente o token ou usam X-API-Token continuam aceitas. Não use token na URL ou no corpo.

O mesmo token é o segredo dos webhooks. Ele é exibido no painel no momento da criação/rotação e deve ser tratado como segredo.

Contrato

Convenções e limites

Consultas, limites e segurança

Prefira webhooks para acompanhar os pagamentos. Se precisar consultar GET /payments/{uuid}, use intervalo de pelo menos 30 segundos. O GET retorna o estado salvo na Droppay sem esperar a adquirente. Para cobranças abertas, pode agendar uma verificação em segundo plano, com intervalo mínimo de 30 segundos e sem acumular jobs duplicados da mesma transação. Webhooks, jobs e conciliação agendada atualizam esse estado; a confirmação pode aparecer com atraso.

Em HTTP 429, respeite Retry-After e aumente o intervalo das tentativas. Os limites da API valem por IP, credencial e conta. A revogação ou expiração de uma credencial também impede o envio de seus webhooks ainda na fila.

URLs de webhook precisam usar HTTPS público. Redirecionamentos não são seguidos. As conexões validam o certificado TLS e usam os IPs públicos aprovados na resolução DNS. Webhooks legados de Shopify e WooCommerce estão indisponíveis; utilize os endpoints documentados da API v1.

Conta responsável e identificação para suporte

merchant identifica o cliente cadastrado na Droppay que é titular da operação: ID da conta, nome, e-mail, CPF/CNPJ e telefone do cadastro. A identidade é determinada pela conta da credencial autenticada, sem precisar reenviar esses dados em cada pedido.

integration informa o Client ID, nome da credencial e projeto de origem. Não inclui token, senha ou segredo. Nas transações, os rótulos registrados na criação são preservados; saques e links consultam a credencial vinculada atual. Dados não registrados podem ser null.

payer e payer_* continuam identificando o comprador que paga. reference é a referência do pedido/operação no seu gateway; não altera o titular da conta Droppay.

JSON · identificação na resposta
{
  "merchant": {
    "id": 42,
    "name": "Gateway Exemplo",
    "email": "[email protected]",
    "document": "11222333000181",
    "phone": "5511999999999"
  },
  "integration": {
    "client_id": "cli_gateway_01",
    "name": "Produção",
    "project": "Gateway Exemplo"
  },
  "reference": "pedido-1042"
}

Esses blocos acompanham criação e consulta de pagamentos, consultas de transações, saques, links de pagamento e os dados dos webhooks. O extrato JSON inclui merchant no nível principal; o CSV mantém seu formato anterior.

Para atendimento: informe o UUID Droppay (ou ID do saque), merchant.id, integration.client_id e a referência do seu sistema. O admin pode buscar esses identificadores e acessar os dados de contato da conta responsável.

Uma credencial representa uma conta cadastrada na Droppay. Os usuários internos do seu gateway não são identificados automaticamente como contas Droppay. Enviar merchant, merchant_id ou user_id no corpo não escolhe outro titular. Cada conta Droppay deve usar sua própria credencial.

Esta identificação serve à rastreabilidade da operação na Droppay. O nome do recebedor exibido no comprovante Pix ou no banco depende da adquirente e da conta recebedora; não é alterado por esses campos. Respostas e webhooks só contêm a identidade da própria conta autorizada.

Dinheiro

BRL como JSON number: 49.90. amount/amount_gross = bruto, fee = taxa, amount_net = líquido.

Idempotência

Em POST /payments/pix e POST /cashout/pix, envie Idempotency-Key (8–80 caracteres). Replay devolve idempotent_replay: true.

Referência

reference é seu ID de pedido/lojista. Volta em respostas/webhooks e pode filtrar transações e extrato.

Rate limit

Padrão: 120 req/min por token e teto adicional por conta; parceiros podem ter limite próprio. Também existe proteção por IP. Em 429 respeite Retry-After.

Datas

ISO 8601 nas respostas; filtros usam AAAA-MM-DD. Não calcule vencimento do Pix por conta própria: use expires_at.

Timeout

Use timeout de 30s. Em erro de rede/5xx, consulte/reuse a mesma Idempotency-Key antes de criar outra operação.

Receber

Cobrança Pix

Para cobrar o cliente final use sempre este endpoint.

POSThttps://droppayofc.net/api/v1/payments/pix
CampoTipoObrigatórioDescrição
amountdecimalSimValor bruto em reais. A taxa é descontada no ato e amount_net é o valor efetivamente creditado.
payer_namestringSimNome do pagador.
payer_emailstringSimE-mail válido.
payer_cpfstringSimCPF ou CNPJ válido por dígito verificador.
payer_phonestringNãoDDD+número, opcionalmente com 55. Recomendado para compatibilidade entre adquirentes.
descriptionstringNãoDescrição de até 500 caracteres.
referencestringNãoSeu ID externo, até 120 caracteres.
webhook_urlstringNãoHTTPS público específico desta cobrança.
settlementstringNãobrl (padrão) ou usdt quando habilitado.
splitsarrayNãoRecebedores {email, percentage}; soma até 100%.
A criação responde pending. Nunca libere produto/serviço só porque o QR foi criado.

Depósito próprio

POST /cashin/pix existe somente para colocar saldo na própria conta. O valor do Pix é bruto; a taxa é descontada e somente o líquido entra no saldo. Gateways e plataformas não devem usá-lo para cobranças de clientes.

Receber

Cartão de crédito

Disponível apenas para contas habilitadas.

POSThttps://droppayofc.net/api/v1/payments/credit-card

Respostas: 201 approved; 202 requires_authentication ou processing; 402 declined. Nunca grave número completo ou CVV. Em 3DS, confirme o resultado pela consulta/webhook, não pela URL de retorno.

POSThttps://droppayofc.net/api/v1/payments/{transaction_uuid}/refund

Envie {"amount": 50.00} para parcial ou corpo vazio para total.

Checkout hospedado

Link de pagamento

POSThttps://droppayofc.net/api/v1/payment-links
CampoTipoObrigatórioDescrição
amountdecimalSimValor em reais, mínimo 1.
descriptionstringSimDescrição, 2 a 120 caracteres.
methodsarrayNãopix e/ou credit_card.
max_installmentsintegerNão1 a 12.
success_url / cancel_urlurlNãoHTTPS público.
webhook_urlurlNãoHTTPS público específico do link.
expires_in_minutesintegerNão5 a 43200. Padrão 1440.
single_usebooleanNãoPadrão true.
external_referencestringNãoSeu código externo.
GEThttps://droppayofc.net/api/v1/payment-links/{id}
DELETEhttps://droppayofc.net/api/v1/payment-links/{id}

Status: active, paid, expired ou cancelled. Um link pago não pode ser cancelado.

Liquidação

Pix convertido em USDT

Quando habilitado para a conta, envie "settlement":"usdt" em POST /payments/pix. A consulta da cobrança traz o bloco settlement. A confirmação do Pix continua sendo deposit.completed; entrega cripto usa crypto_settlement.completed.

Marketplace

Split de pagamento

JSON
{
  "amount": 100.00,
  "payer_name": "Maria Souza",
  "payer_email": "[email protected]",
  "payer_cpf": "52998224725",
  "splits": [
    {"email": "[email protected]", "percentage": 20}
  ]
}

Recebedores precisam ser contas aprovadas. E-mails não podem repetir e a soma não pode superar 100%. O split é calculado sobre o líquido após a taxa da Droppay.

Conciliação

Consultar, listar, saldo e extrato

GEThttps://droppayofc.net/api/v1/payments/{transaction_uuid}

Fonte da verdade para uma cobrança. Se estiver aberta, a Droppay tenta conferir a adquirente antes de responder.

GEThttps://droppayofc.net/api/v1/transactions?status=completed&type=pix&reference=pedido-1042&per_page=50

Filtros aceitos: status, type (pix|credit), start_date, end_date, reference, page e per_page (1–100).

GEThttps://droppayofc.net/api/v1/transactions/{transaction_uuid}
GEThttps://droppayofc.net/api/v1/balance

available_for_withdrawal considera dívida de MED/chargeback e reserva de parceiro. Consultar saldo também pode reconciliar pendências recentes, no máximo uma vez por minuto por conta.

GEThttps://droppayofc.net/api/v1/statement?from=2026-10-01&to=2026-10-31&format=json

Janela máxima de 31 dias; format=csv também é aceito. Cada linha traz bruto, taxa e líquido; o líquido é o valor realmente creditado ou enviado.

Pagar

Saque via Pix

Você informa o total que deseja retirar do saldo. A taxa é descontada no ato e somente o líquido é enviado para a chave Pix.

POSThttps://droppayofc.net/api/v1/cashout/pix
CampoTipoObrigatórioDescrição
amountdecimalSimTotal a debitar do saldo (mínimo R$ 10,00). A taxa é descontada deste valor.
pix_keystringSimCPF, CNPJ, e-mail, telefone ou EVP. Validada antes de reservar saldo.
pix_key_typestringNãoCPF, CNPJ, EMAIL, PHONE ou EVP. Se omitido, a Droppay tenta inferir.
referencestringNãoSeu ID de cliente/pedido.
webhook_urlurlNãoHTTPS público específico deste saque.

Automático

Exige credencial em modo automático e IP de origem cadastrado. Aprovação da conta, limites e saldo são verificados antes do envio. Parceiros ativados pelo administrador com acesso à API liberado dispensam KYC cadastral.

Homologação

Postman, Insomnia, Thunder Client e bibliotecas HTTP são permitidos. User-Agent não é mecanismo de segurança.

Exemplo: se amount=22.00 e a taxa calculada for R$ 3,99, a carteira é debitada em R$ 22,00 e o Pix enviado é de R$ 18,01.

O saldo é reservado atomicamente para impedir duplo gasto. A adquirente é escolhida pelo roteamento; se a primeira estiver indisponível antes do envio, a próxima pode assumir. Em falha explícita, o valor volta ao saldo. Em resultado incerto, o saque fica em processamento para conferência — nunca é reenviado às cegas.

GEThttps://droppayofc.net/api/v1/withdrawals/{id}

Alias compatível: GET /cashout/{id}. Campos principais: status, amount (líquido), amount_gross (total debitado), fee, payout_amount, pix_key, pix_key_type e reference.

Notificações

Webhooks

HTTP
POST /seu-webhook HTTP/1.1
Content-Type: application/json
X-Webhook-Id: 7f89c866-8d5c-4b84-8b8b-2ff8b67c962a
X-Webhook-Event: deposit.completed
X-Webhook-Timestamp: 1792960200
X-Webhook-Signature-V2: t=1792960200,v1=...
X-Webhook-Signature: ...

{"id":"7f89c866-8d5c-4b84-8b8b-2ff8b67c962a","event":"deposit.completed","data":{"transaction_uuid":"...","status":"completed","amount":49.90,"fee":1.50,"amount_net":48.40},"created_at":"2026-10-25T23:30:00-03:00"}

URL deve ser HTTPS pública e responder 2xx em até 10 segundos. Não seguimos redirects. Em erro de conexão ou 5xx, tentamos novamente em cerca de 60s, até 3 tentativas. 4xx é considerado rejeição definitiva.

EventoUso
deposit.completedCobrança confirmada; evento principal para liberar pedido.
transaction.waiting_paymentCobrança aguardando pagamento.
transaction.failedCobrança encerrada; status é failed/cancelled e reason pode ser expired.
transaction.refundedEstorno de transação.
transaction.chargebackContestação/MED/chargeback.
withdrawal.pendingSaque criado/reservado.
withdrawal.completedSaque confirmado como pago.
withdrawal.failedSaque falhou/foi recusado e valor retornou ao saldo.
crypto_settlement.completedLiquidação cripto concluída.
checkout.order_paidPedido de link/checkout pago.

Eventos podem chegar fora de ordem ou repetidos. Guarde o X-Webhook-Id/id do evento e, em dúvida, consulte a operação pela API.

HMAC

Validar assinatura do webhook

  1. 1. Leia o corpo cru da requisição.
  2. 2. Leia t e v1 em X-Webhook-Signature-V2.
  3. 3. Calcule HMAC-SHA256(token, t + "." + corpo) e compare em tempo constante.
  4. 4. Recuse timestamps com diferença maior que 5 minutos e deduplique pelo ID do evento.
PHP
$raw = file_get_contents("php://input");
$header = $_SERVER["HTTP_X_WEBHOOK_SIGNATURE_V2"] ?? "";
preg_match("/t=(\d+),v1=([a-f0-9]{64})/i", $header, $m);
$timestamp = $m[1] ?? "";
$received = strtolower($m[2] ?? "");
if (!$timestamp || abs(time() - (int) $timestamp) > 300) { http_response_code(401); exit; }
$expected = hash_hmac("sha256", $timestamp . "." . $raw, getenv("DROPPAY_API_TOKEN"));
if (!hash_equals($expected, $received)) { http_response_code(401); exit; }
http_response_code(204);

Máquina de estados

Status

CobrançaSignificado
pendingCriada/aguardando confirmação.
waiting_paymentAguardando pagamento.
processingEm conferência.
completedPago e liquidado conforme regra da operação.
failedRecusado/falhou.
cancelledCancelado ou expirado.
refundedEstornado.
chargebackContestação/chargeback.
mediationEm análise de contestação.

Expiração: o estado persistido é cancelled; quando o motivo for vencimento, o evento de falha traz reason: expired. Um Pix cancelado/expirado pode ser reaberto para completed se a adquirente comprovar pagamento posterior.

SaqueSignificado
pendingFila/manual ou aguardando tentativa.
processingEnviado ou em conferência.
paidPago.
rejectedRecusado; saldo devolvido.
failedFalha; saldo devolvido.
cancelledCancelado; saldo devolvido.

Por indisponibilidade operacional das adquirentes, um saque processing pode voltar a pending e ficar na fila administrativa sem devolver a reserva naquele instante.

Erros

Códigos HTTP

CódigoUsoAção
200OKConsulta/ação concluída ou replay idempotente.
201CreatedOperação criada.
202AcceptedCartão ainda requer ação/conferência.
400Bad RequestRegra financeira/operacional impediu a operação.
401UnauthorizedCredenciais ausentes/inválidas/expiradas.
402Payment RequiredCartão recusado.
403ForbiddenAprovação, conta, IP ou recurso bloqueado.
404Not FoundRecurso inexistente ou de outra conta.
422ValidationPayload inválido. Veja errors.
429Rate limitEspere Retry-After.
500Server errorNão crie outra operação às cegas; consulte/reuse idempotência.
JSON · 422
{"success":false,"message":"The given data was invalid.","errors":{"payer_cpf":["CPF/CNPJ inválido. Confira os dígitos do documento."]}}

Exemplos

Polling seguro e saque

cURL · consultar Pix
curl "https://droppayofc.net/api/v1/payments/TRANSACTION_UUID" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-Client-ID: SEU_CLIENT_ID" \
  -H "Accept: application/json"
cURL · saque
curl -X POST "https://droppayofc.net/api/v1/cashout/pix" \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "X-Client-ID: SEU_CLIENT_ID" \
  -H "Idempotency-Key: saque-cliente-7788" \
  -H "Content-Type: application/json" \
  -d '{"amount":150.00,"pix_key":"[email protected]","pix_key_type":"EMAIL","reference":"cliente-7788"}'

No exemplo de saque, R$ 150,00 é o total debitado do saldo; a resposta informa fee e payout_amount/amount líquidos. Se estiver exibindo a tela do Pix, consulte a cobrança a cada 5–10s. Para conciliação de backoffice prefira webhook e uma rotina periódica menos agressiva. Nunca use endpoints inexistentes como /pix, /me ou /wallet.

Produção

Checklist

  • • Use Authorization Bearer + X-Client-ID e guarde o token somente no servidor.
  • • Cadastre IP do servidor quando usar saque automático.
  • • Use Idempotency-Key único por intenção de cobrança e por intenção de saque.
  • • Envie payer_phone nas cobranças Pix quando possível e sempre CPF/CNPJ válido.
  • • Guarde transaction_uuid e reference no seu pedido.
  • • Considere expires_at da resposta como fonte da verdade do vencimento.
  • • Libere pedido somente após completed/deposit.completed e confira o valor.
  • • No saque, trate amount enviado como total debitado e payout_amount como líquido recebido na chave.
  • • Valide X-Webhook-Signature-V2 e deduplique pelo ID do evento.
  • • Aceite webhooks fora de ordem; em dúvida consulte GET /payments/{uuid}.
  • • Em 429/5xx/timeout, aplique backoff e não duplique operações; reutilize a idempotência.
  • • Teste Pix pago, Pix expirado, webhook indisponível, replay de criação, saque aprovado e saque recusado antes de abrir tráfego.
  • • Importe o OpenAPI desta página no Postman/Insomnia/SDK e mantenha sua integração somente nas rotas documentadas.

Pronto para integrar?

Crie sua conta, aprove o cadastro e gere sua chave de API no painel.

Criar conta