v1REST · JSON

SNSOTP OTP API

Une API REST pour la vérification par SMS. Commandez un numéro pour l'un des 182 services dans l'un des 154 pays, lisez le code à usage unique de la commande et récupérez le prix complet si aucun code n'arrive dans les 20 minutes.

Chaque endpoint accepte les paramètres sous forme de paramètres de requête (GET) ou de champs de formulaire ou JSON (POST). Les réponses sont en JSON ; l'argent est une chaîne USD avec deux décimales et les heures sont au format ISO 8601 en UTC.

Serveur

https://snsotp.com/api/v1

AuthentificationBearer token

Votre clé API depuis la console, envoyée sous forme de Authorization: Bearer sok_...

Authentification

Créez une clé sur la page API de la console. Elle commence par sok_ et n'est affichée qu'une seule fois, donc stockez-la dans une variable d'environnement. Remplacer la clé arrête immédiatement l'ancienne. Les appels à /services, /countries et /prices fonctionnent sans clé.

En-tête
Authorization: Bearer sok_your_key_here

La clé peut également être envoyée sous forme de paramètre de requête key ou de champ de formulaire, ce qui aide les outils qui ne peuvent pas définir d'en-têtes.

Démarrage rapide

Commandez un numéro, donnez-le à l'application, puis interrogez la commande jusqu'à ce que le code soit là. Le même flux en quatre langues :

# 1. Order a number for whatsapp in US
curl -X POST https://snsotp.com/api/v1/orders \
  -H "Authorization: Bearer $SNSOTP_KEY" \
  -d service=whatsapp -d country=us

# 2. Read the code (poll every 3 to 5 seconds)
curl https://snsotp.com/api/v1/orders/OT-7K2M9QX4PB \
  -H "Authorization: Bearer $SNSOTP_KEY"

GET/services

Chaque service avec son code et son prix le plus bas · pas de clé

Chaque service que vous pouvez commander, avec son code (utilisez-le comme service dans d'autres appels), sa catégorie et le prix le plus bas parmi les pays. Aucune clé nécessaire.

RequêtecURL
curl https://snsotp.com/api/v1/services
Réponse200
{
  "services": [
    { "code": "whatsapp", "name": "WhatsApp", "category": "social", "from": "0.09" },
    { "code": "telegram", "name": "Telegram", "category": "social", "from": "0.03" }
  ]
}

GET/countries

Chaque pays avec son code et son indicatif · pas de clé

Chaque pays avec son code (ISO 3166 alpha-2 en minuscules, utilisez-le comme country) et son indicatif téléphonique. Aucune clé nécessaire.

RequêtecURL
curl https://snsotp.com/api/v1/countries
Réponse200
{
  "countries": [
    { "code": "us", "name": "United States", "dial_code": "1" },
    { "code": "gb", "name": "United Kingdom", "dial_code": "44" }
  ]
}

GET/prices

Prix pour un service, un pays ou les deux · pas de clé

Le prix par commande pour un service dans chaque pays, un pays pour chaque service, ou une paire. Envoyez au moins un filtre. Aucune clé nécessaire.

Paramètres

  • servicestring

    Code du service, par exemple whatsapp

  • countrystring

    Code du pays, par exemple us

RequêtecURL
curl "https://snsotp.com/api/v1/prices?service=whatsapp&country=us"
Réponse200
{
  "prices": [
    { "service": "whatsapp", "country": "us", "price": "0.93" }
  ]
}

GET/balance

Votre crédit en USD · clé requise

Votre crédit en USD.

RequêtecURL
curl https://snsotp.com/api/v1/balance \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "balance": "42.50",
  "currency": "USD"
}

POST/orders

Commandez un numéro pour un service et un pays · clé requise

Commande un numéro et facture son prix. La réponse contient le numéro complet (phone) et sans l'indicatif téléphonique (number). La commande reste ouverte pendant 20 minutes ; si aucun code n'arrive dans ce délai, le prix est automatiquement remboursé sur votre crédit. Réponse statut 201.

Paramètres

  • servicestringrequis

    Code du service depuis GET /services

  • countrystringrequis

    Code du pays depuis GET /countries

RequêtecURL
curl -X POST https://snsotp.com/api/v1/orders \
  -H "Authorization: Bearer $SNSOTP_KEY" \
  -d service=whatsapp -d country=us
Réponse201
{
  "order": {
    "id": "OT-7K2M9QX4PB",
    "service": "whatsapp",
    "country": "us",
    "phone": "+13475550182",
    "number": "3475550182",
    "dial_code": "1",
    "price": "0.93",
    "status": "waiting",
    "code": null,
    "sms": null,
    "codes": [],
    "expires_at": "2026-11-03T12:20:00.000Z"
  },
  "window_minutes": 20
}

GET/orders/{id}

Statut, code et texte SMS d'une commande · clé requise

Une commande avec son statut, le dernier code, le dernier texte SMS et tous les codes reçus jusqu'à présent. Interrogez toutes les 3 à 5 secondes tant que le statut est waiting.

Paramètres

  • idpathrequis

    ID de commande depuis POST /orders

RequêtecURL
curl https://snsotp.com/api/v1/orders/OT-7K2M9QX4PB \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "order": {
    "id": "OT-7K2M9QX4PB",
    "service": "whatsapp",
    "country": "us",
    "phone": "+13475550182",
    "number": "3475550182",
    "price": "0.93",
    "status": "received",
    "code": "284913",
    "sms": "Your WhatsApp code is 284913",
    "expires_at": "2026-11-03T12:20:00.000Z"
  }
}

GET/orders

