Zum Inhalt springen

Kunden aus einem n8n-Workflow anrufen

September 2, 2026 · 7 Min. Lesezeit

Sie können einen Kunden aus n8n anrufen, ohne eine Zeile Code zu schreiben: Fügen Sie Ihrem Workflow einen HTTP-Request-Node hinzu, richten Sie ihn auf POST https://volai.cz/v1/calls mit einem Header Authorization: Bearer vk_... und einem Body aus {to, agentId} - und Ihr Sprachagent wählt die Nummer genau dann, wenn der Workflow es verlangt. Unten finden Sie die vollständige Einrichtung: Workflow-Daten in den Prompt des Agenten übernehmen, das Ergebnis des Anrufs zurück nach n8n holen und ganz ohne Agent anrufen, indem Sie zwei Nummern direkt verbinden.

Was Sie brauchen

  • Eine n8n-Instanz - Cloud oder selbst gehostet, jede aktuelle Version.
  • Ein volai-Konto und einen API-Schlüssel aus dem Portal (Einstellungen -> API & MCP) in der Form vk_.... Speichern Sie ihn in n8n als Header-Auth-Zugangsdaten (Header Authorization, Wert Bearer vk_...), damit Sie den Schlüssel nicht in jeden Node kopieren müssen.
  • Eine eigene Nummer mit zugeordnetem Sprachagenten - legen Sie ihn im Portal an oder über /docs/agent. Noch kein Agent? Sie können trotzdem anrufen, indem Sie zwei Nummern direkt verbinden (die Variante mit from weiter unten).

1HTTP-Request-Node hinzufügen

Methode POST, URL https://volai.cz/v1/calls, Authentifizierung über Ihre gespeicherten Zugangsdaten, Body Content Type JSON. Der Body braucht to (die Nummer des Kunden) und agentId (die ID des Agenten aus dem Portal) - beide sind Pflicht, und zwar genau EINES von agentId/from/systemPrompt, nie mehr als eines.

json
{
  "to": "={{ $json.phone }}",
  "agentId": "ag_kx91fa2b",
  "variables": {
    "customer_name": "={{ $json.name }}",
    "order_number": "={{ $json.order }}"
  },
  "ringingTimeoutSecs": 30
}

Werte in der Form ={{...}} sind n8n-Ausdrücke - $json liest Felder aus dem vorherigen Node des Workflows (zum Beispiel aus einem Webhook „neue Bestellung“ oder einer Tabellenzeile).

2Workflow-Daten in den Prompt des Agenten übernehmen

variables ist ein Objekt von String zu String, das der Agent als dynamische Variablen erhält - in seinem Systemprompt verweisen Sie darauf als {{customer_name}}. Grenzen: höchstens 20 Schlüssel, Schlüssel bis 64 Zeichen, Werte bis 512 Zeichen. Die Namen attempt_id, caller_number und called_number sind reserviert - volai füllt sie selbst aus, und gleichnamige Werte aus Ihrem Workflow würden verworfen.

ringingTimeoutSecs (5 bis 60 Sekunden, Standard 25) legt fest, wie lange das Telefon klingeln darf, bevor ein unbeantworteter Anruf mit endReason: "no_answer" endet. Ein längeres Timeout erhöht die Chance, dass der Kunde abnimmt, belegt aber auch länger eine Leitung für ausgehende Anrufe.

3Antwort lesen und optional auf das Ergebnis warten

Eine erfolgreiche Antwort kommt sofort zurück, der Anruf hat aber gerade erst begonnen - status ist initiated, kein Endzustand:

json
{
  "id": "c_9d4e2b7f",
  "status": "initiated"
}

Möchten Sie das Ergebnis im selben Workflow-Lauf abwarten statt über einen separaten Webhook? Fügen Sie direkt nach dem HTTP-Request-Node einen zweiten Node hinzu, der GET /v1/calls/{id} mit dem Parameter waitSecs (0 bis 45 Sekunden) aufruft - der Server antwortet, sobald der Anruf endet oder das Timeout erreicht ist, je nachdem, was zuerst eintritt:

