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.
ÎnregistrareFlux tipic
- Apelează getNumber cu un serviciu și o țară.
- Folosește numărul în aplicația țintă.
- Interoghează getStatus la câteva secunde până primești STATUS_OK.
- 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țiune | Parametri | Răspuns |
|---|---|---|
| getBalance | — | ACCESS_BALANCE:12.5000 |
| getPrices | service?, country? | {"187":{"wa":{"cost":0.4,"count":1563}}} |
| getNumber | service, country, maxPrice? | ACCESS_NUMBER:48151623:15550123456 |
| getStatus | id | STATUS_WAIT_CODE · STATUS_WAIT_RETRY:code · STATUS_OK:code · STATUS_CANCEL |
| setStatus | id, status | ACCESS_RETRY_GET · ACCESS_ACTIVATION · ACCESS_CANCEL |
| getRentNumber | service, country, rent_time (4/24/72/168/720) | {"status":"success","phone":{"id":31,"endDate":"…","number":"447700900001"}} |
| getRentStatus | id | {"status":"success","quantity":"1","values":{"0":{"phoneFrom":"WhatsApp","text":"…"}}} |
| setRentStatus | id, status (1 = finish, 2 = cancel) | {"status":"success"} |
| continueRentNumber | id, 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/eventsWebhookuri
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.