---
title: "Update Automation"
description: "Update an existing automation rule."
---

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

# Update Automation

Use the Speak AI MCP server tool `update_automation` to update an existing
automation rule.

## What does it do?

Update an existing automation rule. This replaces the whole automation (name,
trigger, and steps), so fetch the current values with `get_automation` first and
pass them all back with your changes.

## Parameters

`update_automation` takes 9 parameters, 4 of them required.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `automationId` | string | Yes | Unique identifier of the automation |
| `name` | string | Yes | Display name for the automation |
| `trigger` | object | Yes | Trigger object (the automation's root). Always include triggerSlug. Supported shapes: • Media analyzed in folder(s): \{ type: "folders", triggerSlug: "media_analyzed", folderIds: string[] (min 1) \} • Inbound webhook (receive external payloads): \{ type: "folders", triggerSlug: "inbound_webhook", webhookId? (from `provision_inbound_webhook`; omit to auto-provision a new one on create), childKey? (dot-path narrowing which part of the payload feeds the automation, e.g. "data") \}. The create/update response includes inboundWebhook.inboundUrl: the public URL to POST payloads to. • Custom field updated: \{ type: "folders", triggerSlug: "field_updated", values: string[] (watched custom field ids, min 1), fieldValueMatches?: [\{ fieldId, values: string[] \}] (fire only when the field changes TO one of these values; empty values = any change), fieldMatchLogic?: "AND"\|"OR" (how multiple fieldValueMatches combine, default "OR") \} • Composio app event: \{ type: "composio", provider: "composio", app, triggerSlug, connectedAccountId \} (requires a connected account; may be behind a server flag) Notes: "tags"/"keywords" trigger types are rejected for graph automations. The server stores inbound-webhook triggers with type "webhook" internally: send type "folders" plus the slug as shown above. |
| `triggers` | array of object | No | Optional additional "Or" triggers (max 10): the automation runs when ANY of them fires, sharing the same steps. Each entry mirrors the trigger shapes above but cannot be an inbound webhook and carries no webhookId/childKey. Example: [\{ type: "folders", triggerSlug: "field_updated", values: ["\<fieldId\>"] \}] |
| `steps` | array of object | Yes | Ordered array of graph steps (1-20). Each step is an object: \{ stepId: string (unique within the array), stepType: one of "speak-upload" \| "magic-prompt" \| "translation" \| "filter" \| "condition" \| "notify" \| "outbound-webhook" \| "composio-action", dependsOn?: string[] (stepIds this step runs after), branch?: "true"\|"false" (which outcome of an upstream condition step this step belongs to) \} plus ONE config key matching stepType: • speak-upload -\> speakUpload: \{ sourceMode: "url"\|"file", sourceUrl (required when sourceMode="url"; tokens allowed. If the token resolves to an object, the first http(s) URL inside it is used), folderId (required, unless folderRouting.mode="dynamic" where it becomes the optional fallback), name? (tokens allowed, mixable with static text), language? (language code or token), fieldsMap?: \{ \<customFieldId\>: "\<value\>" \} (writes payload values into Speak custom fields on the uploaded media; values are usually \{\{trigger.payload.\<path\>\}\} tokens. Get field ids from `list_fields`), folderRouting?: \{ mode: "static"\|"dynamic", sourceKey (payload key holding the destination folder name, required when dynamic), onNoMatch: "create"\|"default" (create a folder named after the value, or fall back to folderId) \} \} • magic-prompt -\> magicPrompt: \{ prompt (required unless fieldIds given, max 20000), title?, assistantType? ("general"\|"researcher"\|"marketer"\|"sales"\|"recruiter"\|"custom", default "general"), assistantTemplateId? (required if assistantType="custom"), fieldIds?: string[] (max 10. Extract answers into these custom fields) \} • translation -\> translation: \{ targetLanguage: region-qualified locale code, e.g. "es-ES", "fr-FR" (bare codes like "es" are rejected) \} • filter -\> filter: \{ logic: "AND"\|"OR" (default "AND"), rules: [\{ field, op, value? \}] (1-20) \}. The run continues only when the rules match, otherwise it stops silently • condition -\> condition: same \{ logic, rules \} shape as filter, but instead of stopping it routes: downstream steps marked branch:"true"/"false" run according to the outcome • notify -\> notify: \{ channel: "in_app"\|"email"\|"slack", target?, message (required, tokens allowed) \} • outbound-webhook -\> outboundWebhook: \{ url (required, tokens allowed), method? ("GET"\|"POST"\|"PUT"\|"PATCH"\|"DELETE", default "POST"), headers?: \{ \<name\>: \<value\> \}, bodyTemplate?: string \| object (tokens allowed) \} • composio-action -\> composio: \{ app, action, connectedAccountId?, argsTemplate? \} (Composio is currently behind a server flag and may be unavailable) Filter/condition rule fields depend on what flows into the step: MEDIA -\> name\|duration\|sourceLanguage\|tags\|transcript\|speakers or a custom field id; INSIGHT -\> answer; inbound-webhook DATA -\> any payload path (e.g. "contact.status"). Ops by field type. Text: eq\|neq\|contains\|ncontains\|startsWith\|exists; number: eq\|neq\|gt\|lt\|exists; array: contains\|ncontains\|exists ("exists" takes no value; gt/lt values are numbers). Token syntax (usable in fields marked 'tokens allowed'): \{\{trigger.payload.\<path\>\}\} reads the inbound webhook payload (dot paths and [n] array indices; paths are relative to trigger.childKey when set. Discover valid paths with `get_inbound_webhook` after sending a test payload); \{\{step.\<index\>.\<path\>\}\} or \{\{step.\<stepId\>.\<path\>\}\} reads a previous step's output (speak-upload -\> mediaId, magic-prompt -\> answer, outbound-webhook -\> status/response). |
| `description` | string | No | Optional description |
| `isActive` | boolean | No | Whether the automation is active (defaults to true) |
| `runType` | enum: instant, schedule | No | Run type: "instant" (default, runs on trigger) or "schedule" (cron) |
| `schedule` | object | No | Required when runType="schedule": \{ timePeriod: "today"\|"yesterday"\|"last7days"\|"last14days"\|"thisWeek", repeatAt: string \} |

## Behaviour

The Speak AI MCP server publishes these behaviour hints for `update_automation`.

- Can change data in your workspace.
- Can delete or overwrite data. Use with care.
- Repeating an identical call is safe.
- Can reach systems outside Speak AI.

## Related

- [Automations](/mcp/tools/automations/) lists the rest of the Automations category.
- [Tool reference](/mcp/tools/) lists every Speak AI MCP server tool.
- [MCP server](/mcp/) covers setup, supported clients, and what agents can do once
  connected.

Source: https://docs.speakai.co/mcp/tools/automations/update_automation/index.mdx