Vos commandes ouvertes (ou toutes avec status=all) · clé requise

Vos commandes ouvertes, les plus récentes en premier. Ajoutez status=all pour les commandes récentes dans tous les statuts.

Paramètres

  • statusstring

    open (par défaut) ou all

  • limitnumber

    1 à 100, par défaut 50

RequêtecURL
curl "https://snsotp.com/api/v1/orders?status=open" \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "orders": [
    { "id": "OT-7K2M9QX4PB", "service": "whatsapp", "status": "received", "code": "284913" }
  ]
}

POST/orders/{id}/resend

Un autre code sur le même numéro · clé requise

Demande un autre code sur le même numéro après le premier code, dans la fenêtre, sans frais supplémentaires. Déclenchez ensuite un nouveau SMS dans l'application ; waiting_for_resend est vrai jusqu'à ce qu'il arrive.

Paramètres

  • idpathrequis

    ID de commande

RequêtecURL
curl -X POST https://snsotp.com/api/v1/orders/OT-7K2M9QX4PB/resend \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "order": { "id": "OT-7K2M9QX4PB", "status": "received", "waiting_for_resend": true }
}

POST/orders/{id}/finish

Fermez une commande après avoir utilisé le code · clé requise

Ferme une commande qui a reçu un code une fois que vous l'avez utilisé. La finalisation est facultative : les commandes ouvertes se ferment d'elles-mêmes lorsque la fenêtre se termine.

Paramètres

  • idpathrequis

    ID de commande

RequêtecURL
curl -X POST https://snsotp.com/api/v1/orders/OT-7K2M9QX4PB/finish \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "order": { "id": "OT-7K2M9QX4PB", "status": "finished" }
}

POST/orders/{id}/cancel

Annulez avant un code, remboursement intégral · clé requise

Annule une commande avant l'arrivée d'un code et rembourse immédiatement le prix complet sur votre crédit. Après un code, l'annulation répond has_code.

Paramètres

  • idpathrequis

    ID de commande

RequêtecURL
curl -X POST https://snsotp.com/api/v1/orders/OT-7K2M9QX4PB/cancel \
  -H "Authorization: Bearer $SNSOTP_KEY"
Réponse200
{
  "order": { "id": "OT-7K2M9QX4PB", "status": "canceled", "refunded": "0.93" }
}

Statut de la commande

valeurs de statut
  • waitingLe numéro est prêt et aucun SMS n'est encore arrivé. L'annulation est possible.
  • receivedAu moins un code est arrivé. code et sms contiennent le dernier.
  • finishedFermé après un code, par finish ou lorsque la fenêtre se termine.
  • refundedAucun code n'est arrivé dans les 20 minutes. Le prix complet est remboursé sur votre crédit.
  • canceledAnnulé avant l'arrivée d'un code. Le prix complet est remboursé sur votre crédit.

Erreurs

Les erreurs utilisent le statut HTTP et un corps avec un code stable et un message lisible.

Statut HTTP et codes
  • 400missing_filter, bad_jsonUne valeur requise est manquante ou le corps ne peut pas être lu.
  • 401no_key, bad_keyLa clé est manquante, incorrecte ou supprimée.
  • 402no_balanceCrédit insuffisant pour cette commande. Ajoutez du crédit dans la console.
  • 404unknown_service, unknown_country, not_sold, not_foundLe code ou la commande n'existe pas, ou la paire n'est pas vendue.
  • 409too_many_open, has_code, not_ready, no_numbersL'action ne correspond pas à l'état de la commande, ou aucun numéro n'est disponible actuellement (rien n'est facturé).
  • 429rate_limitedPlus de 300 requêtes en une minute avec une seule clé.
Corps d'erreur402
{
  "error": {
    "code": "no_balance",
    "message": "Not enough credit. Add credit in the console."
  }
}

Limites de taux

  • 300 requêtes par minute par clé. Au-delà, l'API répond 429 rate_limited pour le reste de la minute.
  • Jusqu'à 20 commandes ouvertes par compte. Finalisez ou annulez-en une pour en ouvrir une autre.
  • Interrogez une commande toutes les 3 à 5 secondes ; les codes arrivent généralement en moins d'une minute.

Format d'activation SMS

Les scripts écrits pour le format commun handler_api.php fonctionnent avec la même clé API : changez l'adresse de base en https://snsotp.com/stubs/handler_api.php et conservez les actions. Les codes de service et de pays sont les mêmes que dans l'API REST.

Actions
  • getBalance

    ACCESS_BALANCE:42.50

  • getServicesList

    Liste JSON des services

  • getCountries

    Carte JSON des pays

  • getPricesservice, country (facultatif)

    JSON {country: {service: {cost, count}}}

  • getNumberservice, country

    ACCESS_NUMBER:<id>:<phone>

  • getStatusid

    STATUS_WAIT_CODE, STATUS_OK:<code>, STATUS_WAIT_RETRY:<code>, STATUS_CANCEL

  • setStatusid, status 1 / 3 / 6 / 8

    ACCESS_READY, ACCESS_RETRY_GET, ACCESS_ACTIVATION, ACCESS_CANCEL

RequêtecURL
curl "https://snsotp.com/stubs/handler_api.php\
?api_key=$SNSOTP_KEY&action=getNumber\
&service=telegram&country=gb"

ACCESS_NUMBER:OT-3QF8ZK2W7M:447700900182

Valeurs de setStatus : 1 prêt, 3 un autre code, 6 terminer, 8 annuler avec un remboursement intégral.

Documentation de l'API OTP : API REST de vérification par SMS | SNSOTP