Preskoči na vsebino
REST API

SMS in klici neposredno iz poteka dela n8n

n8n pokliče REST API volai prek vozlišča HTTP Request - brez pisanja kode tako iz poteka dela pošljete SMS, sprožite klic prek glasovnega agenta in rezultat prejmete nazaj kot webhook.

1Ključ shranite kot credential

V n8n ustvarite nov credential tipa HTTP Header Auth: ime glave Authorization, vrednost Bearer vk_VAS_KLJUC (ključ najdete v portalu v razdelku Pomočnik AI). Dodelite ga vsakemu vozlišču HTTP Request, ki bo klicalo /v1/* - isti ključ velja za SMS, klice in webhook.

2Pošljite SMS iz poteka dela

Dodajte vozlišče HTTP Request: metoda POST, naslov https://volai.cz/v1/messages, telo JSON s poljema to in body. Odgovor vsebuje priceHal (cena v stotinih za vse segmente sporočila) in segments - besedilo s šumniki zavzame več segmentov kot sporočilo samo z znaki ASCII. Primer spodaj zato besedilo sporočila namenoma pušča brez šumnikov, da ostane v enem segmentu - s šumniki deluje enako, le porabi se več segmentov.

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

3Pokličite stranko prek svojega agenta

Drugo vozlišče HTTP Request: POST https://volai.cz/v1/calls s to in agentId obstoječega glasovnega agenta (ustvarite ga v portalu ali prek POST /v1/agents) - agent mora imeti dodeljeno lastno številko, sicer se zahteva konča z napako agent_no_number. Zahteva klic le sproži in vrne njegov id - o dejanskem izidu (zaključen, brez odgovora, neuspešen) boste izvedeli iz webhooka v naslednjem 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"}'

4Nastavite webhook, da se vam potek dela odzove

Dodajte sprožilec Webhook (n8n vam ustvari URL) in isti naslov shranite prek PUT /v1/webhook skupaj s seznamom dogodkov, ki vas zanimajo. Pozor: prazno polje events ne pomeni nobenega dogodka, ampak čisto vse - raje jih vedno naštejte. Odgovor vrne tudi secret - shranite ga takoj, GET /v1/webhook ga ne vrne več.

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"]}'

5Preverite podpis in šele nato obdelajte telo

Vsaka zahteva nosi glavo Volai-Signature v obliki t=<unix>,v1=<hex>. V vozlišču Code izračunajte HMAC-SHA256 nad {t}.{rawBody} s svojim secret in primerjajte z v1 - telo obdelajte šele, ko se ujemata. V vozlišču Webhook v razdelku Add Options vklopite možnost Raw Body - brez nje n8n telo takoj razčleni in bajti, iz katerih je bil izračunan podpis, se izgubijo. Z vklopljeno možnostjo pa telo prispe kot binarni podatki (lastnost data), ne v json.body - spodnja koda zato telo bere prek getBinaryDataBuffer, kar deluje ne glede na to, ali n8n binarne podatke hrani v pomnilniku, na disku ali v S3. Vgrajeni crypto lahko v vozlišču Code uporabite le na self-hosted n8n z dovoljenim NODE_FUNCTION_ALLOW_BUILTIN=crypto - n8n Cloud uvoza modulov sploh ne podpira, zato se preverjanje tam ne vključi v eno vozlišče. Na Cloudu zato verigo podaljšajte z vozliščem Extract From File (operacija Extract From Text File) - to binarne podatke najprej pretvori v besedilo v izbranem polju (na primer rawBody) - in šele nato vozlišče Crypto (dejanje Hmac, tip SHA256, kodiranje HEX, vrednost izraz, ki združuje časovni žig iz glave s poljem rawBody, secret vnesen prek Crypto credentiala, ne v navadno besedilno polje) izračuna odtis brez pisanja kode; primerjavo z v1 nato dokonča vozlišče IF.

javascript
// Vhod iz vozlišča Webhook z vklopljeno možnostjo Raw Body: header je vrednost
// "Volai-Signature", npr. "t=1756111640,v1=8f2ac1d4..."; surovo telo
// prispe kot binarni podatki (privzeto ime lastnosti "data"), ne v json.body.
const header = $input.first().json.headers['volai-signature'];

// getBinaryDataBuffer deluje v vseh načinih shranjevanja binarnih podatkov v n8n
// (privzeto v pomnilniku, pa tudi filesystem/S3) - neposredno branje
// $input.first().binary.data.data bi delovalo le v pomnilniškem načinu.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');

// secret je vrednost iz 4. koraka (PUT /v1/webhook) - v produkciji ga beri
// iz n8n credentiala ali spremenljivke okolja, nikoli ga ne piši trdo v kodo
const secret = 'whsec_nadomestite_s_svojim';

const crypto = require('crypto'); // samo self-hosted n8n, glejte besedilo 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('Neveljaven podpis Volai-Signature');
}

Kaj lahko z njim naredite

Potrditveni SMS po naročilu

Spletna trgovina ali rezervacijski sistem pošlje n8n webhook o novem naročilu - potek dela takoj odpošlje SMS s potrditvijo in predvidenim časom prevzema.

Odhodni klic iz načrtovalnika ali preglednice

Vrstica v Google Sheets, Airtable ali CRM sproži vozlišče HTTP Request, ki pokliče stranko prek vašega glasovnega agenta - opomnik na termin, poziv k dokončanju naročila, kratka anketa.

Zapis izida klica nazaj v sistem

Webhook call.completed prinese prepis, povzetek in zabeležene podatke iz klica (data) - potek dela jih zapiše v CRM, preglednico ali pošlje na Slack, brez ročnega poslušanja posnetka.

Pogosta vprašanja

Ali obstaja uradno vozlišče n8n za volai?
Zaenkrat ne - danes zadoščata splošni vozlišči HTTP Request in Webhook, ki ju ima n8n vedno na voljo. Preverjeno skupnostno vozlišče bi moralo skozi pregled v n8n Creator Portal - zaenkrat ga ne pripravljamo.
Kako vem, da je webhook res poslal volai in ne nekdo tretji?
Po glavi Volai-Signature - podpis HMAC-SHA256 s secretom, ki ga vrne vsak PUT /v1/webhook (shranite ga takoj, GET ga ne vrne več). Podroben obrazec in primer v Pythonu ter TypeScriptu je na /docs/webhooky.
Kaj, če HTTP Request odpove zaradi timeouta in ga n8n ponovi?
Dodajte glavo Idempotency-Key s poljubno stabilno vrednostjo (na primer ID naročila). V 24 urah na ponovljeno zahtevo z istim ključem dobite nazaj popolnoma enak odgovor - SMS ali klic se ne odpošljeta drugič.
Koliko stane avtomatizacija več v primerjavi z ročnim klicanjem API-ja?
Nič - za n8n ni nobenega doplačila. Veljajo iste cene kot v ceniku: SMS 1.36 CZK (~EUR 0.06), odhodni klic 0.92 CZK/min (~EUR 0.04), glasovni agent dodatno 2.50 CZK/min (~EUR 0.10). Natančen cenik je na /cenik.

Preizkusite takoj

Registrirajte se in prvih 50 kr je na naš račun.