Kanorio

API reference

Automations

Management API: GET /sites/{id}/automations, PATCH /sites/{id}/automations/{automationKey}/actions/{actionKey}, GET /sites/{id}/automations/catalog, …

Base URL https://app.kanorio.com/api/v1ErrorsPagination

List automations

GET/sites/{id}/automations
betaconsole:viewdefault (120/minute per token)

List the site's built-in automations (what Kanorio sends automatically when store, form and customer-login events happen) with each action's status. Action status: on / off (owner can toggle), locked (always sent), managed_by_destination (webhooks follow endpoint subscriptions; manage with webhooks.*), upgrade_required, coming_soon. The whole list is returned in one page. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Response 200

  • dataobject[]required
  • data[].keystringrequired

    Stable automation key, e.g. order_paid, form_inquiry, customer_login_code.

  • data[].group"forms" | "store" | "customers"required
  • data[].triggerEventKeystringrequired

    Webhook event key that triggers it, e.g. ec.order.paid.

  • data[].timing"immediate" | "delayed"required

    delayed = runs later through the automation engine (e.g. payment due reminder).

  • data[].actionsobject[]required
  • data[].actions[].key"customer_email" | "team_email" | "team_in_app" | "team_webhook"required
  • data[].actions[].audience"customer" | "team"required
  • data[].actions[].channelstringrequired
  • data[].actions[].status"on" | "off" | "locked" | "managed_by_destination" | "upgrade_required" | "coming_soon"required
  • data[].actions[].minPlanstring | nullrequired

    Plan required when status is upgrade_required.

  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403

MCP tool automations_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "key": "order_paid",
      "group": "store",
      "triggerEventKey": "ec.order.paid",
      "timing": "immediate",
      "actions": [
        {
          "key": "customer_email",
          "audience": "customer",
          "channel": "email",
          "status": "locked",
          "minPlan": null
        },
        {
          "key": "team_email",
          "audience": "team",
          "channel": "email",
          "status": "on",
          "minPlan": null
        },
        {
          "key": "team_in_app",
          "audience": "team",
          "channel": "in_app",
          "status": "on",
          "minPlan": null
        },
        {
          "key": "team_webhook",
          "audience": "team",
          "channel": "webhook",
          "status": "managed_by_destination",
          "minPlan": null
        }
      ]
    },
    {
      "key": "payment_due_soon",
      "group": "store",
      "triggerEventKey": "ec.checkout.payment_instructions_issued",
      "timing": "delayed",
      "actions": [
        {
          "key": "customer_email",
          "audience": "customer",
          "channel": "email",
          "status": "on",
          "minPlan": null
        }
      ]
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Set action enabled

PATCH/sites/{id}/automations/{automationKey}/actions/{actionKey}
betaconsole:viewdefault (120/minute per token)

Turn one action of a built-in automation on or off (e.g. stop the shipment email to customers, or stop team emails for form submissions). Requires the manage permission of the automation's group: store → commerce:manage, forms → marketing:manage, customers → customers:manage. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, ACTION_NOT_FOUND, LOCKED (always-sent action), MANAGED_BY_DESTINATION (webhooks follow endpoint subscriptions), PLAN_REQUIRED, COMING_SOON.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationKeystring · pathrequired

    Automation key from automations.list, e.g. shipment_shipped.

  • actionKeystring · pathrequired

    One of customer_email, team_email, team_in_app, team_webhook.

Request body

  • enabledbooleanrequired

Response 200

  • automationKeystringrequired
  • actionKey"customer_email" | "team_email" | "team_in_app" | "team_webhook"required
  • enabledbooleanrequired

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404
  • ACTION_NOT_FOUND 404
  • LOCKED 403 · always-sent action
  • MANAGED_BY_DESTINATION 422 · webhooks follow endpoint subscriptions
  • PLAN_REQUIRED 403
  • COMING_SOON 422

MCP tool automations_set_action_enabled

curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/automations/{automationKey}/actions/{actionKey}" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'
Response
{
  "automationKey": "shipment_shipped",
  "actionKey": "customer_email",
  "enabled": false
}

Retrieve a catalog

GET/sites/{id}/automations/catalog
betaconsole:viewdefault (120/minute per token)

Resolve the automation catalog for this site: triggers (event key, JSON schema of the payload a flow can read via var(), identity/futureDate/cancelRef fields) and actions (input/output JSON schemas, required permission, plan). Build graphs only from these keys; automations.flows.validate checks every var() path against the trigger schema and ancestor outputs. Custom triggers (custom:<id>) appear here too. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Response 200

  • triggersobject[]required
  • triggers[].keystringrequired
  • triggers[].source"tenant_event" | "platform_event" | "custom"required
  • triggers[].groupstringrequired
  • triggers[].titlestringrequired
  • triggers[].descriptionstringrequired
  • triggers[].payloadSchemaobjectrequired
  • triggers[].identityobject | nullrequired
  • triggers[].identity.fieldstringrequired
  • triggers[].identity.type"contact"required
  • triggers[].futureDateFieldstring | nullrequired
  • triggers[].cancelRefFieldstring | nullrequired
  • triggers[].filtersobject[]required
  • triggers[].filters[].fieldstringrequired
  • triggers[].filters[].titlestringrequired
  • triggers[].requiredPermissionstring | nullrequired
  • triggers[].minPlanstringrequired
  • actionsobject[]required
  • actions[].keystringrequired
  • actions[].groupstringrequired
  • actions[].titlestringrequired
  • actions[].descriptionstringrequired
  • actions[].inputSchemaobjectrequired
  • actions[].outputSchemaobjectrequired
  • actions[].permissionstring | nullrequired
  • actions[].minPlanstringrequired
  • actions[].idempotentbooleanrequired
  • actions[].compensablebooleanrequired

Errors

  • FORBIDDEN 403

MCP tool automations_catalog_get

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/catalog" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "triggers": [
    {
      "key": "ec.order.paid",
      "source": "tenant_event",
      "group": "store",
      "title": "Order paid",
      "description": "A buyer completed payment for an order.",
      "payloadSchema": {
        "type": "object",
        "properties": {
          "contactId": {
            "type": "string",
            "title": "Contact id",
            "description": "Contact id of the person the event is about."
          },
          "orderId": {
            "type": "string",
            "title": "Order id",
            "description": "Order id."
          }
        }
      },
      "identity": {
        "field": "contactId",
        "type": "contact"
      },
      "futureDateField": null,
      "cancelRefField": null,
      "filters": [],
      "requiredPermission": "commerce:manage",
      "minPlan": "FREE"
    }
  ],
  "actions": [
    {
      "key": "contacts.add_label",
      "group": "contacts",
      "title": "Add label to contact",
      "description": "Add a label (tag) to the contact.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "contactId": {
            "type": "string",
            "title": "Contact id",
            "description": "Contact id."
          },
          "label": {
            "type": "string",
            "title": "Label",
            "description": "Label text."
          }
        },
        "required": [
          "contactId",
          "label"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "changed": {
            "type": "boolean",
            "title": "Changed",
            "description": "Whether the label was added."
          }
        }
      },
      "permission": "customers:manage",
      "minPlan": "FREE",
      "idempotent": true,
      "compensable": true
    }
  ]
}

