Skip to main content
A webhook trigger turns an agent into an endpoint: something posts to a URL, and a task starts. This guide creates one, secures it, and shows how to tell a rejected delivery from a filtered one.

Prerequisites

  • An agent with a working model. See create and configure an agent.
  • A publicly reachable API, or a tunnel to your local one — the sending system has to be able to reach the webhook URL.
  • An access token as AGENTAREA_TOKEN and the API base URL as AGENTAREA_URL.

Steps

1

Create the trigger

Omit webhook_id and the platform generates one with secrets.token_urlsafe(16). Let it — a generated id is unguessable, and for an unverified webhook the URL is the only thing standing between the agent and the internet.
The response carries the webhook_id. The URL is:
2

Turn on signature verification

Verification is opt-in for every type, including github and stripe. Without a signing secret, verify_webhook_signature returns “not enabled” and the request proceeds unverified. Naming a webhook_type alone secures nothing.
Configure the secret the provider signs with, then point the trigger at it:
For generic webhooks the HMAC details are configurable, because the sender is whatever you wrote:
Those three values are the defaults. slack, github, discord (Ed25519), linear and stripe ignore them and use their provider’s scheme. Telegram is validated by bot token at a different layer.
3

Point the sending system at the URL

Register the URL wherever the events come from — a GitHub repository webhook, a Stripe endpoint, your own service.
Only Telegram registers its inbound webhook with the provider automatically. Every other channel is a manual step, and nothing in the platform reports that you skipped it.
4

Send a test delivery

Use the provider’s own “redeliver” or “send test” button where one exists — it exercises the real signature path, which a hand-rolled curl does not.For a generic webhook with no secret configured yet:

Verify

The execution history records every delivery that reached the trigger, including ones that produced no task:
status: "success" with a task_id means the delivery started a task. status: "success" with task_id: null means validation passed and the conditions declined — the trigger is working and deliberately filtering.
A delivery rejected at the method, signature, or validation stage never becomes an execution record with a task. Check the API logs for the rejection reason, which is deliberately not returned to the caller in detail.

Troubleshooting

A signing secret is configured and the signature did not match. The most common cause is the body: the signature is computed over the exact raw bytes, so any proxy that re-serializes JSON between the provider and the API invalidates it. The same response is returned when a secret is configured but the raw body was unavailable to verify.
allowed_methods defaults to ["POST"] and is checked before signature and validation. A provider that sends PUT, or a browser preflight, is rejected here.
Validation passed and the conditions declined to create a task. Conditions with no explicit type are evaluated by a model against the payload, so the verdict is a judgement, not a rule mismatch. Read trigger_data on the execution record to see exactly what the model was shown.
Crossing failure_threshold consecutive failures disables the trigger, and nothing re-enables it automatically:
It is not. The type selects which verifier runs, not whether one runs. Verification begins only once a signing secret resolves from webhook_config or validation_rules.

Triggers and channels

The model behind this, and what it does not cover.

Schedule an agent

The other way a task starts without a person.

Debug a failed task

When the delivery worked and the task did not.

Errors

What the API returns, and what is safe to retry.
Last modified on September 17, 2026