bash
curl "https://volai.cz/v1/calls/c_9d4e2b7f?waitSecs=30" \
  -H "Authorization: Bearer vk_YOUR_KEY"

Das Ergebnis zurückholen: ein Webhook nach n8n

Für einen produktiven Workflow ist es meist praktischer, nicht inline zu warten, sondern das Ergebnis separat zustellen zu lassen: Fügen Sie in n8n einen Webhook-Node hinzu (ein neuer Workflow genügt), kopieren Sie seine Production URL und registrieren Sie sie einmalig bei volai:

bash
curl -X PUT https://volai.cz/v1/webhook \
  -H "Authorization: Bearer vk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-instance.app.n8n.cloud/webhook/volai-calls",
    "events": ["call.completed", "call.failed", "call.no_answer"]
  }'

Die Antwort enthält ein secret (in der Form whsec_...) - speichern Sie es, Sie brauchen es, um die Signatur jeder eingehenden Anfrage zu prüfen. volai sendet einen Header Volai-Signature in der Form t=<unix>,v1=<hex> - den vollständigen Verifizierungscode in TypeScript und Python finden Sie auf /docs/webhooky. Er lässt sich nicht unverändert in einen n8n-Code-Node übernehmen: Der HMAC wird über den ROHEN Request-Body berechnet, deshalb müssen Sie im Webhook-Node die Option Raw Body aktivieren (ohne sie liefert n8n bereits geparstes JSON und die Signatur stimmt nie überein), und im Code-Node importieren Sie crypto mit require, nicht mit import. Verarbeiten Sie den Body nicht, bevor Sie die Signatur geprüft haben.

Das kommt an, sobald der Anruf beendet ist:

json
{
  "event": "call.completed",
  "ts": 1756111640000,
  "data": {
    "id": "c_9d4e2b7f",
    "direction": "out",
    "from": "+420601234567",
    "to": "+420777123456",
    "status": "completed",
    "durationSecs": 90,
    "priceHal": 513,
    "answeredBy": "human",
    "endReason": "completed",
    "transcript": [
      { "role": "agent", "message": "Guten Tag, ich rufe wegen der Bestellung A-42 an." },
      { "role": "caller", "message": "Ja, das weiß ich schon, danke für die Erinnerung." }
    ],
    "summary": "Der Kunde hat den Erhalt der Bestellung A-42 bestätigt.",
    "data": {
      "order_confirmed": true
    }
  }
}

Der Schlüssel data innerhalb von data ist optional und enthält genau die Felder, die Sie beim Agenten in dessen dataFields konfiguriert haben - das Beispiel oben (order_confirmed) ist nur zur Veranschaulichung, Ihre Felder werden anders heißen. Ein nachfolgender n8n-Node kann dann anhand dieser Felder verzweigen, etwa um einen CRM-Eintrag zu aktualisieren oder den Anruf neu zu planen.

Wie rufen Sie ohne Agent an?

Wenn Sie keinen Sprachagenten brauchen, sondern nur eine direkte Verbindung zwischen zwei Nummern (zum Beispiel einem Vertriebsmitarbeiter und einem Kunden), senden Sie from statt agentId:

json
{
  "to": "+420777123456",
  "from": "+420601234567"
}

volai ruft zuerst from an, und sobald jemand abnimmt, wählt es to. Beide Gesprächsabschnitte werden getrennt mit 0.92 CZK pro Minute abgerechnet (ohne Agent-Aufschlag). from ist die Nummer, unter der SIE abnehmen - typischerweise Ihr Handy - und kann jede tschechische oder slowakische Nummer sein, sie muss nicht zu Ihrem volai-Konto gehören. Die eigentliche Voraussetzung ist eine andere: Ihr Konto braucht mindestens eine eigene volai-Nummer, denn über sie wird der Anruf abgerechnet und sie sehen beide Seiten im Display (ohne sie gibt volai bridge_needs_number zurück). Tragen Sie nur keine volai-Nummer in from ein, die auf einen Agenten oder auf SIP geleitet wird - das Netz würde diesen ersten Abschnitt statt zu Ihnen zum Agenten verbinden, und Ihr Telefon würde nie klingeln.

