Preskoči na vsebino

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 - fetch je 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 (+420 ali +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.

javascript
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:

KodiranjeZnakov v 1. segmentuZnakov v nadaljnjih delih
GSM-7 (navadno latinično besedilo)160153
UCS-2 (šumniki ali nelatinični znaki)7067

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:

javascript
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.

bash
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.

javascript
// .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:

StanjeKodaPomen
400invalid_numberNi veljavna češka ali slovaška telefonska številka.
400invalid_bodyBesedilo sporočila mora imeti od 1 do 765 znakov.
400unsupported_countryŠtevilka zunaj CZ/SK, tja SMS ne pošiljamo.
400recipient_cannot_receive_smsŠtevilka stacionarnega telefona - SMS ne bi mogel prispeti. Ni obračunano.
402insufficient_creditDobroimetje ne pokrije cene vseh segmentov ali račun še ni bil dopolnjen - za SMS je potrebna prva dopolnitev, pozdravno dobroimetje jih ne pokrije.
429rate_limitedVeč kot 1 SMS na 2 sekundi ali več kot 100 SMS na račun na dan.
502send_failedOperater je zahtevek zavrnil. Dobroimetje ni bilo obračunano, poskusite znova.
502send_unknownSporoč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:

javascript
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.

Preizkusi brezplačno