List templates

GET/sites/{id}/automations/templates
betaconsole:viewdefault (120/minute per token)

List ready-made automation templates (a pre-built graph plus what the site owner still has to fill in: an external URL, a course id, an amount threshold). Pass template.graph to automations.flows.create after filling the empty required inputs; validate first. Only templates whose trigger is in this site's catalog are returned, all in one page. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Response 200

  • dataobject[]required
  • data[].keystringrequired
  • data[].category"store" | "forms" | "courses" | "headless"required
  • data[].titlestringrequired
  • data[].descriptionstringrequired
  • data[].needs"url" | "deliverable" | "threshold"[]required
  • data[].graphobjectrequired
  • data[].graph.triggerobjectrequired
  • data[].graph.rootActionIdsstring[]required
  • data[].graph.actionsobjectrequired
  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403

MCP tool automations_templates_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/templates" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "key": "store_vip_label",
      "category": "store",
      "title": "Label big spenders as VIP",
      "description": "When an order above your threshold is paid, add the VIP label to the buyer.",
      "needs": [
        "threshold"
      ],
      "graph": {
        "trigger": {
          "triggerKey": "ec.order.paid",
          "filters": []
        },
        "rootActionIds": [
          "c1"
        ],
        "actions": {
          "c1": {
            "id": "c1",
            "type": "CONDITION",
            "namespace": "CONDITION-1",
            "conditionInfo": {
              "orExpressionGroups": [
                {
                  "operator": "AND",
                  "booleanExpressions": [
                    "{{numberGt(var(\"amount\");10000)}}"
                  ]
                }
              ],
              "truePostActionIds": [
                "a2"
              ],
              "falsePostActionIds": []
            }
          },
          "a2": {
            "id": "a2",
            "type": "APP_DEFINED",
            "namespace": "contacts_add_label-2",
            "appDefinedInfo": {
              "actionKey": "contacts.add_label",
              "inputMapping": {
                "contactId": "{{var(\"contactId\")}}",
                "label": "VIP"
              },
              "postActionIds": []
            }
          }
        }
      }
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

List flows

GET/sites/{id}/automations/flows
betaconsole:viewdefault (120/minute per token)

List the site's owner-built automations (Automation objects with their published graph, status and revision). Preinstalled scenario automations are listed by automations.list. Errors: FORBIDDEN, INVALID_CURSOR.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • includeArchivedboolean · query

    Include archived automations.

  • limitinteger · query

    Maximum number of items to return, 1–100. Defaults to 20.

  • cursorstring · query

    Opaque cursor from the previous page's nextCursor. Omit for the first page.

Response 200

  • dataobject[]required
  • data[].idstringrequired
  • data[].keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • data[].namestringrequired
  • data[].descriptionstring | nullrequired
  • data[].origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • data[].status"ACTIVE" | "INACTIVE"required
  • data[].revisionintegerrequired

    Send it back on update (optimistic lock).

  • data[].archivedbooleanrequired
  • data[].settingsobject | nullrequired
  • data[].settings.readonlyboolean
  • data[].settings.disableDeleteboolean
  • data[].settings.disableStatusChangeboolean
  • data[].settings.actionSettingsobject
  • data[].graphobjectrequired
  • data[].graph.triggerobjectrequired
  • data[].graph.rootActionIdsstring[]required
  • data[].graph.actionsobjectrequired
  • data[].draftobject | nullrequired
  • data[].draft.triggerobjectrequired
  • data[].draft.rootActionIdsstring[]required
  • data[].draft.actionsobjectrequired
  • data[].createdAtstringrequired
  • data[].updatedAtstringrequired
  • data[].lastTriggeredAtstring | nullrequired
  • data[].triggerCountintegerrequired
  • data[].autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403
  • INVALID_CURSOR 400

MCP tool automations_flows_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/flows" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "id": "auto_example01",
      "key": "db:auto_example01",
      "name": "Label big spenders",
      "description": null,
      "origin": "USER",
      "status": "INACTIVE",
      "revision": 1,
      "archived": false,
      "settings": null,
      "graph": {
        "trigger": {
          "triggerKey": "ec.order.paid",
          "filters": []
        },
        "rootActionIds": [
          "c1"
        ],
        "actions": {
          "c1": {
            "id": "c1",
            "type": "CONDITION",
            "namespace": "CONDITION-1",
            "displayName": "Big order?",
            "conditionInfo": {
              "orExpressionGroups": [
                {
                  "operator": "AND",
                  "booleanExpressions": [
                    "{{numberGt(var(\"amount\");100000)}}"
                  ]
                }
              ],
              "truePostActionIds": [
                "a2"
              ],
              "falsePostActionIds": []
            }
          },
          "a2": {
            "id": "a2",
            "type": "APP_DEFINED",
            "namespace": "contacts_add_label-2",
            "displayName": "Label as VIP",
            "appDefinedInfo": {
              "actionKey": "contacts.add_label",
              "inputMapping": {
                "contactId": "{{var(\"contactId\")}}",
                "label": "vip"
              },
              "postActionIds": []
            }
          }
        }
      },
      "draft": null,
      "createdAt": "2026-10-31T12:00:00.000Z",
      "updatedAt": "2026-10-31T12:00:00.000Z",
      "lastTriggeredAt": null,
      "triggerCount": 0,
      "autoPausedAt": null
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Create a flow

POST/sites/{id}/automations/flows
betaautomations:managedefault (120/minute per token)

Create an owner-built automation (created INACTIVE; activate with automations.flows.set_status). The graph must be VALID: a trigger from the catalog and a single-parent tree of actions (APP_DEFINED, CONDITION, DELAY, RATE_LIMIT, SET_VARIABLES, SPLIT). Expressions use {{…}} with var("path") and the catalog function list; string literals are URI-encoded. Errors: FORBIDDEN, VALIDATION, INVALID_AUTOMATION (details.validation lists the node errors).

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • namestringrequired
  • descriptionstring | null
  • graphanyrequired

Response 201

  • idstringrequired
  • keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • namestringrequired
  • descriptionstring | nullrequired
  • origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • status"ACTIVE" | "INACTIVE"required
  • revisionintegerrequired

    Send it back on update (optimistic lock).

  • archivedbooleanrequired
  • settingsobject | nullrequired
  • settings.readonlyboolean
  • settings.disableDeleteboolean
  • settings.disableStatusChangeboolean
  • settings.actionSettingsobject
  • settings.actionSettings.readonlyActionIdsstring[]required
  • settings.actionSettings.permanentActionIdsstring[]required
  • graphobjectrequired
  • graph.triggerobjectrequired
  • graph.trigger.triggerKeystringrequired
  • graph.trigger.filtersobject[]required
  • graph.trigger.scheduledEventOffsetobject
  • graph.rootActionIdsstring[]required
  • graph.actionsobjectrequired
  • draftobject | nullrequired
  • draft.triggerobjectrequired
  • draft.trigger.triggerKeystringrequired
  • draft.trigger.filtersobject[]required
  • draft.trigger.scheduledEventOffsetobject
  • draft.rootActionIdsstring[]required
  • draft.actionsobjectrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • lastTriggeredAtstring | nullrequired
  • triggerCountintegerrequired
  • autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