Was kostet ein solcher Anruf?

Ein ausgehender Anruf über einen Agenten wird als Summe zweier Tarife abgerechnet: die ausgehende Minute (0.92 CZK) plus der Agent-Aufschlag OBENDRAUF (2.50 CZK), beide laut Preisliste vom 2. September 2026. Ein Anruf von 90 Sekunden kommt auf 5.13 CZK:

PostenTarifAnruf von 90 s
Ausgehende Minute0.92 CZK/Min.1.38 CZK
Agent-Aufschlag2.50 CZK/Min.3.75 CZK
Gesamt5.13 CZK

Abgerechnet wird sekundengenau, nicht pro angefangener Minute - ein kürzerer Anruf kostet entsprechend weniger. Die vollständige Preisliste (Nummern, Agent, SMS) finden Sie unter /cenik.

Sicher wiederholen (Idempotency-Key)

n8n kann einen Node bei einem Fehler automatisch wiederholen (Retry On Fail) - ohne Absicherung würde das zwei echte Anrufe beim selben Kunden bedeuten. Fügen Sie einen Header Idempotency-Key mit einem Wert hinzu, der für einen Workflow-Lauf stabil bleibt (n8n stellt dafür {{ $execution.id }} bereit, oder nutzen Sie Ihre eigene Bestell-ID) - mit demselben Schlüssel erhalten Sie innerhalb von 24 Stunden die Antwort des ersten Versuchs zurück, und der Anruf wird nicht doppelt ausgelöst:

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

Was tun, wenn die API einen Fehler zurückgibt?

Diese Tabelle deckt die Varianten agentId und from ab - die Zustände, die nur für einen Testanruf ohne eigene Nummer (systemPrompt) gelten, fehlen bewusst, das ist ein anderer Ablauf.

StatusCodeBedeutung
400invalid_numberDas Feld to ist keine gültige Telefonnummer.
400validationagentId/from fehlt oder beide sind gesetzt; oder variables überschreiten ihre Grenzen, oder ringingTimeoutSecs liegt außerhalb von 5 bis 60.
400on_dncDie Nummer steht auf Ihrer Do-not-call-Liste (/v1/dnc).
400destination_auto_blockedDieses Ziel wurde nach wiederholten Fehlschlägen automatisch für 30 Tage gesperrt.
400cannot_call_own_numberSchleifenschutz - Sie können Ihre eigene volai-Nummer nicht anrufen.
404agent_not_foundagentId existiert nicht oder gehört nicht zu Ihrem Konto.
404agent_no_numberDem Agenten ist keine Telefonnummer zugeordnet.
404bridge_needs_numberFür die Variante mit from: Sie brauchen mindestens eine volai-Nummer in Ihrem Konto.
409destination_busyZu genau dieser Nummer läuft bereits ein anderer Anruf von Ihnen.
402insufficient_creditIhr Guthaben deckt das Minimum für den Start eines Anrufs nicht.
503capacity_busyAlle Leitungen für ausgehende Anrufe sind gerade belegt, versuchen Sie es in einer Minute erneut.

Das allgemeine API-Limit

Zusätzlich zur Tabelle oben gilt für die gesamte API ein Limit: höchstens 60 Anfragen pro Minute und API-Schlüssel (HTTP 429, rate_limited). Denken Sie daran in einem Workflow, der Dutzende Nummern direkt nacheinander anruft - dasselbe Limit gilt für POST /v1/messages und jeden anderen Endpunkt unter demselben Schlüssel.

Wie es weitergeht

Eine vollständige Übersicht dessen, was Sie aus n8n tun können (SMS, Nummern, Do-not-call-Liste), finden Sie in der Anleitung zur n8n-Integration. Die vollständige REST-Referenz steht unter /docs/api, die vollständige Liste der Webhook-Ereignisse samt Signaturprüfung unter /docs/webhooky.

volai ausprobieren - die ersten 50 kr gehen auf uns

Sie legen in einer Minute ein Konto an und haben sofort Startguthaben für Anrufe und eine Nummer - SMS versenden Sie nach der ersten Aufladung.

Kostenlos testen