Docs
ENFR
Tableau de bord
Référence de l’API

Cartes

Cartes virtuelles Visa et Mastercard en dollars. Une carte est rechargée depuis votre solde cartes et peut être bloquée, vidée vers le solde cartes ou résiliée à tout moment. Montants en cents de dollar. Quand la réponse de l’émetteur à une action n’est pas définitive, l’API renvoie 202 et le résultat arrive par webhook.

L’objet carte

Attributs
idstring

Identifiant unique (UUID).

livemodeboolean

true en production, false en mode test.

objectstring

Toujours card.

typestring

Les cartes agent appartiennent à un agent IA et n’ont pas de titulaire.

teamcustomeragent
statusstring

pending pendant que l’émetteur crée la carte, failed s’il n’a pas pu.

pendingactivefrozenterminatedfailed
cardholderstring | null

Identifiant du titulaire.

agent_namestring | null

Cartes agent seulement.

labelstring | null

Votre libellé pour la carte.

networkstring
visamastercard
last4string | null

4 derniers chiffres du numéro de carte.

exp_monthinteger | null
exp_yearinteger | null
currencystring

Toujours USD.

balanceinteger | null

Solde de la carte, en cents de dollar.

single_useboolean

Carte à usage unique : elle peut être débitée une fois ; les paiements suivants sont refusés. Elle ne peut être ni rechargée ni vidée.

spending_limitobject | null

{ amount, interval } avec interval daily ou per_transaction. Toujours null pour les cartes à usage unique.

created_atstring

Date de création, ISO 8601 (UTC).

terminated_atstring | null
L’objet carte
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Créer une carte

POST/v1/cards

Émet une carte pour un titulaire vérifié (ou pour un agent IA avec type: "agent"). amount est prélevé sur votre solde cartes : il doit couvrir les frais d’émission plus 1 $ au moins. Renvoie 201 quand la carte est active, ou 202 avec status: "pending" pendant que l’émetteur termine ou tant que sa réponse n’est pas définitive ; card.issued ou card.issue_failed suit. L’argent ne revient au solde cartes qu’une fois l’échec définitif.

Rôles de la clé : Propriétaire ou Finance

Corps
amountintegerRequis

Recharge initiale en cents de dollar, prélevée sur le solde cartes. Jusqu’à 10 000 000.

cardholderstringFacultatif

Identifiant du titulaire. Requis sauf si type vaut agent.

typestringFacultatifPar défaut team

agent pour une carte agent. Sinon, la carte prend le type de son titulaire.

teamcustomeragent
agent_namestringFacultatif

Requis pour les cartes agent. 60 caractères au plus.

labelstringFacultatif

Votre libellé, 60 caractères au plus.

networkstringFacultatifPar défaut visa
visamastercard
single_usebooleanFacultatifPar défaut false

La carte peut être débitée une fois. Les paiements suivants sont refusés et rien n’est prélevé. Elle ne peut être ni rechargée ni vidée ; son solde restant revient au solde cartes à sa résiliation (automatique 30 jours après l’émission, ou avec terminate).

spending_limitobjectFacultatif

Plafond de dépense. Interdit avec single_use: true (le montant de la carte fait office de plafond) : envoyer les deux renvoie 400 parameter_invalid.

Voir les attributs
amountintegerRequis

En cents de dollar.

intervalstringRequis
dailyper_transaction
Retour

Renvoie le nouvel objet carte avec 201, ou 202 quand le résultat n’est pas encore définitif.

Erreurs à prévoir
HTTPCodeDescription
400cardholder_not_verifiedL’identité du titulaire n’est pas encore vérifiée.
400amount_too_smallMontant inférieur au minimum (pour les cartes : frais d’émission plus 1 $).
400parameter_invalidUn paramètre a un type ou une valeur incorrects. Voir param.
402balance_insufficientVotre solde (ou solde cartes) ne couvre pas le montant et les frais.
400agent_cards_not_enabledLes cartes agent ne sont pas encore configurées. Un Propriétaire doit émettre la première carte agent depuis le tableau de bord.
402provider_declinedL’opérateur ou l’émetteur de cartes a refusé. message donne leur motif.
curl https://api.monerail.com/v1/cards \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45" \
  -d '{
    "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
    "type": "customer",
    "label": "Subscriptions",
    "amount": 1000,
    "spending_limit": {
      "amount": 20000,
      "interval": "daily"
    }
  }'
Réponse201
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Consulter une carte

GET/v1/cards/{id}

Le numéro complet et le CVC ne sont jamais renvoyés par l’API. Un membre Propriétaire ou Finance peut les afficher 60 secondes dans le tableau de bord (Afficher les données).

Rôles de la clé : Tous les rôles

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Retour

Renvoie l’objet carte.

curl https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0 \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Lister les cartes

GET/v1/cards

Du plus récent au plus ancien.

Rôles de la clé : Tous les rôles

Paramètres de requête
statusstringFacultatif

Seulement les cartes à ce statut.

pendingactivefrozenterminatedfailed
cardholderstringFacultatif