Errors

  • FORBIDDEN 403
  • VALIDATION 400
  • INVALID_AUTOMATION 400 · details.validation lists the node errors

MCP tool automations_flows_create

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/flows" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Label big spenders","graph":{"trigger":{"triggerKey":"ec.order.paid","filters":[]},"rootActionIds":["c1"],"actions":{"c1":{"id":"c1","type":"CONDITION","namespace":"CONDITION-1","displayName":"Big order?","conditionInfo":{"orExpressionGroups":[{"operator":"AND","booleanExpressions":["{{numberGt(var(\"amount\");100000)}}"]}],"truePostActionIds":["a2"],"falsePostActionIds":[]}},"a2":{"id":"a2","type":"APP_DEFINED","namespace":"contacts_add_label-2","displayName":"Label as VIP","appDefinedInfo":{"actionKey":"contacts.add_label","inputMapping":{"contactId":"{{var(\"contactId\")}}","label":"vip"},"postActionIds":[]}}}}}'
Response
{
  "id": "auto_example01",
  "key": "db:auto_example01",
  "name": "Label big spenders",
  "description": null,
  "origin": "USER",
  "status": "INACTIVE",
  "revision": 1,
  "archived": false,
  "settings": null,
  "graph": {
    "trigger": {
      "triggerKey": "ec.order.paid",
      "filters": []
    },
    "rootActionIds": [
      "c1"
    ],
    "actions": {
      "c1": {
        "id": "c1",
        "type": "CONDITION",
        "namespace": "CONDITION-1",
        "displayName": "Big order?",
        "conditionInfo": {
          "orExpressionGroups": [
            {
              "operator": "AND",
              "booleanExpressions": [
                "{{numberGt(var(\"amount\");100000)}}"
              ]
            }
          ],
          "truePostActionIds": [
            "a2"
          ],
          "falsePostActionIds": []
        }
      },
      "a2": {
        "id": "a2",
        "type": "APP_DEFINED",
        "namespace": "contacts_add_label-2",
        "displayName": "Label as VIP",
        "appDefinedInfo": {
          "actionKey": "contacts.add_label",
          "inputMapping": {
            "contactId": "{{var(\"contactId\")}}",
            "label": "vip"
          },
          "postActionIds": []
        }
      }
    }
  },
  "draft": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:00.000Z",
  "lastTriggeredAt": null,
  "triggerCount": 0,
  "autoPausedAt": null
}

Validate a flow

POST/sites/{id}/automations/flows/validate
betaconsole:viewdefault (120/minute per token)

Validate an automation graph without saving it (Wix Validate Automation semantics): structural invariants, trigger/action keys against the catalog, inputMapping types, every var() path against the aggregated schema, condition vocabulary, delays, rate limits, permissions and plan. Returns status VALID / VALID_WITH_WARNINGS / INVALID with per-node errors (nodeId, fieldKey, errorType, severity). WARNING severity never blocks publishing: TRIGGER_SHARED_BY_MANY (more than 10 active automations would use this trigger — consider merging them into one with conditions) and ACTION_MAY_RETRIGGER (an action emits the automation's own trigger event — add a condition so it does not trigger itself). Pass automationId when validating an existing automation so it is not counted against itself. Call it before create, update and activation. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • graphanyrequired

    Automation graph: { trigger, rootActionIds, actions }.

  • automationIdstring

    The automation being edited, if any; excluded when counting other active automations on the same trigger.

Response 200

  • status"VALID" | "VALID_WITH_WARNINGS" | "INVALID"required
  • triggerErrorsobject[]required
  • triggerErrors[].nodeIdstring | nullrequired
  • triggerErrors[].fieldKeystring | nullrequired
  • triggerErrors[].errorTypestringrequired
  • triggerErrors[].severity"CRITICAL" | "WARNING"required
  • triggerErrors[].messagestringrequired
  • actionErrorsobject[]required
  • actionErrors[].nodeIdstring | nullrequired
  • actionErrors[].fieldKeystring | nullrequired
  • actionErrors[].errorTypestringrequired
  • actionErrors[].severity"CRITICAL" | "WARNING"required
  • actionErrors[].messagestringrequired

Errors

  • FORBIDDEN 403

MCP tool automations_flows_validate

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/validate" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"graph":{"trigger":{"triggerKey":"ec.order.paid","filters":[]},"rootActionIds":["c1"],"actions":{"c1":{"id":"c1","type":"CONDITION","namespace":"CONDITION-1","displayName":"Big order?","conditionInfo":{"orExpressionGroups":[{"operator":"AND","booleanExpressions":["{{numberGt(var(\"amount\");100000)}}"]}],"truePostActionIds":["a2"],"falsePostActionIds":[]}},"a2":{"id":"a2","type":"APP_DEFINED","namespace":"contacts_add_label-2","displayName":"Label as VIP","appDefinedInfo":{"actionKey":"contacts.add_label","inputMapping":{"contactId":"{{var(\"contactId\")}}","label":"vip"},"postActionIds":[]}}}}}'
Response
{
  "status": "VALID",
  "triggerErrors": [],
  "actionErrors": []
}

Test a flow

POST/sites/{id}/automations/flows/test
betaautomations:manageheavy (20/minute per token, plus 20/minute per site)

Test-run an automation with a sample trigger payload (Wix Test Automation): actions REALLY execute (emails are sent, labels added, HTTP requests fired); delays and rate limits are skipped; the automation need not be ACTIVE. Pass confirm: true to acknowledge the side effects. Poll the run with automations.runs.get or operations.get (op_automation_run_<id>). Limited to 20 test runs per site per hour. Errors: FORBIDDEN, CONFIRM_REQUIRED, AUTOMATION_NOT_FOUND, PAYLOAD_INVALID, RATE_LIMITED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • automationKeystringrequired

    db:<id> or system:<name>.

  • payloadobjectrequired

    Trigger payload matching the trigger's schema.

  • confirmbooleanrequired

    Must be true: the test executes real actions.

Response 202

  • runIdstringrequired
  • operationIdstringrequired

Errors

  • FORBIDDEN 403
  • CONFIRM_REQUIRED 400
  • AUTOMATION_NOT_FOUND 404
  • PAYLOAD_INVALID 422
  • RATE_LIMITED 429

MCP tool automations_flows_test

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/test" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"automationKey":"db:auto_example01","payload":{"contactId":"cnt_01","orderId":"ord_01","amount":250000,"currency":"USD","itemCount":1},"confirm":true}'
Response
{
  "runId": "run_example02",
  "operationId": "op_automation_run_run_example02"
}

Retrieve a flow

GET/sites/{id}/automations/flows/{automationId}
betaconsole:viewdefault (120/minute per token)

Get one owner-built automation with its graph, draft and revision. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationIdstring · pathrequired

    Automation id (from automations.flows.list).

