Topolo Docs Topolo Platform
Open workspace

Ingest lifecycle events

Record one typed lifecycle event, or a batch of up to 100 as {events: [...]}, from app usage or any system. Each event is validated against events.catalog, names its contact by contactId, email or externalId (email is used to resolve, never stored; no contact or subscription is created), and is stored once per idempotency key. New events run journey triggers and goals, then rescore the contact against the published lead scoring model. Derived types (inactive, mql) are reserved: 422 reserved_event_type.

Outcome

Record one typed lifecycle event, or a batch of up to 100 as {events: [...]}, from app usage or any system. Each event is validated against events.catalog, names its contact by contactId, email or externalId (email is used to resolve, never stored; no contact or subscription is created), and is stored once per idempotency key. New events run journey triggers and goals, then rescore the contact against the published lead scoring model. Derived types (inactive, mql) are reserved: 422 reserved_event_type.

Before you start

  • Verify identity and pin the intended organization and environment before discovering the action.
  • Discover a granted Nurture workspace. The application permission is workspace:write; required workspace access is read_write. A permission alone does not supply a workspace grant.
  • Organization and workspace come from verified context. Select resourceType/resourceId separately from action input; body fields cannot grant a different organization or workspace. The first authorized product action can initialize an identity-only workspace mirror.
  • Obtain authorization for the documented effect or personal-data export before supplying CLI --confirm or MCP confirm:true.

Discover the target

topolo whoami --json
topolo actions get app_topolo_nurture.events.ingest --detail --json
topolo resources topolo-nurture --json
topolo workspaces list topolo-nurture --json

Request

POST /api/events

Save action input as payload.json. The reviewed plan separates path identifiers, query fields and HTTP body. Set NURTURE_WORKSPACE_ID from granted resource discovery; it is separate from action input.

Inspect and test this action in the signed action console. A test response still requires the verification below.

Input fields

Use an empty JSON object; verified credential and resource context are separate.

