API de activare SMS

Două variante: un endpoint compatibil cu protocolul sms-activate, ca software-ul existent să treacă schimbând URL-ul și cheia, și un API REST JSON pentru integrări noi. Ambele folosesc aceeași cheie API din panou.

Obține cheia API

Creează un cont, deschide panoul și generează o cheie la Acces API. Păstreaz-o secretă: oricine are cheia îți poate cheltui soldul.

Înregistrare

Flux tipic

  1. Apelează getNumber cu un serviciu și o țară.
  2. Folosește numărul în aplicația țintă.
  3. Interoghează getStatus la câteva secunde până primești STATUS_OK.
  4. Apelează setStatus cu 6 pentru finalizare sau cu 8 pentru anulare dacă n-a venit codul.

Endpoint compatibil sms-activate

Trimite cereri GET sau POST cu parametrii api_key și action. Răspunsurile sunt text simplu, exact ca la sms-activate.

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

Acțiuni

AcțiuneParametriRăspuns
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 setStatus

3
Cere alt cod pe același număr
6
Finalizează activarea
8
Anulează și rambursează (posibil la două minute după cumpărare)

API REST JSON

Trimite cheia în antetul Authorization ca "Bearer KEY". Sumele sunt șiruri în dolari americani cu patru zecimale.

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

Webhookuri

Setează un URL în secțiunea Acces API din panou. Pentru fiecare eveniment trimitem un POST cu corp JSON. Răspunde cu orice stare 2xx în 10 secunde; altfel reîncercăm după 1, 5, 30, 120, 360 și 720 de minute.

activation.sms_received
A sosit un cod pentru un număr cumpărat.
activation.cancelled
Un număr a fost anulat sau a expirat, iar banii s-au întors în soldul tău.
rental.sms_received
A sosit un SMS pe un număr închiriat.
rental.ended
O închiriere s-a încheiat sau a fost anulată.

Exemplu de corp

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

Verificarea semnăturii

Fiecare cerere are un antet X-Webhook-Signature de forma t=1730000000,v1=…, unde v1 este HMAC-SHA256 hexazecimal al "t.body" calculat cu secretul tău de semnare. Respinge cererea dacă semnătura nu se potrivește sau dacă t este mai vechi de 5 minute.

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

Erori

BAD_KEY
Cheia API este greșită sau a fost înlocuită.
NO_NUMBERS
Momentan nu există stoc pentru acest serviciu și această țară.
NO_BALANCE
Soldul tău e prea mic pentru acest număr.
EARLY_CANCEL_DENIED
Anularea e posibilă la două minute după cumpărare.
NO_ACTIVATION
ID-ul de activare nu există sau nu îți aparține.