Response 200

  • idstringrequired
  • keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • namestringrequired
  • descriptionstring | nullrequired
  • origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • status"ACTIVE" | "INACTIVE"required
  • revisionintegerrequired

    Send it back on update (optimistic lock).

  • archivedbooleanrequired
  • settingsobject | nullrequired
  • settings.readonlyboolean
  • settings.disableDeleteboolean
  • settings.disableStatusChangeboolean
  • settings.actionSettingsobject
  • settings.actionSettings.readonlyActionIdsstring[]required
  • settings.actionSettings.permanentActionIdsstring[]required
  • graphobjectrequired
  • graph.triggerobjectrequired
  • graph.trigger.triggerKeystringrequired
  • graph.trigger.filtersobject[]required
  • graph.trigger.scheduledEventOffsetobject
  • graph.rootActionIdsstring[]required
  • graph.actionsobjectrequired
  • draftobject | nullrequired
  • draft.triggerobjectrequired
  • draft.trigger.triggerKeystringrequired
  • draft.trigger.filtersobject[]required
  • draft.trigger.scheduledEventOffsetobject
  • draft.rootActionIdsstring[]required
  • draft.actionsobjectrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • lastTriggeredAtstring | nullrequired
  • triggerCountintegerrequired
  • autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404

MCP tool automations_flows_get

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "id": "auto_example01",
  "key": "db:auto_example01",
  "name": "Label big spenders",
  "description": null,
  "origin": "USER",
  "status": "INACTIVE",
  "revision": 1,
  "archived": false,
  "settings": null,
  "graph": {
    "trigger": {
      "triggerKey": "ec.order.paid",
      "filters": []
    },
    "rootActionIds": [
      "c1"
    ],
    "actions": {
      "c1": {
        "id": "c1",
        "type": "CONDITION",
        "namespace": "CONDITION-1",
        "displayName": "Big order?",
        "conditionInfo": {
          "orExpressionGroups": [
            {
              "operator": "AND",
              "booleanExpressions": [
                "{{numberGt(var(\"amount\");100000)}}"
              ]
            }
          ],
          "truePostActionIds": [
            "a2"
          ],
          "falsePostActionIds": []
        }
      },
      "a2": {
        "id": "a2",
        "type": "APP_DEFINED",
        "namespace": "contacts_add_label-2",
        "displayName": "Label as VIP",
        "appDefinedInfo": {
          "actionKey": "contacts.add_label",
          "inputMapping": {
            "contactId": "{{var(\"contactId\")}}",
            "label": "vip"
          },
          "postActionIds": []
        }
      }
    }
  },
  "draft": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:00.000Z",
  "lastTriggeredAt": null,
  "triggerCount": 0,
  "autoPausedAt": null
}

Update a flow

PATCH/sites/{id}/automations/flows/{automationId}
betaautomations:managedefault (120/minute per token)

Update name, description or graph of an owner-built automation. Send the current revision (optimistic lock; REVISION_CONFLICT otherwise). A new graph must be VALID; updating an ACTIVE automation takes effect immediately. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, REVISION_CONFLICT, INVALID_AUTOMATION, LOCKED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationIdstring · pathrequired

Request body

  • revisionintegerrequired
  • namestring
  • descriptionstring | null
  • graphany

Response 200

  • idstringrequired
  • keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • namestringrequired
  • descriptionstring | nullrequired
  • origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • status"ACTIVE" | "INACTIVE"required
  • revisionintegerrequired

    Send it back on update (optimistic lock).

  • archivedbooleanrequired
  • settingsobject | nullrequired
  • settings.readonlyboolean
  • settings.disableDeleteboolean
  • settings.disableStatusChangeboolean
  • settings.actionSettingsobject
  • settings.actionSettings.readonlyActionIdsstring[]required
  • settings.actionSettings.permanentActionIdsstring[]required
  • graphobjectrequired
  • graph.triggerobjectrequired
  • graph.trigger.triggerKeystringrequired
  • graph.trigger.filtersobject[]required
  • graph.trigger.scheduledEventOffsetobject
  • graph.rootActionIdsstring[]required
  • graph.actionsobjectrequired
  • draftobject | nullrequired
  • draft.triggerobjectrequired
  • draft.trigger.triggerKeystringrequired
  • draft.trigger.filtersobject[]required
  • draft.trigger.scheduledEventOffsetobject
  • draft.rootActionIdsstring[]required
  • draft.actionsobjectrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • lastTriggeredAtstring | nullrequired
  • triggerCountintegerrequired
  • autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404
  • REVISION_CONFLICT 422
  • INVALID_AUTOMATION 400
  • LOCKED 403

MCP tool automations_flows_update

curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"revision":1,"name":"Label VIP buyers"}'
Response
{
  "id": "auto_example01",
  "key": "db:auto_example01",
  "name": "Label VIP buyers",
  "description": null,
  "origin": "USER",
  "status": "INACTIVE",
  "revision": 2,
  "archived": false,
  "settings": null,
  "graph": {
    "trigger": {
      "triggerKey": "ec.order.paid",
      "filters": []
    },
    "rootActionIds": [
      "c1"
    ],
    "actions": {
      "c1": {
        "id": "c1",
        "type": "CONDITION",
        "namespace": "CONDITION-1",
        "displayName": "Big order?",
        "conditionInfo": {
          "orExpressionGroups": [
            {
              "operator": "AND",
              "booleanExpressions": [
                "{{numberGt(var(\"amount\");100000)}}"
              ]
            }
          ],
          "truePostActionIds": [
            "a2"
          ],
          "falsePostActionIds": []
        }
      },
      "a2": {
        "id": "a2",
        "type": "APP_DEFINED",
        "namespace": "contacts_add_label-2",
        "displayName": "Label as VIP",
        "appDefinedInfo": {
          "actionKey": "contacts.add_label",
          "inputMapping": {
            "contactId": "{{var(\"contactId\")}}",
            "label": "vip"
          },
          "postActionIds": []
        }
      }
    }
  },
  "draft": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:00.000Z",
  "lastTriggeredAt": null,
  "triggerCount": 0,
  "autoPausedAt": null
}

Delete a flow

DELETE/sites/{id}/automations/flows/{automationId}
betaautomations:managedefault (120/minute per token)

Delete an owner-built automation (preinstalled ones cannot be deleted; turn them off instead). Run history is kept. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, LOCKED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationIdstring · pathrequired

Response 200

  • deletedtruerequired

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404
  • LOCKED 403

MCP tool automations_flows_delete

curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "deleted": true
}

Set status

POST/sites/{id}/automations/flows/{automationId}/status
betaautomations:managedefault (120/minute per token)

Turn an owner-built automation on or off. Activation requires a VALID graph and counts against the site's active-automation limit (same on every plan); deactivation never fails on validation. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, INVALID_AUTOMATION, PLAN_LIMIT_REACHED, LOCKED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationIdstring · pathrequired

Request body

  • status"ACTIVE" | "INACTIVE"required

