SMS og opkald direkte fra n8n-workflowen
n8n kalder volai REST API'et via HTTP Request-noden - uden kode kan en workflow sende en SMS, starte et opkald via en stemmeagent og få resultatet tilbage som en webhook.
1Gem nøglen som credential
Opret i n8n en ny credential af typen HTTP Header Auth: headernavn Authorization, værdi Bearer vk_DIN_NOEGLE (nøglen findes i portalen under AI-assistent). Tildel den til hver HTTP Request-node, der kalder volai.cz/v1/* - den samme nøgle gælder for SMS, opkald og webhook.
2Send en SMS fra workflowen
Tilføj en HTTP Request-node: metode POST, URL https://volai.cz/v1/messages, JSON-body med felterne to og body. Svaret indeholder priceHal (prisen i haléř, 1/100 CZK, for alle segmenter af beskeden) og segments - en tekst med diakritiske tegn fylder flere segmenter end en ren ASCII-besked. Eksemplet herunder lader derfor med vilje beskedteksten stå uden diakritiske tegn, så den bliver i ét segment - med diakritiske tegn virker det på samme måde, der bruges blot flere segmenter.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_DIN_NOEGLE" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "body": "Din bestilling er klar til afhentning."}'3Ring til en kunde via agenten
En anden HTTP Request-node: POST https://volai.cz/v1/calls med to og agentId for en eksisterende stemmeagent (den oprettes i portalen eller via POST /v1/agents) - agenten skal have tildelt et eget nummer, ellers ender anmodningen med fejlen agent_no_number. Anmodningen starter kun opkaldet og returnerer dets id - det faktiske udfald (gennemført, ikke besvaret, mislykket) fremgår af webhooken i næste trin.
curl -X POST https://volai.cz/v1/calls \
-H "Authorization: Bearer vk_DIN_NOEGLE" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "agentId": "ag_kx91fa2b"}'4Opsæt en webhook, så workflowen får svar tilbage
Tilføj en Webhook-trigger (n8n genererer en URL) og gem den samme adresse via PUT /v1/webhook sammen med listen over de hændelser, der er relevante. Pas på: et tomt events-array betyder ikke ingen hændelser, men alle - angiv derfor altid de ønskede hændelser eksplicit. Svaret returnerer også en secret - gem den med det samme, GET /v1/webhook returnerer den aldrig igen.
curl -X PUT https://volai.cz/v1/webhook \
-H "Authorization: Bearer vk_DIN_NOEGLE" \
-H "Content-Type: application/json" \
-d '{"url": "https://din-n8n.app.n8n.cloud/webhook/volai", "events": ["call.completed", "message.sent"]}'5Bekræft signaturen, før body behandles
Hver anmodning har en Volai-Signature-header i formen t=<unix>,v1=<hex>. I en Code-node beregnes HMAC-SHA256 over {t}.{rawBody} med den gemte secret og sammenlignes med v1 - body behandles først, når de to er ens. Slå i Webhook-noden indstillingen Raw Body til under Add Options - uden den parser n8n body'en med det samme, og de præcise bytes, som signaturen blev beregnet over, går tabt. Med indstillingen slået til ankommer body'en i stedet som binære data (egenskaben data), ikke i json.body - koden herunder læser den derfor via getBinaryDataBuffer, som virker, uanset om n8n gemmer binære data i hukommelsen, på disk eller i S3. Det indbyggede crypto-modul kan kun bruges i Code-noden på selvhostet n8n med NODE_FUNCTION_ALLOW_BUILTIN=crypto slået til - n8n Cloud understøtter slet ikke import af moduler, så verificeringen kan dér ikke rummes i én node. På Cloud forlænges kæden derfor med en Extract From File-node (operationen Extract From Text File) - den omdanner de binære data til tekst i et valgfrit felt (fx rawBody) - og først derefter beregner en Crypto-node (handlingen Hmac, type SHA256, kodning HEX, værdi et udtryk, der sammensætter tidsstemplet fra headeren med feltet rawBody, secret angivet via en Crypto-credential, ikke et almindeligt tekstfelt) fingeraftrykket uden kode; sammenligningen med v1 afsluttes af en IF-node.
// Input fra Webhook-noden med indstillingen Raw Body slået til: headeren er værdien af
// "Volai-Signature", fx "t=1756111640,v1=8f2ac1d4..."; den rå body
// ankommer som binære data (standardnavn på egenskaben "data"), ikke i json.body.
const header = $input.first().json.headers['volai-signature'];
// getBinaryDataBuffer virker i alle lagringstilstande for binære data i n8n
// (standard i hukommelsen samt filesystem/S3) - direkte læsning af
// $input.first().binary.data.data ville kun virke i hukommelsestilstand.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');
// secret er værdien fra trin 4 (PUT /v1/webhook) - i produktion læses den
// fra en n8n-credential eller en miljøvariabel, aldrig skrevet direkte i koden
const secret = 'whsec_erstat_med_din';
const crypto = require('crypto'); // kun selvhostet n8n, se teksten i trinnet
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('Ugyldig signatur i Volai-Signature');
}Hvad den kan bruges til
Bekræftelses-SMS efter en bestilling
Webshoppen eller bookingsystemet sender en webhook til n8n om en ny bestilling - workflowen sender straks en bekræftelses-SMS med det forventede afhentningstidspunkt.
Udgående opkald fra en planlægger eller et regneark
En række i Google Sheets, Airtable eller CRM-systemet udløser en HTTP Request-node, der ringer til kunden via stemmeagenten - en påmindelse om en aftale, en opfordring til at gennemføre en bestilling, en kort undersøgelse.
Opkaldsresultatet skrives tilbage i systemet
Webhooken call.completed leverer udskrift, resumé og de oplysninger, som agenten har noteret under opkaldet (data) - workflowen skriver dem ind i CRM-systemet eller et regneark eller sender dem til Slack, uden at nogen manuelt skal lytte til optagelsen.
Ofte stillede spørgsmål
- Findes der en officiel n8n-node til volai?
- Ikke endnu - i dag er de generelle noder HTTP Request og Webhook, som n8n altid har til rådighed, nok. En verificeret community-node skulle gennem review i n8n Creator Portal - en sådan er der foreløbig ikke planer om.
- Hvordan kan det ses, at webhooken virkelig kom fra volai og ikke fra en uvedkommende?
- Ud fra headeren
Volai-Signature- en HMAC-SHA256-signatur med densecret, som hvertPUT /v1/webhookreturnerer (gem den med det samme,GETreturnerer den ikke igen). Den fulde formel samt eksempler i Python og TypeScript findes på/docs/webhooky. - Hvad sker der, hvis HTTP Request løber ind i en timeout, og n8n gentager den?
- Tilføj headeren
Idempotency-Keymed en vilkårlig stabil værdi (fx bestillings-ID'et). Inden for 24 timer returneres der på en gentaget anmodning med samme nøgle præcis det samme svar - hverken SMS eller opkald sendes en gang til. - Hvad koster automatiseringen ekstra i forhold til at kalde API'et manuelt?
- Intet - der er intet tillæg for n8n. Der gælder de samme takster som i prisoversigten: SMS 1,36 kr (≈ 0,43 DKK), udgående opkald 0,92 kr/min (≈ 0,29 DKK), stemmeagent oveni 2,50 kr/min (≈ 0,78 DKK). De præcise priser findes på
/cenik.
Prøv det med det samme
Opret en konto, og de første 50 kr i saldo er på os.