API til sms-aktivering

To muligheder: et endpoint, der er kompatibelt med sms-activate-protokollen, så eksisterende software skifter ved at ændre URL og nøgle, og et JSON REST-API til nye integrationer. Begge bruger den samme API-nøgle fra dit panel.

Få din API-nøgle

Opret en konto, åbn panelet, og generér en nøgle under API-adgang. Hold den hemmelig: Alle med nøglen kan bruge din saldo.

Tilmeld

Typisk forløb

  1. Kald getNumber med en tjeneste og et land.
  2. Brug nummeret i målappen.
  3. Forespørg getStatus med få sekunders mellemrum, indtil du får STATUS_OK.
  4. Kald setStatus med 6 for at afslutte, eller 8 for at annullere, hvis der ikke kom en kode.

Endpoint kompatibelt med sms-activate

Send GET- eller POST-forespørgsler med parametrene api_key og action. Svarene er ren tekst, præcis som hos sms-activate.

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

Handlinger

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

Værdier for setStatus

3
Bed om en ny kode på samme nummer
6
Afslut aktiveringen
8
Annuller og refundér (muligt to minutter efter køb)

JSON REST-API

Send nøglen i Authorization-headeren som "Bearer KEY". Beløb er strenge i amerikanske dollars med fire decimaler.

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

Angiv en URL under API-adgang i dit panel. Vi sender en POST med JSON-body for hver hændelse. Svar med en vilkårlig 2xx-status inden for 10 sekunder; ellers prøver vi igen efter 1, 5, 30, 120, 360 og 720 minutter.

activation.sms_received
Der er kommet en kode til et nummer, du har købt.
activation.cancelled
Et nummer blev annulleret eller udløb, og pengene gik tilbage til din saldo.
rental.sms_received
Der er kommet en sms på et lejet nummer.
rental.ended
En leje er slut eller blev annulleret.

Eksempel på 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"
  }
}

Tjek signaturen

Hver forespørgsel har en X-Webhook-Signature-header som t=1730000000,v1=…, hvor v1 er den hexadecimale HMAC-SHA256 af "t.body" lavet med din signeringsnøgle. Afvis forespørgslen, hvis signaturen ikke passer, eller t er mere end 5 minutter gammel.

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

Fejl

BAD_KEY
API-nøglen er forkert eller er blevet udskiftet.
NO_NUMBERS
Intet lager til denne tjeneste og dette land lige nu.
NO_BALANCE
Din saldo er for lav til dette nummer.
EARLY_CANCEL_DENIED
Du kan annullere to minutter efter køb.
NO_ACTIVATION
Aktiverings-id'et findes ikke eller tilhører ikke dig.