API d'activation SMS

Deux options : un point d'accès compatible avec le protocole sms-activate, pour que vos logiciels basculent en changeant l'URL et la clé, et une API REST JSON pour les nouvelles intégrations. Les deux utilisent la même clé API de votre panneau.

Obtenir votre clé API

Créez un compte, ouvrez le panneau et générez une clé dans Accès API. Gardez-la secrète : toute personne qui la possède peut dépenser votre solde.

Inscription

Déroulement type

  1. Appelez getNumber avec un service et un pays.
  2. Utilisez le numéro dans l'appli cible.
  3. Interrogez getStatus toutes les quelques secondes jusqu'à STATUS_OK.
  4. Appelez setStatus avec 6 pour terminer, ou 8 pour annuler si aucun code n'est venu.

Point d'accès compatible sms-activate

Envoyez des requêtes GET ou POST avec les paramètres api_key et action. Les réponses sont en texte brut, exactement comme sms-activate.

https://smsrota.com/stubs/handler_api.php?api_key=KEY&action=getNumber&service=wa&country=187

Actions

ActionParamètresRéponse
getBalance—ACCESS_BALANCE:12.5000
getPricesservice?, country?{"187":{"wa":{"cost":0.4,"count":1563}}}
getNumberservice, country, maxPrice?ACCESS_NUMBER:48151623:15550123456
getStatusidSTATUS_WAIT_CODE · STATUS_WAIT_RETRY:code · STATUS_OK:code · STATUS_CANCEL
setStatusid, statusACCESS_RETRY_GET · ACCESS_ACTIVATION · ACCESS_CANCEL
getRentNumberservice, country, rent_time (4/24/72/168/720){"status":"success","phone":{"id":31,"endDate":"…","number":"447700900001"}}
getRentStatusid{"status":"success","quantity":"1","values":{"0":{"phoneFrom":"WhatsApp","text":"…"}}}
setRentStatusid, status (1 = finish, 2 = cancel){"status":"success"}
continueRentNumberid, rent_time{"status":"success","phone":{…}}

Valeurs de setStatus

3
Demander un autre code sur le même numéro
6
Terminer l'activation
8
Annuler et rembourser (possible deux minutes après l'achat)

API REST JSON

Envoyez la clé dans l'en-tête Authorization sous la forme "Bearer KEY". Les montants sont des chaînes en dollars US à quatre décimales.

GET   https://smsrota.com/v1/balance
GET   https://smsrota.com/v1/prices?service=wa
POST  https://smsrota.com/v1/activations  {"service":"wa","country":"187"}
GET   https://smsrota.com/v1/activations/:id
POST  https://smsrota.com/v1/activations/:id/retry
POST  https://smsrota.com/v1/activations/:id/complete
POST  https://smsrota.com/v1/activations/:id/cancel
GET   https://smsrota.com/v1/rent/prices?service=wa&hours=24
POST  https://smsrota.com/v1/rentals  {"service":"full","country":"16","hours":24}
GET   https://smsrota.com/v1/rentals/:id
POST  https://smsrota.com/v1/rentals/:id/extend  {"hours":24}
POST  https://smsrota.com/v1/rentals/:id/finish
POST  https://smsrota.com/v1/rentals/:id/cancel
POST  https://smsrota.com/v1/rentals/:id/dispute  {"reason":"no_sms"}
PUT   https://smsrota.com/v1/webhook  {"url":"https://example.com/sms-webhook"}
POST  https://smsrota.com/v1/webhook/test
GET   https://smsrota.com/v1/webhook/events

Webhooks

Indiquez une URL dans Accès API de votre panneau. Nous envoyons un POST avec un corps JSON pour chaque événement. Répondez avec un statut 2xx sous 10 secondes ; sinon nous réessayons après 1, 5, 30, 120, 360 et 720 minutes.

activation.sms_received
Un code est arrivé pour un numéro que vous avez acheté.
activation.cancelled
Un numéro a été annulé ou a expiré, et l'argent est revenu sur votre solde.
rental.sms_received
Un SMS est arrivé sur un numéro loué.
rental.ended
Une location s'est terminée ou a été annulée.

Exemple de corps

{
  "id": "evt_1042",
  "type": "activation.sms_received",
  "createdAt": "2026-11-01T10:00:00.000Z",
  "data": {
    "activationId": 48151623,
    "service": "wa",
    "country": "187",
    "phone": "15550123456",
    "code": "123456"
  }
}

Vérifier la signature

Chaque requête contient un en-tête X-Webhook-Signature de la forme t=1730000000,v1=…, où v1 est le HMAC-SHA256 hexadécimal de "t.body" calculé avec votre secret de signature. Rejetez la requête si la signature ne correspond pas ou si t date de plus de 5 minutes.

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body exactly as received, before JSON parsing.
function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  return fresh && v1.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}

Erreurs

BAD_KEY
La clé API est incorrecte ou a été remplacée.
NO_NUMBERS
Pas de stock pour ce service et ce pays pour le moment.
NO_BALANCE
Votre solde est insuffisant pour ce numéro.
EARLY_CANCEL_DENIED
L'annulation est possible deux minutes après l'achat.
NO_ACTIVATION
L'identifiant d'activation n'existe pas ou ne vous appartient pas.