Webhooks
Ergon receives and processes webhook events from external providers and routes them to configured triggers.
Overview
Webhooks are primarily used by the Channels service to receive inbound messages and delivery-lifecycle callbacks from the email provider. When a webhook is received, Ergon records the activity and emits a platform event (such as channels.email.received) that the central Automations service can react to.
Webhook endpoints are called by external providers, not by your application. You define what happens when an event arrives by creating rules in the Automations service.
Event Type Catalog
Every action across the platform emits a structured event. These events power the Event Streams API, real-time WebSocket feeds, and internal processing pipelines. Browse the complete event and automation-trigger catalog for every payload shape and compatible predicate, or download the machine-readable JSON. The table below highlights common event types.
IAM
| Event Type | Description |
|---|---|
iam.company.created | A new organization was created |
iam.member.invited | A member was invited to an organization |
iam.member.joined | A member accepted an invitation |
iam.member.removed | A member was removed from an organization |
iam.role.created | A custom role was created |
iam.role.updated | A role was updated |
iam.role.deleted | A role was deleted |
iam.role.assigned | A role was assigned to a principal |
iam.role.unassigned | A role was unassigned from a principal |
iam.permission.granted | A permission grant was created |
iam.permission.revoked | A permission grant was revoked |
iam.api_key.created | An API key was created |
iam.api_key.updated | An API key was updated |
iam.api_key.deleted | An API key was deleted |
iam.agent.created | A service agent was created |
iam.agent.updated | A service agent was updated |
iam.agent.deleted | A service agent was deleted |
iam.agent.access_granted | Access was granted to a service agent |
iam.agent.access_revoked | Access was revoked from a service agent |
iam.company_service.enabled | A service was enabled for an organization |
iam.company_service.disabled | A service was disabled for an organization |
iam.service_access.granted | Service access was granted to a principal |
iam.service_access.revoked | Service access was revoked |
iam.grant.deleted | An org-level grant was deleted |
iam.connection_request.created | A connection request was raised |
iam.connection_request.approved | A connection request was approved |
iam.connection_request.rejected | A connection request was rejected |
iam.connection_request.withdrawn | A connection request was withdrawn |
Workflows
| Event Type | Description |
|---|---|
workflows.workflow.created | A workflow was created |
workflows.workflow.updated | A workflow was updated |
workflows.workflow.deleted | A workflow was deleted |
workflows.phase.created | A phase was created |
workflows.phase.updated | A phase was updated |
workflows.phase.deleted | A phase was deleted |
workflows.phase.reordered | Phases were reordered |
workflows.field.created | A field was created |
workflows.field.updated | A field was updated |
workflows.field.deleted | A field was deleted |
workflows.items.created | An item was created |
workflows.items.updated | An item was updated |
workflows.items.routed | An item was routed to another phase |
workflows.items.deleted | An item was deleted |
workflows.items.claimed | An item was claimed by a user |
workflows.items.assigned | An item was assigned |
workflows.items.group_assigned | An item was assigned to a group |
workflows.items.released | An item was released from assignment |
workflows.items.auto_assigned | An item was auto-assigned |
workflows.items.auto_released | An item was auto-released after timeout |
workflows.items.timeout | An item timed out |
workflows.items.routing_failed | Routing an item failed |
workflows.items.visibility_restored | Item visibility was restored |
workflows.items.field.updated | An item field value was updated |
workflows.items.comment.added | A comment was added to an item |
workflows.items.comment.deleted | A comment was deleted |
workflows.items.attachment.uploaded | An attachment was uploaded |
workflows.items.attachment.deleted | An attachment was removed |
workflows.items.form.submitted | A form submission was received |
workflows.route.created | A phase route was created |
workflows.route.updated | A phase route was updated |
workflows.route.deleted | A phase route was deleted |
workflows.access.grant.created | Workflow access was granted |
workflows.access.grant.deleted | Workflow access was revoked |
Channels
| Event Type | Description |
|---|---|
channels.message.dispatched | An outbound email was sent |
channels.email.received | An inbound email was received |
channels.email.delivered | An email was delivered |
channels.email.bounced | An email bounced |
channels.email.failed | Email delivery failed |
channels.email.complained | A spam complaint was received |
channels.email.delivery_delayed | Email delivery was delayed |
channels.email.opened | An email was opened |
channels.email.clicked | A link in an email was clicked |
Agent Hub & Conversations
| Event Type | Description |
|---|---|
conversations.conversation.created | A conversation was created |
conversations.message.added | A message was added to a conversation |
conversations.message.sent | A message was sent in a conversation |
agents.message.sent | An assistant response was sent |
agents.run.started | An agent run started (carries run_id) |
agents.run.completed | An agent run completed (resolves agent_run wait key) |
agents.run.failed | An agent run raised before producing a final reply |
agents.tool.executed | A tool was executed during a run |
Worksheets
| Event Type | Description |
|---|---|
worksheets.folder.created | A folder was created |
worksheets.folder.updated | A folder was updated |
worksheets.folder.deleted | A folder was deleted |
worksheets.worksheet.created | A worksheet was created |
worksheets.worksheet.updated | A worksheet was updated |
worksheets.worksheet.deleted | A worksheet was deleted |
worksheets.column.created | A column was created |
worksheets.column.updated | A column was updated |
worksheets.column.deleted | A column was deleted |
worksheets.column.formula_changed | A column formula was updated |
worksheets.rows.created | A row was created |
worksheets.rows.updated | A row was updated |
worksheets.rows.deleted | A row was deleted |
worksheets.rows.bulk_created | Rows were created in bulk |
worksheets.rows.bulk_updated | Rows were updated in bulk |
worksheets.rows.bulk_deleted | Rows were deleted in bulk |
worksheets.rows.attachment.uploaded | A row attachment was uploaded |
worksheets.rows.attachment.deleted | A row attachment was removed |
worksheets.access.grant.created | Worksheet access was granted |
worksheets.access.grant.deleted | Worksheet access was revoked |
Buckets
| Event Type | Description |
|---|---|
buckets.bucket.created | A bucket was created |
buckets.bucket.updated | A bucket was updated |
buckets.bucket.deleted | A bucket was deleted |
buckets.folder.created | A folder was created |
buckets.folder.updated | A folder was updated |
buckets.folder.deleted | A folder was deleted |
buckets.files.ingested | A file was uploaded and ingested |
buckets.files.updated | A file was updated |
buckets.files.deleted | A file was deleted |
buckets.files.process | File processing was queued |
buckets.files.processed | File processing completed |
buckets.files.failed | File processing failed |
buckets.access.grant.created | Bucket access was granted |
buckets.access.grant.deleted | Bucket access was revoked |
Event Envelope
Every platform event follows a standard envelope structure. The payload field contains event-type-specific data.
{
"id": "e1a2b3c4-d5e6-7890-abcd-ef1234567890",
"event_type": "workflows.items.created",
"source": "workflows",
"company_id": "c0ffee00-cafe-babe-dead-beefcafebabe",
"actor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"actor_type": "member",
"correlation_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
"timestamp": "2026-04-14T10:30:00Z",
"payload": {
"workflow_id": "550e8400-e29b-41d4-a716-446655440000",
"item_id": "660e8400-e29b-41d4-a716-446655440000",
"phase_id": "770e8400-e29b-41d4-a716-446655440000",
"title": "New customer request"
}
}| Field | Type | Description |
|---|---|---|
id | UUID | Unique event identifier |
event_type | string | Event type slug from the catalog above |
source | string | Service that emitted the event |
company_id | UUID | Organization the event belongs to |
actor_id | UUID | null | Principal that triggered the event |
actor_type | string | null | Principal type: member, api_key, agent, or service |
correlation_id | UUID | null | Links related events into a trace |
timestamp | ISO 8601 | When the event occurred |
payload | object | Event-type-specific data |
Use the Event Streams API to browse events, query aggregated metrics, and explore correlated traces. Real-time streaming is available via WebSocket.
Email Inbound Webhook
The email inbound webhook receives events from Resend when emails arrive at configured addresses. The webhook URL is registered automatically when you create a channel config and verify the domain.
| Property | Value |
|---|---|
| Endpoint | POST /api/v1/channels/webhooks/email |
| Provider | Resend |
| Authentication | Webhook signature verification (automatic) |
| Content-Type | application/json |
Example inbound email payload from Resend:
{
"type": "email.received",
"data": {
"from": "[email protected]",
"to": ["[email protected]"],
"subject": "Help with my order",
"text": "I need help with order #12345...",
"html": "<p>I need help with order #12345...</p>",
"headers": {
"message-id": "<[email protected]>",
"in-reply-to": "<[email protected]>"
}
}
}Trigger Actions
Reacting to inbound events is handled by the central Automations service rather than by the webhook endpoint itself. You author rules that match a trigger event (for example channels.email.received) and run one or more actions. Common actions include:
- Invoke an AI agent with the received message as input.
- Create or route a workflow item from the message.
- Send an outbound email or an outbound webhook.
Because reactions live in Automations, loop protection and conditions are configured there too — see the Automations service for rule authoring, conditions, and recursion safeguards.
Security
Webhook endpoints implement the following security measures:
- Provider signature verification (webhook signing)
- Address matching — only emails to configured addresses are processed
- Recursion safeguards in the Automations service to prevent runaway loops
- Rate limiting on the webhook endpoint