OpenSequence
DocsAPI referenceSDKs and CLIReference
Sequences

Validation

Every validation code with its fix. Warnings on save, errors on publish.

Edit on GitHub

Validation runs on POST /v1/sequences:validate, on every draft save (problems are returned, the save goes through) and on publish (errors block). Every problem is { path, code, message, severity } with a JSON path into the definition and a sentence a person or an agent can act on:

{ "path": "nodes.sms_follow.params.body", "code": "TOO_LONG", "message": "The SMS is 412 characters (3 segments).", "severity": "warning" }
CodeSeverityWhenFix
INVALID_DEFINITIONerrorthe document does not match the schema: a wrong type, a missing required param, a bad duration, an id that is not lower_snake_case, over 200 nodes or 256 KB, a transition key the node type does not emit, a next on an end nodefollow the path; the message is the schema's own
UNKNOWN_NODE_TYPEerrortype is not registeredone of start, outreach, wait, wait_for, condition, task, end
UNKNOWN_CHANNEL, UNKNOWN_ACTIONerroran outreach node without a channel, with an unknown one, or with an action the channel does not havechannel: "email" or "sms", action: "send"
UNKNOWN_NODEerrorentry, a next target or a branches_by_outcome target names a node that does not existfix the id
MISSING_TRANSITIONerrora required transition is unwired (then on start and wait, yes and no on condition)wire it
UNREACHABLE_NODEerrora node no path from entry reacheswire it or delete it
CYCLEerrora loop with no timed step on it (a wait, a task, or a wait_for with a timeout)put a wait on the loop, or break it
TOO_MANY_SMSerrormore than one sms sendone text per sequence
UNKNOWN_FIELDerrora condition names a field the registry does not knowpick one from GET /v1/schema/fields
BAD_OPERATORerrorthe operator does not fit the field's type (gte on text, contains on a bool)see the operators per type in Conditions
BAD_VALUEerrora missing value where the operator needs one, a non-number for a number field, a value outside an enumfix the value
BAD_EVENTerrora wait_for lists an event with no transitionwire next.<event>
BAD_TEMPLATEerrora {{ path }} outside the known roots, or contact.first_name, contact.last_name, contact.email without a fallbackuse contact.*, attrs.*, sender.*, sequence.name, unsubscribe_url; add | "fallback"
NO_UNSUBSCRIBEwarningan email body without {{ unsubscribe_url }}add it; recipients cannot opt out with one click otherwise
TOO_LONGwarningan SMS body over 320 characters (three or more segments)shorten it; the hard limit is 1000

Problems that stop a publish are also what the engine refuses at enrollment time, so a published version never fails for a reason validation could have caught. The generated list of every code, including the HTTP ones, is in the reference.

The architecture document also lists NO_END, TOO_MANY_CONNECTS and BAD_EXIT. The code has none of them: a path may end on an unwired transition (the enrollment completes), LinkedIn connects are tasks, and exit_on is checked by the schema as INVALID_DEFINITION.