Voicetta
    Voicetta.

    Voicetta Developers

    n8n and No-code

    Receive Voicetta call data in n8n, Make, or Zapier without writing a server. The four settings that decide whether it works in production.

    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 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 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.

    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.