Soldes et cartes

Cartes virtuelles

Émettre des cartes Visa et Mastercard en dollars pour vos paiements en ligne.

Une carte virtuelle est une carte Visa ou Mastercard en dollars américains, utilisable pour payer en ligne : publicité, abonnements, logiciels, fournisseurs. Elle est alimentée depuis votre solde en USD.

Les cartes se gèrent depuis le tableau de bord, page « Cartes virtuelles », ou par l'API avec une clé réelle. Elles doivent d'abord être activées sur votre compte : contactez le support pour en faire la demande.

Émettre une carte

  1. Ayez des dollars sur votre solde d'encaissement réel. Si vos encaissements sont en XAF ou en XOF, convertissez-les en USD.
  2. Enregistrez le titulaire : nom, e-mail, téléphone, adresse et pièce d'identité. L'émetteur de la carte exige l'identité de la personne qui l'utilisera. Un titulaire peut avoir plusieurs cartes.
  3. Choisissez le réseau (Visa ou Mastercard), donnez un nom à la carte et indiquez le montant à charger.

Frais

Deux frais s'appliquent, tous deux affichés avant que vous ne confirmiez et prélevés sur votre solde en USD, en plus du montant chargé :

  • des frais fixes à l'émission de chaque carte ;
  • un pourcentage du montant à chaque chargement, y compris le premier.

Un montant minimum s'applique à chaque chargement. Récupérer de l'argent d'une carte vers votre solde est gratuit.

Gérer une carte

ActionEffetÀ savoir
ChargerAjoute de l'argent depuis votre solde en USD.Le solde est débité avant l'envoi ; il est rendu si l'émetteur refuse.
RetirerRamène de l'argent de la carte vers votre solde en USD.Le solde est crédité une fois le retrait confirmé par l'émetteur.
BloquerRefuse tout nouveau paiement.Réversible à tout moment.
ClôturerFerme la carte définitivement.Impossible tant qu'il reste de l'argent dessus : retirez d'abord le solde.

La page d'une carte affiche son solde en temps réel, les paiements effectués avec elle et l'historique de ses chargements.

Sécurité

  • Loov ne conserve ni le numéro complet de la carte, ni sa date d'expiration, ni son code de sécurité. Seuls les derniers chiffres sont enregistrés.
  • Pour les afficher, vous devez saisir votre mot de passe. Ils sont alors lus chez l'émetteur, montrés une seule fois, et chaque consultation est inscrite dans le journal d'activité de votre compte.
  • Quiconque détient ces informations peut dépenser le solde de la carte. En cas de doute, bloquez la carte immédiatement.

Statuts

StatutConcerneDescription
activeCarteLa carte peut payer, être chargée et débitée.
frozenCarteLes paiements sont refusés jusqu'au déblocage.
terminatedCarteLa carte est clôturée.
succeededOpérationL'émission, le chargement ou le retrait a abouti.
failedOpérationL'émetteur a refusé ; votre solde a été rendu.
unknownOpérationL'émetteur n'a pas répondu. Le montant reste réservé pendant que notre équipe vérifie, puis votre solde est corrigé si nécessaire.

Intégrer les cartes par l'API

Tout ce que fait le tableau de bord est disponible par l'API, pour émettre et gérer des cartes depuis votre propre application. Les cartes sont réelles : ces routes exigent une clé réelle (loov_live_…) et répondent live_key_required avec une clé de test. Les montants sont en cents de dollar.

