SMS un zvani tieši no n8n darbplūsmas
n8n izsauc volai REST API ar HTTP Request mezglu - bez koda rakstīšanas no darbplūsmas nosūtāt SMS, uzsākat zvanu ar balss aģentu un rezultātu saņemat atpakaļ kā webhook.
1Saglabājiet atslēgu kā credential
n8n izveidojiet jaunu HTTP Header Auth tipa credential: galvenes nosaukums Authorization, vērtība Bearer vk_JUSU_ATSLEGA (atslēgu atradīsiet portālā sadaļā AI asistents). Piešķiriet to katram HTTP Request mezglam, kas izsauks /v1/* - viena un tā pati atslēga der SMS, zvaniem un webhook.
2Nosūtiet SMS no darbplūsmas
Pievienojiet HTTP Request mezglu: metode POST, adrese https://volai.cz/v1/messages, JSON pamatdaļa ar laukiem to un body. Atbilde satur priceHal (cena Čehijas kronas simtdaļās jeb haléři par visiem ziņas segmentiem) un segments - tekstam ar diakritiskajām zīmēm segmentu iznāk vairāk nekā tīri ASCII ziņai. Tāpēc zemāk redzamajā piemērā ziņas teksts ar nolūku ir bez diakritiskajām zīmēm, lai paliktu vienā segmentā - ar tām darbojas tāpat, tikai tiek patērēti vairāk segmentu.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_JUSU_ATSLEGA" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "body": "Pasutijums ir gatavs izsniegsanai."}'3Piezvaniet klientam ar savu aģentu
Otrs HTTP Request mezgls: POST https://volai.cz/v1/calls ar to un esoša balss aģenta agentId (izveidosiet to portālā vai caur POST /v1/agents) - aģentam jābūt piešķirtam savam numuram, citādi pieprasījums beigsies ar kļūdu agent_no_number. Pieprasījums tikai uzsāk zvanu un atgriež tā id - par faktisko rezultātu (pabeigts, neatbildēja, neizdevās) uzzināsiet no webhook nākamajā solī.
curl -X POST https://volai.cz/v1/calls \
-H "Authorization: Bearer vk_JUSU_ATSLEGA" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "agentId": "ag_kx91fa2b"}'4Iestatiet webhook, lai darbplūsma saņemtu atbildi
Pievienojiet Webhook trigeri (n8n ģenerē jums URL) un to pašu adresi saglabājiet ar PUT /v1/webhook kopā ar to notikumu sarakstu, kas jūs interesē. Uzmanību: tukšs events lauks nenozīmē nevienu notikumu, bet gan pilnīgi visus - labāk vienmēr tos uzskaitiet. Atbilde atgriež arī secret - saglabājiet to uzreiz, GET /v1/webhook to vairs neatgriezīs.
curl -X PUT https://volai.cz/v1/webhook \
-H "Authorization: Bearer vk_JUSU_ATSLEGA" \
-H "Content-Type: application/json" \
-d '{"url": "https://jusu-n8n.app.n8n.cloud/webhook/volai", "events": ["call.completed", "message.sent"]}'5Pārbaudiet parakstu un tikai tad apstrādājiet pamatdaļu
Katrs pieprasījums satur galveni Volai-Signature formātā t=<unix>,v1=<hex>. Code mezglā aprēķiniet HMAC-SHA256 pār {t}.{rawBody} ar savu secret un salīdziniet ar v1 - pamatdaļu apstrādājiet tikai tad, ja tie sakrīt. Webhook mezglā sadaļā Add Options ieslēdziet opciju Raw Body - bez tās n8n pamatdaļu uzreiz sapars un baiti, no kuriem rēķināts paraksts, tiek zaudēti. Ar ieslēgtu opciju pamatdaļa tomēr ierodas kā binārie dati (īpašība data), nevis json.body - tāpēc tālāk redzamais kods pamatdaļu lasa ar getBinaryDataBuffer, un tas darbojas neatkarīgi no tā, vai n8n bināros datus tur atmiņā, diskā vai S3. Iebūvēto crypto Code mezglā var izmantot tikai self-hosted n8n ar atļautu NODE_FUNCTION_ALLOW_BUILTIN=crypto - n8n Cloud moduļu importu neatbalsta vispār, tāpēc tur pārbaude vienā mezglā neietilpst. Cloud vidē ķēdi pagariniet ar Extract From File mezglu (darbība Extract From Text File) - tas bināros datus vispirms pārvērš tekstā izvēlētā laukā (piemēram, rawBody) - un tikai tad Crypto mezgls (darbība Hmac, tips SHA256, kodējums HEX, vērtība ir izteiksme, kas savieno laika zīmogu no galvenes ar lauku rawBody, secret ievadīts ar Crypto credential, nevis parastu teksta lauku) aprēķina kontrolsummu bez koda rakstīšanas; salīdzināšanu ar v1 pēc tam pabeidz IF mezgls.
// Ievade no Webhook mezgla ar ieslēgtu opciju Raw Body: header ir vērtība
// "Volai-Signature", piem., "t=1756111640,v1=8f2ac1d4..."; neapstrādātā
// pamatdaļa ierodas kā binārie dati (noklusējuma īpašības nosaukums "data"), nevis json.body.
const header = $input.first().json.headers['volai-signature'];
// getBinaryDataBuffer darbojas visos n8n bināro datu glabāšanas režīmos
// (noklusējuma atmiņā, kā arī filesystem/S3) - tieša lasīšana
// $input.first().binary.data.data darbotos tikai atmiņas režīmā.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');
// secret ir vērtība no 4. soļa (PUT /v1/webhook) - produkcijā to lasiet
// no n8n credential vai vides mainīgā, nekad neierakstiet tieši kodā
const secret = 'whsec_nomainiet_ar_savu';
const crypto = require('crypto'); // tikai self-hosted n8n, skatiet soļa tekstu
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('Nederīgs paraksts Volai-Signature');
}Ko ar to varēsit izdarīt
Apstiprinājuma SMS pēc pasūtījuma
Jūsu e-veikals vai rezervāciju sistēma nosūta n8n webhook par jaunu pasūtījumu - darbplūsma uzreiz izsūta apstiprinājuma SMS ar paredzamo saņemšanas laiku.
Izejošs zvans no plānotāja vai tabulas
Rinda Google Sheets, Airtable vai CRM palaiž HTTP Request mezglu, kas piezvana klientam ar jūsu balss aģentu - atgādinājums par laiku, aicinājums pabeigt pasūtījumu, īsa aptauja.
Zvana rezultāta ierakstīšana atpakaļ sistēmā
Webhook call.completed atnes transkriptu, kopsavilkumu un no zvana iegūtos datus (data) - darbplūsma tos ieraksta CRM, tabulā vai nosūta uz Slack, bez ieraksta klausīšanās ar rokām.
Biežāk uzdotie jautājumi
- Vai volai ir oficiāls n8n mezgls?
- Pagaidām nav - šobrīd pietiek ar vispārīgajiem mezgliem HTTP Request un Webhook, kas n8n ir vienmēr pieejami. Pārbaudīts kopienas mezgls prasītu n8n Creator Portal pārskatīšanu - tādu pagaidām negatavojam.
- Kā noteikt, ka webhook patiešām nosūtījis volai, nevis kāds svešs?
- Pēc galvenes
Volai-Signature- HMAC-SHA256 paraksts arsecret, ko atgriež katrsPUT /v1/webhookizsaukums (saglabājiet to uzreiz,GETto vairs neatgriež). Detalizēta formula un piemērs Python un TypeScript ir sadaļā/docs/webhooky. - Kas notiek, ja HTTP Request beidzas ar noildzi un n8n to atkārto?
- Pievienojiet galveni
Idempotency-Keyar jebkuru stabilu vērtību (piemēram, pasūtījuma ID). 24 stundu laikā uz atkārtotu pieprasījumu ar to pašu atslēgu saņemsiet tieši to pašu atbildi - ne SMS, ne zvans netiks nosūtīts otrreiz. - Cik papildus maksā automatizācija salīdzinājumā ar API izsaukšanu ar rokām?
- Nekas - par n8n nav nekāda piemaksa. Spēkā ir tās pašas likmes kā cenrādī: SMS 1,36 kr (≈ 0,06 EUR), izejošs zvans 0,92 kr/min (≈ 0,04 EUR), balss aģents papildus 2,50 kr/min (≈ 0,10 EUR). Precīzs cenrādis ir sadaļā
/cenik.
Izmēģiniet uzreiz
Reģistrējieties un pirmie 50 kr ir uz mūsu rēķina.