Πύλη SMS μέσω API σε 10 λεπτά με Node.js
September 2, 2026 · 6 λεπτά ανάγνωσης · Ενημερώθηκε October 9, 2026
Για να στείλετε ένα SMS από το Node.js, αρκεί ένα αίτημα POST στο https://volai.cz/v1/messages με κεφαλίδα Authorization: Bearer vk_... και σώμα JSON {to, body}. Το Node 20 διαθέτει ενσωματωμένο το fetch, οπότε δεν χρειάζεται να εγκαταστήσετε κανένα πακέτο. Ένα λειτουργικό παράδειγμα ακολουθεί αμέσως παρακάτω, με χειρισμό σφαλμάτων και idempotency, ώστε ένα πρόβλημα δικτύου να μη στείλει το ίδιο μήνυμα δύο φορές.
Τι θα χρειαστείτε
- Node.js 18 ή νεότερο - το
fetchείναι ενσωματωμένο από αυτή την έκδοση· προτείνουμε την τρέχουσα υποστηριζόμενη γραμμή LTS (24, κατάσταση στις 2 Σεπτεμβρίου 2026). - Έναν λογαριασμό στο volai και ένα κλειδί API από την πύλη (Ρυθμίσεις -> API και MCP) της μορφής
vk_.... - Τουλάχιστον μία φόρτιση υπολοίπου. Τα SMS λειτουργούν μόνο μετά την πρώτη φόρτιση, το υπόλοιπο καλωσορίσματος δεν τα καλύπτει - με αυτό δοκιμάζετε κλήσεις, όχι μηνύματα.
- Τηλεφωνικό αριθμό παραλήπτη στην Τσεχία ή τη Σλοβακία (
+420ή+421) - σε άλλες χώρες δεν στέλνουμε SMS. - ΔΕΝ χρειάζεστε δικό σας τηλεφωνικό αριθμό. Τα μηνύματα φεύγουν με το κοινόχρηστο όνομα
SMSinfo- οι πάροχοι στα τσεχικά δίκτυα επιτρέπουν μόνο εγκεκριμένα ονόματα αποστολέα, οπότε με τον κοινόχρηστο αποστολέα δεν μπορείτε να ορίσετε δικό σας όνομα και ο παραλήπτης δεν μπορεί να απαντήσει στο SMSinfo. Γράψτε λοιπόν την ταυτότητά σας απευθείας στο κείμενο του μηνύματος, όπως στο παράδειγμα παρακάτω. Αν θέλετε να μπορεί να σας απαντήσει, στείλτε το μήνυμα από δικό σας αριθμό κινητού (πρόσθετο, δείτε την επισήμανση παρακάτω).
Στείλτε το πρώτο σας SMS
Το αίτημα χρειάζεται μόνο δύο πεδία: to (αριθμός παραλήπτη) και body (κείμενο μηνύματος). Η απάντηση επιστρέφει το id του μηνύματος, το status, την τιμή σε εκατοστά της κορώνας (priceHal) και τον αριθμό τμημάτων (segments) - και για τα δύο θα μιλήσουμε σε λίγο.
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_TO_KLEIDI_SAS",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Γεια σας από το volai! - Η εφαρμογή μου",
}),
});
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 }Πόσο κοστίζουν τα SMS και τι είναι τα τμήματα;
Ένα SMS ενός τμήματος κοστίζει 1,36 kr χωρίς ΦΠΑ (τιμή ισχύος στις 2 Σεπτεμβρίου 2026). Το πόσα τμήματα καταλαμβάνει ένα μήνυμα εξαρτάται από το αν περιέχει χαρακτήρες εκτός του αλφαβήτου GSM-7 - οι πάροχοι χωρίζουν τα SMS σύμφωνα με το πρότυπο GSM 03.38:
| Κωδικοποίηση | Χαρακτήρες στο 1ο τμήμα | Χαρακτήρες στα επόμενα τμήματα |
|---|---|---|
| GSM-7 (απλό λατινικό κείμενο χωρίς τόνους) | 160 | 153 |
| UCS-2 (με τόνους ή μη λατινικούς χαρακτήρες, όπως τα ελληνικά) | 70 | 67 |
Αρκεί ΕΝΑΣ χαρακτήρας εκτός του βασικού αλφαβήτου GSM-7 (γράμματα με τόνους, emoji, οι περισσότερες μη λατινικές γραφές) και ΟΛΟΚΛΗΡΟ το μήνυμα μεταβαίνει σε UCS-2, ακόμη και αν είναι ο μοναδικός τέτοιος χαρακτήρας στο κείμενο. Συμβουλή: για να χωράτε με βεβαιότητα σε ένα τμήμα, χρησιμοποιήστε μόνο απλούς χαρακτήρες GSM-7.
Παράδειγμα: μήνυμα με τόνους πάνω από 70 χαρακτήρες
Αυτό το μήνυμα έχει 132 χαρακτήρες και περιέχει ελληνικούς χαρακτήρες, άρα μετράται ως UCS-2 (67 χαρακτήρες ανά τμήμα στα πολυμερή μηνύματα) - βγαίνει 2 τμήματα, δηλαδή 2,72 kr, όχι 1,36 kr:
await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_TO_KLEIDI_SAS",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+420777123456",
body: "Καλημέρα, σας υπενθυμίζουμε το αυριανό ραντεβού στις 10:00 - αν δεν σας βολεύει, απαντήστε μας και θα βρούμε άλλη ώρα. Ευχαριστούμε.",
}),
});
// -> { id: "msg_9a3f1c7d", status: "sent", priceHal: 272, segments: 2 }Idempotency: ασφαλής επανάληψη αιτήματος
Προσθέστε μια κεφαλίδα Idempotency-Key με οποιαδήποτε δική σας συμβολοσειρά, για παράδειγμα το αναγνωριστικό της παραγγελίας. Αν το αίτημα αποτύχει λόγω σφάλματος δικτύου και η ροή εργασίας σας το επαναλάβει με την ΙΔΙΑ κεφαλίδα, το volai επιστρέφει την αποθηκευμένη απάντηση της πρώτης προσπάθειας και δεν στέλνει το μήνυμα δεύτερη φορά - το κλειδί ισχύει για 24 ώρες.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_TO_KLEIDI_SAS" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: paraggelia-4471" \
-d '{"to": "+420777123456", "body": "Η παραγγελία σας αρ. 4471 ελήφθη."}'Χειριστείτε με ασφάλεια το κλειδί API
Το κλειδί API (vk_...) έχει το ίδιο βάρος με έναν κωδικό πρόσβασης - όποιος το γνωρίζει μπορεί να στέλνει μηνύματα στο όνομά σας και να ξοδεύει υπόλοιπο από τον λογαριασμό σας. Για αυτό μην το γράφετε ποτέ στον πηγαίο κώδικα που κάνετε commit στο αποθετήριο. Ανήκει σε μια μεταβλητή περιβάλλοντος (process.env.VOLAI_API_KEY στο Node.js) ή στον διαχειριστή μυστικών που χρησιμοποιεί η φιλοξενία σας.
// .env.local (ποτέ μην το κάνετε commit στο αποθετήριο)
// VOLAI_API_KEY=vk_to_kleidi_sas
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 πάντα από διακομιστή, ποτέ από τον περιηγητή - όποιος διάβαζε το κλειδί στα εργαλεία προγραμματιστή του περιηγητή θα μπορούσε να αρχίσει να στέλνει δικά του μηνύματα από τον λογαριασμό σας. Αν το κλειδί διέρρευσε (για παράδειγμα με ένα κατά λάθος commit), δημιουργήστε νέο στην πύλη και ανακαλέστε το παλιό - η παλιά τιμή παύει να λειτουργεί αμέσως.
Δοκιμάστε πρώτα με ασφάλεια
Πριν συνδέσετε την αποστολή SMS σε μια πραγματική διαδικασία (για παράδειγμα επιβεβαίωση παραγγελίας), στείλτε τα πρώτα μηνύματα στον δικό σας αριθμό. Θα δείτε ακριβώς ό,τι θα δει ο πελάτης - πώς φαίνεται ο αποστολέας SMSinfo, πόση ώρα παίρνει η παράδοση και αν τα τμήματα μετρώνται όπως περιμένετε. Μόνο μετά αλλάξτε το to στον πραγματικό αριθμό του πελάτη.
Τι κάνετε όταν το API επιστρέψει σφάλμα;
Μια ανεπιτυχής απάντηση έχει πάντα τη μορφή {error: {code, message}} και κατάσταση HTTP ανάλογα με τον τύπο του σφάλματος:
| Κατάσταση | Κωδικός | Τι σημαίνει |
|---|---|---|
| 400 | invalid_number | Δεν είναι έγκυρος τσεχικός ή σλοβακικός τηλεφωνικός αριθμός. |
| 400 | invalid_body | Το κείμενο του μηνύματος πρέπει να έχει 1 έως 765 χαρακτήρες. |
| 400 | unsupported_country | Αριθμός εκτός Τσεχίας και Σλοβακίας, δεν στέλνουμε SMS εκεί. |
| 400 | recipient_cannot_receive_sms | Σταθερή γραμμή - το SMS δεν θα έφτανε. Δεν χρεώνεται τίποτα. |
| 402 | insufficient_credit | Το υπόλοιπο δεν καλύπτει την τιμή όλων των τμημάτων του μηνύματος ή ο λογαριασμός δεν έχει φορτιστεί ακόμη - τα SMS λειτουργούν μόνο μετά την πρώτη φόρτιση, το υπόλοιπο καλωσορίσματος δεν τα καλύπτει. |
| 429 | rate_limited | Περισσότερα από 1 SMS ανά 2 δευτερόλεπτα ή περισσότερα από 100 SMS ανά λογαριασμό την ημέρα. |
| 502 | send_failed | Το τηλεφωνικό δίκτυο απέρριψε το αίτημα. Το υπόλοιπο δεν χρεώθηκε, δοκιμάστε ξανά. |
| 502 | send_unknown | Παραδώσαμε το μήνυμα στο δίκτυο, αλλά δεν ήρθε επιβεβαίωση - χρεώνεται, οπότε μην το στείλετε ξανά στα τυφλά. |
Ποιες καταστάσεις μπορεί να έχει ένα μήνυμα;
Το πεδίο status, τόσο στη λίστα (GET /v1/messages) όσο και στο λεπτομερές μήνυμα, παίρνει πέντε τιμές: pending (αποθηκευμένο, αποστέλλεται ακόμη), sent (ο πάροχος επιβεβαίωσε την αποστολή), failed (ο πάροχος το απέρριψε - δεν χρεώνεται), unknown (δεν ήρθε επιβεβαίωση παράδοσης, συνήθως timeout από την πλευρά του παρόχου - χρεώνεται ωστόσο πλήρως, επειδή το μήνυμα μπορεί να έφτασε) και received (μόνο στα εισερχόμενα μηνύματα, δηλαδή με direction=in· τα απεσταλμένα μηνύματα δεν το έχουν).
Κάθε μήνυμα φέρει επίσης τα πεδία direction (out στα απεσταλμένα, in στα ληφθέντα), smsNumber (ο αριθμός από τον οποίο έφυγε το μήνυμα ή στον οποίο έφτασε· στα μηνύματα με το κοινόχρηστο όνομα SMSinfo είναι null) και deliveryStatus (delivered ή undelivered, αναφορά παράδοσης από τον πάροχο· υπάρχει μόνο στα SMS που στάλθηκαν από αριθμό κινητού, στα υπόλοιπα είναι null).
Πώς στέλνετε πολλά SMS μαζί;
Το rate limit επιτρέπει το πολύ ένα SMS ανά δύο δευτερόλεπτα ανά λογαριασμό και το πολύ 100 SMS την ημέρα. Όταν στέλνετε πολλά μηνύματα μαζί (για παράδειγμα υπενθυμίσεις ραντεβού), είναι απλούστερο να κάνετε μια σύντομη παύση ανάμεσα στα αιτήματα παρά να πιάνετε το rate_limited και να δοκιμάζετε ξανά:
const message = "Υπενθύμιση: το ραντεβού σας είναι αύριο - Η εφαρμογή μου";
for (const to of recipients) {
const response = await fetch("https://volai.cz/v1/messages", {
method: "POST",
headers: {
Authorization: "Bearer vk_TO_KLEIDI_SAS",
"Content-Type": "application/json",
},
body: JSON.stringify({ to, body: message }),
});
if (!response.ok) {
const { error } = await response.json();
console.error("volai " + to + ": " + error.code);
}
// Το όριο είναι το πολύ 1 SMS ανά 2 δευτερόλεπτα ανά λογαριασμό - μια
// σύντομη παύση ανάμεσα στα αιτήματα είναι απλούστερη από το να
// χειρίζεστε το rate_limited και να δοκιμάζετε ξανά.
await new Promise((resolve) => setTimeout(resolve, 2100));
}Δύο είδη αριθμών δέχονται SMS
Οι φωνητικοί αριθμοί του volai δεν δέχονται SMS, οπότε η απάντηση σε ένα μήνυμα που στάλθηκε με το κοινόχρηστο όνομα SMSinfo δεν εμφανίζεται πουθενά. Αν θέλετε να δέχεστε και να στέλνετε SMS από δικό σας αριθμό, επιλέξτε το πρόσθετο «αριθμός κινητού»: έναν τσεχικό αριθμό κινητού μόνο για SMS, χωρίς κλήσεις, 290 kr για 30 ημέρες χωρίς ΦΠΑ. Ή παραγγείλτε την επιλογή «αριθμός για κλήσεις και SMS»: μια σταθερή γραμμή Πράγας στην οποία δέχεστε κλήσεις και SMS, 49 kr για 30 ημέρες χωρίς ΦΠΑ (η χρέωση γίνεται μόνο μετά την ενεργοποίηση, που συνήθως διαρκεί έως 1 εργάσιμη ημέρα). Και στις δύο τα εισερχόμενα SMS περιλαμβάνονται στην τιμή. Τα εισερχόμενα μηνύματα τα διαβάζετε στο GET /v1/messages?direction=in, στο εργαλείο MCP list_messages ή στο webhook message.received και τα φυλάσσουμε για 90 ημέρες· η αποστολή από αριθμό κινητού κοστίζει 1,90 kr ανά τμήμα, από την επιλογή «αριθμός για κλήσεις και SMS» 2,50 kr ανά τμήμα, και γίνεται μόνο σε τσεχικούς αριθμούς. Για αποστολή από αριθμό προσθέστε το πεδίο fromNumber στο POST /v1/messages (τον αριθμό τον παίρνετε από το GET /v1/sms-numbers ή από το GET /v1/voice-sms-numbers). Το ημερήσιο όριο αποστολής από αριθμό είναι 20 SMS ανά λογαριασμό τις πρώτες 30 ημέρες από την αγορά του αριθμού, μετά 50. Ένας λογαριασμός μπορεί να έχει το πολύ δύο αριθμούς κινητού και μπορεί να αγοράσει αριθμό μόνο μετά την πρώτη φόρτιση υπολοίπου· το ίδιο ισχύει για τους αριθμούς της επιλογής «αριθμός για κλήσεις και SMS»: το πολύ δύο ανά λογαριασμό και παραγγελία μόνο μετά την πρώτη φόρτιση. Δεν εγγυόμαστε κωδικούς επαλήθευσης από υπηρεσίες (τράπεζες, Google και παρόμοιες) - οι αριθμοί προορίζονται για επικοινωνία με ανθρώπους και τη λήψη την έχουμε επαληθεύσει στο δίκτυο της O2. Λεπτομέρειες υπάρχουν στις ενότητες Αριθμοί κινητού και Αριθμοί: αριθμός για κλήσεις και SMS της τεκμηρίωσης του API. Πότε το Twilio είναι καλύτερη επιλογή για λήψη SMS, περιγράφει η σύγκριση Twilio και volai.
Συνοπτικά: μία κλήση POST /v1/messages με τα πεδία to και body στέλνει το SMS, η κεφαλίδα Idempotency-Key προστατεύει τη ροή εργασίας από διπλή αποστολή όταν επαναλαμβάνεται το αίτημα, και η τιμή υπολογίζεται ανά τμήμα ανάλογα με το αν το κείμενο περιέχει χαρακτήρες εκτός GSM-7. Κρατήστε το κλειδί έξω από το αποθετήριο και στείλτε το πρώτο μήνυμα στον εαυτό σας.
Τι ακολουθεί
Η πλήρης τεκμηρίωση του REST API (αριθμοί, κλήσεις, webhooks, πράκτορες) βρίσκεται στο /docs/api. Θέλετε να μάθετε αμέσως πότε το volai παραδίδει ένα μήνυμα στον πάροχο, χωρίς polling του GET /v1/messages; Εγγραφείτε στο συμβάν message.sent - επιβεβαιώνει μόνο ότι το μήνυμα παραλήφθηκε από τον πάροχο, όχι ότι έφτασε στο τηλέφωνο (στα μηνύματα με το κοινόχρηστο όνομα το volai δεν το βλέπει, δείτε παραπάνω· τα μηνύματα που στέλνονται από δικό σας αριθμό κινητού έχουν αναφορά παράδοσης) - δείτε την τεκμηρίωση των webhooks. Και αν εκτός από SMS χρειάζεστε και έναν τηλεφωνικό αριθμό που σηκώνει μόνος του τις κλήσεις, δείτε την AI ρεσεψιονίστ.
Δοκιμάστε το volai - τα πρώτα 50 kr είναι δώρο
Δημιουργείτε λογαριασμό σε ένα λεπτό και έχετε αμέσως αρχικό υπόλοιπο για κλήσεις και αριθμό - τα SMS στέλνονται μετά την πρώτη φόρτιση.
Τι ακολουθεί
Σχετικά άρθρα
Πέντε ερωτήσεις πριν αποκτήσετε AI ρεσεψιονίστ
Τιμή, εκκίνηση σε 5 λεπτά, προώθηση αριθμού από O2/T-Mobile/Vodafone, σλοβακικοί αριθμοί και ΦΠΑ - πέντε απαντήσεις απευθείας από τον τιμοκατάλογο και τις ρυθμίσεις του volai.
Πώς να καλέσετε έναν πελάτη από ένα workflow του n8n
Καλέστε έναν πελάτη απευθείας από το n8n: κόμβος HTTP Request προς το REST API του volai, μεταβλητές του workflow στο prompt του πράκτορα και το αποτέλεσμα της κλήσης πίσω μέσω webhook.
Πώς να δώσετε στο Claude Code τηλεφωνικό αριθμό μέσω MCP
Εγκαταστήστε το volai στο Claude Code με μία εντολή, δώστε του τηλεφωνικό αριθμό και αφήστε το να τηλεφωνεί και να στέλνει SMS μόνο με prompt - χωρίς κώδικα, χωρίς τεκμηρίωση API.