API di attivazione SMS

Due possibilità: un endpoint compatibile con il protocollo sms-activate, così il software esistente passa a noi cambiando URL e chiave, e un'API REST JSON per nuove integrazioni. Entrambe usano la stessa chiave API del tuo pannello.

Ottieni la tua chiave API

Crea un account, apri il pannello e genera una chiave in Accesso API. Tienila segreta: chiunque abbia la chiave può spendere il tuo saldo.

Registrati

Flusso tipico

  1. Chiama getNumber con un servizio e un paese.
  2. Usa il numero nell'app di destinazione.
  3. Interroga getStatus ogni pochi secondi finché ricevi STATUS_OK.
  4. Chiama setStatus con 6 per terminare, o con 8 per annullare se il codice non è arrivato.

Endpoint compatibile sms-activate

Invia richieste GET o POST con i parametri api_key e action. Le risposte sono testo semplice, esattamente come sms-activate.

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

Azioni

AzioneParametriRisposta
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":{…}}

Valori di setStatus

3
Richiedi un altro codice sullo stesso numero
6
Completa l'attivazione
8
Annulla e rimborsa (possibile due minuti dopo l'acquisto)

API REST JSON

Invia la chiave nell'header Authorization come "Bearer KEY". Gli importi sono stringhe in dollari USA con quattro decimali.

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

Webhook

Imposta un URL in Accesso API nel tuo pannello. Per ogni evento inviamo un POST con corpo JSON. Rispondi con uno stato 2xx entro 10 secondi; altrimenti riproviamo dopo 1, 5, 30, 120, 360 e 720 minuti.

activation.sms_received
È arrivato un codice per un numero che hai acquistato.
activation.cancelled
Un numero è stato annullato o è scaduto e il denaro è tornato sul tuo saldo.
rental.sms_received
È arrivato un SMS su un numero noleggiato.
rental.ended
Un noleggio è terminato o è stato annullato.

Corpo di esempio

{
  "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"
  }
}

Verificare la firma

Ogni richiesta ha un'intestazione X-Webhook-Signature come t=1730000000,v1=…, dove v1 è l'HMAC-SHA256 esadecimale di "t.body" calcolato con il tuo segreto di firma. Rifiuta la richiesta se la firma non corrisponde o se t è più vecchio di 5 minuti.

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));
}

Errori

BAD_KEY
La chiave API è errata o è stata sostituita.
NO_NUMBERS
Al momento nessuna disponibilità per questo servizio e paese.
NO_BALANCE
Il tuo saldo non basta per questo numero.
EARLY_CANCEL_DENIED
Puoi annullare due minuti dopo l'acquisto.
NO_ACTIVATION
L'id di attivazione non esiste o non è tuo.