Desarrolladores
API de cobros
Crea cobros en cripto desde el sistema de tu tienda, muestra el QR al cliente y recibe un aviso firmado cuando entre el pago. El dinero va directo a la billetera de la cuenta, sin intermediarios. Empieza por el entorno de pruebas, sin dinero real.
Autenticación
Crea la clave en Cobrar → API y webhook (la cuenta debe tener activada la verificación en dos pasos). Envíala en la cabecera Authorization y guárdala solo en el servidor. Elige el acceso: “leer y crear cobros” (tienda) o “solo lectura” (conciliación, informes). Una clave de solo lectura que intenta crear recibe 403.
Authorization: Bearer ib_XXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Crear cobro
token: USDC o SOL. valor: decimal con punto, u omítelo para monto abierto. validade_horas: 1, 24, 72, 168 o 720 (por defecto 24). externo_id: el número de pedido en tu tienda, único por cuenta. Envía Idempotency-Key (UUID) para reintentar con seguridad si se cae la red.
curl -X POST https://ducripto.com/api/v1/cobrancas \
-H "Authorization: Bearer ib_XXXXXXXXXXXX_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2a8e-4b1d-4c55-9a3e-0d2b7f9e1c11" \
-d '{"token":"USDC","valor":"25.90","descricao":"Pedido 1042","externo_id":"1042","validade_horas":24}'{
"id": "9b2f…", "estado": "pendente", "externo_id": "1042",
"token": "USDC", "decimais": 6, "valor_unidades": "25900000", "valor": "25.9",
"url_pagamento": "https://ducripto.com/pagar/9b2f…",
"solana_pay": "solana:<carteira>?amount=25.9&spl-token=EPjF…&reference=…",
"expira_em": "…", "pagamento": null
}Consultar
Los montos vuelven siempre como texto en unidades enteras del token (valor_unidades), sin pérdida de precisión. estado: pendente, paga, expirada o cancelada. La lista viene paginada: usa limite (1 a 100, por defecto 50) y pasa en depois el valor de proximo para leer la página siguiente; proximo nulo = fin. Para billeteras que obtienen la transacción del servidor (Solana Pay "transaction request"), usa solana_pay_transacao; en cobros de valor abierto, añade ?quantidade= a la URL antes de codificarla.
curl https://ducripto.com/api/v1/cobrancas/9b2f… -H "Authorization: Bearer ib_…" curl "https://ducripto.com/api/v1/cobrancas?externo_id=1042" -H "Authorization: Bearer ib_…" curl "https://ducripto.com/api/v1/cobrancas?limite=50&depois=<proximo>" -H "Authorization: Bearer ib_…"
Webhook: cobro pagado
Recibes un POST JSON con tipo cobranca.paga. Verifica la firma: HMAC-SHA256 en hex de "timestamp.cuerpo" con tu secreto, y rechaza si el timestamp tiene más de 5 minutos. Responde 2xx; si no, reintentamos con espera creciente. Usa evento_id para ignorar repeticiones.
import { createHmac, timingSafeEqual } from 'node:crypto';
// corpo = texto CRU da requisição (antes de JSON.parse)
// x-interbank-assinatura-anterior só vem durante uma troca de chaves da plataforma: aceite qualquer uma
export function webhookValido(corpo, cab, segredo) {
const ts = cab['x-interbank-timestamp'];
if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const esperado = createHmac('sha256', segredo).update(`${ts}.${corpo}`).digest();
return ['x-interbank-assinatura', 'x-interbank-assinatura-anterior'].some((h) => {
const veio = Buffer.from(cab[h] ?? '', 'hex');
return veio.length === esperado.length && timingSafeEqual(veio, esperado);
});
}Botón de pago en tu sitio (SDK)
Una línea de script dibuja el botón con tu marca y abre el checkout en una pestaña nueva; cuando el pago se confirma, tu sitio recibe el evento checkout:paga. El evento es solo para la pantalla: entrega el pedido después de confirmarlo en el servidor (webhook firmado o GET del cobro).
<!-- data-cobranca: id devolvido por POST /api/v1/cobrancas · data-voltar: opcional, só do seu site -->
<script src="https://ducripto.com/sdk/v1/checkout.js" data-cobranca="9b2f…" data-voltar="/obrigado" async></script>
<script>
addEventListener('checkout:paga', (e) => mostrarObrigado(e.detail.cobranca));
</script>Recibir USDC desde cualquier token
Envíe "aceita_conversao": true al crear un cobro en USDC con importe. En la página de pago, quien paga elige SOL, USDT, JUP o BONK, ve cuánto gastará, y la misma transacción convierte y entrega el importe exacto en USDC en su billetera. El webhook y la consulta son los mismos: cuenta el USDC que llegó. No vale en modo prueba.
curl -X POST https://ducripto.com/api/v1/cobrancas -H "Authorization: Bearer ib_…" -H "Content-Type: application/json" \
-d '{"token":"USDC","valor":"49.90","externo_id":"1043","aceita_conversao":true}'
# → { "aceita_conversao": true, "url_pagamento": "https://ducripto.com/pagar/…", … }
# quem paga escolhe SOL, USDT, JUP ou BONK na página; você recebe 49.90 USDC exatosEntorno de pruebas (sandbox)
Cree una clave en modo Prueba (empieza con ib_test_). Usa la misma API, pero solo ve y crea cobros de prueba, que quedan en la red de pruebas (modo: "teste" en la respuesta y en el webhook) y nunca entran en su saldo. Para probar sin billetera, simule el pago: POST /api/v1/cobrancas/{id}/simular-pagamento (con importe abierto, envíe {"valor": "…"}). El webhook cobranca.paga llega firmado, igual que el real. La clave de producción no simula, y ninguna clave ve los cobros de la otra.
# chave de teste (ib_test_…): mesma API, só cobranças de teste, rede de testes
curl -X POST https://ducripto.com/api/v1/cobrancas -H "Authorization: Bearer ib_test_XXXXXXXXXXXX_…" \
-H "Content-Type: application/json" -d '{"token":"USDC","valor":"25.90","externo_id":"teste-1"}'
# → { "id": "9b2f…", "modo": "teste", "rede": "devnet", "estado": "pendente", … }
curl -X POST https://ducripto.com/api/v1/cobrancas/9b2f…/simular-pagamento -H "Authorization: Bearer ib_test_XXXXXXXXXXXX_…"
# → { "estado": "paga", "pagamento": { "assinatura": "simulado_…", … } } e o webhook cobranca.paga com "modo": "teste"Errores y límites
Los errores vienen como { erro: { codigo, mensagem } }. 401 clave inválida o revocada · 403 la clave no tiene el alcance de la operación · 404 cobro de otra cuenta o inexistente · 409 externo_id repetido o Idempotency-Key reutilizada con otro cuerpo · 422 datos inválidos · 429 más de 120 llamadas por minuto por clave.
Contrato (OpenAPI)
La especificación OpenAPI 3.1 completa (cobros, errores y el webhook) está en /api/v1/openapi.json: impórtela en Postman, Insomnia o un generador de clientes. Se genera con los mismos esquemas que las pruebas comparan con las respuestas reales.
curl https://ducripto.com/api/v1/openapi.json