Response 200

  • idstringrequired
  • keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • namestringrequired
  • descriptionstring | nullrequired
  • origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • status"ACTIVE" | "INACTIVE"required
  • revisionintegerrequired

    Send it back on update (optimistic lock).

  • archivedbooleanrequired
  • settingsobject | nullrequired
  • settings.readonlyboolean
  • settings.disableDeleteboolean
  • settings.disableStatusChangeboolean
  • settings.actionSettingsobject
  • settings.actionSettings.readonlyActionIdsstring[]required
  • settings.actionSettings.permanentActionIdsstring[]required
  • graphobjectrequired
  • graph.triggerobjectrequired
  • graph.trigger.triggerKeystringrequired
  • graph.trigger.filtersobject[]required
  • graph.trigger.scheduledEventOffsetobject
  • graph.rootActionIdsstring[]required
  • graph.actionsobjectrequired
  • draftobject | nullrequired
  • draft.triggerobjectrequired
  • draft.trigger.triggerKeystringrequired
  • draft.trigger.filtersobject[]required
  • draft.trigger.scheduledEventOffsetobject
  • draft.rootActionIdsstring[]required
  • draft.actionsobjectrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • lastTriggeredAtstring | nullrequired
  • triggerCountintegerrequired
  • autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404
  • INVALID_AUTOMATION 400
  • PLAN_LIMIT_REACHED 403
  • LOCKED 403

MCP tool automations_flows_set_status

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}/status" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"ACTIVE"}'
Response
{
  "id": "auto_example01",
  "key": "db:auto_example01",
  "name": "Label big spenders",
  "description": null,
  "origin": "USER",
  "status": "ACTIVE",
  "revision": 2,
  "archived": false,
  "settings": null,
  "graph": {
    "trigger": {
      "triggerKey": "ec.order.paid",
      "filters": []
    },
    "rootActionIds": [
      "c1"
    ],
    "actions": {
      "c1": {
        "id": "c1",
        "type": "CONDITION",
        "namespace": "CONDITION-1",
        "displayName": "Big order?",
        "conditionInfo": {
          "orExpressionGroups": [
            {
              "operator": "AND",
              "booleanExpressions": [
                "{{numberGt(var(\"amount\");100000)}}"
              ]
            }
          ],
          "truePostActionIds": [
            "a2"
          ],
          "falsePostActionIds": []
        }
      },
      "a2": {
        "id": "a2",
        "type": "APP_DEFINED",
        "namespace": "contacts_add_label-2",
        "displayName": "Label as VIP",
        "appDefinedInfo": {
          "actionKey": "contacts.add_label",
          "inputMapping": {
            "contactId": "{{var(\"contactId\")}}",
            "label": "vip"
          },
          "postActionIds": []
        }
      }
    }
  },
  "draft": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:00.000Z",
  "lastTriggeredAt": null,
  "triggerCount": 0,
  "autoPausedAt": null
}

Archive a flow

POST/sites/{id}/automations/flows/{automationId}/archive
betaautomations:managedefault (120/minute per token)

Archive (deactivates and hides from the list; runs are kept) or unarchive an owner-built automation. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, LOCKED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationIdstring · pathrequired

Request body

  • archivedboolean

Response 200

  • idstringrequired
  • keystringrequired

    db:<id> for owner-built, system:<name> for preinstalled.

  • namestringrequired
  • descriptionstring | nullrequired
  • origin"USER" | "PREINSTALLED" | "APPLICATION"required
  • status"ACTIVE" | "INACTIVE"required
  • revisionintegerrequired

    Send it back on update (optimistic lock).

  • archivedbooleanrequired
  • settingsobject | nullrequired
  • settings.readonlyboolean
  • settings.disableDeleteboolean
  • settings.disableStatusChangeboolean
  • settings.actionSettingsobject
  • settings.actionSettings.readonlyActionIdsstring[]required
  • settings.actionSettings.permanentActionIdsstring[]required
  • graphobjectrequired
  • graph.triggerobjectrequired
  • graph.trigger.triggerKeystringrequired
  • graph.trigger.filtersobject[]required
  • graph.trigger.scheduledEventOffsetobject
  • graph.rootActionIdsstring[]required
  • graph.actionsobjectrequired
  • draftobject | nullrequired
  • draft.triggerobjectrequired
  • draft.trigger.triggerKeystringrequired
  • draft.trigger.filtersobject[]required
  • draft.trigger.scheduledEventOffsetobject
  • draft.rootActionIdsstring[]required
  • draft.actionsobjectrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • lastTriggeredAtstring | nullrequired
  • triggerCountintegerrequired
  • autoPausedAtstring | nullrequired

    When Kanorio turned this automation off automatically (more than 20 runs in the past 7 days with 95% or more failing); null once it is turned back on.

Errors

  • FORBIDDEN 403
  • AUTOMATION_NOT_FOUND 404
  • LOCKED 403

MCP tool automations_flows_archive

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}/archive" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"archived":true}'
Response
{
  "id": "auto_example01",
  "key": "db:auto_example01",
  "name": "Label big spenders",
  "description": null,
  "origin": "USER",
  "status": "INACTIVE",
  "revision": 2,
  "archived": true,
  "settings": null,
  "graph": {
    "trigger": {
      "triggerKey": "ec.order.paid",
      "filters": []
    },
    "rootActionIds": [
      "c1"
    ],
    "actions": {
      "c1": {
        "id": "c1",
        "type": "CONDITION",
        "namespace": "CONDITION-1",
        "displayName": "Big order?",
        "conditionInfo": {
          "orExpressionGroups": [
            {
              "operator": "AND",
              "booleanExpressions": [
                "{{numberGt(var(\"amount\");100000)}}"
              ]
            }
          ],
          "truePostActionIds": [
            "a2"
          ],
          "falsePostActionIds": []
        }
      },
      "a2": {
        "id": "a2",
        "type": "APP_DEFINED",
        "namespace": "contacts_add_label-2",
        "displayName": "Label as VIP",
        "appDefinedInfo": {
          "actionKey": "contacts.add_label",
          "inputMapping": {
            "contactId": "{{var(\"contactId\")}}",
            "label": "vip"
          },
          "postActionIds": []
        }
      }
    }
  },
  "draft": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:00.000Z",
  "lastTriggeredAt": null,
  "triggerCount": 0,
  "autoPausedAt": null
}

List runs

GET/sites/{id}/automations/runs
betaconsole:viewdefault (120/minute per token)

List automation runs (newest first) with status PENDING / WAITING (delay) / RUNNING / DONE / CANCELED / FAILED / SKIPPED (not run: the trigger was blocked by loop protection — causation depth over 16 — or by the trigger rate limit; lastError says which, and one record covers each 30-second window per automation and reason); filter by automationKey, status or contactId. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • automationKeystring · query
  • status"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED" · query
  • contactIdstring · query
  • limitinteger · query

    Maximum number of items to return, 1–100. Defaults to 20.

  • cursorstring · query

    Opaque cursor from the previous page's nextCursor. Omit for the first page.

