Checking authentication...

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

Read Idempotent

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

NameTypeRequiredDescription
sectionstringoptionalWhich 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_typestringoptionalWhen 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.
detailbooleanoptionalInclude 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

List Automations

Read Idempotent

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

NameTypeRequiredDescription
app_idnumberoptionalList automations belonging to this app (from tape_listApps / tape_getApp).
workspace_idnumberoptionalList automations across this workspace. Ignored if app_id is provided. Omit both app_id and workspace_id to list org-wide.
limitnumberoptionalMax automations to return (default 50, max 100). Use cursor to page.
cursorstringoptionalPagination cursor from a previous response. Scope-pinned — reuse the same scope.
verbosebooleanoptionalReturn 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

Get Automation

Read Idempotent

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation id (from tape_listAutomations).
verbosebooleanoptionalReturn 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

Validate Automation

Read Idempotent

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

NameTypeRequiredDescription
automation_idnumberrequiredThe 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

Get Automation Revisions

Read Idempotent

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation whose revisions you want (from tape_listAutomations).
revision_idstringoptionalFetch 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

Create Automation

Write

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

NameTypeRequiredDescription
app_idnumberrequiredThe app to create the automation in (from tape_listApps / tape_getApp).
namestringrequiredAutomation name (1–5000 chars).
descriptionstringoptionalOptional description (up to 25000 chars).
triggerobject,nulloptionalTrigger { 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.
filterobjectoptionalOptional 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.
actionsarrayoptionalOrdered 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

Update Automation

Write

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation to update.
namestringoptionalNew name (cannot be null).
descriptionstring,nulloptionalNew description, or null to clear it.
triggerobject,nulloptionalNew trigger { type, config }, or null to REMOVE the trigger. Omit to leave it unchanged.
filterobject,nulloptionalNew filter tree, or null to clear it. Omit to leave unchanged.
actionsarrayoptionalReplaces 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

Replace Automation Trigger

Write

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation whose trigger to replace.
typestringrequiredTrigger type (from tape_getAutomationCatalog), e.g. "record_created".
configobjectoptionalTrigger 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

Delete Automation

Destructive

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

NameTypeRequiredDescription
automation_idnumberrequiredThe 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

Activate Automation

Read

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

NameTypeRequiredDescription
automation_idnumberrequiredThe 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

Pause Automation

Read

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

NameTypeRequiredDescription
automation_idnumberrequiredThe 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

Run Automation

Read

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation to run.
record_idnumberoptionalThe record to run against (for record-triggered automations). A record you cannot view or that does not exist returns 404.
webhook_payloadobjectoptionalFor a webhook_received automation: the payload to run with. Alternatively set use_last_received_webhook_payload.
use_last_received_webhook_payloadbooleanoptionalFor 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

Simulate Automation

Read

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation to simulate.
record_idnumberoptionalThe record to simulate against (for record-triggered automations).
webhook_payloadobjectoptionalFor a webhook_received automation: the payload to simulate with.
use_last_received_webhook_payloadbooleanoptionalFor 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

Call Automation

Read

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

NameTypeRequiredDescription
automation_idnumberrequiredThe automation to call.
trigger_on_record_idnumberrequiredThe record to run the automation on (this endpoint uses trigger_on_record_id, not record_id).
argumentsobjectoptionalOptional {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_idnumberoptionalOptional 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

List Automation Runs

Read Idempotent

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

NameTypeRequiredDescription
scopestringoptionalWhich 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_idnumberoptionalRequired for scope "app".
workspace_idnumberoptionalRequired for scope "workspace".
automation_idnumberoptionalRequired for scope "automation".
cursorstringoptionalPagination cursor from a previous response. In the general scope it CANNOT be combined with any filter — send it alone.
limitnumberoptionalMax runs to return (default 50, max 500).
statusarrayoptionalGeneral scope only: filter to these run statuses.
app_idsarrayoptionalGeneral scope only: filter to runs of these apps (max 100).
automation_idsarrayoptionalGeneral scope only: filter to runs of these automations (max 100).
workspace_idsarrayoptionalGeneral scope only: filter to runs in these workspaces (max 100).
created_at_fromstringoptionalGeneral scope only: UTC "YYYY-MM-DD HH:mm:ss" lower bound (inclusive).
created_at_tostringoptionalGeneral scope only: UTC "YYYY-MM-DD HH:mm:ss" upper bound (inclusive, >= created_at_from).
verbosebooleanoptionalReturn 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

Get Automation Run

Read Idempotent

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

NameTypeRequiredDescription
run_idstringrequiredThe run id (from tape_listAutomationRuns). 64-bit — pass it as a string.
full_logsbooleanoptionalReturn 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

Get Automation Usage

Read Idempotent

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

NameTypeRequiredDescription
limitnumberrequiredHow many interval buckets to return, newest first (0–100). 0 returns an empty list.
interval_resolutionstringrequiredBucket 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