---
title: "Inbound webhooks"
description: "Give any external tool a URL that starts a Speak AI automation. Works with Zapier, Make, GoHighLevel or your own script."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.speakai.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Inbound webhooks

An inbound webhook lets any external tool start a Speak AI automation by sending it an HTTP request. Tools like Zapier, GoHighLevel, Make, or your own script can POST data to a unique URL, and your automation runs with that data available to every later step. For the basics of building automations, see [How to use automations in Speak AI](/help/automations/).


## Add the inbound webhook trigger

1. Open the automation canvas and add a trigger step.
1. Choose **Catch inbound webhook** from the trigger list.
1. Save the automation. The **Inbound URL** field generates a unique URL for this automation. Until you save, the field shows **Save this automation to generate the URL**.

## Copy the Inbound URL

After saving, the **Inbound URL** field shows a copyable link with a Copy button. It looks like this:

`https://api.speakai.co/v1/webhook/in/<your-token>`

- The URL is unique to this one automation. Keep it private. Anyone with the URL can trigger the automation.
- Send the data as an HTTP **POST** request to this URL.

## Send a sample request so Speak AI learns the payload

Open the test step in the canvas. Under **Send a request to this URL**, the helper text reads **Send a sample request to this URL so Speak AI can learn the payload shape**. Send one real request from your external tool. Speak AI captures the fields from that request so you can reference them in later steps.

## Use payload data in later steps

Once a field is captured, reference it with a token in any later step. The token format is:

`#{{trigger.payload.<path>}}`

For example, if your request sends a contact object with an email, you can use `#{{trigger.payload.contact.email}}` in a later step. Nested fields use a dot path.

## View recent deliveries

The trigger shows a **Recent deliveries** list of incoming requests, newest first. Each delivery shows a status badge:

- **Captured**: the request was received and its payload was captured as a sample.
- **Ran**: the request was accepted and the automation ran.
- **Rejected**: the request was refused, for example a failed signature check.
- **Error**: another error occurred, shown with its code.

If **No deliveries yet** shows, no request has reached the URL. Deliveries are kept for 90 days.

## Limits and optional signature checking

- **Rate limit**: up to 60 requests per minute per URL and sending IP address. Extra requests get an HTTP `429` response with the message **Too many requests. Please retry shortly.**
- **Optional signature verification**: if a signing secret is set on the webhook, each request must include an `x-speak-timestamp` header and an `x-speak-signature` header in the form `sha256=<hex-digest>`. The signature is HMAC-SHA256 over the timestamp and the raw request body, and the timestamp must be within 5 minutes. Failed checks return an HTTP `401`. If no signing secret is set, the unguessable URL is the only control.

Next, chain a **Speak Upload** step after this trigger to transcribe a file URL from the payload automatically.

The fastest way to reach us is the live chat in the app (the chat bubble in the bottom corner). You can also email [success@speakai.co](mailto:success@speakai.co).

Want a hand setting this up? [Book a free consult](https://calendly.com/speak-ai/consult?utm_source=docs&utm_campaign=consult) and we'll do it together on your account.

---
Related: [Automations](/help/automations/) · [Actions](/help/automations/actions/)

Source: https://docs.speakai.co/help/automations/inbound-webhooks/index.mdx