Response 200

  • dataobject[]required
  • data[].idstringrequired
  • data[].automationKeystringrequired
  • data[].automationIdstring | nullrequired
  • data[].revisioninteger | nullrequired
  • data[].status"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED"required
  • data[].initiation"TRIGGER" | "MANUAL" | "RERUN" | "TEST"required
  • data[].triggerEventKeystringrequired
  • data[].triggerEventIdstringrequired
  • data[].contactIdstring | nullrequired
  • data[].subjectTypestring | nullrequired
  • data[].subjectIdstring | nullrequired
  • data[].currentNodeIdstring | nullrequired
  • data[].runAtstringrequired
  • data[].waitUntilstring | nullrequired
  • data[].attemptsintegerrequired
  • data[].lastErrorstring | nullrequired
  • data[].causationDepthintegerrequired
  • data[].parentRunIdstring | nullrequired
  • data[].messageLogIdstring | nullrequired
  • data[].createdAtstringrequired
  • data[].updatedAtstringrequired
  • data[].stepsobject[]
  • data[].steps[].idstringrequired
  • data[].steps[].nodeIdstringrequired
  • data[].steps[].typestringrequired
  • data[].steps[].namespacestringrequired
  • data[].steps[].status"PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "SKIPPED" | "CANCELED"required
  • data[].steps[].attemptsintegerrequired
  • data[].steps[].startedAtstring | nullrequired
  • data[].steps[].finishedAtstring | nullrequired
  • data[].steps[].inputanyrequired
  • data[].steps[].outputanyrequired
  • data[].steps[].errorstring | nullrequired
  • data[].steps[].compensatedAtstring | nullrequired
  • data[].triggerobject | null
  • data[].trigger.keystringrequired
  • data[].trigger.occurredAtstringrequired
  • data[].trigger.payloadobjectrequired
  • data[].nodesobject

    Step nodeId → node of the automation's current graph (type, owner-given step name, action key). Steps from an older revision may be missing.

  • data[].automationNamestring | null

    Current name of the automation (owner-built); null for platform defaults or deleted automations.

  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403

MCP tool automations_runs_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/runs?status=DONE&limit=20" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "id": "run_example01",
      "automationKey": "db:auto_example01",
      "automationId": "auto_example01",
      "revision": 1,
      "status": "DONE",
      "initiation": "TRIGGER",
      "triggerEventKey": "ec.order.paid",
      "triggerEventId": "ord_01",
      "contactId": "cnt_01",
      "subjectType": "order",
      "subjectId": "ord_01",
      "currentNodeId": null,
      "runAt": "2026-10-31T12:00:00.000Z",
      "waitUntil": null,
      "attempts": 0,
      "lastError": null,
      "causationDepth": 0,
      "parentRunId": null,
      "messageLogId": null,
      "createdAt": "2026-10-31T12:00:00.000Z",
      "updatedAt": "2026-10-31T12:00:02.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Retrieve a run

GET/sites/{id}/automations/runs/{runId}
betaconsole:viewdefault (120/minute per token)

Get one run with its per-step records (status, attempts, input as sent, output readable by later steps, error, compensation) and the trigger payload. Secrets never appear (inputs hold placeholders). Errors: FORBIDDEN, RUN_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • runIdstring · pathrequired

Response 200

  • idstringrequired
  • automationKeystringrequired
  • automationIdstring | nullrequired
  • revisioninteger | nullrequired
  • status"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED"required
  • initiation"TRIGGER" | "MANUAL" | "RERUN" | "TEST"required
  • triggerEventKeystringrequired
  • triggerEventIdstringrequired
  • contactIdstring | nullrequired
  • subjectTypestring | nullrequired
  • subjectIdstring | nullrequired
  • currentNodeIdstring | nullrequired
  • runAtstringrequired
  • waitUntilstring | nullrequired
  • attemptsintegerrequired
  • lastErrorstring | nullrequired
  • causationDepthintegerrequired
  • parentRunIdstring | nullrequired
  • messageLogIdstring | nullrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • stepsobject[]
  • steps[].idstringrequired
  • steps[].nodeIdstringrequired
  • steps[].typestringrequired
  • steps[].namespacestringrequired
  • steps[].status"PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "SKIPPED" | "CANCELED"required
  • steps[].attemptsintegerrequired
  • steps[].startedAtstring | nullrequired
  • steps[].finishedAtstring | nullrequired
  • steps[].inputanyrequired
  • steps[].outputanyrequired
  • steps[].errorstring | nullrequired
  • steps[].compensatedAtstring | nullrequired
  • triggerobject | null
  • trigger.keystringrequired
  • trigger.occurredAtstringrequired
  • trigger.payloadobjectrequired
  • nodesobject

    Step nodeId → node of the automation's current graph (type, owner-given step name, action key). Steps from an older revision may be missing.

  • automationNamestring | null

    Current name of the automation (owner-built); null for platform defaults or deleted automations.

Errors

  • FORBIDDEN 403
  • RUN_NOT_FOUND 404

MCP tool automations_runs_get

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/runs/{runId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "id": "run_example01",
  "automationKey": "db:auto_example01",
  "automationId": "auto_example01",
  "revision": 1,
  "status": "DONE",
  "initiation": "TRIGGER",
  "triggerEventKey": "ec.order.paid",
  "triggerEventId": "ord_01",
  "contactId": "cnt_01",
  "subjectType": "order",
  "subjectId": "ord_01",
  "currentNodeId": null,
  "runAt": "2026-10-31T12:00:00.000Z",
  "waitUntil": null,
  "attempts": 0,
  "lastError": null,
  "causationDepth": 0,
  "parentRunId": null,
  "messageLogId": null,
  "createdAt": "2026-10-31T12:00:00.000Z",
  "updatedAt": "2026-10-31T12:00:02.000Z",
  "steps": [
    {
      "id": "step_01",
      "nodeId": "c1",
      "type": "CONDITION",
      "namespace": "CONDITION-1",
      "status": "SUCCEEDED",
      "attempts": 0,
      "startedAt": null,
      "finishedAt": "2026-10-31T12:00:01.000Z",
      "input": null,
      "output": {
        "result": true
      },
      "error": null,
      "compensatedAt": null
    },
    {
      "id": "step_02",
      "nodeId": "a2",
      "type": "APP_DEFINED",
      "namespace": "contacts_add_label-2",
      "status": "SUCCEEDED",
      "attempts": 1,
      "startedAt": "2026-10-31T12:00:01.000Z",
      "finishedAt": "2026-10-31T12:00:02.000Z",
      "input": {
        "contactId": "cnt_01",
        "label": "vip"
      },
      "output": {
        "contactId": "cnt_01",
        "label": "vip",
        "changed": true
      },
      "error": null,
      "compensatedAt": null
    }
  ],
  "trigger": {
    "key": "ec.order.paid",
    "occurredAt": "2026-10-31T12:00:00.000Z",
    "payload": {
      "contactId": "cnt_01",
      "orderId": "ord_01",
      "amount": 250000
    }
  }
}

Run rerun

POST/sites/{id}/automations/runs/{runId}/rerun
betaautomations:managedefault (120/minute per token)

Rerun a finished run (Wix Rerun Activation): from "failed" continues at the failed step reusing successful steps' outputs; from "start" replays the whole flow with the same trigger payload. Returns the new run id. Errors: FORBIDDEN, RUN_NOT_FOUND, RUN_NOT_TERMINAL.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • runIdstring · pathrequired

Request body

  • from"failed" | "start"

Response 202

  • runIdstringrequired
  • operationIdstringrequired

Errors

  • FORBIDDEN 403
  • RUN_NOT_FOUND 404
  • RUN_NOT_TERMINAL 422

MCP tool automations_runs_rerun

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/runs/{runId}/rerun" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"from":"failed"}'
Response
{
  "runId": "run_example03",
  "operationId": "op_automation_run_run_example03"
}

Report events

POST/sites/{id}/automations/events
betaautomations:managedefault (120/minute per token)Idempotency-Key

