Preskoči na sadržaj
REST API

SMS i pozivi izravno iz n8n workflowa

n8n poziva REST API volai putem čvora HTTP Request - bez pisanja koda iz workflowa šaljete SMS, pokrećete poziv putem glasovnog agenta, a rezultat dobivate natrag kao webhook.

1Spremite ključ kao credential

U n8n-u izradite novi credential tipa HTTP Header Auth: naziv headera Authorization, vrijednost Bearer vk_VAS_KLJUC (ključ nalazite u portalu u odjeljku AI asistent). Dodijelite ga svakom čvoru HTTP Request koji će pozivati /v1/* - isti ključ vrijedi za SMS, pozive i webhook.

2Pošaljite SMS iz workflowa

Dodajte čvor HTTP Request: metoda POST, adresa https://volai.cz/v1/messages, JSON tijelo s poljima to i body. Odgovor sadrži priceHal (cijena u halerima za sve segmente poruke) i segments - tekst s dijakritičkim znakovima zauzima više segmenata od poruke samo u ASCII-ju. Primjer u nastavku zato namjerno ostavlja tekst poruke bez dijakritike kako bi stao u jedan segment - s dijakritikom radi jednako, samo se potroši više segmenata.

bash
curl -X POST https://volai.cz/v1/messages \
  -H "Authorization: Bearer vk_VAS_KLJUC" \
  -H "Content-Type: application/json" \
  -d '{"to": "+420777123456", "body": "Narudzba je spremna za preuzimanje."}'

3Nazovite kupca putem svojeg agenta

Drugi čvor HTTP Request: POST https://volai.cz/v1/calls s poljima to i agentId postojećeg glasovnog agenta (izradite ga u portalu ili putem POST /v1/agents) - agent mora imati dodijeljen vlastiti broj, inače zahtjev završi greškom agent_no_number. Zahtjev poziv samo pokreće i vraća njegov id - o stvarnom ishodu (završen, nije se javio, nije uspio) saznat ćete iz webhooka u sljedećem koraku.

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

4Postavite webhook da se workflow javi natrag

Dodajte okidač Webhook (n8n će vam generirati URL) i istu adresu spremite putem PUT /v1/webhook zajedno s popisom događaja koji vas zanimaju. Pažnja: prazno polje events ne znači nijedan događaj, nego sve događaje - bolje ih uvijek nabrojite. Odgovor vraća i secret - spremite ga odmah, GET /v1/webhook ga više ne vraća.

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

5Provjerite potpis, tek onda obradite tijelo

Svaki zahtjev nosi header Volai-Signature u obliku t=<unix>,v1=<hex>. U čvoru Code izračunajte HMAC-SHA256 nad {t}.{rawBody} sa svojim secret i usporedite s v1 - tijelo obradite tek kada se podudaraju. U čvoru Webhook u odjeljku Add Options uključite opciju Raw Body - bez nje n8n tijelo odmah parsira i bajtovi iz kojih se računao potpis se gube. S uključenom opcijom, međutim, tijelo stiže kao binarni podatak (svojstvo data), a ne u json.body - kod u nastavku zato tijelo čita putem getBinaryDataBuffer, što radi bez obzira drži li n8n binarne podatke u memoriji, na disku ili u S3-u. Ugrađeni crypto u čvoru Code može se koristiti samo na self-hosted n8n-u s dopuštenim NODE_FUNCTION_ALLOW_BUILTIN=crypto - n8n Cloud uvoz modula uopće ne podržava, pa se tamo provjera ne stane u jedan čvor. Na Cloudu zato lanac produljite čvorom Extract From File (operacija Extract From Text File) - on binarni podatak prvo pretvara u tekst u odabrano polje (na primjer rawBody) - a tek zatim čvor Crypto (akcija Hmac, tip SHA256, kodiranje HEX, vrijednost je izraz koji spaja vremensku oznaku iz headera s poljem rawBody, secret unesen putem Crypto credentiala, a ne običnog tekstnog polja) izračuna otisak bez pisanja koda; usporedbu s v1 zatim dovršava čvor IF.

javascript
// Ulaz iz čvora Webhook s uključenom opcijom Raw Body: header je vrijednost
// "Volai-Signature", npr. "t=1756111640,v1=8f2ac1d4..."; sirovo tijelo
// stiže kao binarni podatak (zadani naziv svojstva "data"), a ne u json.body.
const header = $input.first().json.headers['volai-signature'];

// getBinaryDataBuffer radi u svim načinima pohrane binarnih podataka u n8n-u
// (zadano u memoriji te filesystem/S3) - izravno čitanje
// $input.first().binary.data.data radilo bi samo u memorijskom načinu.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');

// secret je vrijednost iz koraka 4 (PUT /v1/webhook) - u produkciji ga čitajte
// iz n8n credentiala ili varijable okruženja, nikada ga ne upisujte izravno
const secret = 'whsec_zamijenite_svojim';

const crypto = require('crypto'); // samo self-hosted n8n, vidi tekst koraka

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('Neispravan potpis Volai-Signature');
}

Što time postižete

SMS potvrda nakon narudžbe

Web-trgovina ili sustav za rezervacije šalje n8n-u webhook o novoj narudžbi - workflow odmah šalje SMS s potvrdom i procijenjenim vremenom preuzimanja.

Odlazni poziv iz planera ili tablice

Redak u Google Sheetsu, Airtableu ili CRM-u pokreće čvor HTTP Request koji putem vašeg glasovnog agenta zove kupca - podsjetnik na termin, poziv na dovršetak narudžbe, kratka anketa.

Upis ishoda poziva natrag u sustav

Webhook call.completed donosi transkript, sažetak i prikupljene podatke iz poziva (data) - workflow ih upisuje u CRM, tablicu ili šalje na Slack, bez ručnog slušanja snimke.

Česta pitanja

Postoji li službeni n8n čvor za volai?
Za sada ne - danas su dovoljni opći čvorovi HTTP Request i Webhook koje n8n uvijek ima na raspolaganju. Provjereni čvor zajednice morao bi proći pregled u n8n Creator Portalu - za sada ga ne pripremamo.
Kako znam da je webhook doista poslao volai, a ne netko treći?
Prema headeru Volai-Signature - HMAC-SHA256 potpis s secret koji vam vraća svaki PUT /v1/webhook (spremite ga odmah, GET ga više ne vraća). Točna formula te primjeri u Pythonu i TypeScriptu nalaze se na /docs/webhooky.
Što ako HTTP Request zbog timeouta ne uspije i n8n ga ponovi?
Dodajte header Idempotency-Key s bilo kojom stabilnom vrijednošću (na primjer ID narudžbe). Unutar 24 sata na ponovljeni zahtjev s istim ključem dobit ćete točno isti odgovor - SMS ni poziv neće se poslati drugi put.
Koliko automatizacija košta povrh ručnog pozivanja API-ja?
Ništa - za n8n nema nikakve doplate. Vrijede iste cijene kao u cjeniku: SMS 1,36 kr (≈ 0,06 EUR), odlazni poziv 0,92 kr/min (≈ 0,04 EUR), glasovni agent povrh toga 2,50 kr/min (≈ 0,10 EUR). Točan cjenik nalazi se na /cenik.

Isprobajte odmah

Registrirajte se i prvih 50 kr dobivate od nas.