Guide complet
Tout ce qu’il faut savoir pour intégrer les cartes Visa/Mastercard HeyQo : comportement de l’API live, pièges courants, coûts, sécurité PCI et webhooks. Basé sur le skill open source heyqo-cards.
HeyQo est une couche white-label au-dessus de Platnova. La banque émettrice est en bout de chaîne — le KYC vient de la banque, pas de HeyQo seul.
https://heyqo.cash/business/v1https://heyqo.cash/business/sandbox/v1Le mode de la clé API doit correspondre à l’URL de base, sinon 403 sans message explicite.
{ message, data, type }. Les erreurs utiles sont dans message.error[]. Un HTTP 200 peut quand même être une erreur — vérifiez type.amount (string). Détails = info (last4, expiry_month/year en 2 chiffres, name_on_card…). Pas de champ balance.0000 au client.local_id du customer. L’id UUID de la liste peut renvoyer « customer was not found ».?external_ref= sur GET /customers est ignoré ; filtrez côté client.Confirmez par écrit avec HeyQo avant de fixer vos tarifs :
| Poste | À clarifier |
|---|---|
| Émission carte | Frais + éventuel pré-dépôt sur la carte (débités ensemble) |
| Recharge (deposit) | Frais fixe par opération, en plus du montant |
| Retrait (withdraw) | Frais fixe — le retrait n’est pas gratuit |
| Float marchand | Recharge de votre wallet partenaire ; un 402 signale l’épuisement |
Formule utile : pour un frais fixe c et un plafond p %, montant minimum rentable ≈ c / p.
card.charged / card.funded, re-lisez GET /cards/{id}.https://heyqo.cash/business/v1/authentication/tokenBody : client_id, secret_id (pas client_secret). Token dans data.access_token.
https://heyqo.cash/business/v1/cards{
"customer_id": "<local_id>",
"currency": "usd",
"brand": "visa",
"label": "Primary card"
}
brand en minuscules (visa, mastercard). Réponse sans PAN/expiry tant que la carte est en provisioning.
https://heyqo.cash/business/v1/cards/{id}{
"card": {
"amount": "15.90",
"currency": "usd",
"status": "active",
"info": {
"masked_pan": "411111******1111",
"last4": "1111",
"expiry_month": "08",
"expiry_year": "29",
"name_on_card": "...",
"brand": "visa"
}
}
}
https://heyqo.cash/business/v1/cards/{id}/deposithttps://heyqo.cash/business/v1/cards/{id}/withdrawMontants en unités (pas centimes). Frais issuer débités en plus sur votre float.
PUT .../freeze · PUT .../unfreeze · PUT .../terminate
PCI SAQ A : le numéro complet s’affiche dans une page HeyQo, embed via iframe. Ne jamais exposer PAN/CVV via votre API.
https://heyqo.cash/business/v1/cards/{id}/secure-view{
"layout": "free",
"align": "left",
"positions": {
"pan": { "top": "57%", "left": "6%" },
"cardholder": { "top": "71%", "left": "6%" },
"expiry": { "top": "71%", "left": "60%" },
"cvv": { "top": "71%", "left": "78%" }
},
"text_color": "#FFFFFF",
"show_branding": false
}
→ { "iframe_url": "...", "expires_in": 90 }
layout: free seul mode avec positions absolues.x-ratelimit-remaining.Signature HMAC-SHA256 sur le corps brut, header X-HeyQo-Signature.
| Événement | Action |
|---|---|
customer.approved / customer.rejected | Mettre à jour le statut KYC |
card.charged / card.funded | Re-sync solde (GET card), pas d’arithmétique sur le montant event |
card.declined | Informatif |
card.terminated | Fermer la carte localement |
https://heyqo.cash/business/v1local_id utilisé pour POST /cards