Report an event to start automations (Wix Report Event): triggerKey is a catalog trigger or a custom trigger (custom:<id>); payload must match the trigger's schema (missing required fields → PAYLOAD_INVALID, nothing starts). idempotencyKey (or the Idempotency-Key header) deduplicates; externalEntityId lets automations.events.cancel withdraw waiting runs; scheduledAt starts the flow at that time. Errors: FORBIDDEN, TRIGGER_NOT_FOUND, TRIGGER_DISABLED, PAYLOAD_INVALID.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • Idempotency-Keystring · header

    Client-chosen key (1-200 chars). Retrying with the same key and the same body returns the original result; the same key with a different body is rejected with IDEMPOTENCY_CONFLICT (409). Keys expire after 24 hours.

Request body

  • triggerKeystringrequired
  • payloadobjectrequired
  • externalEntityIdstring
  • idempotencyKeystring
  • scheduledAtstring

    ISO 8601; start the automations at this time instead of now.

Response 202

  • eventIdstringrequired

    Outbox id; the runs appear in automations.runs.list once the worker delivers it.

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404
  • TRIGGER_DISABLED 422
  • PAYLOAD_INVALID 422

MCP tool automations_events_report

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/events" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"triggerKey":"custom:trg_example01","payload":{"orderRef":"ERP-1001","total":129.5},"externalEntityId":"ERP-1001"}'
Response
{
  "eventId": "obx_example01"
}

Cancel an event

POST/sites/{id}/automations/events/cancel
betaautomations:managedefault (120/minute per token)

Cancel waiting runs started by a trigger for the given externalEntityId (Wix Cancel Event), e.g. the order was paid so the reminder must not go out. Errors: FORBIDDEN, TRIGGER_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • triggerKeystringrequired
  • externalEntityIdstringrequired

Response 200

  • canceledintegerrequired

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404

MCP tool automations_events_cancel

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/events/cancel" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"triggerKey":"custom:trg_example01","externalEntityId":"ERP-1001"}'
Response
{
  "canceled": 1
}

List triggers

GET/sites/{id}/automations/triggers
betaconsole:viewdefault (120/minute per token)

List the site's custom triggers (webhook endpoints external systems post to). Tokens and signing secrets are never returned; only the token prefix. The whole list is returned in one page. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Response 200

  • dataobject[]required
  • data[].idstringrequired
  • data[].keystringrequired
  • data[].namestringrequired
  • data[].descriptionstring | nullrequired
  • data[].payloadSchemaobjectrequired
  • data[].identityFieldstring | nullrequired
  • data[].futureDateFieldstring | nullrequired
  • data[].cancelRefFieldstring | nullrequired
  • data[].endpointTokenPrefixstringrequired
  • data[].requireSignaturebooleanrequired
  • data[].status"ACTIVE" | "DISABLED"required
  • data[].lastReceivedAtstring | nullrequired
  • data[].receivedCountintegerrequired
  • data[].previousSecretExpiresAtstring | nullrequired
  • data[].createdAtstringrequired
  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403

MCP tool automations_triggers_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "id": "trg_example01",
      "key": "custom:trg_example01",
      "name": "ERP order synced",
      "description": null,
      "payloadSchema": {
        "type": "object",
        "properties": {
          "orderRef": {
            "type": "string",
            "title": "Order ref",
            "description": "ERP order reference"
          },
          "total": {
            "type": "number",
            "title": "Total",
            "description": "Order total"
          }
        },
        "required": [
          "orderRef",
          "total"
        ]
      },
      "identityField": null,
      "futureDateField": null,
      "cancelRefField": "orderRef",
      "endpointTokenPrefix": "aut_Ab12Cd34",
      "requireSignature": true,
      "status": "ACTIVE",
      "lastReceivedAt": null,
      "receivedCount": 0,
      "previousSecretExpiresAt": null,
      "createdAt": "2026-10-31T12:00:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Create a trigger

POST/sites/{id}/automations/triggers
betaautomations:managedefault (120/minute per token)

Create a custom trigger: give a name and a payload schema (or a sample payload). Returns the endpoint path (POST /api/webhooks/automations/<token>) and the Standard Webhooks signing secret (whsec_…) ONCE; store them now. Senders sign webhook-id.webhook-timestamp.body with HMAC-SHA256 and send webhook-id / webhook-timestamp / webhook-signature headers (±5 minutes). Errors: FORBIDDEN, VALIDATION, INVALID_SCHEMA, PLAN_LIMIT_REACHED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • namestringrequired
  • descriptionstring | null
  • payloadSchemaobject

    Catalog JSON schema subset (object with described properties).

  • samplePayloadobject

    Alternative to payloadSchema: a sample JSON the schema is inferred from.

  • identityFieldstring | null
  • futureDateFieldstring | null
  • cancelRefFieldstring | null
  • requireSignatureboolean

Response 201

  • triggerobjectrequired
  • trigger.idstringrequired
  • trigger.keystringrequired
  • trigger.namestringrequired
  • trigger.descriptionstring | nullrequired
  • trigger.payloadSchemaobjectrequired
  • trigger.identityFieldstring | nullrequired
  • trigger.futureDateFieldstring | nullrequired
  • trigger.cancelRefFieldstring | nullrequired
  • trigger.endpointTokenPrefixstringrequired
  • trigger.requireSignaturebooleanrequired
  • trigger.status"ACTIVE" | "DISABLED"required
  • trigger.lastReceivedAtstring | nullrequired
  • trigger.receivedCountintegerrequired
  • trigger.previousSecretExpiresAtstring | nullrequired
  • trigger.createdAtstringrequired
  • endpointTokenstringrequired
  • endpointPathstringrequired
  • signingSecretstring | nullrequired

Errors

  • FORBIDDEN 403
  • VALIDATION 400
  • INVALID_SCHEMA 400
  • PLAN_LIMIT_REACHED 403

MCP tool automations_triggers_create

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"ERP order synced","samplePayload":{"orderRef":"ERP-1001","total":129.5},"cancelRefField":"orderRef"}'
Response
{
  "trigger": {
    "id": "trg_example01",
    "key": "custom:trg_example01",
    "name": "ERP order synced",
    "description": null,
    "payloadSchema": {
      "type": "object",
      "properties": {
        "orderRef": {
          "type": "string",
          "title": "Order ref",
          "description": "ERP order reference"
        },
        "total": {
          "type": "number",
          "title": "Total",
          "description": "Order total"
        }
      },
      "required": [
        "orderRef",
        "total"
      ]
    },
    "identityField": null,
    "futureDateField": null,
    "cancelRefField": "orderRef",
    "endpointTokenPrefix": "aut_Ab12Cd34",
    "requireSignature": true,
    "status": "ACTIVE",
    "lastReceivedAt": null,
    "receivedCount": 0,
    "previousSecretExpiresAt": null,
    "createdAt": "2026-10-31T12:00:00.000Z"
  },
  "endpointToken": "aut_Ab12Cd34…",
  "endpointPath": "/api/webhooks/automations/aut_Ab12Cd34…",
  "signingSecret": "whsec_…"
}

Update a trigger

PATCH/sites/{id}/automations/triggers/{triggerId}
betaautomations:managedefault (120/minute per token)

