Μετάβαση στο περιεχόμενο
REST API

SMS και κλήσεις απευθείας από το workflow του n8n

Το n8n καλεί το REST API του volai μέσω του κόμβου HTTP Request - χωρίς να γράψετε κώδικα στέλνετε SMS από το workflow, ξεκινάτε κλήση μέσω φωνητικού πράκτορα και παίρνετε το αποτέλεσμα πίσω ως webhook.

1Αποθηκεύστε το κλειδί ως credential

Στο n8n δημιουργήστε ένα νέο credential τύπου HTTP Header Auth: όνομα κεφαλίδας Authorization, τιμή Bearer vk_TO_KLEIDI_SAS (το κλειδί θα το βρείτε στην πύλη, στην ενότητα AI βοηθός). Αντιστοιχίστε το σε κάθε κόμβο HTTP Request που θα καλεί το /v1/* - το ίδιο κλειδί ισχύει για SMS, κλήσεις και webhook.

2Στείλτε SMS από το workflow

Προσθέστε έναν κόμβο HTTP Request: μέθοδος POST, διεύθυνση https://volai.cz/v1/messages, σώμα JSON με τα πεδία to και body. Η απάντηση περιέχει το priceHal (τιμή σε εκατοστά της τσεχικής κορώνας για όλα τα τμήματα του μηνύματος) και το segments - κείμενο με ελληνικούς χαρακτήρες καταλαμβάνει περισσότερα τμήματα από μήνυμα μόνο με ASCII. Το παράδειγμα παρακάτω γράφει σκόπιμα το κείμενο του μηνύματος με λατινικούς χαρακτήρες, ώστε να μείνει σε ένα τμήμα - με ελληνικούς χαρακτήρες λειτουργεί ακριβώς το ίδιο, απλώς καταναλώνονται περισσότερα τμήματα.

bash
curl -X POST https://volai.cz/v1/messages \
  -H "Authorization: Bearer vk_TO_KLEIDI_SAS" \
  -H "Content-Type: application/json" \
  -d '{"to": "+420777123456", "body": "I paraggelia sas einai etoimi gia paralavi."}'

3Καλέστε πελάτη μέσω του πράκτορά σας

Δεύτερος κόμβος HTTP Request: POST https://volai.cz/v1/calls με τα to και agentId ενός υπάρχοντος φωνητικού πράκτορα (τον δημιουργείτε στην πύλη ή μέσω POST /v1/agents) - ο πράκτορας πρέπει να έχει εκχωρημένο δικό του αριθμό, αλλιώς το αίτημα θα τελειώσει με το σφάλμα agent_no_number. Το αίτημα απλώς ξεκινά την κλήση και επιστρέφει το id της - το πραγματικό αποτέλεσμα (ολοκληρώθηκε, δεν απάντησε, απέτυχε) θα το μάθετε από το webhook στο επόμενο βήμα.

bash
curl -X POST https://volai.cz/v1/calls \
  -H "Authorization: Bearer vk_TO_KLEIDI_SAS" \
  -H "Content-Type: application/json" \
  -d '{"to": "+420777123456", "agentId": "ag_kx91fa2b"}'

4Ορίστε webhook, ώστε το workflow να λάβει απάντηση

Προσθέστε έναν trigger Webhook (το n8n θα δημιουργήσει το URL) και αποθηκεύστε την ίδια διεύθυνση μέσω PUT /v1/webhook μαζί με τη λίστα των συμβάντων που σας ενδιαφέρουν. Προσοχή: ένας κενός πίνακας events δεν σημαίνει κανένα συμβάν, αλλά όλα - προτιμήστε να τα απαριθμείτε πάντα. Η απάντηση επιστρέφει και το secret - αποθηκεύστε το αμέσως, το GET /v1/webhook δεν θα το επιστρέψει ξανά.

bash
curl -X PUT https://volai.cz/v1/webhook \
  -H "Authorization: Bearer vk_TO_KLEIDI_SAS" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://to-n8n-sas.app.n8n.cloud/webhook/volai", "events": ["call.completed", "message.sent"]}'

5Επαληθεύστε την υπογραφή και μόνο μετά επεξεργαστείτε το σώμα

Κάθε αίτημα φέρει την κεφαλίδα Volai-Signature με μορφή t=<unix>,v1=<hex>. Σε έναν κόμβο Code υπολογίστε το HMAC-SHA256 πάνω στο {t}.{rawBody} με το secret σας και συγκρίνετέ το με το v1 - επεξεργαστείτε το σώμα μόνο όταν ταιριάζουν. Στον κόμβο Webhook ενεργοποιήστε στην ενότητα Add Options την επιλογή Raw Body - χωρίς αυτήν το n8n αναλύει αμέσως το σώμα και τα byte πάνω στα οποία υπολογίστηκε η υπογραφή χάνονται. Με ενεργή την επιλογή, όμως, το σώμα φτάνει ως δυαδικά δεδομένα (ιδιότητα data), όχι στο json.body - ο παρακάτω κώδικας το διαβάζει γι' αυτό μέσω getBinaryDataBuffer, που λειτουργεί ανεξάρτητα από το αν το n8n κρατά τα δυαδικά δεδομένα στη μνήμη, στον δίσκο ή στο S3. Το ενσωματωμένο crypto μπορεί να χρησιμοποιηθεί στον κόμβο Code μόνο σε self-hosted n8n με ενεργό το NODE_FUNCTION_ALLOW_BUILTIN=crypto - το n8n Cloud δεν υποστηρίζει καθόλου εισαγωγή modules, οπότε εκεί η επαλήθευση δεν χωρά σε έναν κόμβο. Στο Cloud επεκτείνετε λοιπόν την αλυσίδα με έναν κόμβο Extract From File (λειτουργία Extract From Text File) - μετατρέπει πρώτα τα δυαδικά δεδομένα σε κείμενο στο πεδίο που θα επιλέξετε (για παράδειγμα rawBody) - και μόνο μετά ένας κόμβος Crypto (ενέργεια Hmac, τύπος SHA256, κωδικοποίηση HEX, τιμή μια έκφραση που συνδέει τη χρονική σήμανση από την κεφαλίδα με το πεδίο rawBody, το secret δοσμένο μέσω credential Crypto και όχι σε απλό πεδίο κειμένου) υπολογίζει το αποτύπωμα χωρίς κώδικα· τη σύγκριση με το v1 ολοκληρώνει ένας κόμβος IF.

javascript
// Είσοδος από τον κόμβο Webhook με ενεργοποιημένη την επιλογή Raw Body: η κεφαλίδα
// είναι η τιμή "Volai-Signature", π.χ. "t=1756111640,v1=8f2ac1d4..."; το ακατέργαστο
// σώμα φτάνει ως δυαδικά δεδομένα (προεπιλεγμένο όνομα ιδιότητας "data"), όχι στο json.body.
const header = $input.first().json.headers['volai-signature'];

// Η getBinaryDataBuffer λειτουργεί σε όλους τους τρόπους αποθήκευσης δυαδικών του n8n
// (προεπιλογή στη μνήμη, καθώς και filesystem/S3) - η άμεση ανάγνωση του
// $input.first().binary.data.data θα δούλευε μόνο στη λειτουργία μνήμης.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');

// Το secret είναι η τιμή από το βήμα 4 (PUT /v1/webhook) - στην παραγωγή διαβάστε το
// από credential του n8n ή από μεταβλητή περιβάλλοντος, ποτέ μην το γράφετε μέσα στον κώδικα
const secret = 'whsec_antikatastiste_me_to_dikon_sas';

const crypto = require('crypto'); // μόνο για self-hosted n8n, βλ. το κείμενο του βήματος

const [tPart, v1Part] = header.split(',');
const t = tPart.replace('t=', '');
const v1 = v1Part.replace('v1=', '');

const expected = crypto
  .createHmac('sha256', secret)
  .update(`${t}.${rawBody}`)
  .digest('hex');

if (expected !== v1) {
  throw new Error('Μη έγκυρη υπογραφή Volai-Signature');
}

Τι μπορείτε να κάνετε

SMS επιβεβαίωσης μετά από παραγγελία

Το e-shop ή το σύστημα κρατήσεων στέλνει στο n8n webhook για μια νέα παραγγελία - το workflow στέλνει αμέσως SMS με την επιβεβαίωση και την εκτιμώμενη ώρα παραλαβής.

Εξερχόμενη κλήση από προγραμματιστή ή υπολογιστικό φύλλο

Μια γραμμή σε Google Sheets, Airtable ή CRM ενεργοποιεί έναν κόμβο HTTP Request που καλεί τον πελάτη μέσω του φωνητικού πράκτορά σας - υπενθύμιση ραντεβού, πρόσκληση για ολοκλήρωση παραγγελίας, σύντομη έρευνα.

Καταγραφή του αποτελέσματος της κλήσης πίσω στο σύστημα

Το webhook call.completed φέρνει τη μεταγραφή, τη σύνοψη και τα δεδομένα που καταγράφηκαν στην κλήση (data) - το workflow τα γράφει στο CRM, σε φύλλο ή τα στέλνει στο Slack, χωρίς χειροκίνητη ακρόαση της ηχογράφησης.

Συχνές ερωτήσεις

Υπάρχει επίσημος κόμβος n8n για το volai;
Προς το παρόν όχι - σήμερα αρκούν οι γενικοί κόμβοι HTTP Request και Webhook, που το n8n έχει πάντα διαθέσιμους. Ένας επαληθευμένος κόμβος κοινότητας θα έπρεπε να περάσει έλεγχο στο n8n Creator Portal - προς το παρόν δεν τον ετοιμάζουμε.
Πώς ξέρω ότι το webhook το έστειλε πραγματικά το volai και όχι κάποιος τρίτος;
Από την κεφαλίδα Volai-Signature - υπογραφή HMAC-SHA256 με το secret που σας επιστρέφει κάθε PUT /v1/webhook (αποθηκεύστε το αμέσως, το GET δεν θα το επιστρέψει ξανά). Αναλυτικός τύπος και παράδειγμα σε Python και TypeScript υπάρχουν στο /docs/webhooky.
Τι γίνεται αν το HTTP Request αποτύχει λόγω timeout και το n8n το επαναλάβει;
Προσθέστε την κεφαλίδα Idempotency-Key με οποιαδήποτε σταθερή τιμή (για παράδειγμα το ID της παραγγελίας). Εντός 24 ωρών, σε επαναλαμβανόμενο αίτημα με το ίδιο κλειδί θα λάβετε πίσω ακριβώς την ίδια απάντηση - ούτε το SMS ούτε η κλήση θα σταλούν δεύτερη φορά.
Πόσο κοστίζει η αυτοματοποίηση επιπλέον σε σχέση με τη χειροκίνητη κλήση του API;
Τίποτα - δεν υπάρχει επιπλέον χρέωση για το n8n. Ισχύουν οι ίδιες τιμές όπως στον τιμοκατάλογο: SMS 1,36 kr (≈ 0,06 EUR), εξερχόμενη κλήση 0,92 kr/min (≈ 0,04 EUR), φωνητικός πράκτορας επιπλέον 2,50 kr/min (≈ 0,10 EUR). Ο πλήρης τιμοκατάλογος βρίσκεται στο /cenik.

Δοκιμάστε το αμέσως

Εγγραφείτε και τα πρώτα 50 kr υπολοίπου τα προσφέρουμε εμείς.