# Webhook Trigger (/docs/triggers/webhook)

Trigger workflows from external services via HTTP POST.



A webhook trigger generates a unique URL. When an external service sends a POST request to that URL, your workflow executes.

Setup [#setup]

1. Add a **Webhook Trigger** node to your canvas
2. A unique webhook token is generated automatically
3. Click the node to open settings, then copy the full webhook URL from the **Parameters** pane.
4. Paste the URL into your external service's webhook settings

Configuration [#configuration]

| Field          | Description                                                            |
| -------------- | ---------------------------------------------------------------------- |
| Trigger Label  | Display name shown on the canvas                                       |
| Route Key      | Optional helper key for routing payloads through downstream conditions |
| Webhook URL    | Generated URL to copy into the sending app                             |
| Sample Payload | Optional JSON example used for manual testing and previews             |

The settings **Input** pane previews the current sample payload. Downstream nodes can use that sample while you build and test the workflow without sending a real webhook request.

Activating [#activating]

The webhook only fires after you click **Activate** in the editor toolbar. Inactive workflows reject webhook deliveries.

Payload [#payload]

Send a JSON body with `Content-Type: application/json`. The payload is stored on the execution record.

```json
{
  "token": "SOL",
  "price": 150.23,
  "alert": "price_above_threshold"
}
```

Non-JSON content types are also accepted and stored as raw text.

The webhook trigger output includes the request data plus metadata. For object JSON bodies, fields are available directly:

```text
{webhook.token}
{webhook.price}
{webhook.alert}
{webhook.triggeredAt}
{webhook.source}
```

Arrays, primitive JSON values, and non-JSON bodies are wrapped under `body`, so use `{webhook.body}`.

For the JSON request above, the full trigger output is:

```json
{
  "token": "SOL",
  "price": 150.23,
  "alert": "price_above_threshold",
  "triggeredAt": "2026-05-14T10:00:00.000Z",
  "source": "webhook"
}
```

For a non-object body such as `[1, 2, 3]` or `"hello"`, the output is:

```json
{
  "body": [1, 2, 3],
  "triggeredAt": "2026-05-14T10:00:00.000Z",
  "source": "webhook"
}
```

The base fields (`triggeredAt`, `source`) always win on key collision - a payload field named `source` will be shadowed by the trigger's own `"webhook"` value.

Testing and reruns [#testing-and-reruns]

Use the trigger's **Sample Payload** while configuring downstream nodes. In the editor's executions panel, webhook reruns use this configured sample payload; they do **not** replay the original webhook delivery body.

Request limits [#request-limits]

* **Max body size**: 100KB
* **Content type**: `application/json` (parsed) or any other (stored as raw string)
* **Method**: POST only

Replay protection [#replay-protection]

If the sender includes an `X-Webhook-Delivery-Id` or `X-GitHub-Delivery` header, Solaris AI Flow deduplicates requests with the same ID. Generic senders without a delivery ID are not replay-protected.

Plan limits [#plan-limits]

| Plan  | Webhook workflows |
| ----- | ----------------- |
| Free  | 1 active          |
| Pro   | Unlimited         |
| Ultra | Unlimited         |

Next steps [#next-steps]

* [Cron Trigger](/docs/triggers/cron) - schedule-based automation
* [Webhook API Reference](/docs/reference/webhook-api) - technical endpoint details
