SMS pristupnik preko API-ja za 10 minuta u Node.js-u
September 2, 2026 · 6 minuta čitanja · Ažurirano October 9, 2026
Da biste iz Node.js-a poslali SMS, dovoljan je jedan zahtjev POST na https://volai.cz/v1/messages sa zaglavljem Authorization: Bearer vk_... i tijelom JSON {to, body}. Node 20 ima ugrađen fetch, pa vam nije potreban nikakav dodatni paket. Radni primjer nalazi se odmah ispod ovog odlomka, uključujući obradu pogrešaka i idempotentnost, kako vam ispad mreže ne bi dvaput poslao istu poruku.
Što će vam trebati
- Node.js 18 ili noviji -
fetchje ugrađen od te verzije; preporučujemo trenutačnu podržanu LTS liniju (24, stanje na dan 2. 9. 2026.). - Račun u volai i API ključ iz portala (Postavke -> API i MCP) u obliku
vk_.... - Barem jednu dopunu stanja. SMS poruke rade tek nakon prve dopune, početno stanje za njih nije moguće iskoristiti - pozive njime možete isprobati, tekstualne poruke ne.
- Telefonski broj primatelja u Češkoj ili Slovačkoj (
+420ili+421) - u druge zemlje SMS ne šaljemo. - Vlastiti telefonski broj NE trebate. Poruke odlaze pod zajedničkim imenom
SMSinfo- operateri u češkim mrežama dopuštaju samo odobrena imena, vlastito ime pošiljatelja kod zajedničkog pošiljatelja nije moguće postaviti, a na SMSinfo primatelj ne može odgovoriti. Zato svoj identitet navedite izravno u tekstu poruke, kao u primjeru u nastavku. Ako želite da je moguće odgovoriti, pošaljite poruku sa svojeg mobilnog broja (dodatak, vidi napomenu u nastavku).
Pošaljite prvi SMS
Zahtjevu su dovoljna dva polja: to (broj primatelja) i body (tekst poruke). Odgovor vraća id poruke, status, cijenu u halerima (priceHal) i broj segmenata (segments) - na oboje se uskoro vraćamo.
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_VAS_KLJUC",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Pozdrav iz volai! - Moja aplikacija",
}),
});
if (!response.ok) {
const { error } = await response.json();
throw new Error("volai " + error.code + ": " + error.message);
}
const message = await response.json();
console.log(message);
// { id: "msg_7c1f9a2e", status: "sent", priceHal: 136, segments: 1 }Koliko koštaju SMS poruke i što su segmenti?
Jedan SMS u jednom segmentu košta 1,36 kr bez PDV-a (cijena vrijedi na dan 2. 9. 2026.). Koliko će segmenata poruka zauzeti, ovisi o tome sadrži li znakove izvan abecede GSM-7 - operateri dijele SMS prema standardu GSM 03.38:
| Kodiranje | Znakova u 1. segmentu | Znakova u daljnjim dijelovima |
|---|---|---|
| GSM-7 (uobičajeni latinični tekst bez dijakritika) | 160 | 153 |
| UCS-2 (s dijakritičkim ili nelatiničnim znakovima) | 70 | 67 |
Dovoljan je JEDAN znak izvan osnovne abecede GSM-7 (znakovi s dijakritikom, emotikoni, većina nelatiničnih pisama) i CIJELA se poruka prebacuje na UCS-2, čak i ako je u tekstu samo jedno slovo s kvačicom. Savjet: ako se želite pouzdano zadržati unutar jednog segmenta, pišite bez dijakritika.
Primjer: poruka s dijakritikom dulja od 70 znakova
Ova poruka ima 130 znakova i sadrži dijakritike, pa se računa kao UCS-2 (ograničenje od 67 znakova po segmentu kod višedijelne poruke) - ispada 2 segmenta, dakle 2,72 kr, a ne 1,36 kr:
await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_VAS_KLJUC",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Dobar dan, podsjećamo vas na sutrašnji termin u 10:00 - ako vam ne odgovara, odgovorite nam i dogovorit ćemo drugo vrijeme. Hvala.",
}),
});
// -> { id: "msg_9a3f1c7d", status: "sent", priceHal: 272, segments: 2 }Idempotentnost: sigurno ponavljanje zahtjeva
Dodatno pošaljite zaglavlje Idempotency-Key s proizvoljnim vlastitim nizom, na primjer ID-jem narudžbe. Ako zahtjev zakaže zbog ispada mreže, a vaš workflow ga ponovi s ISTIM zaglavljem, volai vraća spremljeni odgovor iz prvog pokušaja i poruku ne šalje drugi put - ključ vrijedi 24 sata.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_VAS_KLJUC" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: narudzba-4471" \
-d '{"to": "+420777123456", "body": "Vaša narudžba br. 4471 je zaprimljena."}'Sigurno rukujte API ključem
API ključ (vk_...) ima istu težinu kao lozinka - tko ga zna, može u vaše ime slati poruke i trošiti stanje s vašeg računa. Zato ga nikada ne upisujte u izvorni kod koji commitate u repozitorij. Mjesto mu je u varijabli okruženja (process.env.VOLAI_API_KEY u Node.js-u) ili u upravitelju tajni koji koristi vaš hosting.
// .env.local (nikada ne commitajte u repozitorij)
// VOLAI_API_KEY=vk_vas_kljuc
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.VOLAI_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ to, body }),
});Endpoint uvijek pozivajte sa servera, a ne iz preglednika - tko bi ključ pročitao u alatima za razvojne programere u pregledniku, mogao bi s vašeg računa početi slati vlastite poruke. Ako je ključ procurio (primjerice greškom u commitu), generirajte u portalu novi, a stari poništite - stara vrijednost prestaje raditi odmah.
Prvo to sigurno isprobajte
Prije nego što slanje SMS poruka povežete sa stvarnim procesom (primjerice potvrdom narudžbe), pošaljite prvih nekoliko poruka na vlastiti telefonski broj. Vidjet ćete točno ono što će vidjeti klijent - kako izgleda pošiljatelj SMSinfo, koliko traje isporuka i računaju li se segmenti onako kako očekujete. Tek onda prebacite to na stvarni broj klijenta.
Što učiniti kada API vrati pogrešku?
Neuspješan odgovor uvijek ima oblik {error: {code, message}} i HTTP status prema vrsti pogreške:
| Status | Kod | Što znači |
|---|---|---|
| 400 | invalid_number | To nije važeći češki ni slovački telefonski broj. |
| 400 | invalid_body | Tekst poruke mora imati od 1 do 765 znakova. |
| 400 | unsupported_country | Broj izvan Češke/Slovačke, SMS tamo ne šaljemo. |
| 400 | recipient_cannot_receive_sms | Fiksna linija - SMS ne bi stigao. Ništa se ne naplaćuje. |
| 402 | insufficient_credit | Stanje ne pokriva cijenu svih segmenata poruke ili račun još nije dopunjen - SMS poruke rade tek nakon prve dopune, početno stanje za njih nije moguće iskoristiti. |
| 429 | rate_limited | Više od 1 SMS-a u 2 sekunde ili više od 100 SMS-ova dnevno po računu. |
| 502 | send_failed | Telefonska mreža odbila je zahtjev. Stanje nije umanjeno, pokušajte ponovno. |
| 502 | send_unknown | Poruku smo predali mreži, potvrda nije stigla - naplaćuje se, molimo da je ne šaljete ponovno naslijepo. |
Koja stanja poruka može imati?
Polje status u ispisu (GET /v1/messages) i u detalju pojedine poruke poprima pet vrijednosti: pending (spremljena, još se šalje), sent (operater je potvrdio slanje), failed (operater je odbio - ne naplaćuje se), unknown (potvrda o isporuci nije stigla, tipično istek vremena na strani operatera - unatoč tome naplaćuje se u punom iznosu jer je poruka mogla stići) i received (samo kod primljenih poruka, dakle s direction=in; poslane poruke ga nemaju).
Svaka poruka nosi i polja direction (out kod poslanih, in kod primljenih), smsNumber (broj s kojeg je poruka otišla ili na koji je stigla; kod poruka pod zajedničkim imenom SMSinfo iznosi null) i deliveryStatus (delivered ili undelivered, potvrda o isporuci od operatera; nastaje samo kod SMS poruka poslanih s mobilnog broja, kod ostalih poruka iznosi null).
Kako poslati više SMS poruka odjednom?
Rate limit dopušta najviše jedan SMS u dvije sekunde po računu i najviše 100 SMS-ova dnevno. Pri slanju više poruka odjednom (primjerice podsjetnika na termine) jednostavnije je između zahtjeva kratko pričekati nego hvatati rate_limited i pokušavati ponovno:
const message = "Podsjećamo vas na sutrašnji termin - Moja aplikacija";
for (const to of recipients) {
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_VAS_KLJUC",
"Content-Type": "application/json",
},
body: JSON.stringify({ to, body: message }),
});
if (!response.ok) {
const { error } = await response.json();
console.error("volai " + to + ": " + error.code);
}
// Ograničenje je najviše 1 SMS u 2 sekunde po računu - kratka stanka
// između zahtjeva jednostavnija je od obrade rate_limited i ponovnih pokušaja.
await new Promise((resolve) => setTimeout(resolve, 2100));
}SMS primaju dvije vrste brojeva
Glasovni brojevi usluge volai ne primaju SMS, pa se odgovor na poruku poslanu pod zajedničkim imenom SMSinfo nigdje ne pojavljuje. Ako želite primati i slati SMS s vlastitog broja, odaberite dodatak mobilni broj: češki mobilni broj samo za SMS, bez poziva, 290 kr na 30 dana bez PDV-a. Ili naručite broj za pozive i SMS: praški fiksni broj na kojem primate pozive i SMS, 49 kr na 30 dana bez PDV-a (naknada se naplaćuje tek nakon aktivacije, koja obično traje do 1 radnog dana). Kod oba su primljeni SMS-ovi uključeni u cijenu. Primljene poruke čitate preko GET /v1/messages?direction=in, MCP alata list_messages ili webhooka message.received i čuvamo ih 90 dana; slanje s mobilnog broja košta 1,90 kr po segmentu, s broja broj za pozive i SMS 2,50 kr po segmentu, i ide samo na češke brojeve. S broja šaljete SMS poljem fromNumber u POST /v1/messages (broj uzmite iz GET /v1/sms-numbers ili iz GET /v1/voice-sms-numbers). Dnevno ograničenje slanja s broja iznosi 20 SMS-ova po računu u prvih 30 dana od kupnje broja, nakon toga 50. Na računu mogu biti najviše dva mobilna broja, a kupiti ih je moguće tek nakon prve dopune stanja; isto vrijedi za brojeve broj za pozive i SMS: najviše dva po računu, a naručiti ih je moguće tek nakon prve dopune. Verifikacijske kodove od usluga (banke, Google i slično) ne jamčimo, brojevi su namijenjeni dopisivanju s ljudima, a primanje smo provjerili u mreži O2. Pojedinosti su u odjeljcima Mobilni brojevi i Brojevi broj za pozive i SMS u API dokumentaciji. Kada je za primanje SMS-a bolji izbor Twilio, opisuje usporedba Twilija i usluge volai.
Sažetak: jedan poziv POST /v1/messages s poljima to i body šalje SMS, zaglavlje Idempotency-Key štiti workflow od dvostrukog slanja pri ponavljanju zahtjeva, a cijena se računa po segmentima ovisno o tome sadrži li tekst znakove izvan GSM-7. Ključ držite izvan repozitorija, a prvu poruku pošaljite sami sebi.
Što dalje
Cjelovita referenca REST API-ja (brojevi, pozivi, webhooci, agenti) nalazi se na /docs/api. Želite li znati čim volai preda poruku operateru, bez pollinga GET /v1/messages? Pretplatite se na događaj message.sent - on potvrđuje samo preuzimanje od strane operatera, a ne isporuku na telefon (kod poruka pod zajedničkim imenom volai to ne vidi, vidi gore; poruke poslane s vlastitog mobilnog broja imaju potvrdu o isporuci) - pogledajte dokumentaciju webhookova. A ako uz SMS trebate i telefonski broj koji sam podiže pozive, pogledajte AI recepcionara.
Isprobajte volai - prvih 50 kr dobivate od nas
Račun otvarate za minutu i odmah imate na stanju početno stanje za pozive i broj - SMS šaljete nakon prve dopune.
Povezani članci
Pet pitanja koja ljudi postavljaju prije nabave AI recepcionara
Cijena, pokretanje za 5 minuta, preusmjeravanje broja kod operatera O2/T-Mobile/Vodafone, slovački brojevi i PDV - pet odgovora izravno iz cjenika i postavki usluge volai.
Kako nazvati klijenta iz n8n workflowa
Nazovite klijenta izravno iz n8n-a: čvor HTTP Request prema REST API-ju volai, varijable iz workflowa u promptu agenta i rezultat poziva natrag preko webhooka.
Kako dati Claude Codeu telefonski broj preko MCP-a
Instalirajte volai u Claude Code jednom naredbom, dajte mu telefonski broj i pustite da nazove i pošalje SMS samo promptom - bez pisanja koda, bez API dokumentacije.