MéthodeRouteDescription
POST/v2/cardholdersEnregistrer un titulaire.
GET/v2/cardholdersLister vos titulaires.
POST/v2/cardsÉmettre une carte. Idempotency-Key obligatoire.
GET/v2/cardsLister vos cartes ; filtres status et cardholder.
GET/v2/cards/{id}Une carte et son solde en temps réel.
GET/v2/cards/{id}/detailsNuméro, date d'expiration et code de sécurité.
GET/v2/cards/{id}/transactionsRelevé de la carte chez l'émetteur, lu en direct.
GET/v2/cards/{id}/activityHistorique enregistré de la carte : paiements approuvés, refusés, remboursés, frais et changements d'état. Paginé, filtrable par kind.
POST/v2/cards/{id}/fundCharger la carte. Idempotency-Key obligatoire.
POST/v2/cards/{id}/withdrawRamener de l'argent vers votre solde. Idempotency-Key obligatoire.
POST/v2/cards/{id}/freezeBloquer la carte.
POST/v2/cards/{id}/unfreezeDébloquer la carte.
POST/v2/cards/{id}/terminateClôturer la carte.
GET/v2/cards/{id}/operationsÉmission, chargements et retraits d'une carte.
GET/v2/card-operations/{id}Une opération, pour suivre son statut.

1. Enregistrer un titulaire

curl -X POST https://api.secure.payment.loov-solutions.com/v2/cardholders \
  -H "Authorization: Bearer $LOOV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "first_name": "Awa",
  "last_name": "Ndiaye",
  "email": "awa@example.com",
  "phone": "+237650000000",
  "country": "CM",
  "state": "Littoral",
  "city": "Douala",
  "address": "12 rue de la Joie",
  "zip_code": "00237",
  "id_type": "National_ID",
  "id_number": "123456789"
}'

id_type vaut National_ID, Passport ou Driving_License. Le téléphone est au format international avec le signe +. Conservez l' id renvoyé : il sert à émettre les cartes.

2. Émettre une carte

curl -X POST https://api.secure.payment.loov-solutions.com/v2/cards \
  -H "Authorization: Bearer $LOOV_API_KEY" \
  -H "Idempotency-Key: 6f1c2b9e-order-42" \
  -H "Content-Type: application/json" \
  -d '{
  "cardholder": "01k6x3v9q2m8h4n7b5t0c1d2e3",
  "title": "Publicité en ligne",
  "brand": "visa",
  "amount": 5000
}'
{
  "card": {
    "id": "01k6x4a7r9w2e5t8y1u3i6o0p4",
    "cardholder": "01k6x3v9q2m8h4n7b5t0c1d2e3",
    "title": "Publicité en ligne",
    "brand": "visa",
    "mask": "451946******1642",
    "currency": "USD",
    "status": "active",
    "created_at": "2026-10-05T10:12:00+00:00"
  },
  "operation": {
    "id": "01k6x4a7q1z3x5c7v9b2n4m6k8",
    "card": "01k6x4a7r9w2e5t8y1u3i6o0p4",
    "type": "issue",
    "currency": "USD",
    "amount": 5000,
    "fee": 375,
    "status": "succeeded",
    "created_at": "2026-10-05T10:12:00+00:00"
  }
}

amount est le montant chargé sur la carte ; fee est prélevé en plus sur votre solde en USD.

3. Charger, retirer, suivre

curl -X POST https://api.secure.payment.loov-solutions.com/v2/cards/{id}/fund \
  -H "Authorization: Bearer $LOOV_API_KEY" \
  -H "Idempotency-Key: 6f1c2b9e-order-42" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 2000
}'

Le chargement et le retrait renvoient l'opération. GET /v2/cards/{id} renvoie la carte avec balance, son solde chez l'émetteur à l'instant de l'appel.

Quand l'émetteur ne répond pas

Si l'émetteur ne répond pas à une émission, un chargement ou un retrait, l'API répond 202 avec l'opération au statut unknown (et card: null pour une émission). Le montant reste réservé le temps que notre équipe vérifie. Ne relancez pas avec une nouvelle clé d'idempotence : interrogez GET /v2/card-operations/{id} jusqu'à succeeded ou failed.

Relancer la même requête avec la même Idempotency-Key est toujours sûr : vous recevez la réponse d'origine et votre solde n'est débité qu'une fois.

Afficher les informations de la carte

