SMS-Aktivierungs-API

Zwei Wege: ein mit dem sms-activate-Protokoll kompatibler Endpunkt, sodass bestehende Software durch Ändern von URL und Schlüssel wechselt, und eine JSON-REST-API für neue Integrationen. Beide nutzen denselben API-Schlüssel aus deinem Panel.

API-Schlüssel erhalten

Erstelle ein Konto, öffne das Panel und erzeuge unter API-Zugang einen Schlüssel. Halte ihn geheim: Wer den Schlüssel hat, kann dein Guthaben ausgeben.

Registrieren

Typischer Ablauf

  1. Rufe getNumber mit Dienst und Land auf.
  2. Nutze die Nummer in der Ziel-App.
  3. Frage getStatus alle paar Sekunden ab, bis STATUS_OK kommt.
  4. Rufe setStatus mit 6 zum Abschließen auf, oder mit 8 zum Stornieren, wenn kein Code kam.

sms-activate-kompatibler Endpunkt

Sende GET- oder POST-Anfragen mit den Parametern api_key und action. Antworten sind reiner Text, genau wie bei sms-activate.

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

Aktionen

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

setStatus-Werte

3
Weiteren Code auf derselben Nummer anfordern
6
Aktivierung abschließen
8
Stornieren und erstatten (zwei Minuten nach dem Kauf möglich)

JSON-REST-API

Sende den Schlüssel im Authorization-Header als "Bearer KEY". Beträge sind Strings in US-Dollar mit vier Nachkommastellen.

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

Lege in deinem Panel unter API-Zugang eine URL fest. Für jedes Ereignis senden wir einen POST mit JSON-Body. Antworte innerhalb von 10 Sekunden mit einem 2xx-Status, sonst versuchen wir es nach 1, 5, 30, 120, 360 und 720 Minuten erneut.

activation.sms_received
Für eine gekaufte Nummer ist ein Code eingetroffen.
activation.cancelled
Eine Nummer wurde storniert oder ist abgelaufen, und das Geld ging zurück auf dein Guthaben.
rental.sms_received
Auf einer gemieteten Nummer ist eine SMS eingetroffen.
rental.ended
Eine Miete ist beendet oder wurde storniert.

Beispiel-Body

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

Signatur prüfen

Jede Anfrage hat einen Header X-Webhook-Signature wie t=1730000000,v1=…, wobei v1 der hexadezimale HMAC-SHA256 von "t.body" mit deinem Signaturschlüssel ist. Lehne eine Anfrage ab, wenn die Signatur nicht passt oder t älter als 5 Minuten ist.

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

Fehler

BAD_KEY
Der API-Schlüssel ist falsch oder wurde ersetzt.
NO_NUMBERS
Gerade keine Verfügbarkeit für diesen Dienst und dieses Land.
NO_BALANCE
Dein Guthaben reicht für diese Nummer nicht aus.
EARLY_CANCEL_DENIED
Stornieren ist zwei Minuten nach dem Kauf möglich.
NO_ACTIVATION
Die Aktivierungs-ID existiert nicht oder gehört nicht dir.