Générez une clé depuis /panel/cles-api — elle n'est affichée qu'une seule fois, copiez-la immédiatement. Chaque requête l'envoie via l'en-tête Authorization.
Authorization: Bearer ev_live_a1b2c3d4... Content-Type: application/json
Une clé absente, mal formée ou révoquée renvoie 401 unauthorized. Le corps des requêtes POST accepte du JSON (Content-Type: application/json) ou du application/x-www-form-urlencoded classique.
Les prix sont ceux affichés sur /tarifs, débités automatiquement de votre portefeuille.
FR{
"data": [
{ "e164": "+330696031951", "country": "FR", "type": "mobile",
"monthly_price": 12.60, "currency": "EUR" }
]
}{
"country": "FR",
"type": "mobile"
}{
"id": 19, "e164": "+330924278227",
"country": "FR", "type": "mobile",
"capabilities": ["voice","sms"],
"monthly_price": 12.60, "currency": "EUR",
"status": "active",
"renews_at": "2026-10-19",
"webhook_sms_url": null,
"webhook_voice_url": null
}{ "data": [ { ... }, { ... } ] }Même forme que la ressource retournée par l'achat. 404 not_found si l'id n'existe pas ou ne vous appartient pas.
{ "id": 19, "status": "released" }Voir la section Webhooks pour le format des événements envoyés.
Les SMS entrants sont journalisés automatiquement dès qu'ils arrivent sur un de vos numéros — aucun appel API n'est nécessaire pour les recevoir, ils apparaissent via GET /v1/messages (ou en temps réel via un webhook, voir plus bas).
{
"number_id": 19,
"to": "+33612345678",
"body": "Bonjour depuis l'API"
}{
"id": 31, "number_id": 19,
"direction": "outbound",
"from": "+330924278227",
"to": "+33612345678",
"body": "Bonjour depuis l'API",
"status": "sent", "price": 0.15,
"currency": "EUR"
}Réponse : {"data":[...], "has_more": true|false}.
En v1, un appel sortant lit un message par synthèse vocale (voix naturelle, choix de la langue) — utile pour une alerte, une confirmation, un code vocal. Les appels entrants sur vos numéros sont journalisés automatiquement et visibles via les mêmes endpoints.
{
"number_id": 19,
"to": "+33612345678",
"message": "Votre commande est confirmée.",
"language": "fr-FR"
}{
"id": 5, "number_id": 19,
"direction": "outbound", "source": "tts",
"from": "+330924278227",
"to": "+33612345678",
"status": "queued", "duration_sec": 0,
"price": 0.08, "currency": "EUR"
}Le forfait par appel est débité au lancement ; les minutes réelles s'ajoutent au prix une fois l'appel terminé — récupérez le total à jour via GET /v1/calls/{id}.
{ "balance": 96.5, "currency": "EUR" }Configurez une URL par numéro avec POST /v1/numbers/{id}/webhooks (sms_url, voice_url). À chaque événement, votre URL reçoit une requête POST avec un corps JSON — délai court, tentative unique (pas de re-livraison automatique aujourd'hui : utilisez GET /v1/messages ou /v1/calls comme filet de sécurité si une notification est manquée).
{
"event": "message.received",
"message_id": 32,
"number": { "id": 20, "e164": "+330229226780" },
"from": "+33698765432",
"to": "+330229226780",
"body": "Votre code est 482913",
"sent_at": "2026-09-19T14:00:52+00:00"
}{
"event": "call.completed",
"number": { "id": 20, "e164": "+330229226780" },
"from": "+33698765432",
"to": "+330229226780",
"status": "completed",
"duration_sec": 47,
"sent_at": "2026-09-19T14:03:10+00:00"
}Si un secret est configuré côté plateforme, chaque requête porte l'en-tête X-EsimVoip-Signature: sha256=... — un HMAC-SHA256 du corps brut avec votre secret. Vérifiez-le avant de traiter l'événement.
$body = file_get_contents('php://input'); $expected = 'sha256=' . hash_hmac('sha256', $body, $secret); if (!hash_equals($expected, $_SERVER['HTTP_X_ESIMVOIP_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
Toute erreur renvoie {"error":{"code":"...","message":"..."}} avec le code HTTP correspondant.
Générez votre clé API et faites votre premier appel en quelques minutes.
Obtenir une clé API