Connexion Créer un compte

Référence API complète

Authentification, tous les endpoints (numéros, SMS, appels, solde), webhooks et codes d'erreur — avec exemples de requête et de réponse pour chacun.

Authentification

Une clé, un en-tête

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.

en-tête requis
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.

Numéros

Recherche, achat, gestion

Les prix sont ceux affichés sur /tarifs, débités automatiquement de votre portefeuille.

GET/v1/numbers/availableCherche les numéros disponibles à l'achat pour un pays donné.

Paramètres (query string)

countryrequisISO 3166-1 alpha-2, ex. FR
type« mobile » ou « local » (défaut : mobile)

Réponse

200 OK
{
  "data": [
    { "e164": "+330696031951", "country": "FR", "type": "mobile",
      "monthly_price": 12.60, "currency": "EUR" }
  ]
}
POST/v1/numbersAchète un numéro. Sans e164, le premier numéro disponible du pays est acheté automatiquement.

Paramètres (JSON)

countryrequisISO 3166-1 alpha-2
type« mobile » ou « local » (défaut : mobile)
e164numéro précis à acheter (optionnel — issu de /v1/numbers/available)
requête
{
  "country": "FR",
  "type": "mobile"
}
201 Created
{
  "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
}
GET/v1/numbersListe vos numéros actifs.

Réponse

200 OK
{ "data": [ { ... }, { ... } ] }
GET/v1/numbers/{id}Détail d'un numéro possédé.

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.

DELETE/v1/numbers/{id}Libère un numéro (arrêt immédiat, non remboursable au prorata).

Réponse

200 OK
{ "id": 19, "status": "released" }
POST/v1/numbers/{id}/webhooksConfigure les URLs de notification temps réel de ce numéro.

Paramètres (JSON)

sms_urlURL notifiée à chaque SMS entrant — vide pour désactiver
voice_urlURL notifiée à chaque appel entrant — vide pour désactiver

Voir la section Webhooks pour le format des événements envoyés.

Messages

Envoyer et consulter vos SMS

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).

POST/v1/messagesEnvoie un SMS depuis un de vos numéros.

Paramètres (JSON)

number_idrequisid d'un numéro possédé (voir GET /v1/numbers)
torequisdestinataire au format E.164
bodyrequistexte du message (918 caractères max, facturé au segment de 153)
requête
{
  "number_id": 19,
  "to": "+33612345678",
  "body": "Bonjour depuis l'API"
}
201 Created
{
  "id": 31, "number_id": 19,
  "direction": "outbound",
  "from": "+330924278227",
  "to": "+33612345678",
  "body": "Bonjour depuis l'API",
  "status": "sent", "price": 0.15,
  "currency": "EUR"
}
GET/v1/messagesListe les SMS envoyés et reçus, du plus récent au plus ancien.

Paramètres (query string, tous optionnels)

number_idfiltre sur un numéro
direction« inbound » ou « outbound »
sincedate/heure ISO — messages créés après
pagepagination, 50 résultats par page (défaut : 1)

Réponse : {"data":[...], "has_more": true|false}.

GET/v1/messages/{id}Détail d'un message.
Appels

Lancer un appel, consulter l'historique

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.

POST/v1/callsLance un appel sortant qui lit un message par synthèse vocale.

Paramètres (JSON)

number_idrequisid d'un numéro possédé
torequisdestinataire au format E.164
messagerequistexte à lire (3 à 1000 caractères)
languagefr-FR (défaut), en-US, en-GB, es-ES, ar-XA, de-DE, pt-BR
requête
{
  "number_id": 19,
  "to": "+33612345678",
  "message": "Votre commande est confirmée.",
  "language": "fr-FR"
}
201 Created
{
  "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}.

GET/v1/callsHistorique des appels sortants et entrants.

Paramètres (query string, optionnels)

number_idfiltre sur un numéro
direction« inbound » ou « outbound »
pagepagination, 50 résultats par page
GET/v1/calls/{id}Détail d'un appel (statut, durée, prix final).
Solde

Consulter le portefeuille

GET/v1/balanceSolde disponible du compte.
200 OK
{ "balance": 96.5, "currency": "EUR" }
Webhooks

Recevoir vos événements en temps réel

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).

EVENTmessage.receivedUn SMS entrant est arrivé — envoyé à sms_url
EVENTcall.ringingVotre numéro reçoit un appel — envoyé à voice_url
EVENTcall.completedUn appel entrant s'est terminé — envoyé à voice_url
message.received
{
  "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"
}
call.completed
{
  "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"
}

Vérifier la signature

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.

verify.php
$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;
}
Erreurs

Format et codes

Toute erreur renvoie {"error":{"code":"...","message":"..."}} avec le code HTTP correspondant.

HTTPcodeSignification
401unauthorizedClé API absente, mal formée ou révoquée.
402insufficient_fundsSolde du portefeuille insuffisant pour cette action.
404not_foundRessource introuvable ou n'appartenant pas à votre compte.
409no_inventoryAucun numéro disponible pour ce pays actuellement.
422invalid_requestParamètre manquant ou invalide.
502provider_unavailableService momentanément indisponible — réessayez.
502activation_failed / send_failed / call_failedÉchec de l'opération — le montant débité est intégralement remboursé.

Prêt à intégrer ?

Générez votre clé API et faites votre premier appel en quelques minutes.

Obtenir une clé API