Update a custom trigger (name, schema, identity/futureDate/cancelRef fields, requireSignature, status ACTIVE/DISABLED; a DISABLED endpoint answers 410). Errors: FORBIDDEN, TRIGGER_NOT_FOUND, VALIDATION, INVALID_SCHEMA.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • triggerIdstring · pathrequired

Request body

  • namestring
  • descriptionstring | null
  • payloadSchemaobject

    Catalog JSON schema subset (object with described properties).

  • samplePayloadobject

    Alternative to payloadSchema: a sample JSON the schema is inferred from.

  • identityFieldstring | null
  • futureDateFieldstring | null
  • cancelRefFieldstring | null
  • requireSignatureboolean
  • status"ACTIVE" | "DISABLED"

Response 200

  • idstringrequired
  • keystringrequired
  • namestringrequired
  • descriptionstring | nullrequired
  • payloadSchemaobjectrequired
  • identityFieldstring | nullrequired
  • futureDateFieldstring | nullrequired
  • cancelRefFieldstring | nullrequired
  • endpointTokenPrefixstringrequired
  • requireSignaturebooleanrequired
  • status"ACTIVE" | "DISABLED"required
  • lastReceivedAtstring | nullrequired
  • receivedCountintegerrequired
  • previousSecretExpiresAtstring | nullrequired
  • createdAtstringrequired

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404
  • VALIDATION 400
  • INVALID_SCHEMA 400

MCP tool automations_triggers_update

curl -X PATCH "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers/{triggerId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status":"DISABLED"}'
Response
{
  "id": "trg_example01",
  "key": "custom:trg_example01",
  "name": "ERP order synced",
  "description": null,
  "payloadSchema": {
    "type": "object",
    "properties": {
      "orderRef": {
        "type": "string",
        "title": "Order ref",
        "description": "ERP order reference"
      },
      "total": {
        "type": "number",
        "title": "Total",
        "description": "Order total"
      }
    },
    "required": [
      "orderRef",
      "total"
    ]
  },
  "identityField": null,
  "futureDateField": null,
  "cancelRefField": "orderRef",
  "endpointTokenPrefix": "aut_Ab12Cd34",
  "requireSignature": true,
  "status": "DISABLED",
  "lastReceivedAt": null,
  "receivedCount": 0,
  "previousSecretExpiresAt": null,
  "createdAt": "2026-10-31T12:00:00.000Z"
}

Delete a trigger

DELETE/sites/{id}/automations/triggers/{triggerId}
betaautomations:managedefault (120/minute per token)

Delete a custom trigger; its endpoint stops working and automations using it stop starting (they keep their graph). Errors: FORBIDDEN, TRIGGER_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • triggerIdstring · pathrequired

Response 200

  • deletedtruerequired

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404

MCP tool automations_triggers_delete

curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers/{triggerId}" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "deleted": true
}

Rotate token

POST/sites/{id}/automations/triggers/{triggerId}/rotate-token
betaautomations:managedefault (120/minute per token)

Regenerate a custom trigger's endpoint token: the old URL stops working immediately; the new path is returned once. Errors: FORBIDDEN, TRIGGER_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • triggerIdstring · pathrequired

Response 200

  • endpointTokenstringrequired
  • endpointPathstringrequired

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404

MCP tool automations_triggers_rotate_token

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers/{triggerId}/rotate-token" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
Response
{
  "endpointToken": "aut_Ef56Gh78…",
  "endpointPath": "/api/webhooks/automations/aut_Ef56Gh78…"
}

Rotate secret

POST/sites/{id}/automations/triggers/{triggerId}/rotate-secret
betaautomations:managedefault (120/minute per token)

Rotate a custom trigger's signing secret: the new whsec_ secret is returned once; the previous one keeps verifying for 24 hours so senders can switch without downtime. Errors: FORBIDDEN, TRIGGER_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • triggerIdstring · pathrequired

Response 200

  • signingSecretstringrequired
  • previousSecretExpiresAtstring | nullrequired

Errors

  • FORBIDDEN 403
  • TRIGGER_NOT_FOUND 404

MCP tool automations_triggers_rotate_secret

curl -X POST "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers/{triggerId}/rotate-secret" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
Response
{
  "signingSecret": "whsec_…",
  "previousSecretExpiresAt": "2026-11-01T12:00:00.000Z"
}

List secrets

GET/sites/{id}/automations/secrets
betasite:integrationsdefault (120/minute per token)

List the site's automation secrets (handles and masked hints only; values are write-only). Reference them in the Send HTTP request action as {{secret("handle")}}. The whole list is returned in one page. Errors: FORBIDDEN.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Response 200

  • dataobject[]required
  • data[].handlestringrequired
  • data[].hintstring | nullrequired
  • data[].createdAtstringrequired
  • data[].rotatedAtstringrequired
  • hasMorebooleanrequired

    True when another page exists; pass nextCursor to fetch it.

  • nextCursorstring | nullrequired

    Cursor for the next page, or null on the last page.

Errors

  • FORBIDDEN 403

MCP tool automations_secrets_list

curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/secrets" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "data": [
    {
      "handle": "erp_api_key",
      "hint": "••••f3a9",
      "createdAt": "2026-10-31T12:00:00.000Z",
      "rotatedAt": "2026-10-31T12:00:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Set a secret

PUT/sites/{id}/automations/secrets
betasite:integrationsdefault (120/minute per token)

Create or rotate an automation secret (handle ^[a-z0-9][a-z0-9_-]{0,63}$, value ≤ 4096 chars). Values are encrypted, never returned and never written to run logs. Errors: FORBIDDEN, VALIDATION, PLAN_LIMIT_REACHED.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

Request body

  • handlestringrequired
  • valuestringrequired

Response 200

  • secretsobject[]required
  • secrets[].handlestringrequired
  • secrets[].hintstring | nullrequired
  • secrets[].createdAtstringrequired
  • secrets[].rotatedAtstringrequired

Errors

  • FORBIDDEN 403
  • VALIDATION 400
  • PLAN_LIMIT_REACHED 403

MCP tool automations_secrets_put

curl -X PUT "https://app.kanorio.com/api/v1/sites/{id}/automations/secrets" \
  -H "Authorization: Bearer $KANORIO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handle":"erp_api_key","value":"sk-live-…"}'
Response
{
  "secrets": [
    {
      "handle": "erp_api_key",
      "hint": "••••f3a9",
      "createdAt": "2026-10-31T12:00:00.000Z",
      "rotatedAt": "2026-10-31T12:00:00.000Z"
    }
  ]
}

Delete a secret

DELETE/sites/{id}/automations/secrets/{handle}
betasite:integrationsdefault (120/minute per token)

Delete an automation secret; HTTP actions referencing it fail at send time. Errors: FORBIDDEN, SECRET_NOT_FOUND.

Parameters

  • idstring · pathrequired

    Website id. Get it from sites.list or from sites.create.

  • handlestring · pathrequired

Response 200

  • deletedtruerequired

Errors

  • FORBIDDEN 403
  • SECRET_NOT_FOUND 404

MCP tool automations_secrets_delete

curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/secrets/{handle}" \
  -H "Authorization: Bearer $KANORIO_TOKEN"
Response
{
  "deleted": true
}