Sms versturen via API in 10 minuten met Node.js
September 2, 2026 · 6 min leestijd · Bijgewerkt op October 9, 2026
Om vanuit Node.js een sms te versturen, hebt u één POST-verzoek nodig naar https://volai.cz/v1/messages met een header Authorization: Bearer vk_... en een JSON-body met {to, body}. Node 20 heeft fetch standaard ingebouwd, dus u hoeft geen pakket te installeren. Direct hieronder volgt een werkend voorbeeld, inclusief foutafhandeling en idempotentie, zodat een netwerkstoring niet hetzelfde bericht twee keer verstuurt.
Wat u nodig hebt
- Node.js 18 of nieuwer -
fetchis vanaf deze versie ingebouwd; wij raden de momenteel ondersteunde LTS-lijn aan (24, per 2 september 2026). - Een volai-account en een API-sleutel uit het portaal (Instellingen -> API en MCP) in de vorm
vk_.... - Minstens één keer tegoed opwaarderen. Sms werkt pas na de eerste opwaardering; het welkomsttegoed dekt het niet - u kunt er gesprekken mee uitproberen, maar geen sms-berichten.
- Een ontvangernummer in Tsjechië of Slowakije (
+420of+421) - naar andere landen versturen wij geen sms. - Een eigen telefoonnummer hebt u NIET nodig. Berichten gaan uit onder de gedeelde afzendernaam
SMSinfo- providers staan in Tsjechische netwerken alleen goedgekeurde afzendernamen toe, dus een eigen afzendernaam is bij de gedeelde afzender niet mogelijk, en ontvangers kunnen niet antwoorden op SMSinfo. Zet uw identiteit daarom in de berichttekst zelf, zoals in het voorbeeld hieronder. Wilt u antwoorden ontvangen, verstuur dan vanaf uw eigen mobiele nummer (een extra optie, zie de opmerking hieronder).
Verstuur uw eerste sms
Het verzoek heeft maar twee velden nodig: to (nummer van de ontvanger) en body (berichttekst). Het antwoord bevat de id van het bericht, de status, de prijs in hellers (priceHal) en het aantal segmenten (segments) - op beide komen we zo terug.
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_UW_SLEUTEL",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Hallo van volai! - Mijn App",
}),
});
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 }Wat kost een sms, en wat zijn segmenten?
Een sms van één segment kost 1.36 CZK exclusief btw (prijs per 2 september 2026). Uit hoeveel segmenten een bericht bestaat, hangt af van de vraag of het tekens buiten het GSM-7-alfabet bevat - providers tellen sms volgens de norm GSM 03.38:
| Codering | Tekens in 1e segment | Tekens in volgende delen |
|---|---|---|
| GSM-7 (standaardtekens, ook é en ü) | 160 | 153 |
| UCS-2 (tekens buiten GSM-7) | 70 | 67 |
Eén enkel teken buiten het basisalfabet van GSM-7 (typografische aanhalingstekens “ ”, emoji, de meeste niet-Latijnse schriften, Tsjechische tekens zoals ě š č ř ž, maar ook ë of ï) schakelt het HELE bericht om naar UCS-2, ook als het het enige zulke teken in de tekst is. Tip: om zeker binnen één segment te blijven, gebruikt u alleen eenvoudige GSM-7-tekens en rechte aanhalingstekens.
Voorbeeld: een bericht met bijzondere tekens van meer dan 70 tekens
Dit bericht is 129 tekens lang en bevat typografische aanhalingstekens, dus het wordt als UCS-2 geteld (67 tekens per segment bij een bericht van meerdere delen) - dat levert 2 segmenten op, dus 2.72 CZK in plaats van 1.36 CZK:
await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_UW_SLEUTEL",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Goedendag, wij herinneren u aan uw afspraak morgen om 10:00 uur. Past het niet, meld u dan gewoon aan voor een “nieuwe” afspraak.",
}),
});
// -> { id: "msg_9a3f1c7d", status: "sent", priceHal: 272, segments: 2 }Idempotentie: veilig opnieuw proberen
Voeg een header Idempotency-Key toe met een tekenreeks naar keuze, bijvoorbeeld een bestel-id. Mislukt het verzoek door een netwerkfout en probeert uw workflow het opnieuw met DEZELFDE header, dan geeft volai het opgeslagen antwoord van de eerste poging terug in plaats van het bericht een tweede keer te versturen - de sleutel is 24 uur geldig.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_UW_SLEUTEL" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: bestelling-4471" \
-d '{"to": "+420777123456", "body": "Uw bestelling nr. 4471 is ontvangen."}'Bewaar uw API-sleutel veilig
Een API-sleutel (vk_...) weegt even zwaar als een wachtwoord - wie hem heeft, kan in uw naam berichten versturen en tegoed van uw account uitgeven. Schrijf hem daarom nooit in broncode die u naar een repository commit. Hij hoort in een omgevingsvariabele (process.env.VOLAI_API_KEY in Node.js) of in de secretsmanager van uw hostingprovider.
// .env.local (nooit committen naar de repository)
// VOLAI_API_KEY=vk_uw_sleutel
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 }),
});Roep het endpoint aan vanaf een server, nooit vanuit de browser - iedereen kan de sleutel uit de ontwikkelaarstools van de browser halen en op uw account berichten gaan versturen. Lekt een sleutel ooit uit (bijvoorbeeld door een onbedoelde commit), genereer dan in het portaal een nieuwe en trek de oude in - de oude waarde werkt direct niet meer.
Test eerst veilig
Voordat u het versturen van sms in een echt proces inbouwt (bijvoorbeeld bestelbevestigingen), verstuurt u de eerste berichten naar uw eigen telefoonnummer. Dan ziet u precies wat de klant ziet - hoe de afzendernaam SMSinfo eruitziet, hoe lang de bezorging duurt en of de segmentatie zich gedraagt zoals u verwacht. Pas daarna zet u to om naar het nummer van een echte klant.
Wat doet u als de API een fout teruggeeft?
Een foutantwoord heeft altijd de vorm {error: {code, message}}, met een HTTP-status die bij de soort fout past:
| Status | Code | Wat het betekent |
|---|---|---|
| 400 | invalid_number | Geen geldig Tsjechisch of Slowaaks telefoonnummer. |
| 400 | invalid_body | De berichttekst moet 1 tot 765 tekens lang zijn. |
| 400 | unsupported_country | Nummer buiten CZ/SK, daarheen versturen wij geen sms. |
| 400 | recipient_cannot_receive_sms | Een vast nummer - de sms kon niet aankomen. Niet in rekening gebracht. |
| 402 | insufficient_credit | Uw tegoed dekt de prijs van alle segmenten niet, of het account is nog niet opgewaardeerd - sms vereist een eerste opwaardering, het welkomsttegoed dekt het niet. |
| 429 | rate_limited | Meer dan 1 sms per 2 seconden, of meer dan 100 sms per account per dag. |
| 502 | send_failed | De provider heeft het verzoek geweigerd. Er is geen tegoed afgeschreven, probeer het opnieuw. |
| 502 | send_unknown | Wij hebben het bericht aan de provider overgedragen, maar kregen geen bevestiging van bezorging - het wordt wel in rekening gebracht, verstuur het dus niet blindelings opnieuw. |
Welke statussen kan een bericht hebben?
Het veld status, zowel in de lijst (GET /v1/messages) als bij een enkel bericht, kent vijf mogelijke waarden: pending (opgeslagen, wordt nog verzonden), sent (de provider heeft de verzending bevestigd), failed (de provider heeft het geweigerd - niet in rekening gebracht), unknown (er kwam geen bevestiging van bezorging, meestal een timeout aan de kant van de provider - het wordt volledig in rekening gebracht, omdat het bericht mogelijk is aangekomen) en received (alleen voor inkomende berichten, dus met direction=in; verzonden berichten hebben die status nooit).
Elk bericht bevat bovendien de velden direction (out voor verzonden berichten, in voor ontvangen berichten), smsNumber (het nummer waarvan het bericht is verzonden of waarop het is ontvangen; null bij berichten onder de gedeelde afzendernaam SMSinfo) en deliveryStatus (delivered of undelivered, een bezorgrapport van de provider; het bestaat alleen bij berichten die vanaf een mobiel nummer zijn verzonden en is bij alle andere null).
Hoe verstuurt u een reeks sms-berichten?
De limiet staat maximaal één sms per twee seconden per account toe, tot 100 sms per dag. Verstuurt u meerdere berichten tegelijk (bijvoorbeeld afspraakherinneringen), dan is een korte pauze tussen de verzoeken eenvoudiger dan rate_limited afvangen en opnieuw proberen:
const message = "Herinnering: uw afspraak is morgen - Mijn App";
for (const to of recipients) {
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_UW_SLEUTEL",
"Content-Type": "application/json",
},
body: JSON.stringify({ to, body: message }),
});
if (!response.ok) {
const { error } = await response.json();
console.error("volai " + to + ": " + error.code);
}
// De limiet is maximaal 1 sms per 2 seconden per account - een korte
// pauze tussen de verzoeken is eenvoudiger dan rate_limited afvangen
// en het opnieuw proberen.
await new Promise((resolve) => setTimeout(resolve, 2100));
}Sms ontvangen kan op twee soorten nummers
Spraaknummers van volai ontvangen geen sms, dus een antwoord op een bericht dat onder de gedeelde naam SMSinfo is verzonden, komt nergens binnen. Wilt u sms ontvangen en vanaf uw eigen nummer versturen, kies dan de extra optie mobiel nummer (een Tsjechisch mobiel nummer alleen voor sms, zonder gesprekken, 290 CZK per 30 dagen exclusief btw) of een nummer voor bellen en sms (een vast nummer in Praag, 49 CZK per 30 dagen exclusief btw, pas na activering in rekening gebracht). Ontvangen sms is bij beide inbegrepen. Ontvangen berichten leest u via GET /v1/messages?direction=in, via de MCP-tool list_messages of via de webhook message.received, en wij bewaren ze 90 dagen; versturen vanaf een mobiel nummer kost 1.90 CZK per segment, vanaf een nummer voor bellen en sms 2.50 CZK, en kan alleen naar Tsjechische nummers. Om vanaf een nummer te versturen, voegt u het veld fromNumber toe aan POST /v1/messages (het nummer haalt u uit GET /v1/sms-numbers of GET /v1/voice-sms-numbers). De daglimiet voor versturen vanaf een nummer is 20 sms per account in de eerste 30 dagen na aankoop, daarna 50. Een account kan maximaal twee mobiele nummers hebben en kan er pas een kopen na de eerste opwaardering van het tegoed; hetzelfde geldt voor nummers voor bellen en sms. Wij garanderen geen verificatiecodes van diensten (banken, Google en dergelijke) - de nummers zijn bedoeld voor berichten met mensen, en ontvangst is geverifieerd op het netwerk van O2. De details staan in de onderdelen Mobiele nummers en Nummers voor bellen en sms van de API-referentie. Wanneer Twilio de betere keuze is voor het ontvangen van sms, leest u in de vergelijking van volai en Twilio.
Kort samengevat: één POST /v1/messages met to en body verstuurt de sms, een header Idempotency-Key beschermt een workflow die opnieuw probeert tegen dubbel versturen, en de prijs geldt per segment, afhankelijk van de vraag of de tekst tekens buiten GSM-7 bevat. Houd de sleutel buiten uw repository en verstuur het eerste bericht naar uzelf.
Hoe nu verder
De volledige REST-API-referentie (nummers, gesprekken, webhooks, agenten) vindt u op /docs/api. Wilt u meteen weten wanneer volai een bericht aan de provider overdraagt, zonder GET /v1/messages te pollen? Abonneer u dan op het event message.sent - dat bevestigt alleen dat de provider het bericht heeft aangenomen, niet dat het op de telefoon is aangekomen (bij berichten onder de gedeelde naam kan volai dat niet zien, zie hierboven; berichten die vanaf uw eigen mobiele nummer zijn verzonden krijgen wel een bezorgrapport) - zie de webhookdocumentatie. En als u naast sms ook een telefoonnummer nodig hebt dat zelf gesprekken beantwoordt, kijk dan eens naar de AI-receptionist.
Probeer volai - de eerste 50 kr zijn van ons
U maakt in een minuut een account aan en hebt direct starttegoed voor gesprekken en een nummer - sms'en kunt u na de eerste opwaardering.
Gerelateerde artikelen
Vijf vragen voordat u een AI-receptionist neemt
Prijs, live in 5 minuten, doorschakelen bij O2/T-Mobile/Vodafone, Slowaakse nummers en btw - vijf antwoorden rechtstreeks uit tarieven en instellingen.
Een klant bellen vanuit een n8n-workflow
Bel klanten rechtstreeks vanuit n8n: een HTTP Request-node naar de REST-API van volai, workflowgegevens in de prompt van de agent en het resultaat via een webhook.
Claude Code een telefoonnummer geven via MCP
Installeer volai met één opdracht in Claude Code, geef het een telefoonnummer en laat het bellen en sms'en met alleen een prompt - zonder code, zonder API-documentatie.