Exact input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "anyOf": [
    {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "signup"
            },
            "properties": {
              "type": "object",
              "properties": {
                "plan": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "method": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "userId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "trial_started"
            },
            "properties": {
              "type": "object",
              "properties": {
                "planId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "trialEndsAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "trial_ending"
            },
            "properties": {
              "type": "object",
              "properties": {
                "planId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "subscriptionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "trialEndsAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "form_submitted"
            },
            "properties": {
              "type": "object",
              "properties": {
                "formId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "submissionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                }
              },
              "required": [
                "formId"
              ],
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType",
            "properties"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "purchase"
            },
            "properties": {
              "type": "object",
              "properties": {
                "amountMinor": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                },
                "currency": {
                  "type": "string",
                  "pattern": "^[A-Z]{3}$"
                },
                "orderId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "planId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "subscriptionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                }
              },
              "required": [
                "amountMinor",
                "currency"
              ],
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType",
            "properties"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "subscription_changed"
            },
            "properties": {
              "type": "object",
              "properties": {
                "change": {
                  "type": "string",
                  "enum": [
                    "started",
                    "renewed",
                    "upgraded",
                    "downgraded",
                    "cancel_requested",
                    "cancelled",
                    "reactivated",
                    "trial_ended"
                  ]
                },
                "planId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "subscriptionId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                }
              },
              "required": [
                "change"
              ],
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType",
            "properties"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "feature_used"
            },
            "properties": {
              "type": "object",
              "properties": {
                "feature": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "count": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "feature"
              ],
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType",
            "properties"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "idempotencyKey": {
              "type": "string",
              "minLength": 8,
              "maxLength": 128
            },
            "source": {
              "type": "string",
              "enum": [
                "auth",
                "forms",
                "pay",
                "commerce",
                "app",
                "engage",
                "api"
              ]
            },
            "occurredAt": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "contactId": {
              "anyOf": [
                {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                {
                  "type": "null"
                }
              ]
            },
            "email": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "externalId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "eventType": {
              "type": "string",
              "const": "engage_not_now"
            },
            "properties": {
              "type": "object",
              "properties": {
                "threadId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "campaignId": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "trigger": {
                  "type": "string",
                  "enum": [
                    "classify",
                    "handoff"
                  ]
                },
                "followUpOn": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "required": [
            "idempotencyKey",
            "source",
            "occurredAt",
            "eventType"
          ],
          "additionalProperties": false
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "eventType": {
          "type": "string",
          "enum": [
            "inactive",
            "mql"
          ]
        }
      },
      "required": [
        "eventType"
      ],
      "additionalProperties": {}
    },
    {
      "type": "object",
      "properties": {
        "events": {
          "minItems": 1,
          "maxItems": 100,
          "type": "array",
          "items": {
            "anyOf": [
              {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "signup"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "plan": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "method": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "userId": {
                            "anyOf": [
                              {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "trial_started"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "planId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "trialEndsAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                          }
                        },
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "trial_ending"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "planId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "subscriptionId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "trialEndsAt": {
                            "type": "string",
                            "format": "date-time",
                            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                          }
                        },
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "form_submitted"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "formId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "submissionId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          }
                        },
                        "required": [
                          "formId"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType",
                      "properties"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "purchase"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "amountMinor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9007199254740991
                          },
                          "currency": {
                            "type": "string",
                            "pattern": "^[A-Z]{3}$"
                          },
                          "orderId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "planId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "subscriptionId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          }
                        },
                        "required": [
                          "amountMinor",
                          "currency"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType",
                      "properties"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "subscription_changed"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "change": {
                            "type": "string",
                            "enum": [
                              "started",
                              "renewed",
                              "upgraded",
                              "downgraded",
                              "cancel_requested",
                              "cancelled",
                              "reactivated",
                              "trial_ended"
                            ]
                          },
                          "planId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "subscriptionId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          }
                        },
                        "required": [
                          "change"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType",
                      "properties"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "feature_used"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "feature": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "count": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 9007199254740991
                          }
                        },
                        "required": [
                          "feature"
                        ],
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType",
                      "properties"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "idempotencyKey": {
                        "type": "string",
                        "minLength": 8,
                        "maxLength": 128
                      },
                      "source": {
                        "type": "string",
                        "enum": [
                          "auth",
                          "forms",
                          "pay",
                          "commerce",
                          "app",
                          "engage",
                          "api"
                        ]
                      },
                      "occurredAt": {
                        "type": "string",
                        "format": "date-time",
                        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                      },
                      "contactId": {
                        "anyOf": [
                          {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 64
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "email": {
                        "type": "string",
                        "maxLength": 254,
                        "format": "email",
                        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                      },
                      "externalId": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 200
                      },
                      "eventType": {
                        "type": "string",
                        "const": "engage_not_now"
                      },
                      "properties": {
                        "type": "object",
                        "properties": {
                          "threadId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "campaignId": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "trigger": {
                            "type": "string",
                            "enum": [
                              "classify",
                              "handoff"
                            ]
                          },
                          "followUpOn": {
                            "anyOf": [
                              {
                                "type": "string",
                                "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                              },
                              {
                                "type": "null"
                              }
                            ]
                          }
                        },
                        "additionalProperties": {
                          "anyOf": [
                            {
                              "type": "string",
                              "maxLength": 500
                            },
                            {
                              "type": "number"
                            },
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    },
                    "required": [
                      "idempotencyKey",
                      "source",
                      "occurredAt",
                      "eventType"
                    ],
                    "additionalProperties": false
                  }
                ]
              },
              {
                "type": "object",
                "properties": {
                  "eventType": {
                    "type": "string",
                    "enum": [
                      "inactive",
                      "mql"
                    ]
                  }
                },
                "required": [
                  "eventType"
                ],
                "additionalProperties": {}
              }
            ]
          }
        }
      },
      "required": [
        "events"
      ],
      "additionalProperties": false
    }
  ]
}

Effects

  • Appends each event to the workspace event log, once per idempotency key; a repeat returns the original with duplicate true.
  • Links an externalId to the resolved contact so later events carrying only that externalId resolve.
  • Enrolls contacts in published journeys triggered by the event type and converts enrollments whose goal it is.
  • Rescores the contact when a published scoring model has a behaviour rule for the event type; reaching the MQL threshold records an mql event and hands off through lead_handoff connectors.

Interpret the response

Single-event requests return event.id; batch requests return results[].event.id. There is no one identifier path common to both response shapes. Inspect each duplicate flag and verify the returned event ids through events.list.

Call app_topolo_nurture.events.list with the eventType and confirm each event id is present.

Exact success schema:

{
  "type": "object",
  "properties": {
    "event": {
      "type": "object",
      "required": [
        "id"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "idempotencyKey": {
          "type": "string"
        },
        "eventType": {
          "type": "string"
        },
        "source": {
          "type": "string"
        },
        "contactId": {
          "type": [
            "string",
            "null"
          ]
        },
        "properties": {
          "type": "object"
        },
        "occurredAt": {
          "type": "string"
        },
        "receivedAt": {
          "type": "string"
        }
      }
    },
    "duplicate": {
      "type": "boolean"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "event",
          "duplicate"
        ],
        "properties": {
          "event": {
            "type": "object",
            "required": [
              "id"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "idempotencyKey": {
                "type": "string"
              },
              "eventType": {
                "type": "string"
              },
              "source": {
                "type": "string"
              },
              "contactId": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "properties": {
                "type": "object"
              },
              "occurredAt": {
                "type": "string"
              },
              "receivedAt": {
                "type": "string"
              }
            }
          },
          "duplicate": {
            "type": "boolean"
          }
        }
      }
    },
    "created": {
      "type": "integer"
    },
    "duplicates": {
      "type": "integer"
    }
  }
}