Seulement les cartes de ce titulaire (identifiant).

limitintegerFacultatifPar défaut 20

Nombre d’objets à renvoyer, de 1 à 100.

starting_afterstringFacultatif

Curseur : l’identifiant du dernier objet de la page précédente.

Retour

Renvoie un objet liste : data contient jusqu’à limit objets card, et has_more indique s’il en reste.

curl "https://api.monerail.com/v1/cards?status=active&limit=10" \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "object": "list",
  "url": "/v1/cards",
  "data": [
    {
      "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
      "object": "card",
      "livemode": false,
      "type": "customer",
      "status": "active",
      "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
      "agent_name": null,
      "label": "Subscriptions",
      "network": "visa",
      "last4": "5904",
      "exp_month": 10,
      "exp_year": 2029,
      "currency": "USD",
      "balance": 950,
      "single_use": false,
      "spending_limit": {
        "amount": 20000,
        "interval": "daily"
      },
      "created_at": "2026-10-30T13:47:06.394Z",
      "terminated_at": null
    }
  ],
  "has_more": false
}

Recharger une carte

POST/v1/cards/{id}/fund

Transfère de l’argent du solde cartes vers la carte. Comme toute action sur une carte, renvoie 202 au lieu de 200 quand la réponse de l’émetteur n’est pas encore définitive : l’opération n’a pas échoué, son résultat arrive par webhook (card.funded). Indisponible pour les cartes à usage unique.

Rôles de la clé : Propriétaire ou Finance

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Corps
amountintegerRequis

En cents de dollar, jusqu’à 10 000 000.

Retour

Renvoie l’objet carte avec 200, ou 202 quand la réponse de l’émetteur n’est pas encore définitive.

Erreurs à prévoir
HTTPCodeDescription
402balance_insufficientVotre solde (ou solde cartes) ne couvre pas le montant et les frais.
400card_single_useLes cartes à usage unique ne peuvent être ni rechargées ni vidées.
409card_operation_in_progressUne autre opération est en cours sur cette carte. Réessayez dans quelques secondes.
curl https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45" \
  -d '{
    "amount": 5000
  }'
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 5950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Retirer d’une carte

POST/v1/cards/{id}/withdraw

Rapatrie de l’argent de la carte vers le solde cartes. Au moins 1 $ doit rester sur la carte. Indisponible pour les cartes à usage unique. card.withdrawn le confirme.

Rôles de la clé : Propriétaire ou Finance

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Corps
amountintegerRequis

En cents de dollar.

Retour

Renvoie l’objet carte avec 200, ou 202 quand la réponse de l’émetteur n’est pas encore définitive.

Erreurs à prévoir
HTTPCodeDescription
400card_minimum_balanceAu moins 1 $ doit rester sur la carte.
400card_single_useLes cartes à usage unique ne peuvent être ni rechargées ni vidées.
409card_operation_in_progressUne autre opération est en cours sur cette carte. Réessayez dans quelques secondes.
curl https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45" \
  -d '{
    "amount": 500
  }'
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 450,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Bloquer une carte

POST/v1/cards/{id}/freeze

Refuse tout nouveau paiement jusqu’au déblocage. card.frozen le confirme.

Rôles de la clé : Propriétaire, Finance ou Valideur

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Retour

Renvoie l’objet carte avec 200, ou 202 quand la réponse de l’émetteur n’est pas encore définitive.

Erreurs à prévoir
HTTPCodeDescription
400card_already_frozenLa carte est déjà bloquée.
curl -X POST https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "frozen",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Débloquer une carte

POST/v1/cards/{id}/unfreeze

Accepte de nouveau les paiements. card.unfrozen le confirme.

Rôles de la clé : Propriétaire, Finance ou Valideur

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Retour

Renvoie l’objet carte avec 200, ou 202 quand la réponse de l’émetteur n’est pas encore définitive.

Erreurs à prévoir
HTTPCodeDescription
400card_not_frozenLa carte n’est pas bloquée.
curl -X POST https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "active",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 950,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": null
}

Résilier une carte

POST/v1/cards/{id}/terminate

Ferme définitivement la carte. Son solde restant revient au solde cartes. Action irréversible. card.terminated le confirme.

Rôles de la clé : Propriétaire ou Finance

Paramètres de chemin
idstringRequis

Identifiant de la carte.

Retour

Renvoie l’objet carte avec 200, ou 202 quand la réponse de l’émetteur n’est pas encore définitive.

curl -X POST https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "id": "ce2f0aea-7f87-4cbd-8383-03129d1253e0",
  "object": "card",
  "livemode": false,
  "type": "customer",
  "status": "terminated",
  "cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "agent_name": null,
  "label": "Subscriptions",
  "network": "visa",
  "last4": "5904",
  "exp_month": 10,
  "exp_year": 2029,
  "currency": "USD",
  "balance": 0,
  "single_use": false,
  "spending_limit": {
    "amount": 20000,
    "interval": "daily"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "terminated_at": "2026-10-30T13:47:09.807Z"
}