Automations
Build and run Tape automations (workflows): discover triggers/actions, create/edit/validate/activate automations, run or simulate them, and inspect run history
18 tools
Get Automation Catalog
POST /v1/tools/tape/getAutomationCatalog
Discover what Tape automations can be built: the available trigger types, action types, and (when you pass field_type) the filter operators valid for a field of that type. Returns a compact list by default — pass detail:true to include each entry's full config_schema. Results are cached for 1 hour. Use this before tape_createAutomation to pick a valid trigger/action type. section defaults to "all" (triggers + actions); filter operators are only returned when field_type is supplied.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
section | string | optional | Which catalog to return: "all" (default — triggers + actions), "triggers", or "actions". Filter operators are returned separately whenever field_type is supplied. Values: all, triggers, actions |
field_type | string | optional | When supplied, also return the filter operators valid for a field of this Tape type (e.g. "single_text", "number", "single_category", "single_date"). Required to see filter operators; omit if you only need triggers/actions. |
detail | boolean | optional | Include each trigger/action entry's full config_schema. Default false (compact list). Turn on only when you need the exact config keys for one you have already chosen — the schemas are large. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getAutomationCatalog \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
{
"triggers": [
{
"type": "record_created",
"label": "Record created",
"description": "Runs when a new record is created in the app."
}
],
"actions": [
{
"type": "current_record_update",
"group": "action",
"label": "Update triggering record",
"description": "Updates fields on the record that triggered the automation."
},
{
"type": "for_loop",
"group": "control_flow",
"label": "For each",
"description": "Repeats its actions for every item in a collection."
}
]
}Alternate mode
{
"field_type": "number",
"filter_operators": [
{
"operator": "is",
"label": "Is",
"value_arity": "single"
},
{
"operator": "greater_than",
"label": "Greater than",
"value_arity": "single"
}
]
} Try It
Try it
Sign in to execute this tool
Sign InList Automations
POST /v1/tools/tape/listAutomations
List automations in an app, a workspace, or across the whole organization, with pagination. Provide app_id to list one app's automations, workspace_id for a workspace, or neither to list org-wide (derived from your key). Returns a compact summary per automation (id, name, paused/broken state, trigger type, action type list, counts); pass verbose:true for the full definitions. IMPORTANT: a rare pre-migration automation can be unreadable and poison a listing page — this tool automatically returns the readable prefix plus a warning naming the gap rather than failing the whole call.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | optional | List automations belonging to this app (from tape_listApps / tape_getApp). |
workspace_id | number | optional | List automations across this workspace. Ignored if app_id is provided. Omit both app_id and workspace_id to list org-wide. |
limit | number | optional | Max automations to return (default 50, max 100). Use cursor to page. |
cursor | string | optional | Pagination cursor from a previous response. Scope-pinned — reuse the same scope. |
verbose | boolean | optional | Return each automation's full definition (trigger/filter/actions) instead of the compact summary. Default false. Large — prefer the summary and fetch one automation with tape_getAutomation when you need its definition. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/listAutomations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
{
"total": 2,
"cursor": null,
"automations": [
{
"id": 4021,
"name": "Email owner on new high-priority lead",
"app_id": 87,
"workspace_id": 12,
"paused": false,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-05-20 16:03:08"
}
]
}Alternate mode
{
"total": 40,
"cursor": null,
"automations": [],
"readable_limit": 12,
"warning": "Only the first 12 automation(s) in this scope could be read: a serialization-bricked pre-migration automation poisons the listing at position ~13 …"
} Try It
Try it
Sign in to execute this tool
Sign InGet Automation
POST /v1/tools/tape/getAutomation
Retrieve one automation by id. Default output is a compact summary (identity, paused/broken state, trigger type, action type list); pass verbose:true for the full editable definition (trigger, filter tree, actions). If the automation is a pre-migration one the current API cannot deserialize, this returns a structured "unserializable" error with a heal recipe instead of a raw 500.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation id (from tape_listAutomations). |
verbose | boolean | optional | Return the full definition (trigger, filter, actions) instead of the compact summary. Default false. Use before editing an automation so you have its current definition. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"id": 4021,
"name": "Email owner on new high-priority lead",
"app_id": 87,
"workspace_id": 12,
"paused": false,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-05-20 16:03:08"
}Alternate mode
{
"error": "Automation 443127 could not be read: Tape returned a 500 \"unknown exception\" serializing it …",
"error_code": "automation_unserializable",
"automation_id": 443127,
"bricked": true,
"heal": {
"tool": "tape_updateAutomation",
"body": {
"actions": []
}
}
} Try It
Try it
Sign in to execute this tool
Sign InValidate Automation
POST /v1/tools/tape/validateAutomation
Validate an automation and return the current server verdict: whether it is structurally valid and, if not, the broken reasons annotated with remediation. Read-only — always call this before tape_activateAutomation. NOTE: a valid:true result only means there are no dangling references; it does NOT prove the filter selects the right records (an empty or wrong-channel filter value passes validation but matches every record at run time), so also simulate before relying on it.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to validate (from tape_listAutomations). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/validateAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"valid": true,
"errors": [],
"caveat": "valid:true means no dangling references — it is NOT proof the automation does what you intend. The server does not catch an empty or wrong-channel filter value, which passes validation but matches EVERY record at run time (F2). Simulate (tape_simulateAutomation) against a known record to confirm the filter actually selects what you expect."
}Alternate mode
{
"valid": false,
"errors": [
{
"code": "filter_variable_missing",
"message": "Filter references field 55012 which does not exist.",
"remediation": "The filter references a field/variable that no longer exists. Re-point the condition's subject to a current field_id …",
"deactivated": false,
"block_id": null,
"action_id": null,
"field_id": 55012,
"app_id": 87
}
],
"caveat": "valid:true means no dangling references — it is NOT proof the automation does what you intend. The server does not catch an empty or wrong-channel filter value, which passes validation but matches EVERY record at run time (F2). Simulate (tape_simulateAutomation) against a known record to confirm the filter actually selects what you expect."
} Try It
Try it
Sign in to execute this tool
Sign InGet Automation Revisions
POST /v1/tools/tape/getAutomationRevisions
List an automation's revision history (newest first), or fetch one frozen revision snapshot by passing revision_id. Each revision is the full definition as it was at that point. ROLLBACK RECIPE: fetch the target revision (with revision_id) to get its trigger/filter/actions, then pass those to tape_updateAutomation to restore them. A webhook_received trigger's webhook_url is stable across a rollback — it is NOT regenerated, so external callers keep working.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation whose revisions you want (from tape_listAutomations). |
revision_id | string | optional | Fetch one specific revision snapshot (its full frozen definition) instead of the history list. Revision ids are 64-bit values returned as strings — pass the string exactly. Omit to list the history. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getAutomationRevisions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"revisions": [
{
"id": "90071234500000001",
"automation_id": 4021,
"created_at": "2026-05-20 16:03:08",
"name": "Email owner on new high-priority lead",
"paused": false,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1
}
],
"count": 1
}Alternate mode
{
"id": "90071234500000001",
"automation_id": 4021,
"created_at": "2026-05-20 16:03:08",
"name": "Email owner on new high-priority lead",
"paused": false,
"broken": false,
"trigger": {
"type": "record_created",
"config": {}
},
"filter": null,
"actions": [
{
"type": "send_email",
"config": {}
}
]
} Try It
Try it
Sign in to execute this tool
Sign InCreate Automation
POST /v1/tools/tape/createAutomation
Create a new automation in an app. Supply a name and optionally a trigger ({type, config}), a filter tree, and an ordered actions array. The trigger/filter/actions are validated client-side BEFORE sending — this catches wrong shapes with a faster, clearer fix than a round-trip and mirrors Tape's own write-boundary validation (as of 2026-07-21 Tape 400s wrong-channel filter values, empty-composed values, and empty filter groups), so a validation rejection here saves a wasted call. New automations are created paused/inactive; validate then activate to make one live. Write custom_code / custom_variable code multi-line, indented, and commented — it is displayed in Tape's code editor.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
app_id | number | required | The app to create the automation in (from tape_listApps / tape_getApp). |
name | string | required | Automation name (1–5000 chars). |
description | string | optional | Optional description (up to 25000 chars). |
trigger | object,null | optional | Trigger { type, config } (types from tape_getAutomationCatalog). Pass null EXPLICITLY to create a manual-only automation (the Tape web editor hides the actions panel for trigger-less automations). Omitting the field entirely is rejected. |
filter | object | optional | Optional filter tree { operator:"and"|"or", rows:[…] }. Choose the value channel that matches the field/operator (text/number/ids/date) — Tape rejects a mismatch at the write boundary with a 400 (verified 2026-07-21). Omit the filter (or pass null) to run unfiltered; an empty group { rows:[] } is rejected. |
actions | array | optional | Ordered actions. Control-flow members (condition/action_rows/iterable/…) live INSIDE each action config, not at the top level. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/createAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"app_id": "123",
"name": "example"
}'Response
{
"created": true,
"automation": {
"id": 4090,
"name": "Notify on new lead",
"app_id": 87,
"workspace_id": 12,
"paused": true,
"broken": false,
"trigger_type": "record_created",
"has_filter": false,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-07-21 14:05:12",
"updated_at": "2026-07-21 14:05:12"
},
"note": "Created. New automations start paused and (until validated + activated) inactive: run tape_validateAutomation, then tape_activateAutomation to make it live. You can also tape_runAutomation / tape_simulateAutomation it before activating."
} Try It
Try it
Sign in to execute this tool
Sign InUpdate Automation
POST /v1/tools/tape/updateAutomation
Update an automation (partial). Any field you omit is left unchanged; explicit null clears description/trigger/filter (name cannot be null); actions, when provided, REPLACES the whole action list (send [] to clear). Fetch the current definition with tape_getAutomation verbose:true first if you are editing part of it. The trigger/filter/actions you send are validated client-side before the write. This is also how you HEAL a bricked automation — pass actions:[] to make it readable again. Write custom_code / custom_variable code multi-line, indented, and commented — it is displayed in Tape's code editor.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to update. |
name | string | optional | New name (cannot be null). |
description | string,null | optional | New description, or null to clear it. |
trigger | object,null | optional | New trigger { type, config }, or null to REMOVE the trigger. Omit to leave it unchanged. |
filter | object,null | optional | New filter tree, or null to clear it. Omit to leave unchanged. |
actions | array | optional | Replaces the ENTIRE action list. Send [] to remove all actions. Omit to leave actions unchanged. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/updateAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"updated": true,
"automation": {
"id": 4021,
"name": "Notify on new lead",
"app_id": 87,
"workspace_id": 12,
"paused": false,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email",
"current_record_update"
],
"action_count": 2,
"total_action_count": 2,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-07-21 14:07:45"
}
} Try It
Try it
Sign in to execute this tool
Sign InReplace Automation Trigger
POST /v1/tools/tape/replaceAutomationTrigger
Replace an automation's trigger. The whole body is the trigger ({type, config}); it always REPLACES any existing trigger (it never removes one — to remove a trigger entirely, use tape_updateAutomation with trigger:null). Get valid trigger types and their config keys from tape_getAutomationCatalog. Do NOT include app_id in the config — it is taken from the automation. The server-assigned webhook_url is stable across trigger replacement — external callers keep working.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation whose trigger to replace. |
type | string | required | Trigger type (from tape_getAutomationCatalog), e.g. "record_created". |
config | object | optional | Trigger config object. Use {} for server defaults. Do NOT include app_id. For date_field_arrived, starting_at_hour is in the automation CREATOR's local timezone. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/replaceAutomationTrigger \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123",
"type": "example"
}'Response
{
"updated": true,
"automation": {
"id": 4021,
"name": "Notify on new lead",
"app_id": 87,
"workspace_id": 12,
"paused": false,
"broken": false,
"trigger_type": "record_updated",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-07-21 14:09:02"
}
} Try It
Try it
Sign in to execute this tool
Sign InDelete Automation
POST /v1/tools/tape/deleteAutomation
Soft-delete an automation. It stops running immediately and its runs vanish from run listings. NOTE: on this API a delete can return a 500 yet still succeed (bricked pre-migration automations) — this tool detects that case with a follow-up read and reports success-with-caveat instead of a misleading error.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to delete. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/deleteAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"deleted": true,
"automation": {
"id": 4021,
"name": "Notify on new lead",
"app_id": 87,
"workspace_id": 12,
"paused": true,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-05-20 16:03:08"
},
"note": "Soft-deleted. Its runs no longer appear in run listings."
}Alternate mode
{
"deleted": true,
"caveat": "The delete returned a 500 but a follow-up read now 404s — the deletion persisted (F8)."
} Try It
Try it
Sign in to execute this tool
Sign InActivate Automation
POST /v1/tools/tape/activateAutomation
Activate an automation so it runs live when its trigger fires. This ALWAYS validates first: if the definition is broken it returns the broken reasons with per-code remediation and does NOT attempt activation — fix them (usually via tape_updateAutomation) and retry. Reminder: a structurally valid automation can still have an empty/wrong-channel filter that matches every record — simulate before activating anything that mutates data or sends messages.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to activate. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/activateAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"activated": true,
"automation": {
"id": 4021,
"name": "Email owner on new high-priority lead",
"app_id": 87,
"workspace_id": 12,
"paused": false,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-05-20 16:03:08"
},
"note": "Now live. It will run when its trigger fires."
}Alternate mode
{
"activated": false,
"error": "Automation 4021 is broken and was not activated. 1 issue(s) must be fixed first.",
"error_code": "automation_broken",
"issues": [
{
"code": "filter_variable_missing",
"message": "Filter references field 55012 which does not exist.",
"remediation": "The filter references a field/variable that no longer exists. …",
"deactivated": false
}
],
"next": "Fix the issues (usually via tape_updateAutomation), then retry tape_activateAutomation."
} Try It
Try it
Sign in to execute this tool
Sign InPause Automation
POST /v1/tools/tape/pauseAutomation
Pause an automation so it stops running automatically on its trigger. NOTE: pausing does NOT block manual runs — tape_runAutomation still executes a paused automation. Use tape_activateAutomation to resume. Pausing never fails on a broken definition.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to pause. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/pauseAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"paused": true,
"automation": {
"id": 4021,
"name": "Email owner on new high-priority lead",
"app_id": 87,
"workspace_id": 12,
"paused": true,
"broken": false,
"trigger_type": "record_created",
"has_filter": true,
"action_types": [
"send_email"
],
"action_count": 1,
"total_action_count": 1,
"created_at": "2026-05-14 09:12:31",
"updated_at": "2026-05-20 16:03:08"
},
"note": "Paused. It will not run on its trigger. Manual runs (tape_runAutomation) still work."
} Try It
Try it
Sign in to execute this tool
Sign InRun Automation
POST /v1/tools/tape/runAutomation
Manually run an automation once, then poll for the resulting run and return its outcome and logs. Manual runs work even on a PAUSED automation and on one that currently fails validation — they bypass both. Provide record_id for a record-triggered automation (a bad record id returns 404); for a webhook trigger use webhook_payload or use_last_received_webhook_payload; a periodic/no-trigger automation takes none. This has REAL side effects — use tape_simulateAutomation for a dry run. Polling waits briefly for the run to appear and then up to ~55s for it to finish; a run can take up to ~3 minutes, so if it has not finished when polling ends the response says so (with the run id) and you can re-check with tape_getAutomationRun.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to run. |
record_id | number | optional | The record to run against (for record-triggered automations). A record you cannot view or that does not exist returns 404. |
webhook_payload | object | optional | For a webhook_received automation: the payload to run with. Alternatively set use_last_received_webhook_payload. |
use_last_received_webhook_payload | boolean | optional | For a webhook_received automation: run against the last webhook payload Tape received, instead of supplying webhook_payload. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/runAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"ran": true,
"outcome": "completed",
"run": {
"id": "90083001",
"automation_id": 4021,
"automation_name": "Email owner on new high-priority lead",
"app_id": 87,
"status": "completed",
"type": "manual",
"failure_reason": null,
"error_message": null,
"triggered_on_record_id": 175508048,
"num_consumed_actions": 2,
"created_at": "2026-07-14 10:22:03",
"started_at": "2026-07-14 10:22:04",
"completed_at": "2026-07-14 10:22:07",
"execution_duration_ms": 3120
},
"logs": [
{
"id": "90083001-trigger",
"type": "trigger",
"status": "success",
"label": "Trigger",
"action_id": null,
"record_id": 175508048,
"messages": []
},
{
"id": "90083001-action-a1-1",
"type": "action",
"status": "success",
"label": "Send email",
"action_id": "a1",
"record_id": 175508048,
"messages": []
},
{
"id": "90083001-action-a2-1",
"type": "action",
"status": "success",
"label": "Update triggering record",
"action_id": "a2",
"record_id": 175508048,
"messages": []
}
],
"logs_collapsed": false,
"log_step_count": 3
} Try It
Try it
Sign in to execute this tool
Sign InSimulate Automation
POST /v1/tools/tape/simulateAutomation
Simulate (dry-run) an automation against a record and return the outcome and logs WITHOUT any side effects: mutations are suppressed, no messages are sent, and 0 credits are consumed — even though the logs read as if the actions ran. Use this to confirm a filter selects the right record and the actions would do what you expect BEFORE activating. Works on paused automations. Simulation runs appear only in the per-automation run listing.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to simulate. |
record_id | number | optional | The record to simulate against (for record-triggered automations). |
webhook_payload | object | optional | For a webhook_received automation: the payload to simulate with. |
use_last_received_webhook_payload | boolean | optional | For a webhook_received automation: simulate against the last received webhook payload. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/simulateAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123"
}'Response
{
"ran": true,
"outcome": "completed",
"run": {
"id": "90083010",
"automation_id": 4021,
"automation_name": "Email owner on new high-priority lead",
"app_id": 87,
"status": "completed",
"type": "simulation",
"failure_reason": null,
"error_message": null,
"triggered_on_record_id": 175508048,
"num_consumed_actions": 0,
"created_at": "2026-07-14 10:25:11",
"started_at": "2026-07-14 10:25:12",
"completed_at": "2026-07-14 10:25:13",
"execution_duration_ms": 840
},
"logs": [
{
"id": "90083010-trigger",
"type": "trigger",
"status": "success",
"label": "Trigger",
"action_id": null,
"record_id": 175508048,
"messages": []
},
{
"id": "90083010-action-a1-1",
"type": "action",
"status": "success",
"label": "Send email",
"action_id": "a1",
"record_id": 175508048,
"messages": []
}
],
"logs_collapsed": false,
"log_step_count": 2,
"note": "DRY RUN: the log shows the actions as if they ran, but no records were changed, no messages sent, and 0 credits consumed. Simulation runs appear only in the per-automation run listing (tape_listAutomationRuns with scope \"automation\")."
} Try It
Try it
Sign in to execute this tool
Sign InCall Automation
POST /v1/tools/tape/callAutomation
Call an automation via its advanced trigger endpoint against a record, optionally delivering arguments to it, then poll for the resulting run. Pass arguments as a plain {label: value} map — this tool adds the required var_ prefix for you; a label must be snake_case and match a variable the target automation declares, or it delivers as null. A 202 does NOT mean it ran: if no run appears, the response explains the three silent causes (paused/broken, incompatible trigger, or filter rejected the record).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation to call. |
trigger_on_record_id | number | required | The record to run the automation on (this endpoint uses trigger_on_record_id, not record_id). |
arguments | object | optional | Optional {label: value} arguments delivered to the automation. Labels must be snake_case and match the target's declared variables. Do NOT add the var_ prefix — this tool adds it. A non-matching label delivers null. |
triggered_by_record_id | number | optional | Optional id of the record that caused this call (for attribution). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/callAutomation \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123",
"trigger_on_record_id": "123"
}'Response
{
"ran": true,
"outcome": "completed",
"run": {
"id": "90083020",
"automation_id": 441937,
"automation_name": "Escalate ticket to on-call",
"app_id": 152,
"status": "completed",
"type": "regular",
"failure_reason": null,
"error_message": null,
"triggered_on_record_id": 175508048,
"num_consumed_actions": 3,
"created_at": "2026-07-14 11:02:44",
"started_at": "2026-07-14 11:02:45",
"completed_at": "2026-07-14 11:02:49",
"execution_duration_ms": 4210
},
"logs": [
{
"id": "90083020-trigger",
"type": "trigger",
"status": "success",
"label": "Trigger",
"action_id": null,
"record_id": 175508048,
"messages": []
},
{
"type": "action",
"action_id": "a1",
"label": "Update record ×3 iterations",
"iterations": 3,
"status_breakdown": {
"success": 3
},
"sample_messages": []
}
],
"logs_collapsed": true,
"log_step_count": 4
}Alternate mode
{
"ran": false,
"outcome": "no_run",
"note": "No run was produced. A 202 means \"accepted\", not \"ran\" — the target can silently produce no run when it is (1) paused or broken, (2) reached via a trigger type that does not accept this call, or (3) its filter rejected the record. Confirm the automation is active and valid, and that the record matches the trigger and filter."
} Try It
Try it
Sign in to execute this tool
Sign InGenerate Automation Weblink
POST /v1/tools/tape/generateAutomationWeblink
Generate a shareable weblink that runs an automation against a record when clicked. Synchronous — returns the token and URL immediately (host is weblink.tapeapp.com). REQUIRES the target automation to have a weblink_clicked trigger — otherwise the server rejects it with 400 "not a weblink workflow" (set the trigger with tape_replaceAutomationTrigger first). Optionally deliver {label: value} arguments (var_ prefix added for you) and set an expiration. NOTE: expiration_type here is UPPER-CASE (NEVER / ONE_DAY / ONE_WEEK / ONE_MONTH / ONE_YEAR), distinct from the lower-case weblink_expiration used inside action configs.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
automation_id | number | required | The automation the weblink triggers (its workflow definition id). |
trigger_on_record_id | number | required | The record the automation runs against when the link is clicked. |
arguments | object | optional | Optional {label: value} arguments (snake_case labels; var_ prefix added for you) delivered to the automation. |
expiration_type | string | optional | When the link expires (UPPER-CASE enum). Default NEVER. Values: NEVER, ONE_DAY, ONE_WEEK, ONE_MONTH, ONE_YEAR |
expire_after_first_click | boolean | optional | If true, the link is single-use (expires after the first click). |
triggered_by_record_id | number | optional | Optional id of the record that generated this link (for attribution). |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/generateAutomationWeblink \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"automation_id": "123",
"trigger_on_record_id": "123"
}'Response
{
"trigger_token": "wl_9f2c…",
"trigger_client_url": "https://weblink.tapeapp.com/t/wl_9f2c…"
} Try It
Try it
Sign in to execute this tool
Sign InList Automation Runs
POST /v1/tools/tape/listAutomationRuns
List automation runs (execution history), newest first. Choose a scope: "general" (filter across the org by app_ids / automation_ids / workspace_ids / status / created_at range), "app", "workspace", or "automation" (a single id via app_id / workspace_id / automation_id). Only the per-automation scope includes SIMULATION runs. Returns a compact summary per run; verbose:true for full run objects. IMPORTANT: in the general scope a cursor cannot be combined with any filter (the filters are baked into the cursor) — page by re-sending the cursor alone. Runs of a deleted automation disappear from these listings.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
scope | string | optional | Which listing to use. "general" (default) supports cross-org filters; "app"/"workspace"/"automation" list a single id (only "automation" includes simulation runs). Values: general, app, workspace, automation |
app_id | number | optional | Required for scope "app". |
workspace_id | number | optional | Required for scope "workspace". |
automation_id | number | optional | Required for scope "automation". |
cursor | string | optional | Pagination cursor from a previous response. In the general scope it CANNOT be combined with any filter — send it alone. |
limit | number | optional | Max runs to return (default 50, max 500). |
status | array | optional | General scope only: filter to these run statuses. |
app_ids | array | optional | General scope only: filter to runs of these apps (max 100). |
automation_ids | array | optional | General scope only: filter to runs of these automations (max 100). |
workspace_ids | array | optional | General scope only: filter to runs in these workspaces (max 100). |
created_at_from | string | optional | General scope only: UTC "YYYY-MM-DD HH:mm:ss" lower bound (inclusive). |
created_at_to | string | optional | General scope only: UTC "YYYY-MM-DD HH:mm:ss" upper bound (inclusive, >= created_at_from). |
verbose | boolean | optional | Return full run objects instead of the compact summary. Default false. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/listAutomationRuns \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Response
{
"scope": "automation",
"total": 2,
"cursor": null,
"runs": [
{
"id": "90083001",
"automation_id": 4021,
"automation_name": "Email owner on new high-priority lead",
"app_id": 87,
"status": "completed",
"type": "manual",
"failure_reason": null,
"error_message": null,
"triggered_on_record_id": 175508048,
"num_consumed_actions": 2,
"created_at": "2026-07-14 10:22:03",
"started_at": "2026-07-14 10:22:04",
"completed_at": "2026-07-14 10:22:07",
"execution_duration_ms": 3120
}
]
} Try It
Try it
Sign in to execute this tool
Sign InGet Automation Run
POST /v1/tools/tape/getAutomationRun
Retrieve one automation run with its step logs. By default the logs are summarized and per-iteration loop steps are collapsed into a single "action X ×N iterations" entry with a status breakdown; pass full_logs:true for every raw step. Step ids follow "{run_id}-trigger", "{run_id}-filter", and "{run_id}-action-{action_id}-{execution_id}" (an action inside a loop produces one step per iteration). A success-exit ends the run "completed"; only a failure-exit ends it "failed" with failure_reason "exit_on_purpose" — a controlled stop, not a real error.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
run_id | string | required | The run id (from tape_listAutomationRuns). 64-bit — pass it as a string. |
full_logs | boolean | optional | Return every raw log step instead of the collapsed summary. Default false. Use when you need each loop iteration individually. |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getAutomationRun \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"run_id": "example"
}'Response
{
"run": {
"id": "90083001",
"automation_id": 4021,
"automation_name": "Email owner on new high-priority lead",
"app_id": 87,
"status": "completed",
"type": "manual",
"failure_reason": null,
"error_message": null,
"triggered_on_record_id": 175508048,
"num_consumed_actions": 4,
"created_at": "2026-07-14 10:22:03",
"started_at": "2026-07-14 10:22:04",
"completed_at": "2026-07-14 10:22:09",
"execution_duration_ms": 5470
},
"logs": [
{
"id": "90083001-trigger",
"type": "trigger",
"status": "success",
"label": "Trigger",
"action_id": null,
"record_id": 175508048,
"messages": []
},
{
"type": "action",
"action_id": "a1",
"label": "Update record ×3 iterations",
"iterations": 3,
"status_breakdown": {
"success": 3
},
"sample_messages": []
},
{
"id": "90083001-action-a2-1",
"type": "action",
"status": "success",
"label": "Send email",
"action_id": "a2",
"record_id": 175508048,
"messages": []
}
],
"logs_collapsed": true,
"log_step_count": 5
} Try It
Try it
Sign in to execute this tool
Sign InGet Automation Usage
POST /v1/tools/tape/getAutomationUsage
Get the automation usage report for the organization: consumed action counts and succeeded/failed/cancelled run counts, bucketed by the interval resolution you pass. Requires limit (0–100 buckets, newest first; 0 returns an empty list) and interval_resolution (hourly / daily / weekly / monthly / yearly).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | number | required | How many interval buckets to return, newest first (0–100). 0 returns an empty list. |
interval_resolution | string | required | Bucket size for the report. Values: hourly, daily, weekly, monthly, yearly |
Request
curl -X POST https://api.syncello.io/v1/tools/tape/getAutomationUsage \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
-d '{
"limit": "123",
"interval_resolution": "hourly"
}'Response
{
"organization_id": 875,
"usage_reports": [
{
"from": "2026-07-14 00:00:00",
"to": "2026-07-15 00:00:00",
"num_consumed_actions": 1284,
"num_succeeded_runs": 402,
"num_failed_runs": 7,
"num_cancelled_runs": 0
}
]
} Try It
Try it
Sign in to execute this tool
Sign In