Worked examples

Actual dispatcher and migration-created SQLite or Worker handlers; identity/workspace and external service dependencies are simulated. Fixture identifiers and timestamps are synthetic. These responses establish no live authorization, paid generation, credential provisioning or message delivery. Replace synthetic identifiers using credential-scoped discovery. A local success is not evidence of a deployed effect, configured provider or delivered message.

Successful request

Actual dispatcher and migration-created SQLite; verified identity/workspace and external CRM, Engage, Notify, Consent, Nexus, Brand, Generator, Voice and delivery dependencies are simulated. No live authorization, paid generation or external delivery is established.

Input · payload.json:

{
  "idempotencyKey": "erase-k1",
  "source": "auth",
  "occurredAt": "2026-09-28T00:00:00Z",
  "contactId": "nct_653fc71031f04d7799b9d3d79723a5ea",
  "eventType": "signup"
}

CLI:

topolo actions validate app_topolo_nurture.events.ingest --data @payload.json --json
topolo actions plan app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --confirm --json

MCP tool and arguments:

{
  "tool": "topolo_call_action",
  "arguments": {
    "actionId": "app_topolo_nurture.events.ingest",
    "input": {
      "idempotencyKey": "erase-k1",
      "source": "auth",
      "occurredAt": "2026-09-28T00:00:00Z",
      "contactId": "nct_653fc71031f04d7799b9d3d79723a5ea",
      "eventType": "signup"
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>",
    "confirm": true
  }
}

Captured local response · HTTP 201:

{
  "event": {
    "id": "evt_eb7825cdeae246729c0f0ae5021a2616",
    "idempotencyKey": "erase-k1",
    "eventType": "signup",
    "source": "auth",
    "contactId": "nct_653fc71031f04d7799b9d3d79723a5ea",
    "properties": {},
    "occurredAt": "2026-09-28T00:00:00Z",
    "receivedAt": "2026-10-04T00:32:34.654Z"
  },
  "duplicate": false
}

HTTP 201. Call app_topolo_nurture.events.list with the eventType and confirm each event id is present.

Another supported request

Actual dispatcher and migration-created SQLite; verified identity/workspace and external CRM, Engage, Notify, Consent, Nexus, Brand, Generator, Voice and delivery dependencies are simulated. No live authorization, paid generation or external delivery is established.

Input · payload.json:

{
  "idempotencyKey": "erase-k2",
  "source": "auth",
  "occurredAt": "2026-09-28T00:00:00Z",
  "contactId": "nct_90025a2295394f68883e2d5ff7972940",
  "eventType": "signup"
}

CLI:

topolo actions validate app_topolo_nurture.events.ingest --data @payload.json --json
topolo actions plan app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --confirm --json

MCP tool and arguments:

{
  "tool": "topolo_call_action",
  "arguments": {
    "actionId": "app_topolo_nurture.events.ingest",
    "input": {
      "idempotencyKey": "erase-k2",
      "source": "auth",
      "occurredAt": "2026-09-28T00:00:00Z",
      "contactId": "nct_90025a2295394f68883e2d5ff7972940",
      "eventType": "signup"
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>",
    "confirm": true
  }
}

Captured local response · HTTP 201:

{
  "event": {
    "id": "evt_9dce9e8b5792443ca9eda1144842abab",
    "idempotencyKey": "erase-k2",
    "eventType": "signup",
    "source": "auth",
    "contactId": "nct_90025a2295394f68883e2d5ff7972940",
    "properties": {},
    "occurredAt": "2026-09-28T00:00:00Z",
    "receivedAt": "2026-10-04T00:32:34.655Z"
  },
  "duplicate": false
}

HTTP 201. Call app_topolo_nurture.events.list with the eventType and confirm each event id is present.

Refused request · permission_denied

Actual dispatcher and migration-created SQLite; verified identity/workspace and external CRM, Engage, Notify, Consent, Nexus, Brand, Generator, Voice and delivery dependencies are simulated. No live authorization, paid generation or external delivery is established.

Input · payload.json:

{
  "idempotencyKey": "k-denied-1",
  "source": "app",
  "occurredAt": "2026-10-01T09:00:00.000Z",
  "eventType": "feature_used",
  "properties": {
    "feature": "export"
  }
}

CLI:

topolo actions validate app_topolo_nurture.events.ingest --data @payload.json --json
topolo actions plan app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --json

Captured local response · HTTP 403:

{
  "error": {
    "code": "permission_denied",
    "message": "The credential lacks workspace:write.",
    "details": {
      "requiredPermission": "workspace:write"
    }
  }
}

HTTP 403. Preserve the refusal details and do not claim success.

Refused request · invalid_input

Actual dispatcher and migration-created SQLite; verified identity/workspace and external CRM, Engage, Notify, Consent, Nexus, Brand, Generator, Voice and delivery dependencies are simulated. No live authorization, paid generation or external delivery is established.

Input · payload.json:

{
  "idempotencyKey": "k-change-1",
  "eventType": "subscription_changed",
  "source": "app",
  "occurredAt": "2026-10-01T09:00:00.000Z",
  "properties": {
    "change": "exploded"
  }
}

CLI:

topolo actions validate app_topolo_nurture.events.ingest --data @payload.json --json
topolo actions plan app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --json

Captured local response · HTTP 422:

{
  "error": {
    "code": "invalid_input",
    "message": "The input does not match the action schema.",
    "details": [
      {
        "code": "invalid_union",
        "errors": [
          [
            {
              "code": "invalid_value",
              "values": [
                "started",
                "renewed",
                "upgraded",
                "downgraded",
                "cancel_requested",
                "cancelled",
                "reactivated",
                "trial_ended"
              ],
              "path": [
                "properties",
                "change"
              ],
              "message": "Invalid option: expected one of \"started\"|\"renewed\"|\"upgraded\"|\"downgraded\"|\"cancel_requested\"|\"cancelled\"|\"reactivated\"|\"trial_ended\""
            }
          ],
          [
            {
              "code": "invalid_value",
              "values": [
                "inactive",
                "mql"
              ],
              "path": [
                "eventType"
              ],
              "message": "Invalid option: expected one of \"inactive\"|\"mql\""
            }
          ],
          [
            {
              "expected": "array",
              "code": "invalid_type",
              "path": [
                "events"
              ],
              "message": "Invalid input: expected array, received undefined"
            },
            {
              "code": "unrecognized_keys",
              "keys": [
                "idempotencyKey",
                "eventType",
                "source",
                "occurredAt",
                "properties"
              ],
              "path": [],
              "message": "Unrecognized keys: \"idempotencyKey\", \"eventType\", \"source\", \"occurredAt\", \"properties\""
            }
          ]
        ],
        "path": [],
        "message": "Invalid input"
      }
    ]
  }
}

HTTP 422. Preserve the refusal details and do not claim success.

Refused request · reserved_event_type

Actual dispatcher and migration-created SQLite; verified identity/workspace and external CRM, Engage, Notify, Consent, Nexus, Brand, Generator, Voice and delivery dependencies are simulated. No live authorization, paid generation or external delivery is established.

Input · payload.json:

{
  "eventType": "inactive",
  "idempotencyKey": "k-derived-1",
  "source": "app",
  "occurredAt": "2026-10-01T09:00:00.000Z",
  "properties": {
    "inactiveDays": 3,
    "lastActivityAt": "2026-10-01T09:00:00.000Z"
  }
}

CLI:

topolo actions validate app_topolo_nurture.events.ingest --data @payload.json --json
topolo actions plan app_topolo_nurture.events.ingest --resource-type workspace --resource-id "$NURTURE_WORKSPACE_ID" --data @payload.json --json

Captured local response · HTTP 422:

{
  "error": {
    "code": "reserved_event_type",
    "message": "inactive events are derived by Nurture and cannot be ingested."
  }
}

HTTP 422. Preserve the refusal details and do not claim success.

Verify the result

  • Call app_topolo_nurture.events.list with the eventType and confirm each event id is present.

Errors and recovery

  • organization_required (HTTP 403): Select an organization available to the verified caller before choosing a Nurture workspace.
  • permission_denied (HTTP 403): Grant the credential the required Nurture workspace permission.
  • workspace_required (HTTP 409): Create a Nurture workspace, or pass the workspace resource context.
  • invalid_input (HTTP 422): Correct the fields named in error.details using inputSchema, then retry.
  • reserved_event_type (HTTP 422): Do not send derived types (inactive, mql); Nurture records them. Check ingestable in events.catalog.

Auth or gateway failures may precede this handler. Preserve the exact response shape, error string/code, request id and credential context; no synthetic fixture establishes live credential access.

Recovery boundary

The event log is append-only; a wrong event cannot be removed.

  • List lifecycle events: List the newest lifecycle events in the workspace, optionally filtered by event type or contact, up to 200.

Evidence

Actual dispatcher and migration-created SQLite or Worker handlers; identity/workspace and external service dependencies are simulated. Fixture identifiers and timestamps are synthetic. These responses establish no live authorization, paid generation, credential provisioning or message delivery. Test scenario and capture digests are retained with each fixture.