Webhook Triggers

Overview

Webhook triggers let external systems start runs via HTTP POST. There are three types:

TypeWhat it triggersPayload
Task webhookRuns a pre-created taskOptional JSON body (task has its own instructions)
Teammate webhookStarts a new dynamic runRequires {"message": "..."} in body
App triggerRuns a task on app eventsAutomatic — Composio delivers event data

Rule of thumb: If the work is always the same, use a task webhook. If each trigger has a different message, use a teammate webhook. If a connected app should trigger runs automatically (e.g. "on every GitHub push"), use an app trigger.

Task Webhook Triggers

Attach a webhook trigger to a task. When you POST to the generated URL, the task runs automatically using its pre-defined instructions.

Create a Task Webhook

Trigger the Task

POST to the webhook URL. The JSON body is optional — the task already has its own instructions.

cURL

Teammate Webhook Triggers

Enable a webhook directly on a teammate. Each POST creates a new run with the message you provide — useful for dynamic, event-driven workflows.

Enable Teammate Webhook

Important: The webhook URL contains a secret token and is only shown once. Store it securely.

Trigger a Run

POST a JSON body with a message field:

cURL

The teammate processes the message using its configured instructions and tools.

Disable Teammate Webhook

App Triggers

App triggers connect to your integrated apps (GitHub, Slack, etc.) and automatically start task runs when specific events occur — no webhook URL management needed.

Discover Available Triggers

Create an App Trigger

Prerequisite: The app must be connected first via client.apps.connect() or the dashboard.

How It Works

  1. You connect an app (e.g. GitHub) via OAuth
  2. You create an app trigger on a task with a trigger type and config
  3. When the event fires, the task runs automatically with the event data injected into the instructions
  4. If you disconnect the app or the connection expires, all triggers using that connection are automatically disabled

Multi-Tenancy

For multi-tenant apps, pass user_id to scope the trigger to a specific end-user's connection:

Python

When to Use Which

Use CaseType
Automated report on a schedule + manual triggerTask webhook
CI/CD pipeline triggers a fixed analysisTask webhook
Slack/Discord bot forwards messagesTeammate webhook
Customer support system routes ticketsTeammate webhook
Run task on every GitHub pushApp trigger
Process new Slack messages automaticallyApp trigger
React to CRM events (new deal, updated contact)App trigger

Managing Triggers

List Triggers

Python

Delete a Trigger

Python

Deduplication

Include an X-M8tes-Event-Id header to prevent duplicate runs from retried webhooks:

cURL

What's Next