Update a trigger
PATCH/api/v1/triggers/{id}
scope
assistants:writeChanges only the fields you send. This is how a trigger is switched on. Changing a schedule reschedules the next firing immediately.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Trigger id |
Body
application/json| Name | Type | Description |
|---|---|---|
assistant_idoptional | string (uuid) | The assistant this fires |
nameoptional | string | Trigger name |
kindoptional | string (enum) | What wakes the assistantrecurringonceeventwebhook |
goaloptional | string | What the assistant is asked to do |
enabledoptional | boolean | Defaults to FALSE — a new trigger never fires until you switch it on |
periodoptional | string (enum) | null | Recurring onlydailyweeklymonthly |
send_timeoptional | string | null | Recurring only, HH:MM in the account timezone |
day_of_weekoptional | integer | null | Recurring weekly, 0 is Sunday |
day_of_monthoptional | integer | null | Recurring monthly, clamped to a short month |
run_atoptional | string (date-time) | null | One-off triggers only |
event_keyoptional | string | null | Event triggers only: contact.created, deal.stage_changed or booking.completed |
audience_typeoptional | string (enum) | Who a firing acts on. Event and webhook triggers must be nonenonecontactsegment |
contact_idoptional | string (uuid) | null | Required when the audience is a contact |
segment_idoptional | string (uuid) | null | Required when the audience is a segment |
max_targetsoptional | integer | Ceiling on runs started per firing. Defaults to 50 |
respect_quiet_hoursoptional | boolean | Defer a firing that lands outside sending hours |
Request
curl -X PATCH "https://your-crm.example.com/api/v1/triggers/4b5c6d7e-8f9a-4b0c-8d1e-2f3a4b5c6d7e" \
-H "Authorization: Bearer $RAABTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": true
}'Response · 200 OK
{
"data": {
"id": "4b5c6d7e-8f9a-4b0c-8d1e-2f3a4b5c6d7e",
"assistant_id": "8f2c1d3e-4a5b-4c6d-9e0f-1a2b3c4d5e6f",
"name": "Weekly no-show follow-up",
"enabled": true,
"kind": "recurring",
"goal": "Message anyone who missed an appointment this week and offer to rebook.",
"period": "weekly",
"send_time": "10:00",
"day_of_week": 1,
"day_of_month": null,
"run_at": null,
"event_key": null,
"audience_type": "segment",
"contact_id": null,
"segment_id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"max_targets": 50,
"respect_quiet_hours": true,
"last_fired_at": "2026-09-01T10:00:00.000Z",
"last_error": null,
"created_at": "2026-08-10T12:00:00.000Z",
"updated_at": "2026-09-01T10:00:00.000Z"
}
}Response
Wrapped in { data: … }| Name | Type | Description |
|---|---|---|
idrequired | string (uuid) | Trigger id |
assistant_idrequired | string (uuid) | The assistant this fires |
namerequired | string | Trigger name |
enabledrequired | boolean | Triggers are created switched OFF; enable them explicitly |
kindrequired | string (enum) | What wakes the assistantrecurringonceeventwebhook |
goalrequired | string | What the assistant is asked to do when this fires |
periodrequired | string (enum) | null | Recurring triggers onlydailyweeklymonthly |
send_timerequired | string | null | Recurring only, as HH:MM in the account timezone |
day_of_weekrequired | integer | null | Recurring weekly, where 0 is Sunday |
day_of_monthrequired | integer | null | Recurring monthly, 1 to 31, clamped to the end of a short month |
run_atrequired | string (date-time) | null | One-off triggers only: when it fires |
event_keyrequired | string | null | Event triggers only: which event, from the catalogue |
audience_typerequired | string (enum) | Who a firing acts onnonecontactsegment |
contact_idrequired | string (uuid) | null | Set when the audience is a single contact |
segment_idrequired | string (uuid) | null | Set when the audience is a segment |
max_targetsrequired | integer | Ceiling on runs started per firing, 1 to 500 |
respect_quiet_hoursrequired | boolean | Defer a firing that lands outside the account sending hours |
last_fired_atrequired | string (date-time) | null | When it last fired |
last_errorrequired | string | null | Why the last firing produced no run, if it produced none |
created_atrequired | string (date-time) | When it was created |
updated_atrequired | string (date-time) | When it was last edited |
Errors
| Status | Code | When |
|---|---|---|
| 400 | bad_request | The request could not be parsed: malformed JSON, an invalid cursor, or a query parameter of the wrong shape. |
| 400 | validation_error | The body or query failed validation. `details` lists each failing field with a `path` and a `message`. |
| 401 | unauthorized | No usable API key: the Authorization header is missing or malformed, or the key is unknown, revoked or expired. The three are deliberately indistinguishable. |
| 403 | forbidden | The key is valid but lacks the scope this endpoint requires, or the request came from an address outside the key’s IP allowlist. The message says which. |
| 403 | account_suspended | The account this key belongs to is suspended. Rotating the key will not help; contact support. |
| 404 | not_found | No such resource in this account. A resource that exists in another account also returns this. |
| 422 | unprocessable | The request was well-formed but cannot be carried out. `reason` is a stable string saying why (for example `outside_window` or `stage_not_in_pipeline`). |
| 429 | rate_limited | The per-key budget, or the per-IP budget for failed authentication, is exhausted. Honour `Retry-After` before retrying. |
| 500 | internal | Something failed on our side. Safe to retry with the same Idempotency-Key; quote `request_id` if it persists. |