curl -X GET https://api.secure.payment.loov-solutions.com/v2/cards/{id}/details \
  -H "Authorization: Bearer $LOOV_API_KEY" \
  -H "Accept: application/json"
{
  "id": "01k6x4a7r9w2e5t8y1u3i6o0p4",
  "number": "4519460000001642",
  "security_code": "809",
  "expiry": "1030",
  "name": "Awa Ndiaye",
  "billing_address": null
}
  • Appelez cette route depuis votre serveur, uniquement au moment où le titulaire demande à voir sa carte, après l'avoir authentifié.
  • N'enregistrez jamais la réponse, ni en base de données, ni dans vos journaux, ni en cache.
  • Chaque appel est inscrit dans le journal d'activité de votre compte.

Activité de la carte et notifications

Chaque événement signalé par l'émetteur sur une carte est enregistré, met à jour le solde de la carte (balance, dans la plus petite unité) et son statut, et vous est notifié à l'adresse webhook que vous définissez pour vos cartes dans le tableau de bord (page « Cartes virtuelles », « Notifications des cartes »). Cette adresse est distincte de celles de vos applications et possède son propre secret de signature. Un paiement refusé, des frais de carte impayés et une carte clôturée ou remplacée vous sont aussi signalés par e-mail.

curl -X GET https://api.secure.payment.loov-solutions.com/v2/cards/{id}/activity?kind=decline \
  -H "Authorization: Bearer $LOOV_API_KEY" \
  -H "Accept: application/json"
kindÉvénement webhookDescription
authorizationcard.authorizationPaiement approuvé ; le montant est réservé sur la carte.
settlementcard.settlementPaiement définitivement débité.
reversalcard.reversalPaiement approuvé puis annulé ; la réservation est levée.
refundcard.refundRemboursement reçu d'un marchand.
declinecard.payment_declinedPaiement refusé ; reason indique pourquoi (solde insuffisant, par exemple).
fx_feecard.fx_feeFrais de l'émetteur sur un paiement en devise étrangère.
withdrawalcard.withdrawalMontant retiré de la carte.
verificationcard.verificationVérification de la carte par un marchand, sans montant.
subscriptioncard.subscriptionFrais périodiques de la carte : rappel, prélèvement ou échec.
termination_refundcard.termination_refundSolde restant d'une carte clôturée par l'émetteur, recrédité automatiquement sur votre solde.
card_updatecard.updated / card.terminatedCarte gelée, modifiée, remplacée ou clôturée par l'émetteur.
{
  "event": "card.payment_declined",
  "data": {
    "card": {
      "id": "01k6x4a7r9w2e5t8y1u3i6o0p4",
      "title": "Publicité en ligne",
      "brand": "visa",
      "mask": "451946******1642",
      "status": "active",
      "currency": "USD",
      "balance": 200,
      "balance_updated_at": "2026-10-07T11:20:04+00:00"
    },
    "transaction": {
      "id": "01k7c0d2f4g6h8j0k2m4n6p8q0",
      "kind": "decline",
      "status": "declined",
      "amount": 500,
      "currency": "USD",
      "merchant": "aliexpress",
      "city": "New York",
      "country": "United States",
      "reason": "Insufficient funds",
      "balance_after": 200,
      "occurred_at": "2026-10-07T11:20:03+00:00"
    }
  }
}
Le solde restitué par l'émetteur à la clôture d'une carte est recrédité sur le solde qui alimente vos cartes, une seule fois par carte, dans la limite de ce que vous y aviez chargé.

Messages d'erreur

CodeHTTPDescription
live_key_required403Les cartes exigent une clé réelle.
idempotency_key_required400L'en-tête Idempotency-Key est obligatoire pour émettre, charger et retirer.
cardholder_not_found422Aucun titulaire ne porte cet identifiant.
cards_disabled403Les cartes virtuelles ne sont pas activées pour votre compte.
insufficient_funds402Votre solde en USD ne couvre pas le montant et les frais.
amount_too_small422Le montant est inférieur au minimum de chargement.
card_issuer_declined422L'émetteur a refusé l'opération ; votre solde a été rendu.
card_not_active409La carte est bloquée ou clôturée.
card_terminated409La carte est déjà clôturée.
card_has_balance409Retirez le solde restant avant de clôturer la carte.
card_outcome_unknown502Tableau de bord uniquement : l'émetteur n'a pas répondu. Par l'API, ce cas répond 202 avec le statut unknown.