API リファレンス
Automations
Management API: GET /sites/{id}/automations, PATCH /sites/{id}/automations/{automationKey}/actions/{actionKey}, GET /sites/{id}/automations/catalog, …
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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Response 200
dataobject[]requireddata[].keystringrequiredStable automation key, e.g. order_paid, form_inquiry, customer_login_code.
data[].group"forms" | "store" | "customers"requireddata[].triggerEventKeystringrequiredWebhook event key that triggers it, e.g. ec.order.paid.
data[].timing"immediate" | "delayed"requireddelayed = runs later through the automation engine (e.g. payment due reminder).
data[].actionsobject[]requireddata[].actions[].key"customer_email" | "team_email" | "team_in_app" | "team_webhook"requireddata[].actions[].audience"customer" | "team"requireddata[].actions[].channelstringrequireddata[].actions[].status"on" | "off" | "locked" | "managed_by_destination" | "upgrade_required" | "coming_soon"requireddata[].actions[].minPlanstring | nullrequiredPlan required when status is upgrade_required.
hasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
MCP tool automations_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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
/sites/{id}/automations/{automationKey}/actions/{actionKey}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationKeystring · pathrequiredAutomation key from automations.list, e.g. shipment_shipped.
actionKeystring · pathrequiredOne of customer_email, team_email, team_in_app, team_webhook.
Request body
enabledbooleanrequired
Response 200
automationKeystringrequiredactionKey"customer_email" | "team_email" | "team_in_app" | "team_webhook"requiredenabledbooleanrequired
Errors
FORBIDDEN403AUTOMATION_NOT_FOUND404ACTION_NOT_FOUND404LOCKED403 · always-sent actionMANAGED_BY_DESTINATION422 · webhooks follow endpoint subscriptionsPLAN_REQUIRED403COMING_SOON422
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}'{
"automationKey": "shipment_shipped",
"actionKey": "customer_email",
"enabled": false
}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Response 200
triggersobject[]requiredtriggers[].keystringrequiredtriggers[].source"tenant_event" | "platform_event" | "custom"requiredtriggers[].groupstringrequiredtriggers[].titlestringrequiredtriggers[].descriptionstringrequiredtriggers[].payloadSchemaobjectrequiredtriggers[].identityobject | nullrequiredtriggers[].identity.fieldstringrequiredtriggers[].identity.type"contact"requiredtriggers[].futureDateFieldstring | nullrequiredtriggers[].cancelRefFieldstring | nullrequiredtriggers[].filtersobject[]requiredtriggers[].filters[].fieldstringrequiredtriggers[].filters[].titlestringrequiredtriggers[].requiredPermissionstring | nullrequiredtriggers[].minPlanstringrequiredactionsobject[]requiredactions[].keystringrequiredactions[].groupstringrequiredactions[].titlestringrequiredactions[].descriptionstringrequiredactions[].inputSchemaobjectrequiredactions[].outputSchemaobjectrequiredactions[].permissionstring | nullrequiredactions[].minPlanstringrequiredactions[].idempotentbooleanrequiredactions[].compensablebooleanrequired
Errors
FORBIDDEN403
MCP tool automations_catalog_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/catalog" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Response 200
dataobject[]requireddata[].keystringrequireddata[].category"store" | "forms" | "courses" | "headless"requireddata[].titlestringrequireddata[].descriptionstringrequireddata[].needs"url" | "deliverable" | "threshold"[]requireddata[].graphobjectrequireddata[].graph.triggerobjectrequireddata[].graph.rootActionIdsstring[]requireddata[].graph.actionsobjectrequiredhasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
MCP tool automations_templates_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/templates" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
includeArchivedboolean · queryInclude archived automations.
limitinteger · queryMaximum number of items to return, 1–100. Defaults to 20.
cursorstring · queryOpaque cursor from the previous page's nextCursor. Omit for the first page.
Response 200
dataobject[]requireddata[].idstringrequireddata[].keystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
data[].namestringrequireddata[].descriptionstring | nullrequireddata[].origin"USER" | "PREINSTALLED" | "APPLICATION"requireddata[].status"ACTIVE" | "INACTIVE"requireddata[].revisionintegerrequiredSend it back on update (optimistic lock).
data[].archivedbooleanrequireddata[].settingsobject | nullrequireddata[].settings.readonlybooleandata[].settings.disableDeletebooleandata[].settings.disableStatusChangebooleandata[].settings.actionSettingsobjectdata[].graphobjectrequireddata[].graph.triggerobjectrequireddata[].graph.rootActionIdsstring[]requireddata[].graph.actionsobjectrequireddata[].draftobject | nullrequireddata[].draft.triggerobjectrequireddata[].draft.rootActionIdsstring[]requireddata[].draft.actionsobjectrequireddata[].createdAtstringrequireddata[].updatedAtstringrequireddata[].lastTriggeredAtstring | nullrequireddata[].triggerCountintegerrequireddata[].autoPausedAtstring | nullrequiredWhen 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.
hasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403INVALID_CURSOR400
MCP tool automations_flows_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/flows" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
namestringrequireddescriptionstring | nullgraphanyrequired
Response 201
idstringrequiredkeystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
namestringrequireddescriptionstring | nullrequiredorigin"USER" | "PREINSTALLED" | "APPLICATION"requiredstatus"ACTIVE" | "INACTIVE"requiredrevisionintegerrequiredSend it back on update (optimistic lock).
archivedbooleanrequiredsettingsobject | nullrequiredsettings.readonlybooleansettings.disableDeletebooleansettings.disableStatusChangebooleansettings.actionSettingsobjectsettings.actionSettings.readonlyActionIdsstring[]requiredsettings.actionSettings.permanentActionIdsstring[]requiredgraphobjectrequiredgraph.triggerobjectrequiredgraph.trigger.triggerKeystringrequiredgraph.trigger.filtersobject[]requiredgraph.trigger.scheduledEventOffsetobjectgraph.rootActionIdsstring[]requiredgraph.actionsobjectrequireddraftobject | nullrequireddraft.triggerobjectrequireddraft.trigger.triggerKeystringrequireddraft.trigger.filtersobject[]requireddraft.trigger.scheduledEventOffsetobjectdraft.rootActionIdsstring[]requireddraft.actionsobjectrequiredcreatedAtstringrequiredupdatedAtstringrequiredlastTriggeredAtstring | nullrequiredtriggerCountintegerrequiredautoPausedAtstring | nullrequiredWhen 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
FORBIDDEN403VALIDATION400INVALID_AUTOMATION400 · 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":[]}}}}}'{
"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
/sites/{id}/automations/flows/validateValidate 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
graphanyrequiredAutomation graph: { trigger, rootActionIds, actions }.
automationIdstringThe automation being edited, if any; excluded when counting other active automations on the same trigger.
Response 200
status"VALID" | "VALID_WITH_WARNINGS" | "INVALID"requiredtriggerErrorsobject[]requiredtriggerErrors[].nodeIdstring | nullrequiredtriggerErrors[].fieldKeystring | nullrequiredtriggerErrors[].errorTypestringrequiredtriggerErrors[].severity"CRITICAL" | "WARNING"requiredtriggerErrors[].messagestringrequiredactionErrorsobject[]requiredactionErrors[].nodeIdstring | nullrequiredactionErrors[].fieldKeystring | nullrequiredactionErrors[].errorTypestringrequiredactionErrors[].severity"CRITICAL" | "WARNING"requiredactionErrors[].messagestringrequired
Errors
FORBIDDEN403
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":[]}}}}}'{
"status": "VALID",
"triggerErrors": [],
"actionErrors": []
}Test a flow
/sites/{id}/automations/flows/testTest-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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
automationKeystringrequireddb:<id> or system:<name>.
payloadobjectrequiredTrigger payload matching the trigger's schema.
confirmbooleanrequiredMust be true: the test executes real actions.
Response 202
runIdstringrequiredoperationIdstringrequired
Errors
FORBIDDEN403CONFIRM_REQUIRED400AUTOMATION_NOT_FOUND404PAYLOAD_INVALID422RATE_LIMITED429
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}'{
"runId": "run_example02",
"operationId": "op_automation_run_run_example02"
}Retrieve a flow
/sites/{id}/automations/flows/{automationId}Get one owner-built automation with its graph, draft and revision. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationIdstring · pathrequiredAutomation id (from automations.flows.list).
Response 200
idstringrequiredkeystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
namestringrequireddescriptionstring | nullrequiredorigin"USER" | "PREINSTALLED" | "APPLICATION"requiredstatus"ACTIVE" | "INACTIVE"requiredrevisionintegerrequiredSend it back on update (optimistic lock).
archivedbooleanrequiredsettingsobject | nullrequiredsettings.readonlybooleansettings.disableDeletebooleansettings.disableStatusChangebooleansettings.actionSettingsobjectsettings.actionSettings.readonlyActionIdsstring[]requiredsettings.actionSettings.permanentActionIdsstring[]requiredgraphobjectrequiredgraph.triggerobjectrequiredgraph.trigger.triggerKeystringrequiredgraph.trigger.filtersobject[]requiredgraph.trigger.scheduledEventOffsetobjectgraph.rootActionIdsstring[]requiredgraph.actionsobjectrequireddraftobject | nullrequireddraft.triggerobjectrequireddraft.trigger.triggerKeystringrequireddraft.trigger.filtersobject[]requireddraft.trigger.scheduledEventOffsetobjectdraft.rootActionIdsstring[]requireddraft.actionsobjectrequiredcreatedAtstringrequiredupdatedAtstringrequiredlastTriggeredAtstring | nullrequiredtriggerCountintegerrequiredautoPausedAtstring | nullrequiredWhen 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
FORBIDDEN403AUTOMATION_NOT_FOUND404
MCP tool automations_flows_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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
/sites/{id}/automations/flows/{automationId}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationIdstring · pathrequired
Request body
revisionintegerrequirednamestringdescriptionstring | nullgraphany
Response 200
idstringrequiredkeystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
namestringrequireddescriptionstring | nullrequiredorigin"USER" | "PREINSTALLED" | "APPLICATION"requiredstatus"ACTIVE" | "INACTIVE"requiredrevisionintegerrequiredSend it back on update (optimistic lock).
archivedbooleanrequiredsettingsobject | nullrequiredsettings.readonlybooleansettings.disableDeletebooleansettings.disableStatusChangebooleansettings.actionSettingsobjectsettings.actionSettings.readonlyActionIdsstring[]requiredsettings.actionSettings.permanentActionIdsstring[]requiredgraphobjectrequiredgraph.triggerobjectrequiredgraph.trigger.triggerKeystringrequiredgraph.trigger.filtersobject[]requiredgraph.trigger.scheduledEventOffsetobjectgraph.rootActionIdsstring[]requiredgraph.actionsobjectrequireddraftobject | nullrequireddraft.triggerobjectrequireddraft.trigger.triggerKeystringrequireddraft.trigger.filtersobject[]requireddraft.trigger.scheduledEventOffsetobjectdraft.rootActionIdsstring[]requireddraft.actionsobjectrequiredcreatedAtstringrequiredupdatedAtstringrequiredlastTriggeredAtstring | nullrequiredtriggerCountintegerrequiredautoPausedAtstring | nullrequiredWhen 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
FORBIDDEN403AUTOMATION_NOT_FOUND404REVISION_CONFLICT422INVALID_AUTOMATION400LOCKED403
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"}'{
"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
/sites/{id}/automations/flows/{automationId}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationIdstring · pathrequired
Response 200
deletedtruerequired
Errors
FORBIDDEN403AUTOMATION_NOT_FOUND404LOCKED403
MCP tool automations_flows_delete
curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/flows/{automationId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"deleted": true
}Set status
/sites/{id}/automations/flows/{automationId}/statusTurn 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationIdstring · pathrequired
Request body
status"ACTIVE" | "INACTIVE"required
Response 200
idstringrequiredkeystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
namestringrequireddescriptionstring | nullrequiredorigin"USER" | "PREINSTALLED" | "APPLICATION"requiredstatus"ACTIVE" | "INACTIVE"requiredrevisionintegerrequiredSend it back on update (optimistic lock).
archivedbooleanrequiredsettingsobject | nullrequiredsettings.readonlybooleansettings.disableDeletebooleansettings.disableStatusChangebooleansettings.actionSettingsobjectsettings.actionSettings.readonlyActionIdsstring[]requiredsettings.actionSettings.permanentActionIdsstring[]requiredgraphobjectrequiredgraph.triggerobjectrequiredgraph.trigger.triggerKeystringrequiredgraph.trigger.filtersobject[]requiredgraph.trigger.scheduledEventOffsetobjectgraph.rootActionIdsstring[]requiredgraph.actionsobjectrequireddraftobject | nullrequireddraft.triggerobjectrequireddraft.trigger.triggerKeystringrequireddraft.trigger.filtersobject[]requireddraft.trigger.scheduledEventOffsetobjectdraft.rootActionIdsstring[]requireddraft.actionsobjectrequiredcreatedAtstringrequiredupdatedAtstringrequiredlastTriggeredAtstring | nullrequiredtriggerCountintegerrequiredautoPausedAtstring | nullrequiredWhen 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
FORBIDDEN403AUTOMATION_NOT_FOUND404INVALID_AUTOMATION400PLAN_LIMIT_REACHED403LOCKED403
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"}'{
"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
/sites/{id}/automations/flows/{automationId}/archiveArchive (deactivates and hides from the list; runs are kept) or unarchive an owner-built automation. Errors: FORBIDDEN, AUTOMATION_NOT_FOUND, LOCKED.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationIdstring · pathrequired
Request body
archivedboolean
Response 200
idstringrequiredkeystringrequireddb:<id> for owner-built, system:<name> for preinstalled.
namestringrequireddescriptionstring | nullrequiredorigin"USER" | "PREINSTALLED" | "APPLICATION"requiredstatus"ACTIVE" | "INACTIVE"requiredrevisionintegerrequiredSend it back on update (optimistic lock).
archivedbooleanrequiredsettingsobject | nullrequiredsettings.readonlybooleansettings.disableDeletebooleansettings.disableStatusChangebooleansettings.actionSettingsobjectsettings.actionSettings.readonlyActionIdsstring[]requiredsettings.actionSettings.permanentActionIdsstring[]requiredgraphobjectrequiredgraph.triggerobjectrequiredgraph.trigger.triggerKeystringrequiredgraph.trigger.filtersobject[]requiredgraph.trigger.scheduledEventOffsetobjectgraph.rootActionIdsstring[]requiredgraph.actionsobjectrequireddraftobject | nullrequireddraft.triggerobjectrequireddraft.trigger.triggerKeystringrequireddraft.trigger.filtersobject[]requireddraft.trigger.scheduledEventOffsetobjectdraft.rootActionIdsstring[]requireddraft.actionsobjectrequiredcreatedAtstringrequiredupdatedAtstringrequiredlastTriggeredAtstring | nullrequiredtriggerCountintegerrequiredautoPausedAtstring | nullrequiredWhen 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
FORBIDDEN403AUTOMATION_NOT_FOUND404LOCKED403
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}'{
"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 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
automationKeystring · querystatus"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED" · querycontactIdstring · querylimitinteger · queryMaximum number of items to return, 1–100. Defaults to 20.
cursorstring · queryOpaque cursor from the previous page's nextCursor. Omit for the first page.
Response 200
dataobject[]requireddata[].idstringrequireddata[].automationKeystringrequireddata[].automationIdstring | nullrequireddata[].revisioninteger | nullrequireddata[].status"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED"requireddata[].initiation"TRIGGER" | "MANUAL" | "RERUN" | "TEST"requireddata[].triggerEventKeystringrequireddata[].triggerEventIdstringrequireddata[].contactIdstring | nullrequireddata[].subjectTypestring | nullrequireddata[].subjectIdstring | nullrequireddata[].currentNodeIdstring | nullrequireddata[].runAtstringrequireddata[].waitUntilstring | nullrequireddata[].attemptsintegerrequireddata[].lastErrorstring | nullrequireddata[].causationDepthintegerrequireddata[].parentRunIdstring | nullrequireddata[].messageLogIdstring | nullrequireddata[].createdAtstringrequireddata[].updatedAtstringrequireddata[].stepsobject[]data[].steps[].idstringrequireddata[].steps[].nodeIdstringrequireddata[].steps[].typestringrequireddata[].steps[].namespacestringrequireddata[].steps[].status"PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "SKIPPED" | "CANCELED"requireddata[].steps[].attemptsintegerrequireddata[].steps[].startedAtstring | nullrequireddata[].steps[].finishedAtstring | nullrequireddata[].steps[].inputanyrequireddata[].steps[].outputanyrequireddata[].steps[].errorstring | nullrequireddata[].steps[].compensatedAtstring | nullrequireddata[].triggerobject | nulldata[].trigger.keystringrequireddata[].trigger.occurredAtstringrequireddata[].trigger.payloadobjectrequireddata[].nodesobjectStep 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 | nullCurrent name of the automation (owner-built); null for platform defaults or deleted automations.
hasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
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"{
"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
}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
runIdstring · pathrequired
Response 200
idstringrequiredautomationKeystringrequiredautomationIdstring | nullrequiredrevisioninteger | nullrequiredstatus"PENDING" | "WAITING" | "RUNNING" | "DONE" | "CANCELED" | "FAILED" | "SKIPPED"requiredinitiation"TRIGGER" | "MANUAL" | "RERUN" | "TEST"requiredtriggerEventKeystringrequiredtriggerEventIdstringrequiredcontactIdstring | nullrequiredsubjectTypestring | nullrequiredsubjectIdstring | nullrequiredcurrentNodeIdstring | nullrequiredrunAtstringrequiredwaitUntilstring | nullrequiredattemptsintegerrequiredlastErrorstring | nullrequiredcausationDepthintegerrequiredparentRunIdstring | nullrequiredmessageLogIdstring | nullrequiredcreatedAtstringrequiredupdatedAtstringrequiredstepsobject[]steps[].idstringrequiredsteps[].nodeIdstringrequiredsteps[].typestringrequiredsteps[].namespacestringrequiredsteps[].status"PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "SKIPPED" | "CANCELED"requiredsteps[].attemptsintegerrequiredsteps[].startedAtstring | nullrequiredsteps[].finishedAtstring | nullrequiredsteps[].inputanyrequiredsteps[].outputanyrequiredsteps[].errorstring | nullrequiredsteps[].compensatedAtstring | nullrequiredtriggerobject | nulltrigger.keystringrequiredtrigger.occurredAtstringrequiredtrigger.payloadobjectrequirednodesobjectStep nodeId → node of the automation's current graph (type, owner-given step name, action key). Steps from an older revision may be missing.
automationNamestring | nullCurrent name of the automation (owner-built); null for platform defaults or deleted automations.
Errors
FORBIDDEN403RUN_NOT_FOUND404
MCP tool automations_runs_get
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/runs/{runId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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
/sites/{id}/automations/runs/{runId}/rerunRerun 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
runIdstring · pathrequired
Request body
from"failed" | "start"
Response 202
runIdstringrequiredoperationIdstringrequired
Errors
FORBIDDEN403RUN_NOT_FOUND404RUN_NOT_TERMINAL422
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"}'{
"runId": "run_example03",
"operationId": "op_automation_run_run_example03"
}Report events
/sites/{id}/automations/eventsReport 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Idempotency-Keystring · headerClient-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
triggerKeystringrequiredpayloadobjectrequiredexternalEntityIdstringidempotencyKeystringscheduledAtstringISO 8601; start the automations at this time instead of now.
Response 202
eventIdstringrequiredOutbox id; the runs appear in automations.runs.list once the worker delivers it.
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404TRIGGER_DISABLED422PAYLOAD_INVALID422
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"}'{
"eventId": "obx_example01"
}Cancel an event
/sites/{id}/automations/events/cancelCancel 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
triggerKeystringrequiredexternalEntityIdstringrequired
Response 200
canceledintegerrequired
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404
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"}'{
"canceled": 1
}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Response 200
dataobject[]requireddata[].idstringrequireddata[].keystringrequireddata[].namestringrequireddata[].descriptionstring | nullrequireddata[].payloadSchemaobjectrequireddata[].identityFieldstring | nullrequireddata[].futureDateFieldstring | nullrequireddata[].cancelRefFieldstring | nullrequireddata[].endpointTokenPrefixstringrequireddata[].requireSignaturebooleanrequireddata[].status"ACTIVE" | "DISABLED"requireddata[].lastReceivedAtstring | nullrequireddata[].receivedCountintegerrequireddata[].previousSecretExpiresAtstring | nullrequireddata[].createdAtstringrequiredhasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
MCP tool automations_triggers_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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
/sites/{id}/automations/triggersCreate 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
namestringrequireddescriptionstring | nullpayloadSchemaobjectCatalog JSON schema subset (object with described properties).
samplePayloadobjectAlternative to payloadSchema: a sample JSON the schema is inferred from.
identityFieldstring | nullfutureDateFieldstring | nullcancelRefFieldstring | nullrequireSignatureboolean
Response 201
triggerobjectrequiredtrigger.idstringrequiredtrigger.keystringrequiredtrigger.namestringrequiredtrigger.descriptionstring | nullrequiredtrigger.payloadSchemaobjectrequiredtrigger.identityFieldstring | nullrequiredtrigger.futureDateFieldstring | nullrequiredtrigger.cancelRefFieldstring | nullrequiredtrigger.endpointTokenPrefixstringrequiredtrigger.requireSignaturebooleanrequiredtrigger.status"ACTIVE" | "DISABLED"requiredtrigger.lastReceivedAtstring | nullrequiredtrigger.receivedCountintegerrequiredtrigger.previousSecretExpiresAtstring | nullrequiredtrigger.createdAtstringrequiredendpointTokenstringrequiredendpointPathstringrequiredsigningSecretstring | nullrequired
Errors
FORBIDDEN403VALIDATION400INVALID_SCHEMA400PLAN_LIMIT_REACHED403
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"}'{
"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
/sites/{id}/automations/triggers/{triggerId}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
triggerIdstring · pathrequired
Request body
namestringdescriptionstring | nullpayloadSchemaobjectCatalog JSON schema subset (object with described properties).
samplePayloadobjectAlternative to payloadSchema: a sample JSON the schema is inferred from.
identityFieldstring | nullfutureDateFieldstring | nullcancelRefFieldstring | nullrequireSignaturebooleanstatus"ACTIVE" | "DISABLED"
Response 200
idstringrequiredkeystringrequirednamestringrequireddescriptionstring | nullrequiredpayloadSchemaobjectrequiredidentityFieldstring | nullrequiredfutureDateFieldstring | nullrequiredcancelRefFieldstring | nullrequiredendpointTokenPrefixstringrequiredrequireSignaturebooleanrequiredstatus"ACTIVE" | "DISABLED"requiredlastReceivedAtstring | nullrequiredreceivedCountintegerrequiredpreviousSecretExpiresAtstring | nullrequiredcreatedAtstringrequired
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404VALIDATION400INVALID_SCHEMA400
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"}'{
"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
/sites/{id}/automations/triggers/{triggerId}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
triggerIdstring · pathrequired
Response 200
deletedtruerequired
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404
MCP tool automations_triggers_delete
curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/triggers/{triggerId}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"deleted": true
}Rotate token
/sites/{id}/automations/triggers/{triggerId}/rotate-tokenRegenerate 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
triggerIdstring · pathrequired
Response 200
endpointTokenstringrequiredendpointPathstringrequired
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404
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 '{}'{
"endpointToken": "aut_Ef56Gh78…",
"endpointPath": "/api/webhooks/automations/aut_Ef56Gh78…"
}Rotate secret
/sites/{id}/automations/triggers/{triggerId}/rotate-secretRotate 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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
triggerIdstring · pathrequired
Response 200
signingSecretstringrequiredpreviousSecretExpiresAtstring | nullrequired
Errors
FORBIDDEN403TRIGGER_NOT_FOUND404
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 '{}'{
"signingSecret": "whsec_…",
"previousSecretExpiresAt": "2026-11-01T12:00:00.000Z"
}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Response 200
dataobject[]requireddata[].handlestringrequireddata[].hintstring | nullrequireddata[].createdAtstringrequireddata[].rotatedAtstringrequiredhasMorebooleanrequiredTrue when another page exists; pass nextCursor to fetch it.
nextCursorstring | nullrequiredCursor for the next page, or null on the last page.
Errors
FORBIDDEN403
MCP tool automations_secrets_list
curl -X GET "https://app.kanorio.com/api/v1/sites/{id}/automations/secrets" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"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
}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 · pathrequiredWebsite id. Get it from sites.list or from sites.create.
Request body
handlestringrequiredvaluestringrequired
Response 200
secretsobject[]requiredsecrets[].handlestringrequiredsecrets[].hintstring | nullrequiredsecrets[].createdAtstringrequiredsecrets[].rotatedAtstringrequired
Errors
FORBIDDEN403VALIDATION400PLAN_LIMIT_REACHED403
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-…"}'{
"secrets": [
{
"handle": "erp_api_key",
"hint": "••••f3a9",
"createdAt": "2026-10-31T12:00:00.000Z",
"rotatedAt": "2026-10-31T12:00:00.000Z"
}
]
}Delete a secret
/sites/{id}/automations/secrets/{handle}Delete an automation secret; HTTP actions referencing it fail at send time. Errors: FORBIDDEN, SECRET_NOT_FOUND.
Parameters
idstring · pathrequiredWebsite id. Get it from sites.list or from sites.create.
handlestring · pathrequired
Response 200
deletedtruerequired
Errors
FORBIDDEN403SECRET_NOT_FOUND404
MCP tool automations_secrets_delete
curl -X DELETE "https://app.kanorio.com/api/v1/sites/{id}/automations/secrets/{handle}" \
-H "Authorization: Bearer $KANORIO_TOKEN"{
"deleted": true
}