Votre API crypto.
Sur votre domaine.
Adresse de base : https://api-crypto-payment.com/v1
Une API pour encaisser, suivre les transactions et demander vos retraits. Chaque opération est rattachée à votre compte marchand. Toutes vos requêtes passent par le domaine Crypto Payment.
Démarrage
- Créez un compte et attendez son activation.
- Créez une clé API dans le dashboard ; sa valeur complète n’est affichée qu’une fois.
- Envoyez une requête à
POST /v1/paymentdepuis votre serveur. - Conservez le
payment_idretourné et consultezGET /v1/payment/{payment_id}pour suivre l’état.
https://api-crypto-payment.com/v1/payment
https://api-crypto-payment.com/v1/payment/123456789
https://api-crypto-payment.com/v1/payout
Les URL propres ne nécessitent plus index.php?route=. Le suivi décrit ici fonctionne sans URL IPN ou webhook fournie par le client.
501. Les créations peuvent répondre 503 tant que les encaissements ne sont pas activés.Authentification
x-api-key: sk_live_VOTRE_CLE
Accept: application/json
Content-Type: application/json
Utilisez votre clé Crypto Payment, jamais celle du compte prestataire principal. L’alternative Authorization: Bearer sk_live_VOTRE_CLE reste acceptée. Ne transmettez aucune clé au navigateur de l’acheteur.
POST /v1/auth
Si votre intégration utilise un jeton Bearer, fournissez les identifiants de votre compte Crypto Payment. L’authentification est traitée par Crypto Payment.
curl 'https://api-crypto-payment.com/v1/auth' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{"email":"votre-compte@example.com","password":"VOTRE_MOT_DE_PASSE"}'
{"token":"JETON_JWT"}
Le jeton expire après cinq minutes. Utilisez ensuite Authorization: Bearer JETON_JWT avec x-api-key. Le jeton et la clé doivent appartenir au même compte. Le jeton ne remplace pas la clé marchande.
Protection contre les doublons
Idempotency-Key est recommandé pour les paiements et requis pour les retraits, sauf si chaque bénéficiaire possède un unique_external_id non vide : 1 à 128 lettres ASCII, chiffres ou caractères _ . : -. Une même clé et un même contenu renvoient l’opération existante ; un contenu différent renvoie 409. Conservez aussi le même ordre des bénéficiaires lors d’une reprise.
Sans cet en-tête sur POST /payment, chaque requête constitue une nouvelle création. Une clé générée est retournée dans l’en-tête de réponse, mais si la réponse réseau est perdue vous ne pourrez pas la récupérer : fournissez votre propre clé pour les reprises automatiques.
Routes & compatibilité
| Méthode / route | Comportement actuel |
|---|---|
GET /v1/status | État du prestataire ; sans clé client. Ne confirme pas l’activation des encaissements sur votre compte. |
POST /v1/auth | Authentification locale et jeton marchand. |
GET /v1/currencies | Liste des devises ; paramètre fixed_rate=true ou false accepté. |
GET /v1/full-currencies | Informations détaillées sur les devises, relayées au prestataire. |
GET /v1/merchant/coins | Actifs configurés pour la passerelle chez le prestataire. |
GET /v1/estimate | Paramètres requis : amount, currency_from, currency_to. Estimation indicative. |
GET /v1/min-amount | currency_from, currency_to requis. Options : fiat_equivalent, is_fixed_rate, is_fee_paid_by_user. |
POST /v1/payment | Création relayée et enregistrée pour votre marchand. |
POST /v1/invoice | Crée une facture et un lien de paiement sur api-crypto-payment.com. |
GET /v1/invoice/{id} | Consulte une facture appartenant à votre compte. Extension Crypto Payment. |
POST /v1/invoice-payment | Crée ou retrouve le paiement de votre facture avec iid et pay_currency. |
GET /v1/payment/{payment_id} | Contrôle de propriété puis rapprochement avec le prestataire. |
GET /v1/payment/ | Liste locale filtrée : aucun paiement d’un autre marchand. |
POST /v1/payment/{payment_id}/update-merchant-estimate | Actualise une estimation en attente ou partiellement payée. Corps JSON vide ; contrôle de propriété. |
GET /v1/balance | Soldes disponibles et réservés de votre marchand, isolés des autres comptes. |
POST /v1/payout/validate-address | Vérification d’adresse auprès du prestataire. Corps : address, currency, et éventuellement extra_id. |
GET /v1/payout/fee | Estimation des frais ; currency et amount requis. |
GET /v1/payout-withdrawal/min-amount/{coin} | Minimum de retrait de l’actif. |
POST /v1/payout | Lot de 1 à 50 bénéficiaires, réservation atomique et traitement automatique sans approbation administrateur. |
GET /v1/payout/{id} | Suivi local d’un retrait avec son UUID de passerelle. |
GET /v1/payout | Liste paginée avec filtres de lot, statut et dates. |
POST /v1/payout/{id}/cancel | Annule un retrait jamais soumis ; réservation libérée. |
POST /v1/payout/{id}/cancel-batch | Annule un lot uniquement si tous ses retraits sont encore en attente ou déjà annulés. |
curl 'https://api-crypto-payment.com/v1/estimate?amount=25¤cy_from=eur¤cy_to=btc' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Accept: application/json'
Les noms de devises utilisent de 2 à 24 lettres minuscules ou chiffres. Précisez l’actif et son réseau, par exemple usdttrc20. Les options booléennes de recherche acceptent true, false, 1 et 0.
Factures & liens de paiement
Créez un lien depuis vos factures ou par API. Votre acheteur choisit sa crypto puis reçoit les instructions de paiement, sans compte Crypto Payment. Le prix reste celui enregistré par votre serveur.
POST /v1/invoice
curl 'https://api-crypto-payment.com/v1/invoice' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Idempotency-Key: facture-1042' \
-d '{"price_amount":25,"price_currency":"eur","order_id":"1042","order_description":"Commande 1042","success_url":"https://votre-boutique.fr/merci"}'
| Champ | Règle |
|---|---|
price_amount, price_currency | Requis. Montant positif, maximum 100 000 000, au plus 18 décimales ; devise du prix en minuscules. |
pay_currency | Facultatif. S’il est fourni, impose l’actif/réseau ; sinon l’acheteur le choisit sur la page. |
order_id, order_description | Facultatifs, maximum 128 et 1 000 caractères. La description sera visible par l’acheteur. |
is_fixed_rate, is_fee_paid_by_user | Booléens JSON, facultatifs, false par défaut ; options appliquées à la facture en amont. |
success_url, cancel_url, partially_paid_url | Liens de retour HTTPS facultatifs, 2 048 caractères maximum, sans identifiants dans l’URL. Présentés à l’acheteur selon le statut ; pas de redirection automatique. |
ipn_callback_url | À omettre ; vide ou null accepté. Suivi sans IPN client. |
Réponse 201 : id de facture, gateway_id interne, invoice_url sur https://api-crypto-payment.com/pay/…, prix, options, gateway_status, dates et expires_at. Un résultat de création incertain répond 202, avec gateway_status=creation_unknown et invoice_url=null : conservez la même clé d’idempotence, sans recréer une facture.
Le lien autorise son détenteur à consulter et payer cette commande : transmettez-le uniquement à l’acheteur concerné. Il permet de commencer un paiement pendant 7 jours. Après création du paiement, le délai de l’estimation crypto est distinct et apparaît dans ses instructions.
POST /v1/invoice-payment
curl 'https://api-crypto-payment.com/v1/invoice-payment' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{"iid":"ID_FACTURE","pay_currency":"btc"}'
iid et pay_currency sont les seuls champs acceptés. Le prix et la référence viennent de la facture. La réponse suit le format des paiements : conservez payment_id et consultez GET /v1/payment/{payment_id}.
Une seule opération de paiement est autorisée par facture. Même facture et même devise renvoient le paiement déjà créé, y compris après une coupure réseau. Changer la devise après la première création renvoie 409. Une facture expirée sans paiement renvoie 410. Les champs purchase_id, customer_email et les changements de portefeuille de sortie ne sont pas exposés.
GET /v1/invoice/{id}
Cette extension consulte votre facture avec son id ou son gateway_id. Elle renvoie aussi payment_id et payment_status lorsqu’un paiement a été créé. Une facture d’un autre marchand renvoie 404.
Créer un paiement
curl 'https://api-crypto-payment.com/v1/payment' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: commande-1042' \
-d '{"price_amount":25,"price_currency":"eur","pay_currency":"usdttrc20","order_id":"1042","order_description":"Commande 1042"}'
| Champ | Règle |
|---|---|
price_amount | Requis, positif, maximum 100 000 000 et 18 décimales. Nombre ou chaîne décimale, sans notation scientifique. |
price_currency | Requis : devise du prix, par exemple eur. |
pay_currency | Requis sur cette passerelle : actif/réseau payé. |
pay_amount | Facultatif, positif ; mêmes limites de montant. Transmis au prestataire. |
order_id | Facultatif, référence de votre commande, 128 caractères maximum. Ne remplace pas l’idempotence. |
order_description | Facultatif, 1 000 caractères maximum. |
is_fixed_rate | Facultatif, booléen JSON transmis au prestataire. |
is_fee_paid_by_user | Facultatif, booléen JSON transmis au prestataire. |
N’envoyez pas d’ipn_callback_url : le parcours client n’en utilise pas. Une valeur non vide est refusée. Les changements de portefeuille de sortie (payout_address et champs associés) et les achats partagés via purchase_id ne sont pas exposés.
Exemple de réponse · 201
{
"payment_id": "123456789",
"payment_status": "waiting",
"pay_address": "ADRESSE_RETOURNEE_PAR_API",
"price_amount": 25,
"price_currency": "eur",
"pay_amount": 27.15,
"pay_currency": "usdttrc20",
"actually_paid": 0,
"outcome_amount": null,
"outcome_currency": null,
"order_id": "1042",
"order_description": "Commande 1042",
"ipn_callback_url": null,
"created_at": "2026-09-09T10:00:00.000Z",
"updated_at": "2026-09-09T10:00:00.000Z"
}
Exemple fictif : l’adresse et le montant ne sont pas utilisables pour payer. Selon la réponse du prestataire, d’autres champs propres au paiement peuvent être présents. Les montants peuvent être des nombres ou des chaînes ; ne les calculez pas avec des flottants pour votre comptabilité.
La passerelle conserve une correspondance entre votre marchand, votre order_id, son UUID interne et le payment_id. Votre référence de commande est restituée ; la référence technique utilisée en amont reste interne.
Création incertaine · 202
Un timeout ne prouve pas l’échec de la création. La réponse peut contenir payment_status: creation_unknown, payment_id: null et un gateway_id. Rejouez avec la même clé d’idempotence ou consultez GET /v1/payments/{gateway_id} pour le suivi local. Cette ancienne route utilise les champs id et status. Ne recréez pas l’opération avec une nouvelle clé.
Consulter & suivre sans IPN
curl 'https://api-crypto-payment.com/v1/payment/123456789' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Accept: application/json'
Conservez le payment_id dans votre base et consultez cette route depuis votre serveur. La propriété du paiement est vérifiée avant chaque rapprochement. Une opération d’un autre marchand renvoie 404.
payment_id → consulter payment_status → traiter la commande une seule fois sur finished| Statut | Sens |
|---|---|
waiting | Attente du paiement. |
confirming / confirmed | Confirmations en cours ou obtenues ; pas encore un règlement finalisé. |
sending | Règlement en cours. |
partially_paid | Paiement partiel ; vérification nécessaire. |
finished | Traitement finalisé selon le prestataire. |
failed / expired | Échec ou expiration. |
refunded | Remboursement signalé. |
creating / creation_unknown | États supplémentaires de la passerelle pendant une création non résolue. |
Un intervalle de 30 à 60 secondes est un point de départ pour la consultation ; espacez davantage après une longue attente et respectez les limites de débit. Ce n’est pas une garantie de fraîcheur. Une consultation concurrente peut renvoyer le dernier état enregistré pendant qu’un autre rapprochement est en cours.
Un retour du navigateur ne prouve pas le paiement. Dédupliquez l’exécution de vos commandes par ID de paiement dans une transaction de base de données, et surveillez les éventuels remboursements ultérieurs.
Lister les paiements
GET https://api-crypto-payment.com/v1/payment/?limit=10&page=0&sortBy=created_at&orderBy=desc
La première page est 0. limit : 1 à 500, valeur par défaut 10. sortBy : created_at, updated_at, payment_id, payment_status. orderBy : asc ou desc. dateFrom et dateTo filtrent la date de création ; utilisez une date ISO avec fuseau.
{"data":[],"limit":10,"page":0,"pagesCount":0,"total":0}
La liste contient uniquement les paiements de votre marchand dont l’ID prestataire est connu. Elle utilise les données enregistrées localement ; consultez un paiement individuellement pour un rapprochement. Le filtre invoiceId accepte l’identifiant d’une de vos factures (alias invoiceid également accepté).
Retraits & solde marchand
202 signifie « retrait enregistré », pas « fonds envoyés ». Le solde est réservé pour l’ensemble du lot ou aucune demande n’est créée si un solde est insuffisant. Les nouveaux retraits sont destinés à un traitement automatique, sans approbation administrateur. Lorsque l’automatisation est en pause, ils restent réservés et annulables avant soumission.curl 'https://api-crypto-payment.com/v1/payout' \
-H 'x-api-key: sk_live_VOTRE_CLE' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: retrait-1042' \
-d '{"withdrawals":[{"amount":"10","currency":"usdttrc20","address":"ADRESSE_DU_BENEFICIAIRE"}]}'
Réponse 202 : id du lot et tableau withdrawals. Chaque retrait contient id, batch_withdrawal_id, address, amount, currency, extra_id, unique_external_id, hash, status, gateway_status et les dates de création et modification. Les IDs sont des UUID Crypto Payment. hash reste nul tant que la transaction blockchain n’est pas connue.
Le montant doit être positif, avec au maximum 6 décimales et une valeur de 100 000 000. Le tableau accepte 1 à 50 bénéficiaires. Par bénéficiaire : address (10–512 caractères), currency, amount requis ; extra_id (mémo/tag, 256 caractères maximum) et unique_external_id (référence unique, 128 caractères maximum) facultatifs. Une référence externe déjà employée ne peut pas être réutilisée dans un autre lot.
{"withdrawals":[
{"amount":"10","currency":"usdttrc20","address":"ADRESSE_A","unique_external_id":"retrait-A"},
{"amount":"20","currency":"xrp","address":"ADRESSE_B","extra_id":"123456","unique_external_id":"retrait-B"}
]}
N’envoyez pas d’URL IPN ; une valeur vide ou nulle est acceptée. Les montants fiat, les retraits programmés et les conversions automatiques ne sont pas disponibles.
GET /v1/balance
Pour chaque devise, amount représente le solde disponible de votre marchand et pendingAmount le total réservé pour ses retraits non finalisés, sous forme de chaînes décimales. Aucun solde d’un autre marchand n’est exposé. Un règlement remboursé après réservation peut créer un déficit : les nouveaux envois sont alors bloqués jusqu’à régularisation.
Solde disponible dans une devise =
outcome_amount des paiements finished du marchand
− retraits du marchand, sauf rejected et cancelled
Un retrait terminé reste déduit. Les paiements partiels ne sont pas disponibles. La devise de règlement peut différer de celle payée. Il n’existe pas de conversion automatique. Avant l’envoi, le serveur recontrôle le solde marchand, l’adresse, le minimum de retrait, l’estimation des frais et la liquidité disponible. Un échec de ces précontrôles ne déclenche pas d’envoi et pourra être réessayé automatiquement.
La réponse inclut automatic et last_error. preflight_unavailable indique un contrôle préalable non satisfait, avec réservation conservée. reconciliation_required indique un résultat incertain : aucun nouvel envoi automatique. Les frais réseau sont variables ; leur estimation n’est pas une garantie du coût final.
Suivre un retrait
Appelez GET /v1/payout/{id} avec l’UUID du retrait pour son détail actualisé, ou l’UUID du lot pour la liste de ses retraits enregistrée localement. La liste GET /v1/payout?page=0&limit=10 utilise la même enveloppe de pagination que les paiements.
| Filtre de liste | Valeurs |
|---|---|
batch_id | UUID du lot Crypto Payment. |
status | waiting, creating, processing, sending, finished, rejected, cancelled (insensible à la casse). |
order_by / order | id, created_at, updated_at / asc, desc. Défaut : created_at desc. |
date_from / date_to | Dates ISO 8601, filtre sur la date de création. |
limit / page | 1–500 (défaut 10) / page à partir de 0. |
| gateway_status | status | Interprétation |
|---|---|---|
requested | WAITING | Réservation effectuée, contrôles puis envoi automatique attendus. |
submitting | CREATING | Soumission en cours. |
submission_unknown | PROCESSING | Résultat incertain ; réserve conservée, pas de nouvel envoi automatique. |
verification_required | PROCESSING | Retrait créé en amont ; vérification 2FA automatique à effectuer par le serveur. |
verifying / verification_unknown | PROCESSING | Vérification en cours ou résultat incertain, sans nouvelle tentative automatique. |
sending | SENDING | Vérification effectuée ; finalisation attendue. |
review_required | PROCESSING | Anomalie à contrôler ; réserve conservée. |
finished | FINISHED | Finalisation confirmée par le prestataire. |
rejected | REJECTED | Rejet avant soumission, réservation libérée. |
cancelled | CANCELLED | Annulation avant soumission, réservation libérée. |
Le statut est mis à jour de façon asynchrone. Ni une demande acceptée, ni la validation 2FA ne signifient que les fonds sont arrivés. La 2FA est gérée automatiquement côté serveur ; le client n’a aucun code à fournir. Un résultat incertain exige un rapprochement et ne libère jamais le solde automatiquement.
Annuler avant envoi
curl -X POST 'https://api-crypto-payment.com/v1/payout/UUID_DU_RETRAIT/cancel' \
-H 'x-api-key: sk_live_VOTRE_CLE' -H 'Accept: application/json'Réponse 200 avec le retrait annulé, ou 409 s’il a déjà été soumis. Pour un lot, utilisez son UUID et /cancel-batch. Si un seul retrait du lot a été soumis ou rejeté, aucune annulation du lot n’est effectuée. Aucun appel réseau d’annulation n’est nécessaire pour une demande jamais envoyée.
Erreurs & limites restantes
401 : clé ou jeton invalide ; 403 : compte désactivé ou identité incohérente ; 404 : opération introuvable ou hors de votre compte ; 409 : conflit ; 422 : paramètres invalides, non pris en charge ou solde insuffisant ; 429 : débit dépassé ; 501 : route non exposée ; 502 : communication prestataire ; 503 : fonctionnalité désactivée.
Les erreurs techniques sont filtrées pour ne pas exposer de données internes. Limite marchande : 120 requêtes par minute, avec un plafond supplémentaire par IP. Respectez Retry-After quand il est fourni.
Les modules suivants ne sont pas disponibles et répondent 501 : conversions (/conversion), comptes clients et transferts internes (/sub-partner/*), versements fiat (/fiat-payouts/*), abonnements et plans (/subscriptions/*). Les remboursements automatiques ne sont pas disponibles. POST /payout/{id}/verify n’est pas une opération marchande : le serveur effectue la vérification automatiquement.
Les anciennes routes /v1/payments et /v1/withdrawals restent disponibles pour les intégrations existantes, avec leur format historique. Pour une nouvelle intégration, utilisez les routes au singulier décrites ici.
Les comptes nouveaux sont en attente d’activation. Votre inscription ouvre directement le dashboard, où vous pouvez créer des clés, consulter les transactions et, après activation et règlement, demander un retrait. Les e-mails de récupération seront disponibles après activation du service d’envoi.