--- title: "n8n and No-code" description: "Receive Voicetta call data in n8n, Make, or Zapier without writing a server. The four settings that decide whether it works in production." publishedAt: "2026-08-22" modifiedAt: "2026-08-22" category: "No-code" tags: "Voicetta, n8n, no-code, Make, Zapier, webhook, automation" navOrder: "50" canonical: "https://voicetta.com/developers/n8n" --- # n8n and No-code You do not need to write a server to use this API. A webhook node in n8n, Make, or Zapier is a perfectly good receiver, and the call payload is a single flat-ish JSON object that these tools handle well. What you do need is four specific settings. Each of them looks optional and is not: the defaults are tuned for building a workflow interactively, and they are wrong for receiving production traffic. ## 1. Use the Production URL, not the Test URL The n8n Webhook node gives you two URLs. The **Test URL** only listens while the canvas is open and you have pressed *Listen for test event*. Close the tab and every delivery fails. Copy the **Production URL** into Voicetta, and make sure the workflow is **activated**. A deactivated workflow does not listen on its production URL either. This is the single most common reason a no-code integration works during setup and then stops. ## 2. Set Respond to "Immediately" In the Webhook node, set **Respond** to *Immediately*. The default is to respond when the last node finishes, which means our request stays open for as long as your whole workflow takes to run. If that is longer than the timeout, we conclude the delivery failed and retry it — so a workflow that is working correctly produces duplicate deliveries and, after six attempts, entries marked failed in your delivery log. *Immediately* sends the `200` first and runs the rest of the workflow afterwards. That is the [acknowledge-then-process rule](/developers/quickstart) that applies to coded handlers too; n8n just spells it as a dropdown. ## 3. Authenticate with Header Auth In Voicetta, add a custom header to the endpoint, for example `X-Api-Key` with a secret you generate. In n8n, set the Webhook node's **Authentication** to *Header Auth* and create a credential with the same header name and value. That is the whole thing. Requests without the header are rejected by n8n before your workflow runs. You can verify our HMAC signature instead, but it is not worth it here: it needs a Code node operating on the raw request bytes, and n8n has usually parsed the JSON by the time you can see it, which makes the digest fail. Header authentication gives you the property you actually want — only Voicetta can trigger this workflow — with nothing to get wrong. The signature is always sent, so you can move to it later if your setup changes. ## 4. Leave the timeout at 10 seconds No-code workers cold start. A tight timeout does not make delivery faster; it just guarantees spurious retries on any delivery that arrives while your worker is waking up. See [the timeout section of the webhook reference](/developers/webhooks#about-the-timeout) for why lowering it cannot help. ## Deduplicating Assume you will occasionally receive the same call twice. Every at-least-once delivery system does this, including ours. Two workable approaches in n8n: - **On the delivery id.** Use the `X-Voicetta-Delivery-Id` header as the key in a Remove Duplicates node, or check it against a table of ids you have already handled. Each retry has a new delivery id, so this processes every attempt at most once. - **On the call id.** Use `call_id` from the body, and treat a repeat as an update rather than an insert. Upserting into Airtable, Sheets, or a database keyed on `call_id` makes duplicates harmless by construction. The second is usually simpler in a no-code tool, because it needs no extra state: an upsert with the same key twice leaves one row. ## Reading data instead of receiving it If you would rather pull, an HTTP Request node against `GET /v1/calls` works the same way as anywhere else. Set the header: ``` Authorization: Bearer vk_live_your_key_here ``` Then loop while `has_more` is true, passing `next_cursor` back as `cursor`. Full parameter list in [the read API reference](/developers/api-reference). For most workflows the webhook is the better choice: you get each call once, seconds after it ends, with no schedule to tune and no window where you are polling an API that has nothing new to say. ## A minimal working flow 1. **Webhook** — Production URL, Respond: Immediately, Authentication: Header Auth. 2. **Remove Duplicates** or an upsert keyed on `call_id`. 3. **Set** — pull out the fields you care about: `call.call_id`, `call.analysis.summary`, `call.analysis.outcome`, `call.customer.phone`, `call.duration_seconds`. 4. Your destination — Airtable, Sheets, Slack, a CRM node, or an HTTP Request to your own system. Remember that null fields are omitted rather than sent as `null`, so reference nested fields defensively. A call with no transcript has no `transcript` key at all, not an empty array. ## Related pages - [Quickstart](/developers/quickstart) — test with a request bin before touching n8n - [Webhook reference](/developers/webhooks) — headers, payload, and retry behaviour - [Read API reference](/developers/api-reference) — parameters for the HTTP Request node - [Overview](/developers/overview) — what the API contains