Pošiljanje SMS prek API-ja v 10 minutah v Node.js
September 2, 2026 · 6 minut branja · Posodobljeno October 9, 2026
Če želite poslati SMS iz Node.js, potrebujete en zahtevek POST na https://volai.cz/v1/messages z glavo Authorization: Bearer vk_... in telesom JSON s polji {to, body}. Node 20 ima fetch vgrajen, zato vam ni treba nameščati nobenega paketa. Delujoč primer sledi takoj spodaj, vključno z obravnavo napak in idempotentnostjo, da omrežna težava ne pošlje istega sporočila dvakrat.
Kaj boste potrebovali
- Node.js 18 ali novejši -
fetchje vgrajen od te različice; priporočamo trenutno podprto vrstico LTS (24, stanje 2. 9. 2026). - Račun volai in ključ API iz portala (Nastavitve -> API in MCP) v obliki
vk_.... - Vsaj eno dopolnitev dobroimetja. Za SMS je potrebna prva dopolnitev; pozdravno dobroimetje jih ne pokrije - z njim lahko preizkusite klice, ne pa sporočil SMS.
- Številko prejemnika na Češkem ali Slovaškem (
+420ali+421) - v druge države SMS ne pošiljamo. - Lastne telefonske številke NE potrebujete. Sporočila odhajajo pod skupnim imenom pošiljatelja
SMSinfo- operaterji v čeških omrežjih dovoljujejo le odobrena imena pošiljateljev, zato lastno ime pošiljatelja s skupnim pošiljateljem ni mogoče, prejemniki pa SMSinfo ne morejo odgovoriti. Svojo identiteto zapišite v samo besedilo sporočila, kot v spodnjem primeru. Če želite odgovore, pošiljajte z lastne mobilne številke (dodatek, glejte opombo spodaj).
Pošljite prvi SMS
Zahtevek potrebuje le dve polji: to (številka prejemnika) in body (besedilo sporočila). Odgovor vrne id sporočila, njegov status, ceno v stotinih krone (priceHal) in število segmentov (segments) - več o obojem spodaj.
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: "Živjo 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 stanejo SMS in kaj so segmenti?
Enosegmentni SMS stane 1.36 CZK brez DDV (cena na dan 2. 9. 2026). Koliko segmentov sporočilo zavzame, je odvisno od tega, ali vsebuje znake zunaj abecede GSM-7 - operaterji SMS segmentirajo po standardu GSM 03.38:
| Kodiranje | Znakov v 1. segmentu | Znakov v nadaljnjih delih |
|---|---|---|
| GSM-7 (navadno latinično besedilo) | 160 | 153 |
| UCS-2 (šumniki ali nelatinični znaki) | 70 | 67 |
En sam znak zunaj osnovne abecede GSM-7 (šumniki, emoji, večina nelatiničnih pisav) preklopi CELOTNO sporočilo na UCS-2, tudi če je edini tak znak v besedilu. Nasvet: če želite zanesljivo ostati znotraj enega segmenta, uporabljajte le navadne znake GSM-7.
Primer: sporočilo s šumniki, daljše od 70 znakov
To sporočilo je dolgo 112 znakov in vsebuje šumnike, zato se šteje kot UCS-2 (67 znakov na segment pri večdelnem sporočilu) - zavzame 2 segmenta, torej 2.72 CZK, ne 1.36 CZK:
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: "Pošiljamo vam opomnik: jutri ob 10. uri imate termin pri nas, če ga ne morete obiskati, nam to prosim sporočite.",
}),
});
// -> { id: "msg_9a3f1c7d", status: "sent", priceHal: 272, segments: 2 }Idempotentnost: varno ponavljanje zahtevkov
Dodajte glavo Idempotency-Key z nizom po svoji izbiri, na primer z identifikatorjem naročila. Če zahtevek odpove zaradi omrežne napake in ga vaš potek dela ponovi z ISTO glavo, volai vrne shranjeni odgovor prvega poskusa, namesto da bi sporočilo poslal drugič - ključ velja 24 ur.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_VAS_KLJUC" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: narocilo-4471" \
-d '{"to": "+420777123456", "body": "Vaše naročilo št. 4471 je bilo sprejeto."}'Ključ API hranite na varnem
Ključ API (vk_...) ima enako težo kot geslo - kdor ga ima, lahko v vašem imenu pošilja sporočila in porablja dobroimetje. Nikoli ga ne zapisujte v izvorno kodo, ki jo potrjujete v repozitorij. Sodi v okoljsko spremenljivko (process.env.VOLAI_API_KEY v Node.js) ali v upravljalnik skrivnosti, ki ga ponuja vaš ponudnik gostovanja.
// .env.local (te datoteke nikoli ne potrdite v 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 }),
});Končno točko kličite s strežnika, nikoli iz brskalnika - kdor koli bi lahko ključ prebral v razvijalskih orodjih brskalnika in začel pošiljati sporočila na vaš račun. Če ključ kdaj pušča (na primer ob nenamernem potrditvi v repozitorij), v portalu ustvarite novega in starega prekličite - stara vrednost preneha delovati takoj.
Najprej varno preizkusite
Preden pošiljanje SMS vključite v resničen proces (na primer potrditve naročil), prvih nekaj sporočil pošljite na lastno telefonsko številko. Videli boste natanko to, kar vidi stranka - kako izgleda ime pošiljatelja SMSinfo, kako dolgo traja dostava in ali se segmentacija obnaša, kot pričakujete. Šele nato polje to preklopite na številko resnične stranke.
Kaj storiti, ko API vrne napako?
Odgovor z napako ima vedno obliko {error: {code, message}}, s stanjem HTTP, ki ustreza vrsti napake:
| Stanje | Koda | Pomen |
|---|---|---|
| 400 | invalid_number | Ni veljavna češka ali slovaška telefonska številka. |
| 400 | invalid_body | Besedilo sporočila mora imeti od 1 do 765 znakov. |
| 400 | unsupported_country | Številka zunaj CZ/SK, tja SMS ne pošiljamo. |
| 400 | recipient_cannot_receive_sms | Številka stacionarnega telefona - SMS ne bi mogel prispeti. Ni obračunano. |
| 402 | insufficient_credit | Dobroimetje ne pokrije cene vseh segmentov ali račun še ni bil dopolnjen - za SMS je potrebna prva dopolnitev, pozdravno dobroimetje jih ne pokrije. |
| 429 | rate_limited | Več kot 1 SMS na 2 sekundi ali več kot 100 SMS na račun na dan. |
| 502 | send_failed | Operater je zahtevek zavrnil. Dobroimetje ni bilo obračunano, poskusite znova. |
| 502 | send_unknown | Sporočilo smo predali operaterju, a nismo prejeli potrditve dostave - obračunano je, zato ga prosimo ne pošiljajte slepo znova. |
Katera stanja ima lahko sporočilo?
Polje status, tako na seznamu (GET /v1/messages) kot pri posameznem sporočilu, ima pet možnih vrednosti: pending (shranjeno, še se pošilja), sent (operater je potrdil pošiljanje), failed (operater ga je zavrnil - ni obračunano), unknown (potrditev dostave ni prispela, običajno zaradi izteka časa na strani operaterja - obračunano je v celoti, saj je sporočilo morda prispelo) in received (samo za dohodna sporočila, torej z direction=in; poslana sporočila te vrednosti nikoli nimajo).
Vsako sporočilo ima tudi polja direction (out za poslana sporočila, in za prejeta), smsNumber (številka, s katere je bilo sporočilo poslano ali na katero je bilo prejeto; null za sporočila pod skupnim imenom pošiljatelja SMSinfo) in deliveryStatus (delivered ali undelivered, poročilo o dostavi operaterja; obstaja le pri sporočilih, poslanih s mobilne številke, pri vseh drugih je null).
Kako poslati več sporočil SMS naenkrat?
Omejitev dovoljuje največ en SMS na dve sekundi na račun, do 100 SMS na dan. Pri pošiljanju več sporočil naenkrat (na primer opomnikov na termine) je kratek premor med zahtevki preprostejši kot lovljenje rate_limited in ponovno poskušanje:
const message = "Opomnik: jutri imate 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);
}
// Omejitev je največ 1 SMS na 2 sekundi na račun - kratek premor med
// zahtevki je preprostejši kot obravnava rate_limited in ponovni poskusi.
await new Promise((resolve) => setTimeout(resolve, 2100));
}SMS prejemata dve vrsti številk
Glasovne številke volai ne morejo prejemati SMS, zato odgovor na sporočilo, poslano pod skupnim imenom SMSinfo, ne pride nikamor. Če želite prejemati SMS in pošiljati z lastne številke, izberite dodatek mobilna številka (češka številka samo za SMS, brez klicev, 290 CZK na 30 dni brez DDV) ali številko za klice in SMS (praško stacionarno številko, na kateri prejemate klice in SMS, 49 CZK na 30 dni brez DDV; strošek se obračuna šele po aktivaciji, ki običajno traja do 1 delovni dan). Prejeti SMS so vključeni pri obeh. Prejeta sporočila preberete v GET /v1/messages?direction=in, v orodju MCP list_messages ali v webhooku message.received, hranimo pa jih 90 dni; pošiljanje z mobilne številke stane 1.90 CZK na segment, s številke za klice in SMS 2.50 CZK na segment, in je mogoče le na češke številke. Za pošiljanje s številke dodajte polje fromNumber v POST /v1/messages (številko vzemite iz GET /v1/sms-numbers ali GET /v1/voice-sms-numbers). Dnevna omejitev za pošiljanje s številke je 20 SMS na račun v prvih 30 dneh po nakupu številke, nato 50. Račun ima lahko največ dve mobilni številki in jo lahko kupi šele po prvi dopolnitvi dobroimetja; enako velja za številke za klice in SMS: največ dve na račun, naročilo šele po prvi dopolnitvi. Kod za preverjanje od storitev (banke, Google in podobni) ne jamčimo - številke so namenjene sporazumevanju z ljudmi, prejem pa je preverjen v omrežju O2. Podrobnosti so v razdelkih Mobilne številke in Številke za klice in SMS v referenci API. Kdaj je za prejemanje SMS boljša izbira Twilio, opisuje primerjava volai in Twilio.
Skratka: en klic POST /v1/messages s poljema to in body pošlje SMS, glava Idempotency-Key varuje potek dela s ponavljanjem pred dvojnim pošiljanjem, cena pa se računa na segment glede na to, ali besedilo vsebuje znake zunaj GSM-7. Ključ hranite zunaj repozitorija in prvo sporočilo pošljite sebi.
Kako naprej
Celotna referenca REST API (številke, klici, webhooki, agenti) je na /docs/api. Želite izvedeti trenutek, ko volai preda sporočilo operaterju, brez poizvedovanja po GET /v1/messages? Naročite se na dogodek message.sent - ta potrjuje le, da je operater sporočilo sprejel, ne da je prispelo na telefon (volai tega pri sporočilih pod skupnim imenom ne vidi, glejte zgoraj; sporočila, poslana z lastne mobilne številke, imajo poročilo o dostavi) - glejte dokumentacijo webhookov. In če potrebujete telefonsko številko, ki sprejema tudi klice, ne le SMS, si oglejte AI receptorja.
Preizkusite volai - prvih 50 kr je naših
Račun ustvarite v minuti in takoj imate na njem začetno dobroimetje za klice in številko - SMS pošljete po prvem polnjenju.
Kaj naprej
Povezani članki
Pet vprašanj pred nakupom AI receptorja
Cena, zagon v 5 minutah, preusmeritev številke pri O2/T-Mobilu/Vodafonu, slovaške številke in DDV - pet odgovorov neposredno iz cenika in nastavitev volai.
Kako poklicati stranko iz delovnega toka n8n
Pokličite stranko neposredno iz n8n: vozlišče HTTP Request proti REST API-ju volai, spremenljivke iz delovnega toka v pozivu agenta in rezultat klica prek webhooka.
Claude Codu dodelite telefonsko številko prek MCP
Z enim ukazom namestite volai v Claude Code, mu dodelite telefonsko številko in ga naučite klicati ter pošiljati SMS le s pozivom - brez kode, brez dokumentacije API.