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.
/v1/cardsCréer une carteGET/v1/cards/{id}Consulter une carteGET/v1/cardsLister les cartesPOST/v1/cards/{id}/fundRecharger une cartePOST/v1/cards/{id}/withdrawRetirer d’une cartePOST/v1/cards/{id}/freezeBloquer une cartePOST/v1/cards/{id}/unfreezeDébloquer une cartePOST/v1/cards/{id}/terminateRésilier une carteL’objet carte
Attributs
Identifiant unique (UUID).
true en production, false en mode test.
Toujours card.
Les cartes agent appartiennent à un agent IA et n’ont pas de titulaire.
teamcustomeragentpending pendant que l’émetteur crée la carte, failed s’il n’a pas pu.
pendingactivefrozenterminatedfailedIdentifiant du titulaire.
Cartes agent seulement.
Votre libellé pour la carte.
visamastercard4 derniers chiffres du numéro de carte.
Toujours USD.
Solde de la carte, en cents de dollar.
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.
{ amount, interval } avec interval daily ou per_transaction. Toujours null pour les cartes à usage unique.
Date de création, ISO 8601 (UTC).
{
"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
É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
Recharge initiale en cents de dollar, prélevée sur le solde cartes. Jusqu’à 10 000 000.
Identifiant du titulaire. Requis sauf si type vaut agent.
teamagent pour une carte agent. Sinon, la carte prend le type de son titulaire.
teamcustomeragentRequis pour les cartes agent. 60 caractères au plus.
Votre libellé, 60 caractères au plus.
visavisamastercardfalseLa 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).
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
En cents de dollar.
dailyper_transactionRetour
Renvoie le nouvel objet carte avec 201, ou 202 quand le résultat n’est pas encore définitif.
Erreurs à prévoir
| HTTP | Code | Description |
|---|---|---|
400 | cardholder_ | L’identité du titulaire n’est pas encore vérifiée. |
400 | amount_ | Montant inférieur au minimum (pour les cartes : frais d’émission plus 1 $). |
400 | parameter_ | Un paramètre a un type ou une valeur incorrects. Voir param. |
402 | balance_ | Votre solde (ou solde cartes) ne couvre pas le montant et les frais. |
400 | agent_ | Les cartes agent ne sont pas encore configurées. Un Propriétaire doit émettre la première carte agent depuis le tableau de bord. |
402 | provider_ | L’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"
}
}'const res = await fetch('https://api.monerail.com/v1/cards', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
},
body: JSON.stringify({
cardholder: '5df6acd9-4bac-4e19-869c-fcde6b79f389',
type: 'customer',
label: 'Subscriptions',
amount: 1000,
spending_limit: {
amount: 20000,
interval: 'daily',
},
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}", "Idempotency-Key": "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"},
json={
"cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
"type": "customer",
"label": "Subscriptions",
"amount": 1000,
"spending_limit": {
"amount": 20000,
"interval": "daily",
},
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
'Content-Type: application/json',
'Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
],
CURLOPT_POSTFIELDS => json_encode([
'cardholder' => '5df6acd9-4bac-4e19-869c-fcde6b79f389',
'type' => 'customer',
'label' => 'Subscriptions',
'amount' => 1000,
'spending_limit' => [
'amount' => 20000,
'interval' => 'daily',
],
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, err := json.Marshal(map[string]any{
"cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
"type": "customer",
"label": "Subscriptions",
"amount": 1000,
"spending_limit": map[string]any{
"amount": 20000,
"interval": "daily",
},
})
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards", bytes.NewReader(payload))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
String body = """
{
"cardholder": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
"type": "customer",
"label": "Subscriptions",
"amount": 1000,
"spending_limit": {
"amount": 20000,
"interval": "daily"
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.header("Content-Type", "application/json")
.header("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
req["Content-Type"] = "application/json"
req["Idempotency-Key"] = "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"
req.body = JSON.generate({
cardholder: "5df6acd9-4bac-4e19-869c-fcde6b79f389",
type: "customer",
label: "Subscriptions",
amount: 1000,
spending_limit: {
amount: 20000,
interval: "daily",
},
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards");
request.Headers.Add("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45");
request.Content = JsonContent.Create(new
{
cardholder = "5df6acd9-4bac-4e19-869c-fcde6b79f389",
type = "customer",
label = "Subscriptions",
amount = 1000,
spending_limit = new
{
amount = 20000,
interval = "daily",
},
});
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(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
}Consulter une carte
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
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"const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0', {
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(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
}Lister les cartes
Du plus récent au plus ancien.
Rôles de la clé : Tous les rôles
Paramètres de requête
Seulement les cartes à ce statut.
pendingactivefrozenterminatedfailedSeulement les cartes de ce titulaire (identifiant).
20Nombre d’objets à renvoyer, de 1 à 100.
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"const res = await fetch('https://api.monerail.com/v1/cards?status=active&limit=10', {
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.monerail.com/v1/cards",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
params={"status": "active", "limit": 10},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards?status=active&limit=10');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://api.monerail.com/v1/cards?status=active&limit=10", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards?status=active&limit=10"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards?status=active&limit=10")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.monerail.com/v1/cards?status=active&limit=10");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"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
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
Identifiant de la carte.
Corps
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
| HTTP | Code | Description |
|---|---|---|
402 | balance_ | Votre solde (ou solde cartes) ne couvre pas le montant et les frais. |
400 | card_ | Les cartes à usage unique ne peuvent être ni rechargées ni vidées. |
409 | card_ | Une 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
}'const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
},
body: JSON.stringify({
amount: 5000,
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}", "Idempotency-Key": "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"},
json={
"amount": 5000,
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
'Content-Type: application/json',
'Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => 5000,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, err := json.Marshal(map[string]any{
"amount": 5000,
})
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund", bytes.NewReader(payload))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
String body = """
{
"amount": 5000
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.header("Content-Type", "application/json")
.header("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
req["Content-Type"] = "application/json"
req["Idempotency-Key"] = "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"
req.body = JSON.generate({
amount: 5000,
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/fund");
request.Headers.Add("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45");
request.Content = JsonContent.Create(new
{
amount = 5000,
});
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(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": 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
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
Identifiant de la carte.
Corps
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
| HTTP | Code | Description |
|---|---|---|
400 | card_ | Au moins 1 $ doit rester sur la carte. |
400 | card_ | Les cartes à usage unique ne peuvent être ni rechargées ni vidées. |
409 | card_ | Une 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
}'const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
},
body: JSON.stringify({
amount: 500,
}),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}", "Idempotency-Key": "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"},
json={
"amount": 500,
},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
'Content-Type: application/json',
'Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45',
],
CURLOPT_POSTFIELDS => json_encode([
'amount' => 500,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload, err := json.Marshal(map[string]any{
"amount": 500,
})
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw", bytes.NewReader(payload))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
String body = """
{
"amount": 500
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.header("Content-Type", "application/json")
.header("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
req["Content-Type"] = "application/json"
req["Idempotency-Key"] = "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45"
req.body = JSON.generate({
amount: 500,
})
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/withdraw");
request.Headers.Add("Idempotency-Key", "a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45");
request.Content = JsonContent.Create(new
{
amount = 500,
});
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(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": 450,
"single_use": false,
"spending_limit": {
"amount": 20000,
"interval": "daily"
},
"created_at": "2026-10-30T13:47:06.394Z",
"terminated_at": null
}Bloquer une carte
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
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
| HTTP | Code | Description |
|---|---|---|
400 | card_ | La 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"const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_POSTFIELDS => '',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/freeze");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"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
Accepte de nouveau les paiements. card.unfrozen le confirme.
Rôles de la clé : Propriétaire, Finance ou Valideur
Paramètres de chemin
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
| HTTP | Code | Description |
|---|---|---|
400 | card_ | La 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"const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_POSTFIELDS => '',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/unfreeze");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(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
}Résilier une carte
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
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"const res = await fetch('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MONERAIL_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error.code}: ${data.error.message}`);
console.log(data);import os
import requests
res = requests.post(
"https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate",
headers={"Authorization": f"Bearer {os.environ['MONERAIL_KEY']}"},
timeout=30,
)
data = res.json()
if not res.ok:
raise RuntimeError(f"{data['error']['code']}: {data['error']['message']}")
print(data)<?php
$ch = curl_init('https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MONERAIL_KEY'),
],
CURLOPT_POSTFIELDS => '',
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($status >= 400) {
throw new RuntimeException($data['error']['code'] . ': ' . $data['error']['message']);
}
print_r($data);package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodPost, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate", nil)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("MONERAIL_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
panic(err)
}
if res.StatusCode >= 400 {
panic(fmt.Sprint(data["error"]))
}
fmt.Println(data)
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate"))
.header("Authorization", "Bearer " + System.getenv("MONERAIL_KEY"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException(response.body());
}
System.out.println(response.body()); // parse with your JSON library (Jackson, Gson…)
}
}require "json"
require "net/http"
uri = URI("https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("MONERAIL_KEY")}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
raise "#{data["error"]["code"]}: #{data["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
puts datausing System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("MONERAIL_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://api.monerail.com/v1/cards/ce2f0aea-7f87-4cbd-8383-03129d1253e0/terminate");
using var response = await http.SendAsync(request);
var data = await response.Content.ReadFromJsonAsync<JsonElement>();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(data.GetProperty("error").GetProperty("message").GetString());
}
Console.WriteLine(data);{
"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"
}