Sviluppatori
API di incasso
Crea richieste di pagamento in cripto dal sistema del tuo negozio, mostra il QR al cliente e ricevi una notifica firmata quando il pagamento arriva. L’importo va direttamente nel wallet del conto, senza intermediari. Inizia dall’ambiente di test, senza denaro reale.
Autenticazione
Crea la chiave in Incassa → API e webhook (il conto deve avere la verifica in due passaggi attiva). Inviala nell’header Authorization e conservala solo sul server. Scegli l’accesso: “leggere e creare richieste di pagamento” (negozio) o “solo lettura” (riconciliazione, report). Una chiave di sola lettura che tenta di creare riceve 403.
Authorization: Bearer ib_XXXXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Crea richiesta di pagamento
token: USDC o SOL. valor: decimale con il punto, oppure omettilo per un importo libero. validade_horas: 1, 24, 72, 168 o 720 (predefinito 24). externo_id: il numero d’ordine nel tuo negozio, univoco per conto. Invia Idempotency-Key (UUID) per poter ripetere in sicurezza se la connessione cade.
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
}Consulta
Gli importi tornano sempre come testo in unità intere del token (valor_unidades), senza perdita di precisione. estado: pendente, paga, expirada o cancelada. L’elenco è paginato: usa limite (da 1 a 100, predefinito 50) e passa in depois il valore di proximo per leggere la pagina successiva; proximo nullo = fine. Per i wallet che costruiscono la transazione sul server (Solana Pay "transaction request"), usa solana_pay_transacao; nelle richieste con importo libero, aggiungi ?quantidade= all’URL prima di codificarlo.
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: pagamento ricevuto
Riceve un POST JSON con tipo cobranca.paga. Verifica la firma: HMAC-SHA256 in hex di "timestamp.corpo" con il tuo segreto, e rifiuta se il timestamp ha più di 5 minuti. Rispondi 2xx; altrimenti ripetiamo con attesa crescente. Usa evento_id per ignorare le ripetizioni.
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);
});
}Pulsante di pagamento sul tuo sito (SDK)
Una riga di script disegna il pulsante con il tuo marchio e apre il checkout in una nuova scheda; quando il pagamento è confermato, il tuo sito riceve l’evento checkout:paga. L’evento serve solo per l’interfaccia: consegna l’ordine dopo averlo confermato sul server (webhook firmato o GET della richiesta di pagamento).
<!-- 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>Ricevi in USDC da qualsiasi token
Invia "aceita_conversao": true quando crei una richiesta di pagamento in USDC con importo. Nella pagina di pagamento, chi paga sceglie SOL, USDT, JUP o BONK, vede quanto spenderà, e la stessa transazione converte e consegna l’importo esatto in USDC nel tuo wallet. Il webhook e la consultazione sono gli stessi: conta l’USDC arrivato. Non vale in modalità test.
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 exatosAmbiente di test (sandbox)
Crea una chiave in modalità Test (inizia con ib_test_). Usa la stessa API, ma vede e crea solo richieste di pagamento di test, che restano sulla rete di test (modo: "teste" nella risposta e nel webhook) e non entrano mai nella tua cassa. Per testare senza wallet, simula il pagamento: POST /api/v1/cobrancas/{id}/simular-pagamento (con importo libero, invia {"valor": "…"}). Il webhook cobranca.paga arriva firmato, come quello reale. La chiave di produzione non simula, e una chiave non vede le richieste di pagamento dell’altra.
# 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"Errori e limiti
Gli errori arrivano come { erro: { codigo, mensagem } }. 401 chiave non valida o revocata · 403 la chiave non ha l’ambito dell’operazione · 404 richiesta di pagamento di un altro conto o inesistente · 409 externo_id ripetuto o Idempotency-Key riutilizzata con un altro corpo · 422 dati non validi · 429 oltre 120 chiamate al minuto per chiave.
Contratto (OpenAPI)
La specifica OpenAPI 3.1 completa (richieste di pagamento, errori e il webhook) si trova in /api/v1/openapi.json — importala in Postman, Insomnia o in un generatore di client. Viene generata dagli stessi schemi che i test verificano sulle risposte reali.
curl https://ducripto.com/api/v1/openapi.json