Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (Idempotent-Replayed: true) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.
Ordered steps. Total count INCLUDING nested branch sub-steps must be <= 32, and the steps serialized at most 262144 bytes. New instances run on Cloudflare Workflows: each step is a durable step with retries, so emit_event is keyed on (instance, step) and never emits twice.
Slugified server-side: lowercased, non-alphanumerics collapsed to '-', trimmed, max 48 chars, falling back to 'workflow'. Defaults to a slug of name. Not uniqueness-checked.
Evaluated against the entry record. An empty array matches every record in the dataset.
One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op "equals". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A {{placeholder}} value is refused here: nothing resolves it, so it would be compared as literal text.
The created workflow, as GET by id returns it (#201).
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Hookie","description":"Capture, route and deliver webhooks on Cloudflare — ingest anything, route it into datasets with rules, and deliver signed events with retries, AI triggers and multi-step workflows.","colors":{"primary":"#2B56A1","light":"#749ADC","dark":"#2CB8B8"},"logo":{"light":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/light.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3d05bb847a5407bc7e75e7270aafc101","dark":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/dark.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3a34a943f368167074930496ba10fa63","href":"https://hookie.ai"},"favicon":"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/favicon.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=e81ffa68ca681fd9823d22e0e57d7003","api":{"openapi":"openapi.json","playground":{"display":"interactive"},"examples":{"languages":["bash","javascript","python"]}},"navbar":{"links":[{"href":"https://hookie.ai","label":"Hookie.ai"},{"href":"https://hookie.ai/use-cases","label":"Use cases"},{"href":"https://hookie.ai/pricing","label":"Pricing"}],"primary":{"type":"button","label":"Open console","href":"https://app.hookie.ai/"}},"footer":{"socials":{"website":"https://hookie.ai"},"links":[{"header":"Product","items":[{"label":"Features","href":"https://hookie.ai/features"},{"label":"Use cases","href":"https://hookie.ai/use-cases"},{"label":"Pricing","href":"https://hookie.ai/pricing"},{"label":"Changelog","href":"https://hookie.ai/changelog"},{"label":"Status","href":"https://hookie.ai/status"}]},{"header":"Docs","items":[{"label":"Quickstart","href":"/quickstart"},{"label":"API reference","href":"/api-reference"},{"label":"Connected agents","href":"/connected-agents"}]},{"header":"Company","items":[{"label":"Security","href":"https://hookie.ai/security"},{"label":"Contact","href":"https://hookie.ai/contact"}]},{"header":"Legal","items":[{"label":"Terms","href":"https://hookie.ai/legal/terms"},{"label":"Privacy","href":"https://hookie.ai/legal/privacy"},{"label":"Acceptable use","href":"https://hookie.ai/legal/acceptable-use"}]}]},"styling":{"codeblocks":"dark","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"hookie-ai","hasAudioNarration":false,"actualSubdomain":"hookie-ai","customDomains":["docs.hookie.ai"],"gitSource":{"type":"github","owner":"bcusack1996","repo":"hookie-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6acb37193d9a94205f095409","collectionId":"0e08d911-dc25-4671-83b6-91f9acd96a01","liveDeploymentHistoryId":"6acb37193d9a94205f095409","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6acb37193d9a94205f095409","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"default","tag":"API reference","count":224},{"language":"default","tag":"Workspace","count":26},{"language":"default","tag":"Guides","count":20},{"language":"default","tag":"Customer Portal","count":18},{"language":"default","tag":"Portals","count":12},{"language":"default","tag":"Ingest","count":10},{"language":"default","tag":"SSO","count":10},{"language":"default","tag":"Workflows","count":10},{"language":"default","tag":"Concepts","count":9},{"language":"default","tag":"Webhooks","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/workflows/create-a-workflow-definition","slug":"/api-reference/workflows/create-a-workflow-definition","pageMetadata":{"title":"Create a workflow definition","description":null,"deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/create-a-workflow-definition","autogeneratedByOpenApi":true},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Create a workflow definition","description":null,"deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/create-a-workflow-definition","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"createWorkflow","summary":"Create a workflow definition","tags":["Workflows"],"responses":{"201":"4ec92ffd-e7ff-4e7f-be81-56252c4e23cd","400":"9162a09b-17ef-432d-8e0c-af06d1d9d6d8","401":"cac05a76-bba7-4eec-bfe9-5db756c57aa5","403":"6591219d-dace-470f-b0f6-15c0a0c73c1f","404":"2bda45fc-eb74-47df-9293-83d4c6fae189","429":"401aebf7-6731-4252-946d-9534ddb1784f","500":"cef3ca42-992e-48e3-9ce5-00ebaaa0d1f8"},"parameters":["f29a96c6-4ff4-448e-b3f5-ff67a2a4a012","afc245d2-43e8-496e-b327-eab91d5b06aa"],"requestBody":"ace54f74-09f1-42d9-9365-3ce48f80a409","security":["303d652e-ae1e-409d-9688-7df61faf1408","32cfc502-f6c6-4fd5-9839-d370b5c258cf","7c6edbd2-72db-454a-8ec8-7a1049d3196a"],"method":"post","type":"path","servers":["0ea1ddc9-3a31-4421-86e4-db5233ac2213","d5e32d1f-0c83-4838-aa53-3e0ffb5d5c54"],"path":"/admin/api/projects/{project_id}/workflows","baseUrlOptions":["https://app.hookie.ai","https://app.preview.hookie.ai"],"title":"Create a workflow definition","description":"","codeSamples":[],"requestExampleLanguages":["bash","javascript","python"],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"f29a96c6-4ff4-448e-b3f5-ff67a2a4a012":{"name":"project_id","in":"path","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}},"afc245d2-43e8-496e-b327-eab91d5b06aa":{"name":"Idempotency-Key","in":"header","required":false,"description":"Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (`Idempotent-Replayed: true`) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.","schema":{"type":"string","minLength":1,"maxLength":255,"isRequired":false,"description":"Makes a POST safe to retry for 24 hours: the same key, credential, path and body returns the stored response (`Idempotent-Replayed: true`) instead of running again. 422 if the key was used for a different request; 409 while the first is in flight.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","entry_dataset","steps"],"properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Trimmed before validation.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"entry_dataset":{"type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9_]{0,62}$","description":"A record landing in this dataset via the ingest/cron/ws pipeline can start an instance. Records emitted BY a workflow never start new ones.","isRequired":true,"uniqueKey":"entry_dataset","typeLabel":"string"},"steps":{"type":"array","minItems":1,"description":"Ordered steps. Total count INCLUDING nested branch sub-steps must be \u003c= 32, and the steps serialized at most 262144 bytes. New instances run on Cloudflare Workflows: each step is a durable step with retries, so emit_event is keyed on (instance, step) and never emits twice.","items":{"oneOf":[{"type":"object","title":"emit_event","required":["type","dataset"],"properties":{"type":{"type":"string","enum":["emit_event"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"dataset":{"type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9_]{0,62}$","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.0.dataset","typeLabel":"string"},"payload":{"type":"object","description":"Must be a plain object (not an array/null). Merged OVER the entry record's fields - payload wins. String leaves are templated from the instance context (#165, FLOW-6): \"{{triage.summary}}\" alone takes the value with its type, {{path}} inside longer text is replaced as text. A placeholder that resolves to nothing leaves its field out; one whose root no earlier step writes (entry, an output_key, a set key, waited_event) is refused at save.","uniqueKey":"steps.items.[INDEX].oneOf.0.payload","typeLabel":"object"},"deliver":{"type":"boolean","default":true,"description":"Send the emitted record through the shared fan-out: the project's destinations (under the delivery allowance), the live stream and AI triggers, never a workflow. It is written with a fan-out outbox row, so a fan-out that fails is re-driven by the sweep (#206). Only the literal false disables it; the record is then only stored and streamed.","uniqueKey":"steps.items.[INDEX].oneOf.0.deliver","typeLabel":"boolean"}},"uniqueKey":"steps.items.[INDEX].oneOf.0","typeLabel":"emit_event · object"},{"type":"object","title":"call_ai","required":["type"],"properties":{"type":{"type":"string","enum":["call_ai"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"instructions":{"type":"string","description":"Required — but `prompt` is accepted as an alias. If both are absent or empty the step is rejected.","uniqueKey":"steps.items.[INDEX].oneOf.1.instructions","typeLabel":"string"},"prompt":{"type":"string","description":"Alias for `instructions`; normalized into `instructions` on write.","uniqueKey":"steps.items.[INDEX].oneOf.1.prompt","typeLabel":"string"},"model":{"type":"string","description":"A model from GET /admin/api/ai-models. Absent or empty means the default (@cf/meta/llama-3.3-70b-instruct-fp8-fast); anything off the list is refused with 400 `… is not a supported model` (#196, FLOW-16). It used to be replaced by the default without a word.","uniqueKey":"steps.items.[INDEX].oneOf.1.model","typeLabel":"string"},"max_tokens":{"type":"integer","description":"Clamped to 1..1024. A non-integer is dropped.","uniqueKey":"steps.items.[INDEX].oneOf.1.max_tokens","typeLabel":"integer"},"output_key":{"type":"string","default":"ai_result","description":"Instance-context key the reply is stored under. A reply that is JSON is stored parsed - bare, in a ```json fence, or after a preface such as 'Here is the JSON:' (#165, FLOW-9) - so a branch can read its fields; anything else stays text.","uniqueKey":"steps.items.[INDEX].oneOf.1.output_key","typeLabel":"string"},"output_dataset":{"type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9_]{0,62}$","description":"Optional dataset to also write the AI result into, as a record {output, workflow_id, instance_id} carrying the entry event's hop. The record goes through the shared fan-out like any other event, with a fan-out outbox row behind it (#177, FLOW-6): the project's destinations whose filter admits the dataset (under the monthly delivery allowance), the live stream and matching AI triggers. It never starts or resumes a workflow, not even one entered on this dataset, so a workflow cannot feed itself.","uniqueKey":"steps.items.[INDEX].oneOf.1.output_dataset","typeLabel":"string"}},"uniqueKey":"steps.items.[INDEX].oneOf.1","typeLabel":"call_ai · object"},{"type":"object","title":"wait_for_event","description":"NOT allowed inside a branch.","required":["type","dataset"],"properties":{"type":{"type":"string","enum":["wait_for_event"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"dataset":{"type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9_]{0,62}$","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.dataset","typeLabel":"string"},"conditions":{"type":"array","default":[],"description":"Read against the ARRIVING record. A value may reference this run's context (see items).","items":{"oneOf":[{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A value may be a {{placeholder}} naming the instance context (e.g. \"{{entry.order_id}}\"), resolved when the wait is armed, so the wait matches this instance's record only; a placeholder that resolves to nothing fails the run.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A value may be a {{placeholder}} naming the instance context (e.g. \"{{entry.order_id}}\"), resolved when the wait is armed, so the wait matches this instance's record only; a placeholder that resolves to nothing fails the run.","properties":{"any":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.2.conditions","typeLabel":"object[]"},"timeout_seconds":{"type":"integer","minimum":1,"description":"Must be > 0; floored; at most 31536000 (365 days). Omitted: on the Cloudflare Workflows engine the wait times out after 365 days (step.waitForEvent needs a finite timeout); on the legacy engine it never does. What a timeout does is on_timeout.","maximum":31536000,"uniqueKey":"steps.items.[INDEX].oneOf.2.timeout_seconds","typeLabel":"integer"},"on_timeout":{"type":"string","enum":["fail","continue"],"default":"fail","description":"fail (default): a timed-out wait ends the instance timed_out. continue (#165): the run carries on with waited_event set to null, so a following branch on {\"path\":\"waited_event\",\"op\":\"exists\"} can take the no-reply path. Both engines.","uniqueKey":"steps.items.[INDEX].oneOf.2.on_timeout","typeLabel":"enum\u003cstring>"}},"uniqueKey":"steps.items.[INDEX].oneOf.2","typeLabel":"wait_for_event · object"},{"type":"object","title":"delay","description":"NOT allowed inside a branch.","required":["type","seconds"],"properties":{"type":{"type":"string","enum":["delay"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"seconds":{"type":"integer","minimum":1,"description":"Must be > 0; floored; at most 31536000 (365 days, Cloudflare's step.sleep maximum). On the Cloudflare Workflows engine the sleep is accurate to the second; a legacy instance still resumes on the ~5-minute sweep.","maximum":31536000,"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.3.seconds","typeLabel":"integer"}},"uniqueKey":"steps.items.[INDEX].oneOf.3","typeLabel":"delay · object"},{"type":"object","title":"agent_call","required":["type","agent_id"],"properties":{"type":{"type":"string","enum":["agent_call"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.4.type","typeLabel":"enum\u003cstring>"},"agent_id":{"type":"string","minLength":1,"description":"Id of a project-scoped ai_agent. Existence is NOT checked at write time — a missing or inactive agent fails the step at run time.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.4.agent_id","typeLabel":"string"},"output_key":{"type":"string","default":"agent_result","uniqueKey":"steps.items.[INDEX].oneOf.4.output_key","typeLabel":"string"}},"uniqueKey":"steps.items.[INDEX].oneOf.4","typeLabel":"agent_call · object"},{"type":"object","title":"branch","description":"Max nesting depth 3.","required":["type","conditions","then"],"properties":{"type":{"type":"string","enum":["branch"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.type","typeLabel":"enum\u003cstring>"},"conditions":{"type":"array","minItems":1,"description":"At least one condition is required. Evaluated against the instance CONTEXT (entry payload under `entry`, plus each earlier step's output: call_ai/agent_call/http/transform output_key, every key a set step writes, `waited_event`).","items":{"oneOf":[{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A value may be a {{placeholder}} naming the instance context (e.g. \"{{entry.order_id}}\"), resolved each time the branch is evaluated.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A value may be a {{placeholder}} naming the instance context (e.g. \"{{entry.order_id}}\"), resolved each time the branch is evaluated.","properties":{"any":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.conditions","typeLabel":"object[]"},"then":{"type":"array","minItems":1,"description":"Sub-steps run when the conditions match. Only types that complete in one step are allowed: emit_event, call_ai, agent_call, http, set, transform, branch.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.5.then","typeLabel":"array"},"else":{"type":"array","description":"Optional. Same restrictions as `then`. An empty array is normalized away to absent.","uniqueKey":"steps.items.[INDEX].oneOf.5.else","typeLabel":"array"}},"uniqueKey":"steps.items.[INDEX].oneOf.5","typeLabel":"branch · object"},{"type":"object","title":"http","required":["type","method","url"],"properties":{"type":{"type":"string","enum":["http"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.6.type","typeLabel":"enum\u003cstring>"},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"],"description":"Case-insensitive on write; stored upper-case.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.6.method","typeLabel":"enum\u003cstring>"},"url":{"type":"string","maxLength":2048,"description":"https to a PUBLIC host: no localhost, internal-only or single-label names, no private, loopback, link-local, CGNAT or multicast IP literals, no credentials in the URL. {{placeholders}} may appear only after the host; embedded values are URL-encoded. The resolved URL is checked again before every request. Redirects are never followed: a 3xx is returned as the result. Templating: a string that is exactly \"{{path}}\" takes the instance-context value at that dotted path with its type kept; {{path}} inside a longer string is replaced by the value as text (objects as JSON, null/missing as empty).","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.6.url","typeLabel":"string"},"headers":{"type":"object","additionalProperties":{"type":"string","maxLength":4096,"uniqueKey":"steps.items.[INDEX].oneOf.6.headers.additionalProperties","typeLabel":"string"},"maxProperties":32,"description":"Header values are PLAIN CONFIGURATION, stored with the definition and returned by GET: do not put secrets in them. Values are templated. Host, Content-Length, Connection, Transfer-Encoding, CF-Connecting-IP and X-Forwarded-For are refused. User-Agent and Idempotency-Key (\u003cinstance id>:\u003cstep path>, stable across retries) are sent unless set here.","uniqueKey":"steps.items.[INDEX].oneOf.6.headers","typeLabel":"object"},"body":{"description":"JSON, at most 65536 bytes serialized; not allowed on GET. String leaves are templated. A string body is sent as text/plain, anything else as application/json, unless Content-Type is set.","uniqueKey":"steps.items.[INDEX].oneOf.6.body","typeLabel":"any"},"output_key":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$","default":"http_result","description":"Context key the result {status, body} is written to. body is the response parsed as JSON when it is JSON, else text, capped at 65536 bytes. A non-2xx status is a result, not a failure; only a network error or the timeout fails the step (retried twice).","uniqueKey":"steps.items.[INDEX].oneOf.6.output_key","typeLabel":"string"},"timeout_seconds":{"type":"integer","minimum":1,"maximum":30,"default":10,"uniqueKey":"steps.items.[INDEX].oneOf.6.timeout_seconds","typeLabel":"integer"}},"uniqueKey":"steps.items.[INDEX].oneOf.6","typeLabel":"http · object"},{"type":"object","title":"set","required":["type","values"],"properties":{"type":{"type":"string","enum":["set"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.7.type","typeLabel":"enum\u003cstring>"},"values":{"type":"object","minProperties":1,"maxProperties":64,"description":"Each key (letters, digits, underscores; not `entry`) is written into the instance context. Templating: a string that is exactly \"{{path}}\" takes the instance-context value at that dotted path with its type kept; {{path}} inside a longer string is replaced by the value as text (objects as JSON, null/missing as empty). Anything else is a literal. At most 262144 bytes serialized.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.7.values","typeLabel":"object"}},"uniqueKey":"steps.items.[INDEX].oneOf.7","typeLabel":"set · object"},{"type":"object","title":"transform","required":["type","mapping"],"properties":{"type":{"type":"string","enum":["transform"],"isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.8.type","typeLabel":"enum\u003cstring>"},"mapping":{"type":"object","minProperties":1,"maxProperties":64,"additionalProperties":{"type":"string","minLength":1,"uniqueKey":"steps.items.[INDEX].oneOf.8.mapping.additionalProperties","typeLabel":"string"},"description":"Output key → dotted instance-context path (e.g. \"entry.customer.email\"). Builds one object; a missing path gives undefined.","isRequired":true,"uniqueKey":"steps.items.[INDEX].oneOf.8.mapping","typeLabel":"object"},"output_key":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$","default":"transformed","uniqueKey":"steps.items.[INDEX].oneOf.8.output_key","typeLabel":"string"}},"uniqueKey":"steps.items.[INDEX].oneOf.8","typeLabel":"transform · object"}],"uniqueKey":"steps.items.[INDEX]","typeLabel":"emit_event · object | call_ai · object | wait_for_event · object | delay · object | agent_call · object | branch · object | http · object | set · object | transform · object"},"isRequired":true,"uniqueKey":"steps","typeLabel":"(emit_event · object | call_ai · object | wait_for_event · object | delay · object | agent_call · object | branch · object | http · object | set · object | transform · object)[]"},"slug":{"type":"string","description":"Slugified server-side: lowercased, non-alphanumerics collapsed to '-', trimmed, max 48 chars, falling back to 'workflow'. Defaults to a slug of `name`. Not uniqueness-checked.","uniqueKey":"slug","typeLabel":"string"},"active":{"type":"boolean","default":true,"description":"Only the literal false deactivates; anything else (including omission) means active. An inactive workflow starts no instances.","uniqueKey":"active","typeLabel":"boolean"},"entry_conditions":{"type":"array","default":[],"description":"Evaluated against the entry record. An empty array matches every record in the dataset.","items":{"oneOf":[{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A {{placeholder}} value is refused here: nothing resolves it, so it would be compared as literal text.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One condition dialect (#165): {path, op, value}, or {path, equals} as shorthand for op \"equals\". Refused at save: both forms at once, a missing value (except exists), gt/gte/lt/lte with a non-number, contains or regex with a non-string, a regex that does not compile or is unbounded, in without a list of 1-100 scalars, any other object or array value, an unknown key. A {{placeholder}} value is refused here: nothing resolves it, so it would be compared as literal text.","properties":{"any":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0.equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A group inside a ConditionGroup: its members are Conditions. A group nested a third level is refused with 400.","properties":{"any":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.any","typeLabel":"object[]"},"all":{"type":"array","minItems":1,"items":{"type":"object","description":"One condition of the one condition dialect (#165, extended in #201), accepted by rules, endpoint criteria, workflow entry/branch/wait conditions, AI-trigger match conditions and WebSocket-trigger conditions. Either {path, op, value} or the shorthand {path, equals}. op: equals | not_equals | contains | exists | gt | gte | lt | lte | in | regex. exists takes no value; gt/gte/lt/lte need a finite number and match a numeric field, or a string field that is a plain decimal once trimmed (optional sign, digits, optional fraction), such as a form's \"150\" (#259); hex, exponents, empty and other text never match; contains needs a string; in needs a list of 1-100 scalars; regex needs a pattern of at most 200 characters that compiles, with no backreferences, no repeated group that itself repeats or alternates ((a+)+, (a|b)*) and at most 2 open-ended repetitions (*, +, {n,}), and is tested against the first 256 characters of a string field. In rules and endpoint criteria equals, not_equals and in compare as TEXT (an exact match is stored as {path, equals}); in workflows and triggers they compare with ===. All conditions in a list must hold (AND); an empty list matches everything. An invalid condition is refused with 400 when saved.","required":["path"],"properties":{"path":{"type":"string","description":"Dot path into the payload.","isRequired":true,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].path","typeLabel":"string"},"op":{"type":"string","enum":["equals","not_equals","contains","exists","gt","gte","lt","lte","in","regex"],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].op","typeLabel":"enum\u003cstring>"},"value":{"description":"Required for every op but exists.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].value","typeLabel":"any"},"equals":{"description":"Shorthand for op equals with this value; not together with op/value.","uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX].equals","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1.all","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"entry_conditions.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"entry_conditions.items.[INDEX]","typeLabel":"object"},"uniqueKey":"entry_conditions","typeLabel":"object[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","entry_dataset":"\u003cstring>","steps":[{"type":"emit_event","dataset":"\u003cstring>","payload":{},"deliver":true}],"slug":"\u003cstring>","active":true,"entry_conditions":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"4ec92ffd-e7ff-4e7f-be81-56252c4e23cd":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","required":["id","ok"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"ok":{"type":"boolean","enum":[true],"isRequired":true,"uniqueKey":"ok","typeLabel":"enum\u003cboolean>"},"workflow":{"type":"object","properties":{"id":{"type":"string","uniqueKey":"workflow.id","typeLabel":"string"},"name":{"type":"string","uniqueKey":"workflow.name","typeLabel":"string"},"slug":{"type":"string","uniqueKey":"workflow.slug","typeLabel":"string"},"version":{"type":"integer","description":"Starts at 1; incremented on every update.","uniqueKey":"workflow.version","typeLabel":"integer"},"active":{"type":"integer","enum":[0,1],"uniqueKey":"workflow.active","typeLabel":"enum\u003cinteger>"},"entry_dataset":{"type":"string","uniqueKey":"workflow.entry_dataset","typeLabel":"string"},"entry_conditions":{"type":"string","description":"Raw JSON string of the condition array.","uniqueKey":"workflow.entry_conditions","typeLabel":"string"},"steps":{"type":"string","description":"Raw JSON string of the normalized step array.","uniqueKey":"workflow.steps","typeLabel":"string"},"created_at":{"type":"string","uniqueKey":"workflow.created_at","typeLabel":"string"},"updated_at":{"type":"string","uniqueKey":"workflow.updated_at","typeLabel":"string"}},"description":"The created workflow, as GET by id returns it (#201).","uniqueKey":"workflow","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","ok":true,"workflow":{"id":"\u003cstring>","name":"\u003cstring>","slug":"\u003cstring>","version":123,"active":0,"entry_dataset":"\u003cstring>","entry_conditions":"\u003cstring>","steps":"\u003cstring>","created_at":"\u003cstring>","updated_at":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"9162a09b-17ef-432d-8e0c-af06d1d9d6d8":{"description":"Validation failure, one message. Examples: `body must be an object`; `name is required (\u003c=120 chars)`; `entry_dataset: \u003cdataset name error>`; `conditions must be an array`; `condition.path is required`; `condition.op must be one of equals|not_equals|contains|exists|gt|lt`; `steps must be an array`; `at least one step is required`; `too many steps (max 32 including branch sub-steps)`; `step N: unknown type \"x\"`; `step N (call_ai): instructions/prompt is required`; `step N (delay): seconds must be > 0`; `step N (wait_for_event): not allowed inside a branch (branches run atomically)`; `step N (branch): max nesting depth is 3`; `step N (branch): then must contain at least one step`; `step N (delay): seconds must be at most 31536000 (365 days)`; `step N (http): url must be https`; `step N (http): a {{placeholder}} may only appear after the host, …`; `step N (http): url host \"…\" is a private or reserved address`; `step N (http): a GET request cannot carry a body`; `step N (set): values must set at least one key`; `step N (transform): mapping.x must be a context path such as \"entry.email\"`; `steps are too large (max 262144 bytes serialized)`.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"cac05a76-bba7-4eec-bfe9-5db756c57aa5":{"description":"Not signed in.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"6591219d-dace-470f-b0f6-15c0a0c73c1f":{"description":"`Insufficient role` (write capability required), or `Missing X-Requested-With header`. Also `reason: \"workspace_suspended\"` while the workspace is suspended. For an OAuth-connected agent the body also carries `code`, `required_scope` and `granted_scopes`, plus `manage_url` when widening its grant in Settings → Connected agents would let the call through (see Error).","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"2bda45fc-eb74-47df-9293-83d4c6fae189":{"description":"`Project not found`.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"401aebf7-6731-4252-946d-9534ddb1784f":{"description":"Over this credential's burst limit (about 100 requests per 10 seconds; best-effort, counted separately at each Cloudflare location). Retry after `Retry-After` seconds.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait."}},"content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"},"cef3ca42-992e-48e3-9ce5-00ebaaa0d1f8":{"description":"`Internal error`.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable reason.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"retry_after":{"type":"integer","description":"Seconds to wait. Present on 429.","uniqueKey":"retry_after","typeLabel":"integer"},"upgrade_url":{"type":"string","format":"uri","description":"Present on a monthly-quota 429, and on a `member_limit_reached` 403 (the console's Settings → Plan \u0026 billing).","uniqueKey":"upgrade_url","typeLabel":"string\u003curi>"},"reason":{"type":"string","description":"Machine-readable reason, where the status alone is ambiguous. `workspace_suspended` (403): the workspace is suspended; `delivery_allowance_exhausted` (429): a replay was refused because the monthly delivery allowance is used. `endpoint_disabled` (503): the endpoint is switched off; `handshake_failed`: a provider URL-verification challenge could not be answered (#193). `missing_header`, `bad_signature`, `stale_timestamp` (401): an endpoint's provider signature check failed; `scheme` names the check. `portal_customer_mismatch` (409): a portal token was requested for, or the vendor switched on the endpoint of, a customer other than the one the portal now serves (PORT-2g); `customer_id` and `customer_name` name that customer. Agent self-registration (#331), on /v1/agents/register: `rate_limited` (429), `agent_registration_disabled` and `agent_registration_unavailable` (503), `invalid_body`, `invalid_agent_name`, `invalid_operator_contact`, `terms_not_accepted` (with `terms_version`), `proof_of_work_required`, `invalid_challenge`, `challenge_expired`, `invalid_proof_of_work`, `invalid_idempotency_key` (400), `body_too_large` (413), `already_registered`, `registration_in_progress`, `challenge_spent` (409, with `account_id`), `daily_cap_reached`, `source_daily_limit` (429), `identity_provider_error` (502), `registration_incomplete` (503).","uniqueKey":"reason","typeLabel":"string"},"code":{"type":"string","enum":["agent_scope_insufficient","insufficient_role","agent_not_permitted","member_limit_reached"],"description":"Present on a 403 to an OAuth-connected agent, and on a member-limit 403 to anyone. `agent_scope_insufficient`: the agent's grant is below what the call needs, and widening it would let the call through (see `required_scope` and `manage_url`). `insufficient_role`: the user's OWN workspace role does not allow the call, so no grant can — a workspace owner or admin has to change the user's role first, in the console under Settings → Members. `agent_not_permitted`: no connected agent or API key may do this at any scope (billing, platform admin, managing connected agents, a destination's signing secret, invites of any kind, changing a role, removing a member, transferring ownership, listing or switching a person's workspaces, and creating API keys). To a self-registered agent account nobody has claimed yet (#331) it also carries `claim_required: true`: a person must claim the workspace with the claim link from registration before anyone can do it. `member_limit_reached` (#308): the workspace already has as many members as its plan allows, so an invite cannot be created or accepted; `max_members`, `members` and `upgrade_url` say how many and where to upgrade.","uniqueKey":"code","typeLabel":"enum\u003cstring>"},"required_scope":{"type":"string","enum":["hookie:read","hookie:write","hookie:manage"],"description":"With `code`: the scope the refused call needs.","uniqueKey":"required_scope","typeLabel":"enum\u003cstring>"},"granted_scopes":{"type":"array","items":{"type":"string","uniqueKey":"granted_scopes.items.[INDEX]","typeLabel":"string"},"description":"With `code`: the scopes the agent's grant holds now.","uniqueKey":"granted_scopes","typeLabel":"string[]"},"manage_url":{"type":"string","format":"uri","description":"With `code: \"agent_scope_insufficient\"` only: the console's Settings → Connected agents page, opened on this agent (`…/#/settings/agents?client=\u003cclient_id>`), where its user widens the grant. The change applies on the agent's next request.","uniqueKey":"manage_url","typeLabel":"string\u003curi>"},"scheme":{"type":"string","description":"Present on a signature 401: the endpoint's verification scheme.","uniqueKey":"scheme","typeLabel":"string"},"max_members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the plan's member limit.","uniqueKey":"max_members","typeLabel":"integer"},"members":{"type":"integer","description":"With `code: \"member_limit_reached\"`: the workspace's members now.","uniqueKey":"members","typeLabel":"integer"},"customer_id":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: the customer the portal already serves.","uniqueKey":"customer_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_id","typeLabel":"string | null"},"customer_name":{"oneOf":[{"type":"string","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"On a `portal_customer_mismatch` 409: that customer's display name, if one was given.","uniqueKey":"customer_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"customer_name","typeLabel":"string | null"},"account_id":{"type":"string","description":"On a 409 from POST /v1/agents/register: the agent account the earlier request created (or is creating). Never accompanied by a credential.","uniqueKey":"account_id","typeLabel":"string"},"terms_version":{"type":"string","description":"On a `terms_not_accepted` 400: the Terms version `accept_terms` must equal.","uniqueKey":"terms_version","typeLabel":"string"},"claim_required":{"type":"boolean","description":"With `code: \"agent_not_permitted\"`, to a self-registered agent account nobody has claimed (#331): the refused action needs a person, who first claims the workspace with the claim link from the registration response (`claim.url`).","uniqueKey":"claim_required","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":"\u003cstring>","retry_after":123,"upgrade_url":"\u003cstring>","reason":"\u003cstring>","code":"agent_scope_insufficient","required_scope":"hookie:read","granted_scopes":["\u003cstring>"],"manage_url":"\u003cstring>","scheme":"\u003cstring>","max_members":123,"members":123,"customer_id":"\u003cstring>","customer_name":"\u003cstring>","account_id":"\u003cstring>","terms_version":"\u003cstring>","claim_required":true}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"303d652e-ae1e-409d-9688-7df61faf1408":{"session":{"type":"apiKey","in":"cookie","name":"hookie_session","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","scopes":[],"schemeName":"session"}},"32cfc502-f6c6-4fd5-9839-d370b5c258cf":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","scopes":[],"schemeName":"bearerAuth"}},"7c6edbd2-72db-454a-8ec8-7a1049d3196a":{"apiKey":{"type":"http","scheme":"bearer","description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","scopes":[],"schemeName":"apiKey"}}},"servers":{"0ea1ddc9-3a31-4421-86e4-db5233ac2213":{"url":"https://app.hookie.ai","description":"Production"},"d5e32d1f-0c83-4838-aa53-3e0ffb5d5c54":{"url":"https://app.preview.hookie.ai","description":"Preview"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"cookie","name":"hookie_session","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","scopes":[],"schemeName":"session"},"schema":{"title":"hookie_session","type":"string","description":"The console's sealed session cookie, set by WorkOS AuthKit. Mutating requests also require the `X-Requested-With` CSRF header.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"session","name":"hookie_session"}],"title":"session"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An OAuth 2.1 access token from a connected agent, audienced at the `/mcp` resource URI. The agent acts as its user, with that user's role narrowed to the granted `hookie:*` scopes. No CSRF header is required — a bearer token is not ambient credentials.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"},{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An `hk_…` admin API key from Settings → API keys. Acts as the member who created it, capped at the key's role (viewer, developer or admin) and optionally one project. Stored as a SHA-256 hash, shown once. No CSRF header is required.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"openapi.json"},"subdomain":"hookie-ai","siteName":"Hookie","title":"Create a workflow definition - Hookie","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-11T07:13:37.052Z","originalFileLocation":"api-reference/workflows/create-a-workflow-definition.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Hookie\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a workflow definition - Hookie\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Hookie\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://hookie-ai.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Create+a+workflow+definition\u0026amp;theme=f4aa03159c73f069ac2e6bcf\u0026amp;signature=9a02046bad98fca5c7a930297c4b2f8d4752ac49e1a800ffe8b4ed1f34d7c596\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a workflow definition - Hookie\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://hookie-ai.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Create+a+workflow+definition\u0026amp;theme=f4aa03159c73f069ac2e6bcf\u0026amp;signature=9a02046bad98fca5c7a930297c4b2f8d4752ac49e1a800ffe8b4ed1f34d7c596\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/hookie-ai/swNEJiZkoA-0uCAd/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Hookie\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2B56A1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/workflows/create-a-workflow-definition.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.hookie.ai/#organization\",\"name\":\"Hookie\",\"url\":\"https://docs.hookie.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/hookie-ai/3zmwtACPzz3wb-OX/logo/light.svg?fit=max\u0026auto=format\u0026n=3zmwtACPzz3wb-OX\u0026q=85\u0026s=3d05bb847a5407bc7e75e7270aafc101\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.hookie.ai#website\",\"name\":\"Hookie\",\"url\":\"https://docs.hookie.ai\",\"publisher\":{\"@id\":\"https://docs.hookie.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition#webpage\",\"url\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition\",\"name\":\"Create a workflow definition\",\"dateModified\":\"2026-10-11T07:13:37.052Z\",\"isPartOf\":{\"@id\":\"https://docs.hookie.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://docs.hookie.ai/api-reference/ingest/metas-url-verification-hubchallenge-on-the-public-webhook-url\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Workflows\",\"item\":\"https://docs.hookie.ai/api-reference/workflows/list-workflow-definitions-in-a-project\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a workflow definition\",\"item\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition#apireference\",\"headline\":\"Create a workflow definition\",\"name\":\"Create a workflow definition\",\"url\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition\",\"mainEntityOfPage\":{\"@id\":\"https://docs.hookie.ai/api-reference/workflows/create-a-workflow-definition#webpage\"},\"dateModified\":\"2026-10-11T07:13:37.052Z\",\"publisher\":{\"@id\":\"https://docs.hookie.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.hookie.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Hookie\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Hookie","nav":{"global":null,"groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"Overview","sidebarTitle":"Overview","icon":{"name":"info-circle","style":"regular","library":"fontawesome"},"href":"/index"},{"title":"Quickstart","icon":{"name":"shipping-fast","style":"regular","library":"fontawesome"},"href":"/quickstart"}]},{"group":"Concepts","icon":"lightbulb","pages":[{"title":"Projects","icon":"folder-tree","href":"/projects"},{"title":"Endpoints and ingest keys","icon":"inbox","href":"/endpoints-and-keys"},{"title":"Datasets and records","icon":"table","href":"/datasets-and-records"},{"title":"Rules and mappings","icon":"route","href":"/rules-and-mappings"},{"title":"Destinations and deliveries","icon":"paper-plane","href":"/destinations-and-deliveries"},{"title":"Limits and plans","icon":"gauge","href":"/limits-and-plans"},{"title":"Billing","icon":"credit-card","href":"/billing"},{"title":"Roles, API keys and connected agents","sidebarTitle":"Roles and agents","icon":"user-shield","href":"/roles-and-agents"},{"title":"Glossary","icon":"book","href":"/glossary"}]},{"group":"CLI","icon":"terminal","pages":[{"title":"CLI","sidebarTitle":"Overview","icon":"terminal","href":"/cli/index"},{"title":"Operations","icon":"screwdriver-wrench","href":"/cli/operations"},{"title":"Command reference","icon":"list","href":"/cli/commands"},{"title":"Configuration","icon":"gear","href":"/cli/configuration"}]},{"group":"Guides","icon":"book-open","pages":[{"title":"Forms","icon":"rectangle-list","href":"/forms"},{"title":"Verify signatures","icon":"signature","href":"/signatures"},{"title":"Verify provider signatures","icon":"shield-check","href":"/endpoint-verification"},{"title":"Destination types and options","sidebarTitle":"Destination options","icon":"send","href":"/destinations"},{"title":"Slack app","icon":"slack","href":"/slack-app"},{"title":"Database sources","icon":"database","href":"/database-sources"},{"title":"Ingest keys","icon":"key","href":"/ingest-keys"},{"title":"Live streaming","icon":"radio","href":"/streaming"},{"title":"Workflows \u0026 AI agents","icon":{"name":"robot","style":"regular","library":"fontawesome"},"href":"/workflows"},{"title":"Customer portal","icon":"users","href":"/customer-portal"},{"title":"Broadcast Logs","icon":"tower-broadcast","href":"/broadcast-logs"},{"title":"Analytics","icon":"chart-line","href":"/analytics"},{"title":"Team members","icon":"users","href":"/team-members"},{"title":"Connected agents","icon":"plug","href":"/connected-agents"},{"title":"Agent self-registration","icon":"robot","href":"/agent-self-registration"},{"title":"WorkOS Agent Auth","icon":"id-badge","href":"/workos-agent-auth"},{"title":"API keys","icon":"lock","href":"/api-keys"},{"title":"Data API","icon":"database","href":"/data-api"},{"title":"Delete, export and close","icon":"trash-can","href":"/data-deletion"},{"title":"API reference","icon":"code","href":"/api-reference"}]},{"group":"API reference","icon":"terminal","pages":[{"group":"Ingest","pages":[{"title":"Meta's URL verification (hub.challenge) on the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json get /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/metas-url-verification-hubchallenge-on-the-public-webhook-url"},{"title":"Ingest an event through the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json post /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/ingest-an-event-through-the-public-webhook-url"},{"title":"CORS preflight for a page's fetch() to the public webhook URL","deprecated":null,"version":null,"openapi":"/openapi.json options /{workspace}/{project}/{webhook}","href":"/api-reference/ingest/cors-preflight-for-a-pages-fetch-to-the-public-webhook-url"},{"title":"Ingest an event through the public webhook URL, naming its dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /{workspace}/{project}/{webhook}/{dataset}","href":"/api-reference/ingest/ingest-an-event-through-the-public-webhook-url-naming-its-dataset"},{"title":"Ingest an event with an ingest key (PUT alias of ingestEvent)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/ingest/{ingest_key}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-put-alias-of-ingestevent"},{"title":"Ingest an event with an ingest key, routed by the project's mapping rules, with the key's default dataset as the fallback","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/ingest/{ingest_key}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-routed-by-the-projects-mapping-rules-with-the-keys-default-dataset-as-the-fallback"},{"title":"Ingest an event into a named dataset (PUT alias of ingestEventToDataset)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/ingest/{ingest_key}/{dataset}","href":"/api-reference/ingest/ingest-an-event-into-a-named-dataset-put-alias-of-ingesteventtodataset"},{"title":"Ingest an event with an ingest key straight into a named dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/ingest/{ingest_key}/{dataset}","href":"/api-reference/ingest/ingest-an-event-with-an-ingest-key-straight-into-a-named-dataset"},{"title":"Ingest into a configured endpoint (PUT alias of ingestWebhookEvent)","deprecated":null,"version":null,"openapi":"/openapi.json put /v1/webhooks/{ingest_key}/{slug}","href":"/api-reference/ingest/ingest-into-a-configured-endpoint-put-alias-of-ingestwebhookevent"},{"title":"Ingest an event into a configured endpoint using an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/webhooks/{ingest_key}/{slug}","href":"/api-reference/ingest/ingest-an-event-into-a-configured-endpoint-using-an-ingest-key"}]},{"group":"Streaming","pages":[{"title":"Tail the ingest key's project live event stream over SSE or WebSocket","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/stream","href":"/api-reference/streaming/tail-the-ingest-keys-project-live-event-stream-over-sse-or-websocket"},{"title":"Tail the current workspace's live event stream over SSE or WebSocket","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/stream","href":"/api-reference/streaming/tail-the-current-workspaces-live-event-stream-over-sse-or-websocket"}]},{"group":"Customer Portal","pages":[{"title":"Get the portal context for the caller's token or session","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/me","href":"/api-reference/customer-portal/get-the-portal-context-for-the-callers-token-or-session"},{"title":"List the dataset/event types this portal exposes","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/event-types","href":"/api-reference/customer-portal/list-the-datasetevent-types-this-portal-exposes"},{"title":"List this customer's own destinations","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/destinations","href":"/api-reference/customer-portal/list-this-customers-own-destinations"},{"title":"Create a destination for this customer","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations","href":"/api-reference/customer-portal/create-a-destination-for-this-customer"},{"title":"Edit, pause or resume one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json put /portal/api/destinations/{id}","href":"/api-reference/customer-portal/edit-pause-or-resume-one-of-this-customers-destinations"},{"title":"Delete one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json delete /portal/api/destinations/{id}","href":"/api-reference/customer-portal/delete-one-of-this-customers-destinations"},{"title":"Edit, pause or resume one of this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json patch /portal/api/destinations/{id}","href":"/api-reference/customer-portal/edit-pause-or-resume-one-of-this-customers-destinations-1"},{"title":"List recent delivery attempts to this customer's destinations","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/deliveries","href":"/api-reference/customer-portal/list-recent-delivery-attempts-to-this-customers-destinations"},{"title":"Trade a portal token for a session cookie","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/session","href":"/api-reference/customer-portal/trade-a-portal-token-for-a-session-cookie"},{"title":"Sign out of the portal","deprecated":null,"version":null,"openapi":"/openapi.json delete /portal/api/session","href":"/api-reference/customer-portal/sign-out-of-the-portal"},{"title":"Show a destination's signing secret again","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/destinations/{id}/secret","href":"/api-reference/customer-portal/show-a-destinations-signing-secret-again"},{"title":"Rotate a destination's signing secret, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations/{id}/rotate-secret","href":"/api-reference/customer-portal/rotate-a-destinations-signing-secret-with-an-overlap"},{"title":"End a rotation's overlap early","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/destinations/{id}/expire-previous-secret","href":"/api-reference/customer-portal/end-a-rotations-overlap-early"},{"title":"One delivery, whole: why it failed","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/deliveries/{id}","href":"/api-reference/customer-portal/one-delivery-whole:-why-it-failed"},{"title":"Send a delivery again","deprecated":null,"version":null,"openapi":"/openapi.json post /portal/api/deliveries/{id}/replay","href":"/api-reference/customer-portal/send-a-delivery-again"},{"title":"Example payloads for each exposed event type, and how to verify a delivery (both signature schemes)","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/examples","href":"/api-reference/customer-portal/example-payloads-for-each-exposed-event-type-and-how-to-verify-a-delivery-both-signature-schemes"},{"title":"Table views the provider shared in the portal","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/views","href":"/api-reference/customer-portal/table-views-the-provider-shared-in-the-portal"},{"title":"One page of a shared view, for the signed-in customer","deprecated":null,"version":null,"openapi":"/openapi.json get /portal/api/views/{id}/records","href":"/api-reference/customer-portal/one-page-of-a-shared-view-for-the-signed-in-customer"}]},{"group":"Account","pages":[{"title":"Current user, workspace and role","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/me","href":"/api-reference/account/current-user-workspace-and-role"}]},{"group":"Dashboard","pages":[{"title":"Workspace home dashboard rollup","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/summary","href":"/api-reference/dashboard/workspace-home-dashboard-rollup"},{"title":"Bucketed activity series for the workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/timeseries","href":"/api-reference/dashboard/bucketed-activity-series-for-the-workspace"},{"title":"Analytics breakdown by project, endpoint, workflow and dataset","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/dashboard/analytics","href":"/api-reference/dashboard/analytics-breakdown-by-project-endpoint-workflow-and-dataset"}]},{"group":"Projects","pages":[{"title":"List projects in the workspace","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects","href":"/api-reference/projects/list-projects-in-the-workspace"},{"title":"Create a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects","href":"/api-reference/projects/create-a-project"},{"title":"Get one project with resource counts","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}","href":"/api-reference/projects/get-one-project-with-resource-counts"},{"title":"Delete a project","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}","href":"/api-reference/projects/delete-a-project"},{"title":"Rename a project or set its IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}","href":"/api-reference/projects/rename-a-project-or-set-its-ip-allowlist"},{"title":"Export a project's configuration","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/config","href":"/api-reference/projects/export-a-projects-configuration"},{"title":"Import a configuration into a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/config","href":"/api-reference/projects/import-a-configuration-into-a-project"},{"title":"Clone a project","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/clone","href":"/api-reference/projects/clone-a-project"}]},{"group":"Stats","pages":[{"title":"Traffic and delivery stats for one project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/stats","href":"/api-reference/stats/traffic-and-delivery-stats-for-one-project"}]},{"group":"Datasets","pages":[{"title":"List datasets with record counts","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets","href":"/api-reference/datasets/list-datasets-with-record-counts"},{"title":"One page of a dataset's records, whole and flattened (export shape)","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}","href":"/api-reference/datasets/one-page-of-a-datasets-records-whole-and-flattened-export-shape"}]},{"group":"Records","pages":[{"title":"Get one record with its full payload","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/records/{id}","href":"/api-reference/records/get-one-record-with-its-full-payload"},{"title":"Delete a record and every copy of it","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/records/{id}","href":"/api-reference/records/delete-a-record-and-every-copy-of-it"},{"title":"One page of a dataset's records, optionally through a saved view","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}/records","href":"/api-reference/records/one-page-of-a-datasets-records-optionally-through-a-saved-view"},{"title":"Retired: records are read by dataset","deprecated":true,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}/records","href":"/api-reference/records/retired:-records-are-read-by-dataset"},{"title":"The dataset's latest purge","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/datasets/{dataset}/purge","href":"/api-reference/records/the-datasets-latest-purge"},{"title":"Delete every record in a dataset","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/datasets/{dataset}/purge","href":"/api-reference/records/delete-every-record-in-a-dataset"}]},{"group":"Submissions","pages":[{"title":"List raw submissions","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/submissions","href":"/api-reference/submissions/list-raw-submissions"},{"title":"Set a submission forward status","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/submissions/{id}","href":"/api-reference/submissions/set-a-submission-forward-status"}]},{"group":"Rules","pages":[{"title":"List mapping rules","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/rules","href":"/api-reference/rules/list-mapping-rules"},{"title":"Create a mapping rule","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/rules","href":"/api-reference/rules/create-a-mapping-rule"},{"title":"Get one rule","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/get-one-rule"},{"title":"Delete a rule","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/delete-a-rule"},{"title":"Update a rule","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/rules/{id}","href":"/api-reference/rules/update-a-rule"},{"title":"Test conditions and mappings against a sample payload","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/rules/test","href":"/api-reference/rules/test-conditions-and-mappings-against-a-sample-payload"}]},{"group":"Webhooks","pages":[{"title":"List endpoints","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks","href":"/api-reference/webhooks/list-endpoints"},{"title":"Create an endpoint","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks","href":"/api-reference/webhooks/create-an-endpoint"},{"title":"Publish a new version of a webhook","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/versions","href":"/api-reference/webhooks/publish-a-new-version-of-a-webhook"},{"title":"Get one webhook","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/get-one-webhook"},{"title":"Delete a webhook version","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/delete-a-webhook-version"},{"title":"Change an endpoint: enabled, name, dataset, IP allowlist, form redirect, CORS origins, URL verification, signature verification","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/webhooks/{id}","href":"/api-reference/webhooks/change-an-endpoint:-enabled-name-dataset-ip-allowlist-form-redirect-cors-origins-url-verification-signature-verification"},{"title":"Give an endpoint a new public URL, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/rotate","href":"/api-reference/webhooks/give-an-endpoint-a-new-public-url-with-an-overlap"},{"title":"Replace an endpoint's provider signing secret, with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/webhooks/{id}/rotate-verification-secret","href":"/api-reference/webhooks/replace-an-endpoints-provider-signing-secret-with-an-overlap"},{"title":"One endpoint's received and refused requests","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/webhooks/{id}/activity","href":"/api-reference/webhooks/one-endpoints-received-and-refused-requests"}]},{"group":"Record views","pages":[{"title":"List saved record views","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/record-views","href":"/api-reference/record-views/list-saved-record-views"},{"title":"Create a record view","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/record-views","href":"/api-reference/record-views/create-a-record-view"},{"title":"Get one view","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/get-one-view"},{"title":"Delete a record view","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/delete-a-record-view"},{"title":"Update a record view","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/record-views/{id}","href":"/api-reference/record-views/update-a-record-view"}]},{"group":"Ingest keys","pages":[{"title":"List ingest keys","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ingest-keys","href":"/api-reference/ingest-keys/list-ingest-keys"},{"title":"Issue an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ingest-keys","href":"/api-reference/ingest-keys/issue-an-ingest-key"},{"title":"Get one ingest key","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/get-one-ingest-key"},{"title":"Revoke an ingest key","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/revoke-an-ingest-key"},{"title":"Rename an ingest key, or set its expiry or IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ingest-keys/{id}","href":"/api-reference/ingest-keys/rename-an-ingest-key-or-set-its-expiry-or-ip-allowlist"},{"title":"Rotate an ingest key with an overlap","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ingest-keys/{id}/rotate","href":"/api-reference/ingest-keys/rotate-an-ingest-key-with-an-overlap"}]},{"group":"Destinations","pages":[{"title":"List outbound destinations","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/list-outbound-destinations"},{"title":"Create an outbound destination","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations","href":"/api-reference/destinations/create-an-outbound-destination"},{"title":"Get one destination","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/get-one-destination"},{"title":"Delete a destination","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/delete-a-destination"},{"title":"Edit a destination: name, URL or type settings, on/off, dataset filter, request options, alert URL or delivery limits","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/destinations/{id}","href":"/api-reference/destinations/edit-a-destination:-name-url-or-type-settings-onoff-dataset-filter-request-options-alert-url-or-delivery-limits"},{"title":"Reveal a destination signing secret","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/destinations/{id}/secret","href":"/api-reference/destinations/reveal-a-destination-signing-secret"},{"title":"Rotate a destination signing secret","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations/{id}/rotate-secret","href":"/api-reference/destinations/rotate-a-destination-signing-secret"},{"title":"Stop signing with a destination's previous secret","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/destinations/{id}/expire-previous-secret","href":"/api-reference/destinations/stop-signing-with-a-destinations-previous-secret"}]},{"group":"Deliveries","pages":[{"title":"List outbound deliveries","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries","href":"/api-reference/deliveries/list-outbound-deliveries"},{"title":"Delivery health per destination: success rate, latency percentiles, error classes, time series","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/metrics","href":"/api-reference/deliveries/delivery-health-per-destination:-success-rate-latency-percentiles-error-classes-time-series"},{"title":"Replay every delivery that did not arrive, by filter","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/replay","href":"/api-reference/deliveries/replay-every-delivery-that-did-not-arrive-by-filter"},{"title":"List events whose deliveries are held past the monthly delivery allowance","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/held","href":"/api-reference/deliveries/list-events-whose-deliveries-are-held-past-the-monthly-delivery-allowance"},{"title":"Send held deliveries now that there is room in the allowance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/held/release","href":"/api-reference/deliveries/send-held-deliveries-now-that-there-is-room-in-the-allowance"},{"title":"Get one delivery with its response body and every attempt","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/deliveries/{id}","href":"/api-reference/deliveries/get-one-delivery-with-its-response-body-and-every-attempt"},{"title":"Replay a delivery","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/deliveries/{id}/replay","href":"/api-reference/deliveries/replay-a-delivery"}]},{"group":"Search","pages":[{"title":"Search records (events)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/events","href":"/api-reference/search/search-records-events"},{"title":"Search deliveries","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/deliveries","href":"/api-reference/search/search-deliveries"},{"title":"Search AI agent runs","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/ai-runs","href":"/api-reference/search/search-ai-agent-runs"},{"title":"Search the AI call log","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/ai-calls","href":"/api-reference/search/search-the-ai-call-log"},{"title":"Get one AI call in full","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/search/ai-calls/{id}","href":"/api-reference/search/get-one-ai-call-in-full"},{"title":"Search raw submissions","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/search/submissions","href":"/api-reference/search/search-raw-submissions"},{"title":"Correlate any pipeline id across the pipeline","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/search/correlate/{id}","href":"/api-reference/search/correlate-any-pipeline-id-across-the-pipeline"}]},{"group":"Audit","pages":[{"title":"Read the workspace audit log","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/audit","href":"/api-reference/audit/read-the-workspace-audit-log"},{"title":"List the actions recorded in the workspace audit log","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/audit/actions","href":"/api-reference/audit/list-the-actions-recorded-in-the-workspace-audit-log"}]},{"group":"Sources","pages":[{"title":"List inbound source connectors in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/sources","href":"/api-reference/sources/list-inbound-source-connectors-in-a-project"},{"title":"Create a source connector","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/sources","href":"/api-reference/sources/create-a-source-connector"},{"title":"Get one source","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/get-one-source"},{"title":"Delete a source connector","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/delete-a-source-connector"},{"title":"Update a source connector","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/sources/{source_id}","href":"/api-reference/sources/update-a-source-connector"},{"title":"Test a source connector's connection","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/sources/{source_id}/test","href":"/api-reference/sources/test-a-source-connectors-connection"}]},{"group":"Triggers","pages":[{"title":"List agentic-AI event triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/triggers","href":"/api-reference/triggers/list-agentic-ai-event-triggers-in-a-project"},{"title":"Create an agentic-AI event trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/triggers","href":"/api-reference/triggers/create-an-agentic-ai-event-trigger"},{"title":"Get one trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/get-one-trigger"},{"title":"Delete an AI trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/delete-an-ai-trigger"},{"title":"Enable or disable an AI trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/triggers/{trigger_id}","href":"/api-reference/triggers/enable-or-disable-an-ai-trigger"}]},{"group":"Cron triggers","pages":[{"title":"List cron triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/cron-triggers","href":"/api-reference/cron-triggers/list-cron-triggers-in-a-project"},{"title":"Create a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers","href":"/api-reference/cron-triggers/create-a-cron-trigger"},{"title":"Preview a cron schedule's next fire times","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers/preview","href":"/api-reference/cron-triggers/preview-a-cron-schedules-next-fire-times"},{"title":"Get one cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/get-one-cron-trigger"},{"title":"Delete a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/delete-a-cron-trigger"},{"title":"Update a cron trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}","href":"/api-reference/cron-triggers/update-a-cron-trigger"},{"title":"Fire a cron trigger once, immediately","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/cron-triggers/{cron_trigger_id}/test","href":"/api-reference/cron-triggers/fire-a-cron-trigger-once-immediately"}]},{"group":"WebSocket triggers","pages":[{"title":"List WebSocket triggers in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ws-triggers","href":"/api-reference/websocket-triggers/list-websocket-triggers-in-a-project"},{"title":"Create a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ws-triggers","href":"/api-reference/websocket-triggers/create-a-websocket-trigger"},{"title":"Get one ws trigger","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/get-one-ws-trigger"},{"title":"Delete a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/delete-a-websocket-trigger"},{"title":"Edit, pause or resume a WebSocket trigger","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}","href":"/api-reference/websocket-triggers/edit-pause-or-resume-a-websocket-trigger"},{"title":"Probe a WebSocket trigger's connection","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ws-triggers/{ws_trigger_id}/test","href":"/api-reference/websocket-triggers/probe-a-websocket-triggers-connection"}]},{"group":"Workflows","pages":[{"title":"List workflow definitions in a project","description":"Pages with ?limit and ?offset and returns total, limit and offset beside the array, which is unchanged (DX-6, #201).","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/list-workflow-definitions-in-a-project"},{"title":"Create a workflow definition","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflows","href":"/api-reference/workflows/create-a-workflow-definition"},{"title":"Get one workflow definition","description":null,"deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/get-one-workflow-definition"},{"title":"Replace a workflow definition","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/replace-a-workflow-definition"},{"title":"Deactivate, or permanently delete, a workflow","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/deactivate-or-permanently-delete-a-workflow"},{"title":"Change part of a workflow (merge)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/workflows/{workflow_id}","href":"/api-reference/workflows/change-part-of-a-workflow-merge"},{"title":"List instances of one workflow","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflows/{workflow_id}/instances","href":"/api-reference/workflows/list-instances-of-one-workflow"},{"title":"Get a workflow instance with its step events and per-step status","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/workflow-instances/{instance_id}","href":"/api-reference/workflows/get-a-workflow-instance-with-its-step-events-and-per-step-status"},{"title":"Cancel a workflow instance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflow-instances/{instance_id}/cancel","href":"/api-reference/workflows/cancel-a-workflow-instance"},{"title":"Retry a workflow instance","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/workflow-instances/{instance_id}/retry","href":"/api-reference/workflows/retry-a-workflow-instance"}]},{"group":"AI agents","pages":[{"title":"List AI agents in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ai-agents","href":"/api-reference/ai-agents/list-ai-agents-in-a-project"},{"title":"Create an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/ai-agents","href":"/api-reference/ai-agents/create-an-ai-agent"},{"title":"Get one AI agent","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/get-one-ai-agent"},{"title":"Replace an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/replace-an-ai-agent"},{"title":"Retire, or permanently delete, an AI agent","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/retire-or-permanently-delete-an-ai-agent"},{"title":"Change an AI agent (only the fields sent)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/ai-agents/{agent_id}","href":"/api-reference/ai-agents/change-an-ai-agent-only-the-fields-sent"},{"title":"Models an AI trigger, agent or workflow AI step may name","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/ai-models","href":"/api-reference/ai-agents/models-an-ai-trigger-agent-or-workflow-ai-step-may-name"}]},{"group":"Portals","pages":[{"title":"The project's one customer portal","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/the-projects-one-customer-portal"},{"title":"Create or update the project's customer portal","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/create-or-update-the-projects-customer-portal"},{"title":"Remove the project's customer portal for good","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/remove-the-projects-customer-portal-for-good"},{"title":"Create or update the project's customer portal (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/portal","href":"/api-reference/portals/create-or-update-the-projects-customer-portal-patch-same-as-put"},{"title":"List customer portals in a project","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals","href":"/api-reference/portals/list-customer-portals-in-a-project"},{"title":"Create a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/portals","href":"/api-reference/portals/create-a-customer-portal"},{"title":"Get one customer portal","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/get-one-customer-portal"},{"title":"Update a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/update-a-customer-portal"},{"title":"Disable a customer portal","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/disable-a-customer-portal"},{"title":"Update a customer portal (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/portals/{portal_id}","href":"/api-reference/portals/update-a-customer-portal-patch-same-as-put"},{"title":"List a portal's access tokens","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/portals/{portal_id}/tokens","href":"/api-reference/portals/list-a-portals-access-tokens"},{"title":"Issue or revoke a portal access token","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/portals/{portal_id}/tokens","href":"/api-reference/portals/issue-or-revoke-a-portal-access-token"}]},{"group":"Connected agents","pages":[{"title":"List the signed-in user's OAuth-connected coding agents","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/agents","href":"/api-reference/connected-agents/list-the-signed-in-users-oauth-connected-coding-agents"},{"title":"Revoke a connected agent","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/agents/{grant_id}","href":"/api-reference/connected-agents/revoke-a-connected-agent"},{"title":"Change what a connected agent may do","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/agents/{grant_id}","href":"/api-reference/connected-agents/change-what-a-connected-agent-may-do"}]},{"group":"SSO","pages":[{"title":"List workspace SSO configurations","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/sso","href":"/api-reference/sso/list-workspace-sso-configurations"},{"title":"Create a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso","href":"/api-reference/sso/create-a-workspace-sso-configuration-not-available"},{"title":"Replace a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/replace-a-workspace-sso-configuration-not-available"},{"title":"Delete a workspace SSO configuration","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/delete-a-workspace-sso-configuration"},{"title":"Update a workspace SSO configuration (not available)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/sso/{sso_config_id}","href":"/api-reference/sso/update-a-workspace-sso-configuration-not-available"},{"title":"Check whether an SSO configuration is complete","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/{sso_config_id}/test","href":"/api-reference/sso/check-whether-an-sso-configuration-is-complete"},{"title":"Read the workspace's SSO / Directory Sync request","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/sso/requests","href":"/api-reference/sso/read-the-workspaces-sso-directory-sync-request"},{"title":"Request single sign-on or Directory Sync","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/requests","href":"/api-reference/sso/request-single-sign-on-or-directory-sync"},{"title":"Cancel a pending SSO / Directory Sync request","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/sso/requests/{request_id}","href":"/api-reference/sso/cancel-a-pending-sso-directory-sync-request"},{"title":"Open the WorkOS Admin Portal to set up SSO or Directory Sync","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/sso/portal-link","href":"/api-reference/sso/open-the-workos-admin-portal-to-set-up-sso-or-directory-sync"}]},{"group":"IP allowlist","pages":[{"title":"Read the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/read-the-workspace-level-ingest-ip-allowlist"},{"title":"Replace the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/replace-the-workspace-level-ingest-ip-allowlist"},{"title":"Replace the workspace-level ingest IP allowlist","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/ip-allowlist","href":"/api-reference/ip-allowlist/replace-the-workspace-level-ingest-ip-allowlist-1"}]},{"group":"Workspace","pages":[{"title":"The workspace's name, slug and former slugs","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace","href":"/api-reference/workspace/the-workspaces-name-slug-and-former-slugs"},{"title":"Rename the workspace or change its slug","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/workspace","href":"/api-reference/workspace/rename-the-workspace-or-change-its-slug"},{"title":"List the workspace's admin API keys","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/api-keys","href":"/api-reference/workspace/list-the-workspaces-admin-api-keys"},{"title":"Create an admin API key (shown once)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/api-keys","href":"/api-reference/workspace/create-an-admin-api-key-shown-once"},{"title":"Revoke an admin API key","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/api-keys/{key_id}","href":"/api-reference/workspace/revoke-an-admin-api-key"},{"title":"The pending workspace closure, if any","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/closure","href":"/api-reference/workspace/the-pending-workspace-closure-if-any"},{"title":"Close the workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/workspace/closure","href":"/api-reference/workspace/close-the-workspace"},{"title":"Undo a pending closure","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/workspace/closure","href":"/api-reference/workspace/undo-a-pending-closure"},{"title":"Export all of the workspace's data","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/export","href":"/api-reference/workspace/export-all-of-the-workspaces-data"},{"title":"List the workspace's pending invites","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/invites","href":"/api-reference/workspace/list-the-workspaces-pending-invites"},{"title":"Create a shareable invite link","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites","href":"/api-reference/workspace/create-a-shareable-invite-link"},{"title":"Revoke a pending invite","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/invites/{invite_id}","href":"/api-reference/workspace/revoke-a-pending-invite"},{"title":"Join a workspace with an invite link's token","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites/accept","href":"/api-reference/workspace/join-a-workspace-with-an-invite-links-token"},{"title":"See what an invite link's token would join, without joining","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/invites/preview","href":"/api-reference/workspace/see-what-an-invite-links-token-would-join-without-joining"},{"title":"List the workspace's members","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/members","href":"/api-reference/workspace/list-the-workspaces-members"},{"title":"Remove a member, or leave the workspace","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/members/{user_id}","href":"/api-reference/workspace/remove-a-member-or-leave-the-workspace"},{"title":"Change a member's role","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/members/{user_id}","href":"/api-reference/workspace/change-a-members-role"},{"title":"Transfer ownership to another member","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/members/transfer-ownership","href":"/api-reference/workspace/transfer-ownership-to-another-member"},{"title":"List the workspaces the caller belongs to","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspaces","href":"/api-reference/workspace/list-the-workspaces-the-caller-belongs-to"},{"title":"Switch the caller's active workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/workspaces/active","href":"/api-reference/workspace/switch-the-callers-active-workspace"},{"title":"The workspace's Google Workspace domain link","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/workspace/google-domain","href":"/api-reference/workspace/the-workspaces-google-workspace-domain-link"},{"title":"Link the owner's Google Workspace domain","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/workspace/google-domain","href":"/api-reference/workspace/link-the-owners-google-workspace-domain"},{"title":"Unlink the Google Workspace domain","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/workspace/google-domain","href":"/api-reference/workspace/unlink-the-google-workspace-domain"},{"title":"Change the role people from the linked domain join with","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/workspace/google-domain","href":"/api-reference/workspace/change-the-role-people-from-the-linked-domain-join-with"},{"title":"See what a claim token would take over","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/agent-accounts/claim-preview","href":"/api-reference/workspace/see-what-a-claim-token-would-take-over"},{"title":"Take ownership of a workspace an AI agent registered","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/agent-accounts/claim","href":"/api-reference/workspace/take-ownership-of-a-workspace-an-ai-agent-registered"}]},{"group":"Billing","pages":[{"title":"Current plan, subscription and display prices","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/billing/status","href":"/api-reference/billing/current-plan-subscription-and-display-prices"},{"title":"Start a new subscription via Stripe Checkout","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/billing/subscribe","href":"/api-reference/billing/start-a-new-subscription-via-stripe-checkout"},{"title":"Renewal date, payment failures, a pending cancellation and invoices, from Stripe","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/billing/details","href":"/api-reference/billing/renewal-date-payment-failures-a-pending-cancellation-and-invoices-from-stripe"},{"title":"Open Stripe's Customer Portal for this workspace","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/billing/portal","href":"/api-reference/billing/open-stripes-customer-portal-for-this-workspace"}]},{"group":"Presets","pages":[{"title":"Outbound destination preset catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/destination-presets","href":"/api-reference/presets/outbound-destination-preset-catalog"},{"title":"Inbound source preset catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/source-presets","href":"/api-reference/presets/inbound-source-preset-catalog"}]},{"group":"Data API","pages":[{"title":"The datasets this key may read, and their columns","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data","href":"/api-reference/data-api/the-datasets-this-key-may-read-and-their-columns"},{"title":"One page of an exposed dataset, exposed columns only","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/data/{dataset}","href":"/api-reference/data-api/one-page-of-an-exposed-dataset-exposed-columns-only"},{"title":"What the project exposes to the Data API, and its keys (metadata only)","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/data-api","href":"/api-reference/data-api/what-the-project-exposes-to-the-data-api-and-its-keys-metadata-only"},{"title":"Replace what the project exposes","deprecated":null,"version":null,"openapi":"/openapi.json put /admin/api/projects/{project_id}/data-api/exposures","href":"/api-reference/data-api/replace-what-the-project-exposes"},{"title":"Replace what the project exposes (PATCH, same as PUT)","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/data-api/exposures","href":"/api-reference/data-api/replace-what-the-project-exposes-patch-same-as-put"},{"title":"Create a read-only Data API key (the plaintext is returned once)","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/data-api/keys","href":"/api-reference/data-api/create-a-read-only-data-api-key-the-plaintext-is-returned-once"},{"title":"Revoke a Data API key; it stops working immediately","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/data-api/keys/{key_id}","href":"/api-reference/data-api/revoke-a-data-api-key;-it-stops-working-immediately"}]},{"group":"Broadcast Logs","pages":[{"title":"The project's Broadcast Logs integration (or null) and the vendor catalog","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/the-projects-broadcast-logs-integration-or-null-and-the-vendor-catalog"},{"title":"Start forwarding the project's logs and traces over OTLP/HTTP (JSON) to one tool","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/start-forwarding-the-projects-logs-and-traces-over-otlphttp-json-to-one-tool"},{"title":"Remove the integration","deprecated":null,"version":null,"openapi":"/openapi.json delete /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/remove-the-integration"},{"title":"Change the integration's settings or secrets, or enable / disable it","deprecated":null,"version":null,"openapi":"/openapi.json patch /admin/api/projects/{project_id}/telemetry","href":"/api-reference/broadcast-logs/change-the-integrations-settings-or-secrets-or-enable-disable-it"},{"title":"Send one test log record (and span) to a draft or the saved configuration","deprecated":null,"version":null,"openapi":"/openapi.json post /admin/api/projects/{project_id}/telemetry/test","href":"/api-reference/broadcast-logs/send-one-test-log-record-and-span-to-a-draft-or-the-saved-configuration"}]},{"group":"Observability","pages":[{"title":"A project's flagged events: filtered and routing failed","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/errors","href":"/api-reference/observability/a-projects-flagged-events:-filtered-and-routing-failed"},{"title":"One flagged event, with its whole payload","deprecated":null,"version":null,"openapi":"/openapi.json get /admin/api/projects/{project_id}/errors/{id}","href":"/api-reference/observability/one-flagged-event-with-its-whole-payload"}]},{"group":"Status","pages":[{"title":"Is the API up?","deprecated":null,"version":null,"openapi":"/openapi.json get /health","href":"/api-reference/status/is-the-api-up?"},{"title":"CORS preflight for /health","deprecated":null,"version":null,"openapi":"/openapi.json options /health","href":"/api-reference/status/cors-preflight-for-health"},{"title":"Is the API up? (headers only)","deprecated":null,"version":null,"openapi":"/openapi.json head /health","href":"/api-reference/status/is-the-api-up?-headers-only"}]},{"group":"Agents","pages":[{"title":"Get a proof-of-work challenge to register an agent","deprecated":null,"version":null,"openapi":"/openapi.json get /v1/agents/register/challenge","href":"/api-reference/agents/get-a-proof-of-work-challenge-to-register-an-agent"},{"title":"Register an AI agent's own Hookie account","deprecated":null,"version":null,"openapi":"/openapi.json post /v1/agents/register","href":"/api-reference/agents/register-an-ai-agents-own-hookie-account"}]},{"group":"Delivery","pages":[{"title":"An outbound delivery to a destination","version":null,"deprecated":null,"openapi":"/openapi.json webhook delivery","href":"/api-reference/delivery/an-outbound-delivery-to-a-destination"}]}]}]},"basePath":"","title":"Create a workflow definition - Hookie","buildId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","deploymentId":"dpl_345ReqzYaAjzS9QpeJemsKdb7KDj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-C8RPHPxo.js","utils-0BK-9q6z.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DfjzsUJT.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B4v9psJ4.js","snippetPresets-CpTQv-Ez.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-BNP-Fvr0.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BSgu6h1D.js","shallow-Biv1i9Gs.js","getApiPlaygroundDisplay-BoGOXhtF.js","CodeSnippet-DvQoT18_.js","CodeSnippets-Dnpa15xT.js","Page-Buji1S4J.js","getPastedJson-xAIyhUFE.js","icon-S6FBih11.js","MethodPill-SaYeUZyk.js","DuplicateIcon-Cs-p3v2Q.js","createIcon-DjCFEoHq.js","DynamicMarkdown-BcnBltEQ.js","SectionHeading-BUBl0eEF.js","axios-vUo_bRtp.js","Markdown-h4cOoD8d.js","clsx-B2v50t8t.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-DJnKvr0g.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BHrrjR1K.js"]}