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

# Triggers

> Get a webhook when data in your workspace is created, changes or is seen

A trigger watches your workspace for one or more **kinds** of data and an **action**, and POSTs an event to your webhook URL each time they match. A trigger is made of:

1. **Kind**: what it fires on. Connector data kinds (`email`, `calendar_event`, ...) fire on events from your connected accounts. Entity kinds (`person`, `organization`, ...) fire when an extracted entity of that type changes or is seen.
2. **Action**: `created`, `updated`, `deleted`, `observed` (an entity was seen in new data, whether or not it changed), or `*` for any.
3. **Filter**: an optional predicate over the event's fields.
4. **Delivery**: the HTTPS URL that receives events.

## Creating a trigger

```bash theme={null}
curl -X POST "https://api.adapter.com/v1/triggers" \
  -H "Authorization: Bearer $PK_LIVE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Emails from acme.com",
    "kind": ["email"],
    "action": "created",
    "filter": { "field": "sender_domain", "op": "eq", "value": "acme.com" },
    "delivery": { "url": "https://example.com/hooks/adapter" }
  }'
```

The response includes a `secret`. It is returned only once, so store it: you need it to [verify deliveries](https://docs.beta.adapter.com/triggers/deliveries.md#what-your-endpoint-receives).

You can also create and manage triggers on the **Triggers** page in the [Console](https://mind.adapter.com).

## Kinds and filter fields

[List trigger kinds](https://docs.beta.adapter.com/api-reference/Triggers/list-trigger-kinds.md) returns every kind you can use, each with the `predicate_fields` you can filter on (path, type, and allowed values where there is a fixed set).

## Filters

A filter clause is `{"field": "<dotted.path>", "op": "<operator>", "value": ...}`. Clauses combine with `all`, `any` and `not`, nested to any depth.

| Operators | Use |
| - | - |
| `eq`, `ne`, `in` | Exact match, mismatch, one of a list |
| `contains`, `starts_with`, `ends_with`, `regex` | String matching |
| `includes` | An array field contains a value |
| `domain_matches` | An email address or URL is on a domain |
| `gt`, `lt`, `gte`, `lte` | Numbers and dates |
| `exists` | The field is present |

```json theme={null}
{
  "all": [
    { "field": "sender_email", "op": "domain_matches", "value": "acme.com" },
    { "not": { "field": "subject", "op": "starts_with", "value": "Auto-reply" } }
  ]
}
```

For entity kinds with `action: observed`, filter on `entity_urn` (`exists` for observations that resolved to a known entity, `eq` for one specific entity) or on `via` (`identity` for a structured field such as a sender or attendee, `content` for a name found in body text). Set `entity_observation_fuzzy: true` to also receive fuzzy matches.

A filter can be at most 16,384 bytes as JSON.

## The event

```json theme={null}
{
  "id": "evt_5f4c1e2a9b8d4c6f",
  "trigger_id": "8d3f2a1c-6b4e-4f7a-9c2d-1e5b7a9f0c3d",
  "user_id": "usr_2b7e9c",
  "occurred_at": "2026-10-26T14:03:11Z",
  "kind": "email",
  "action": "created",
    "key": "18c2f9a7e4d1b3c5",
  "urn": "l1_01hx4k2q8r7m9n3p5t6v8w0y2z",
  "data": {
    "sender_email": "dana@acme.com",
    "sender_domain": "acme.com",
    "subject": "Renewal terms",
    "thread_id": "18c2f9a7e4d1b3c5"
  }
}
```

| Field | Meaning |
| - | - |
| `id` | Event id. The same event can arrive more than once, so dedupe on it |
| `trigger_id` | The trigger that matched |
| `user_id` | Who the event belongs to |
| `occurred_at` | When the underlying change happened |
| `kind`, `action` | What matched |
| `source` | The connector the event came from, when there is one |
| `key` | The record's identifier in its source system |
| `urn` | The record's Adapter identifier |
| `data` | The kind's fields, as listed in `predicate_fields`. Empty on `deleted` |

## Managing triggers

| To | Use |
| - | - |
| Pause or resume | [Update trigger](https://docs.beta.adapter.com/api-reference/Triggers/update-trigger.md) with `enabled: false` / `true` |
| Change what it fires on or where it delivers | [Update trigger](https://docs.beta.adapter.com/api-reference/Triggers/update-trigger.md) with `kind`, `filter` or `delivery` |
| See recent outcomes | [Get trigger details](https://docs.beta.adapter.com/api-reference/Triggers/get-trigger.md) and [List deliveries](https://docs.beta.adapter.com/api-reference/Triggers/list-trigger-deliveries.md) |
| Remove it | [Delete trigger](https://docs.beta.adapter.com/api-reference/Triggers/delete-trigger.md) |

Retries, automatic disabling and recovering a failing trigger are covered in [Deliveries](https://docs.beta.adapter.com/triggers/deliveries.md).

> [card] [Deliveries](https://docs.beta.adapter.com/triggers/deliveries.md)
>
> Signing, retries, failures and how to recover

> [card] [Triggers API](https://docs.beta.adapter.com/api-reference/Triggers/list-triggers.md)
>
> Every trigger endpoint


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.