{"components":{"schemas":{"ApiKeyView":{"additionalProperties":false,"properties":{"createdAt":{"type":"string"},"createdBy":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"type":"object"},"expired":{"type":"boolean"},"expiresAt":{"type":"string"},"id":{"type":"string"},"lastUsedAt":{"description":"When the key was last used, to the minute; null before.","type":["string","null"]},"name":{"type":"string"},"prefix":{"description":"The key's first characters, to tell it apart; not a secret.","type":"string"},"scopes":{"items":{"enum":["workflows:read","workflows:write","runs:read","runs:trigger","deliveries:read","deliveries:write","usage:read"],"type":"string"},"type":"array"}},"required":["id","name","prefix","scopes","createdBy","createdAt","expiresAt","expired","lastUsedAt"],"type":"object"},"JsonValue":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"},{"items":{"$ref":"#/components/schemas/JsonValue"},"type":"array"},{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"}]},"Problem":{"additionalProperties":false,"properties":{"code":{"type":"string","x-extensible-enum":["unauthenticated","forbidden_scope","human_required","not_found","validation_failed","unsupported_field","revision_conflict","cron_tz_prefix","cron_field_count","cron_dialect_unsupported","rrule_unsupported","run_at_in_past","idempotency_key_required","idempotency_key_reused","idempotency_in_progress","rate_limited","quota_exhausted","held","region_unavailable","version_unsupported","forbidden","precondition_required","unsupported_media_type","conflict"]},"current":{"$ref":"#/components/schemas/WorkflowView"},"detail":{"type":"string"},"issues":{"items":{"additionalProperties":false,"properties":{"code":{"type":"string","x-extensible-enum":["unsupported_field","cron_tz_prefix","cron_field_count","rrule_unsupported"]},"message":{"type":"string"},"path":{"type":"string"}},"required":["path","message"],"type":"object"},"type":"array"},"next_action":{"additionalProperties":false,"properties":{"kind":{"type":"string","x-extensible-enum":["retry","edit_field","activate","ask_human","none"]},"target":{"type":["string","null"]}},"required":["kind","target"],"type":"object"},"retry_after":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"retryable":{"type":"boolean"},"status":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"title":{"type":"string"},"type":{"const":"about:blank","type":"string"}},"required":["type","title","status","detail","code","retryable"],"type":"object"},"RunDetail":{"additionalProperties":false,"properties":{"deliveries":{"items":{"additionalProperties":false,"properties":{"attemptedAt":{"type":"string"},"durationMs":{"type":["number","null"]},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"status":{"type":"string","x-extensible-enum":["succeeded","failed"]},"statusCode":{"type":["number","null"]},"url":{"description":"The webhook's URL in full for a session; for an API key only its origin, the scheme and host (e.g. https://hooks.example.com), never its path or query. An email's attempt is its `mailto:` address, for either.","type":"string"}},"required":["url","status","statusCode","error","attemptedAt","durationMs"],"type":"object"},"type":"array"},"deliveryStatus":{"anyOf":[{"type":"string","x-extensible-enum":["none","pending","held","rendered","delivered","failed"]},{"type":"null"}],"description":"What became of the run's result after its steps ended: `none` when the run delivers nothing, `pending` until the delivery ends, then `delivered` or `failed`. Null as `outcome` is."},"durationMs":{"type":["number","null"]},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"finishedAt":{"type":["string","null"]},"functionRegion":{"type":["string","null"]},"id":{"type":"string"},"inputs":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},"mergedSlots":{"anyOf":[{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},{"type":"null"}],"description":"On a run queued for the latest of several due fire times: how many `missed` rows were written beside it, a summary row counting as one. Null otherwise."},"outcome":{"anyOf":[{"type":"string","x-extensible-enum":["ok","failed","refused","overloaded","check_failed","timeout","crashed","unknown"]},{"type":"null"}],"description":"How the run's steps ended, whatever became of the delivery: `ok` or why not. Null until the run closes, and for a run that closed before this was recorded."},"outcomeReason":{"anyOf":[{"type":"string","x-extensible-enum":["workflow.deleted","revision.not_recorded","definition.invalid","run.over_request_limit","step.inputs_unresolved","step.failed","engine.internal","provider.quota","provider.timeout","run.not_finished"]},{"type":"null"}],"description":"Why `outcome` is not `ok`, as a code that stays the same while the error text may change; null for `ok`, and where no code is recorded."},"output":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"queuedRevision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256"],"type":"object"},{"type":"null"}]},"revision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256"],"type":"object"},{"type":"null"}]},"scheduledFor":{"type":["string","null"]},"slotReason":{"anyOf":[{"type":"string","x-extensible-enum":["platform_outage","overlap","starting_deadline","delivery_held"]},{"type":"null"}],"description":"Why this fire time did not execute, set exactly when `status` is `missed` or `skipped`: the scheduler reached it late (`platform_outage`), another run of the schedule was queued or not over (`overlap`), or it came later than the schedule's starting deadline."},"slotsUntil":{"description":"On the one summary row of a late claim that missed more fire times than get a row each: the row stands for every fire time from `scheduledFor` up to, not including, this time. Null otherwise.","type":["string","null"]},"startedAt":{"type":["string","null"]},"status":{"description":"`failed` when `outcome` is not `ok` or `deliveryStatus` is `failed`; read those two to tell which. `running` until the delivery has ended, so `succeeded` and `failed` are final. `missed` and `skipped` are fire times that did not execute: `slotReason` says why.","type":"string","x-extensible-enum":["queued","running","succeeded","failed","missed","skipped"]},"steps":{"items":{"additionalProperties":false,"properties":{"aiTokens":{"type":["number","null"]},"durationMs":{"type":["number","null"]},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"finishedAt":{"type":["string","null"]},"inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"model":{"type":["string","null"]},"outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"runnerType":{"type":"string"},"startedAt":{"type":["string","null"]},"status":{"type":"string","x-extensible-enum":["queued","running","succeeded","failed"]},"stepId":{"type":"string"}},"required":["stepId","runnerType","status","inputs","outputs","error","model","aiTokens","startedAt","finishedAt","durationMs"],"type":"object"},"type":"array"},"timezone":{"type":"string"},"trigger":{"type":"string","x-extensible-enum":["schedule","manual"]},"workflowDeleted":{"type":"boolean"},"workflowId":{"type":"string"},"workflowName":{"type":"string"}},"required":["id","trigger","status","outcome","deliveryStatus","slotReason","scheduledFor","startedAt","finishedAt","durationMs","workflowId","workflowName","timezone","revision","queuedRevision","workflowDeleted","functionRegion","inputs","output","outcomeReason","slotsUntil","mergedSlots","error","steps","deliveries"],"type":"object"},"SavedWorkflowBody":{"additionalProperties":false,"properties":{"appliesFrom":{"anyOf":[{"additionalProperties":false,"properties":{"next":{"anyOf":[{"additionalProperties":false,"properties":{"at":{"type":"string"},"runId":{"type":["string","null"]}},"required":["runId","at"],"type":"object"},{"type":"null"}]},"running":{"anyOf":[{"additionalProperties":false,"properties":{"differs":{"additionalProperties":false,"properties":{"delivery":{"type":"boolean"},"version":{"type":"boolean"}},"required":["version","delivery"],"type":"object"},"runId":{"type":"string"},"scheduledFor":{"type":["string","null"]},"startedAt":{"type":"string"}},"required":["runId","scheduledFor","startedAt","differs"],"type":"object"},{"type":"null"}]}},"required":["running","next"],"type":"object"},{"type":"null"}]},"canManage":{"type":"boolean"},"createdAt":{"type":"string"},"delivery":{"anyOf":[{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"webhook","type":"string"},"secret":{"type":"string"},"secretHint":{"type":["string","null"]},"secretShownOnce":{"const":true,"type":"boolean"},"url":{"type":"string"}},"required":["kind","url","secretHint"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"email","type":"string"}},"required":["kind"],"type":"object"}]},{"type":"null"}]},"entityTag":{"type":"string"},"id":{"type":"string"},"model":{"type":["string","null"]},"name":{"type":"string"},"prompt":{"type":"string"},"revision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256"],"type":"object"},{"type":"null"}]},"runs":{"items":{"additionalProperties":false,"properties":{"deliveryStatus":{"anyOf":[{"type":"string","x-extensible-enum":["none","pending","held","rendered","delivered","failed"]},{"type":"null"}],"description":"What became of the run's result after its steps ended: `none` when the run delivers nothing, `pending` until the delivery ends, then `delivered` or `failed`. Null as `outcome` is."},"durationMs":{"type":["number","null"]},"finishedAt":{"type":["string","null"]},"id":{"type":"string"},"outcome":{"anyOf":[{"type":"string","x-extensible-enum":["ok","failed","refused","overloaded","check_failed","timeout","crashed","unknown"]},{"type":"null"}],"description":"How the run's steps ended, whatever became of the delivery: `ok` or why not. Null until the run closes, and for a run that closed before this was recorded."},"scheduledFor":{"type":["string","null"]},"slotReason":{"anyOf":[{"type":"string","x-extensible-enum":["platform_outage","overlap","starting_deadline","delivery_held"]},{"type":"null"}],"description":"Why this fire time did not execute, set exactly when `status` is `missed` or `skipped`: the scheduler reached it late (`platform_outage`), another run of the schedule was queued or not over (`overlap`), or it came later than the schedule's starting deadline."},"startedAt":{"type":["string","null"]},"status":{"description":"`failed` when `outcome` is not `ok` or `deliveryStatus` is `failed`; read those two to tell which. `running` until the delivery has ended, so `succeeded` and `failed` are final. `missed` and `skipped` are fire times that did not execute: `slotReason` says why.","type":"string","x-extensible-enum":["queued","running","succeeded","failed","missed","skipped"]},"trigger":{"type":"string","x-extensible-enum":["schedule","manual"]}},"required":["id","trigger","status","outcome","deliveryStatus","slotReason","scheduledFor","startedAt","finishedAt","durationMs"],"type":"object"},"type":"array"},"schedule":{"additionalProperties":false,"properties":{"consecutiveFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"cron":{"type":"string"},"enabled":{"type":"boolean"},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":"string"},"pauseReason":{"anyOf":[{"type":"string","x-extensible-enum":["failures","manual","exhausted"]},{"type":"null"}]},"timezone":{"type":"string"}},"required":["cron","timezone","enabled","nextRunAt","lastRunAt","consecutiveFailures","pauseReason"],"type":"object"},"systemPrompt":{"type":["string","null"]},"webSearch":{"anyOf":[{"type":"string","x-extensible-enum":["staan","parallel"]},{"type":"null"}]}},"required":["id","name","createdAt","schedule","prompt","systemPrompt","model","webSearch","delivery","runs","canManage","revision","entityTag","appliesFrom"],"type":"object"},"WorkflowView":{"additionalProperties":false,"properties":{"canManage":{"type":"boolean"},"createdAt":{"type":"string"},"delivery":{"anyOf":[{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"webhook","type":"string"},"secretHint":{"type":["string","null"]},"url":{"description":"The webhook's URL in full for a session; for an API key only its origin, the scheme and host (e.g. https://hooks.example.com), never its path or query.","type":"string"}},"required":["kind","url","secretHint"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"email","type":"string"}},"required":["kind"],"type":"object"}]},{"type":"null"}]},"entityTag":{"type":"string"},"id":{"type":"string"},"model":{"type":["string","null"]},"name":{"type":"string"},"prompt":{"type":"string"},"revision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256"],"type":"object"},{"type":"null"}]},"runs":{"items":{"additionalProperties":false,"properties":{"deliveryStatus":{"anyOf":[{"type":"string","x-extensible-enum":["none","pending","held","rendered","delivered","failed"]},{"type":"null"}],"description":"What became of the run's result after its steps ended: `none` when the run delivers nothing, `pending` until the delivery ends, then `delivered` or `failed`. Null as `outcome` is."},"durationMs":{"type":["number","null"]},"finishedAt":{"type":["string","null"]},"id":{"type":"string"},"outcome":{"anyOf":[{"type":"string","x-extensible-enum":["ok","failed","refused","overloaded","check_failed","timeout","crashed","unknown"]},{"type":"null"}],"description":"How the run's steps ended, whatever became of the delivery: `ok` or why not. Null until the run closes, and for a run that closed before this was recorded."},"scheduledFor":{"type":["string","null"]},"slotReason":{"anyOf":[{"type":"string","x-extensible-enum":["platform_outage","overlap","starting_deadline","delivery_held"]},{"type":"null"}],"description":"Why this fire time did not execute, set exactly when `status` is `missed` or `skipped`: the scheduler reached it late (`platform_outage`), another run of the schedule was queued or not over (`overlap`), or it came later than the schedule's starting deadline."},"startedAt":{"type":["string","null"]},"status":{"description":"`failed` when `outcome` is not `ok` or `deliveryStatus` is `failed`; read those two to tell which. `running` until the delivery has ended, so `succeeded` and `failed` are final. `missed` and `skipped` are fire times that did not execute: `slotReason` says why.","type":"string","x-extensible-enum":["queued","running","succeeded","failed","missed","skipped"]},"trigger":{"type":"string","x-extensible-enum":["schedule","manual"]}},"required":["id","trigger","status","outcome","deliveryStatus","slotReason","scheduledFor","startedAt","finishedAt","durationMs"],"type":"object"},"type":"array"},"schedule":{"additionalProperties":false,"properties":{"consecutiveFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"cron":{"type":"string"},"enabled":{"type":"boolean"},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":"string"},"pauseReason":{"anyOf":[{"type":"string","x-extensible-enum":["failures","manual","exhausted"]},{"type":"null"}]},"timezone":{"type":"string"}},"required":["cron","timezone","enabled","nextRunAt","lastRunAt","consecutiveFailures","pauseReason"],"type":"object"},"systemPrompt":{"type":["string","null"]},"webSearch":{"anyOf":[{"type":"string","x-extensible-enum":["staan","parallel"]},{"type":"null"}]}},"required":["id","name","createdAt","schedule","prompt","systemPrompt","model","webSearch","delivery","runs","canManage","revision","entityTag"],"type":"object"}},"securitySchemes":{"bearer":{"description":"An API key of one workspace, made by a signed-in person on the account page, sent as Authorization: Bearer cronai_…. It reads with its scopes, as far as its creator may now; only the operations that list it take it. A request with an Authorization header is authenticated by that header alone.","scheme":"bearer","type":"http"},"session":{"description":"The session cookie that signing in sets; on https its name carries the __Secure- prefix. Every operation takes it.","in":"cookie","name":"better-auth.session_token","type":"apiKey"}}},"info":{"description":"The API agents and the app share: one operation per path and method, each with its scope (x-scope), maturity (x-maturity) and MCP annotations (x-mcp-annotations). Every refusal is application/problem+json (RFC 9457). A value set marked x-extensible-enum may grow: a client must accept a value it does not know, such as a new problem code or run status, and treat it as the generic case. Operations without a route yet are listed under x-planned.","title":"cronai.app API","version":"v1"},"openapi":"3.1.0","paths":{"/api/v1/me":{"get":{"operationId":"get_me","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"key":{"additionalProperties":false,"properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"}},"required":["id","name","prefix"],"type":"object"},"kind":{"type":"string","x-extensible-enum":["session","api_key"]},"scopes":{"items":{"type":"string","x-extensible-enum":["workflows:read","workflows:write","runs:read","runs:trigger","deliveries:read","deliveries:write","usage:read"]},"type":"array"},"user":{"additionalProperties":false,"properties":{"email":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name","email"],"type":"object"},"workspace":{"type":"string"}},"required":["kind","workspace","scopes","user"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get me","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":null}},"/api/v1/schemas/{name}":{"get":{"description":"The JSON Schemas of the workflow document v1 (/api/v1/schemas/workflow-v1.json) and its export envelope (/api/v1/schemas/workflow-export-v1.json), each with its $id on the deployment's base URL. Public, readable from any origin, fresh for five minutes, then revalidated by ETag; limited per client address.","operationId":"get_workflow_schema","parameters":[{"in":"path","name":"name","required":true,"schema":{"enum":["workflow-v1.json","workflow-export-v1.json"],"type":"string"}}],"responses":{"200":{"content":{"application/schema+json":{"schema":{"type":"object"}}},"description":"The schema.","headers":{"ETag":{"description":"The schema's entity tag, for If-None-Match.","schema":{"type":"string"}}}},"304":{"description":"The schema is the one If-None-Match names."},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"}}},"description":"No schema of this name."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"503":{"description":"The deployment has no base URL configured."}},"security":[],"summary":"Get a published JSON Schema"}},"/api/v1/workspaces/{ws}/echo-endpoints":{"post":{"operationId":"create_echo_endpoint","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"secret":{"type":"string"},"token":{"type":"string"},"url":{"type":"string"}},"required":["token","url","secret"],"type":"object"}}},"description":"Created"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Create echo endpoint","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"x-scope":"deliveries:write"}},"/api/v1/workspaces/{ws}/echo-endpoints/{token}":{"patch":{"operationId":"set_echo_endpoint_secret","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"secret":{"maxLength":94,"type":"string"}},"required":["secret"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"token":{"type":"string"},"url":{"type":"string"}},"required":["token","url"],"type":"object"}}},"description":"OK"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Set echo endpoint secret","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"deliveries:write"}},"/api/v1/workspaces/{ws}/echo-endpoints/{token}/receipts":{"get":{"operationId":"list_echo_receipts","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"token","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"receipts":{"items":{"additionalProperties":false,"properties":{"body":{"type":"string"},"id":{"type":"string"},"receivedAt":{"type":"string"},"runId":{"type":["string","null"]},"signatureHeader":{"type":["string","null"]},"signatureValid":{"type":"boolean"},"webhookId":{"type":["string","null"]},"webhookTimestamp":{"type":["string","null"]}},"required":["id","receivedAt","webhookId","webhookTimestamp","signatureHeader","signatureValid","body","runId"],"type":"object"},"type":"array"}},"required":["receipts"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"List echo receipts","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"deliveries:read"}},"/api/v1/workspaces/{ws}/keys":{"get":{"operationId":"list_api_keys","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyView"},"type":"array"}},"required":["keys"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"List api keys","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":null},"post":{"operationId":"create_api_key","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"A new API key of the workspace.","properties":{"expiresInDays":{"description":"Days until the key expires; 90 when left out.","maximum":365,"minimum":1,"type":"integer"},"name":{"description":"What the key is for, as the key list shows it.","maxLength":100,"minLength":1,"type":"string"},"password":{"description":"The password of the signed-in person, asked again for this act; checked and not stored.","minLength":1,"type":"string"},"scopes":{"description":"What the key may read.","items":{"enum":["workflows:read","runs:read","usage:read"],"type":"string"},"minItems":1,"type":"array"}},"required":["name","scopes","password"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"key":{"$ref":"#/components/schemas/ApiKeyView"},"secret":{"description":"The key itself, in this answer only: it is not stored.","type":"string"}},"required":["key","secret"],"type":"object"}}},"description":"Created"},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Create api key","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"x-scope":null}},"/api/v1/workspaces/{ws}/keys/{id}":{"delete":{"operationId":"revoke_api_key","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"204":{"description":"No Content"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Revoke api key","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":null}},"/api/v1/workspaces/{ws}/runs":{"get":{"operationId":"list_runs","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"query","name":"workflow_id","required":false,"schema":{"minLength":1,"type":"string"}},{"in":"query","name":"since","required":false,"schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}},{"in":"query","name":"after","required":false,"schema":{"maxLength":64,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"nextCursor":{"type":["string","null"]},"runs":{"items":{"additionalProperties":false,"properties":{"deliveryStatus":{"anyOf":[{"type":"string","x-extensible-enum":["none","pending","held","rendered","delivered","failed"]},{"type":"null"}],"description":"What became of the run's result after its steps ended: `none` when the run delivers nothing, `pending` until the delivery ends, then `delivered` or `failed`. Null as `outcome` is."},"durationMs":{"type":["number","null"]},"finishedAt":{"type":["string","null"]},"id":{"type":"string"},"outcome":{"anyOf":[{"type":"string","x-extensible-enum":["ok","failed","refused","overloaded","check_failed","timeout","crashed","unknown"]},{"type":"null"}],"description":"How the run's steps ended, whatever became of the delivery: `ok` or why not. Null until the run closes, and for a run that closed before this was recorded."},"scheduledFor":{"type":["string","null"]},"slotReason":{"anyOf":[{"type":"string","x-extensible-enum":["platform_outage","overlap","starting_deadline","delivery_held"]},{"type":"null"}],"description":"Why this fire time did not execute, set exactly when `status` is `missed` or `skipped`: the scheduler reached it late (`platform_outage`), another run of the schedule was queued or not over (`overlap`), or it came later than the schedule's starting deadline."},"startedAt":{"type":["string","null"]},"status":{"description":"`failed` when `outcome` is not `ok` or `deliveryStatus` is `failed`; read those two to tell which. `running` until the delivery has ended, so `succeeded` and `failed` are final. `missed` and `skipped` are fire times that did not execute: `slotReason` says why.","type":"string","x-extensible-enum":["queued","running","succeeded","failed","missed","skipped"]},"trigger":{"type":"string","x-extensible-enum":["schedule","manual"]},"workflowId":{"type":"string"}},"required":["id","trigger","status","outcome","deliveryStatus","slotReason","scheduledFor","startedAt","finishedAt","durationMs","workflowId"],"type":"object"},"type":"array"}},"required":["runs","nextCursor"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"List runs","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"runs:read"}},"/api/v1/workspaces/{ws}/runs/compare":{"get":{"operationId":"compare_runs","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"query","name":"a","required":true,"schema":{"description":"The run to compare from.","minLength":1,"type":"string"}},{"in":"query","name":"b","required":true,"schema":{"description":"The run to compare to.","minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"a":{"$ref":"#/components/schemas/RunDetail"},"b":{"$ref":"#/components/schemas/RunDetail"},"definition":{"oneOf":[{"additionalProperties":false,"properties":{"otherChanges":{"items":{"enum":["name","description","schedule","inputs","outputs"],"type":"string"},"type":"array"},"recorded":{"const":true,"type":"boolean"},"sameRevision":{"type":"boolean"},"steps":{"items":{"additionalProperties":false,"properties":{"bindings":{"items":{"additionalProperties":false,"properties":{"a":{"type":["string","null"]},"b":{"type":["string","null"]},"change":{"enum":["same","changed","added","removed"],"type":"string"},"key":{"type":"string"},"kinds":{"anyOf":[{"additionalProperties":false,"properties":{"a":{"enum":["text","number","boolean","null","list","object"],"type":"string"},"b":{"enum":["text","number","boolean","null","list","object"],"type":"string"}},"required":["a","b"],"type":"object"},{"type":"null"}]},"parts":{"items":{"additionalProperties":false,"properties":{"op":{"enum":["equal","removed","added"],"type":"string"},"text":{"type":"string"}},"required":["op","text"],"type":"object"},"type":"array"},"wordByWord":{"type":"boolean"}},"required":["change","a","b","parts","wordByWord","key","kinds"],"type":"object"},"type":"array"},"change":{"enum":["same","changed","added","removed"],"type":"string"},"name":{"type":"string"},"settings":{"items":{"additionalProperties":false,"properties":{"a":{"$ref":"#/components/schemas/JsonValue","description":"The setting in run a's revision, null where it has none. For a webhook step's url, an API key reads only its origin, the scheme and host (e.g. https://hooks.example.com), never its path or query, and for its headers each value as [redacted], the names kept; a session reads both in full."},"b":{"$ref":"#/components/schemas/JsonValue","description":"The setting in run b's revision, null where it has none. For a webhook step's url, an API key reads only its origin, the scheme and host (e.g. https://hooks.example.com), never its path or query, and for its headers each value as [redacted], the names kept; a session reads both in full."},"setting":{"type":"string"}},"required":["setting","a","b"],"type":"object"},"type":"array"},"stepId":{"type":"string"},"systemPrompt":{"additionalProperties":false,"properties":{"a":{"type":["string","null"]},"b":{"type":["string","null"]},"change":{"enum":["same","changed","added","removed"],"type":"string"},"parts":{"items":{"additionalProperties":false,"properties":{"op":{"enum":["equal","removed","added"],"type":"string"},"text":{"type":"string"}},"required":["op","text"],"type":"object"},"type":"array"},"wordByWord":{"type":"boolean"}},"required":["change","a","b","parts","wordByWord"],"type":"object"}},"required":["stepId","name","change","systemPrompt","bindings","settings"],"type":"object"},"type":"array"}},"required":["recorded","sameRevision","steps","otherChanges"],"type":"object"},{"additionalProperties":false,"properties":{"missing":{"items":{"enum":["a","b"],"type":"string"},"type":"array"},"recorded":{"const":false,"type":"boolean"}},"required":["recorded","missing"],"type":"object"}]},"differs":{"additionalProperties":false,"properties":{"delivery":{"type":"boolean"},"durationMs":{"type":"boolean"},"error":{"type":"boolean"},"functionRegion":{"type":"boolean"},"status":{"type":"boolean"}},"required":["status","error","durationMs","functionRegion","delivery"],"type":"object"},"durationDeltaMs":{"type":["number","null"]},"inferenceRegions":{"additionalProperties":false,"properties":{"a":{"items":{"type":"string"},"type":"array"},"b":{"items":{"type":"string"},"type":"array"}},"required":["a","b"],"type":"object"},"inputs":{"items":{"additionalProperties":false,"properties":{"a":{"type":["string","null"]},"b":{"type":["string","null"]},"change":{"enum":["same","changed","added","removed"],"type":"string"},"key":{"type":"string"},"kinds":{"anyOf":[{"additionalProperties":false,"properties":{"a":{"enum":["text","number","boolean","null","list","object"],"type":"string"},"b":{"enum":["text","number","boolean","null","list","object"],"type":"string"}},"required":["a","b"],"type":"object"},{"type":"null"}]},"parts":{"items":{"additionalProperties":false,"properties":{"op":{"enum":["equal","removed","added"],"type":"string"},"text":{"type":"string"}},"required":["op","text"],"type":"object"},"type":"array"},"wordByWord":{"type":"boolean"}},"required":["change","a","b","parts","wordByWord","key","kinds"],"type":"object"},"type":"array"},"notRecorded":{"items":false,"maxItems":3,"minItems":3,"prefixItems":[{"const":"modelRequested","type":"string"},{"const":"modelResponded","type":"string"},{"const":"cost","type":"string"}],"type":"array"},"output":{"items":{"additionalProperties":false,"properties":{"a":{"type":["string","null"]},"b":{"type":["string","null"]},"change":{"enum":["same","changed","added","removed"],"type":"string"},"key":{"type":"string"},"kinds":{"anyOf":[{"additionalProperties":false,"properties":{"a":{"enum":["text","number","boolean","null","list","object"],"type":"string"},"b":{"enum":["text","number","boolean","null","list","object"],"type":"string"}},"required":["a","b"],"type":"object"},{"type":"null"}]},"parts":{"items":{"additionalProperties":false,"properties":{"op":{"enum":["equal","removed","added"],"type":"string"},"text":{"type":"string"}},"required":["op","text"],"type":"object"},"type":"array"},"wordByWord":{"type":"boolean"}},"required":["change","a","b","parts","wordByWord","key","kinds"],"type":"object"},"type":"array"},"sameWorkflow":{"type":"boolean"},"steps":{"items":{"additionalProperties":false,"properties":{"a":{"anyOf":[{"additionalProperties":false,"properties":{"aiTokens":{"type":["number","null"]},"durationMs":{"type":["number","null"]},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"finishedAt":{"type":["string","null"]},"inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"model":{"type":["string","null"]},"outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"runnerType":{"type":"string"},"startedAt":{"type":["string","null"]},"status":{"type":"string","x-extensible-enum":["queued","running","succeeded","failed"]},"stepId":{"type":"string"}},"required":["stepId","runnerType","status","inputs","outputs","error","model","aiTokens","startedAt","finishedAt","durationMs"],"type":"object"},{"type":"null"}]},"b":{"anyOf":[{"additionalProperties":false,"properties":{"aiTokens":{"type":["number","null"]},"durationMs":{"type":["number","null"]},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"finishedAt":{"type":["string","null"]},"inputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"model":{"type":["string","null"]},"outputs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"propertyNames":{"type":"string"},"type":"object"},{"type":"null"}]},"runnerType":{"type":"string"},"startedAt":{"type":["string","null"]},"status":{"type":"string","x-extensible-enum":["queued","running","succeeded","failed"]},"stepId":{"type":"string"}},"required":["stepId","runnerType","status","inputs","outputs","error","model","aiTokens","startedAt","finishedAt","durationMs"],"type":"object"},{"type":"null"}]},"change":{"enum":["same","changed","added","removed"],"type":"string"},"deltas":{"additionalProperties":false,"properties":{"aiTokens":{"type":["number","null"]},"durationMs":{"type":["number","null"]}},"required":["aiTokens","durationMs"],"type":"object"},"differs":{"items":{"enum":["status","model","region","upstreamProvider"],"type":"string"},"type":"array"},"routing":{"additionalProperties":false,"properties":{"a":{"anyOf":[{"additionalProperties":false,"properties":{"region":{"type":["string","null"]},"upstreamProvider":{"type":["string","null"]}},"required":["region","upstreamProvider"],"type":"object"},{"type":"null"}]},"b":{"anyOf":[{"additionalProperties":false,"properties":{"region":{"type":["string","null"]},"upstreamProvider":{"type":["string","null"]}},"required":["region","upstreamProvider"],"type":"object"},{"type":"null"}]}},"required":["a","b"],"type":"object"},"stepId":{"type":"string"}},"required":["stepId","change","a","b","routing","differs","deltas"],"type":"object"},"type":"array"}},"required":["a","b","sameWorkflow","definition","inputs","steps","output","inferenceRegions","differs","durationDeltaMs","notRecorded"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Compare runs","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"runs:read"}},"/api/v1/workspaces/{ws}/runs/{id}":{"get":{"operationId":"get_run","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetail"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get run","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"runs:read"}},"/api/v1/workspaces/{ws}/runs/{id}/provenance":{"get":{"operationId":"get_run_provenance","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"definitionSha256":{"type":["string","null"]},"prevRootSha256":{"type":["string","null"]},"prevRunId":{"type":["string","null"]},"recorded":{"type":"boolean"},"redactedAt":{"type":["string","null"]},"root":{"type":["string","null"]},"rootSha256":{"type":["string","null"]},"runId":{"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"errorSha256":{"type":["string","null"]},"inputs":{"items":{"additionalProperties":false,"properties":{"key":{"type":"string"},"producerStepId":{"type":["string","null"]},"sha256":{"type":["string","null"]},"source":{"anyOf":[{"type":"string","x-extensible-enum":["static","workflow_input","step_output","run_context","system_prompt","unbound"]},{"type":"null"}]},"trust":{"anyOf":[{"type":"string","x-extensible-enum":["signed_verified","fetched_unverified","written_by_user","derived","computed_by_engine"]},{"type":"null"}]}},"required":["key","source","trust","sha256","producerStepId"],"type":"object"},"type":"array"},"outputSha256":{"type":["string","null"]},"record":{"type":["string","null"]},"recordSha256":{"type":["string","null"]},"recorded":{"type":"boolean"},"rowId":{"type":"string"},"stepId":{"type":"string"},"webSearch":{"type":"boolean"}},"required":["rowId","stepId","recorded","recordSha256","record","inputs","webSearch","outputSha256","errorSha256"],"type":"object"},"type":"array"},"verification":{"oneOf":[{"additionalProperties":false,"properties":{"result":{"const":"not_closed","type":"string"}},"required":["result"],"type":"object"},{"additionalProperties":false,"properties":{"result":{"const":"not_recorded","type":"string"}},"required":["result"],"type":"object"},{"additionalProperties":false,"properties":{"difference":{"anyOf":[{"additionalProperties":false,"properties":{"field":{"type":"string"},"note":{"type":"string"},"recomputed":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]},"record":{"type":"string"},"stored":{"anyOf":[{"$ref":"#/components/schemas/JsonValue"},{"type":"null"}]}},"required":["record","field","stored","recomputed"],"type":"object"},{"type":"null"}]},"mode":{"enum":["recomputed","redacted"],"type":"string"},"result":{"enum":["verified","differs"],"type":"string"}},"required":["result","mode","difference"],"type":"object"}]}},"required":["runId","recorded","definitionSha256","root","rootSha256","prevRunId","prevRootSha256","redactedAt","steps","verification"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get run provenance","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"runs:read"}},"/api/v1/workspaces/{ws}/status":{"get":{"operationId":"get_workspace_status","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"attention":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"inARow":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"kind":{"const":"workflow_failing","type":"string"},"runId":{"type":"string"},"workflowId":{"type":"string"}},"required":["kind","workflowId","runId","error","inARow"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"kind":{"const":"schedule_paused_failures","type":"string"},"runId":{"type":["string","null"]},"workflowId":{"type":"string"}},"required":["kind","workflowId","runId","error"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"schedule_exhausted","type":"string"},"workflowId":{"type":"string"}},"required":["kind","workflowId"],"type":"object"},{"additionalProperties":false,"properties":{"freeAgainAt":{"type":["string","null"]},"kind":{"const":"email_limit_reached","type":"string"},"workflowIds":{"items":{"type":"string"},"type":"array"}},"required":["kind","workflowIds","freeAgainAt"],"type":"object"},{"additionalProperties":false,"properties":{"freeAgainAt":{"type":["string","null"]},"kind":{"const":"web_search_limit_reached","type":"string"},"workflowIds":{"items":{"type":"string"},"type":"array"}},"required":["kind","workflowIds","freeAgainAt"],"type":"object"}]},"type":"array"},"checkedAt":{"type":"string"},"counts":{"additionalProperties":false,"properties":{"emailsSent":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"runs":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"webhooksSent":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"}},"required":["runs","webhooksSent","emailsSent"],"type":"object"},"events":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"at":{"type":"string"},"kind":{"const":"first_run_of_version","type":"string"},"runId":{"type":"string"},"version":{"type":"string"},"workflowId":{"type":"string"}},"required":["kind","at","workflowId","runId","version"],"type":"object"},{"additionalProperties":false,"properties":{"afterFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"at":{"type":"string"},"kind":{"const":"recovered","type":"string"},"runId":{"type":"string"},"workflowId":{"type":"string"}},"required":["kind","at","workflowId","runId","afterFailures"],"type":"object"},{"additionalProperties":false,"properties":{"at":{"type":"string"},"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"kind":{"const":"started_failing","type":"string"},"runId":{"type":"string"},"workflowId":{"type":"string"}},"required":["kind","at","workflowId","runId","error"],"type":"object"},{"additionalProperties":false,"properties":{"at":{"type":"string"},"author":{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"user","type":"string"},"name":{"type":["string","null"]}},"required":["kind","name"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"system","type":"string"}},"required":["kind"],"type":"object"}]},"authorUserId":{"type":["string","null"]},"kind":{"const":"revised","type":"string"},"version":{"type":"string"},"workflowId":{"type":"string"}},"required":["kind","at","workflowId","version","author","authorUserId"],"type":"object"},{"additionalProperties":false,"properties":{"at":{"type":"string"},"author":{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"user","type":"string"},"name":{"type":["string","null"]}},"required":["kind","name"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"system","type":"string"}},"required":["kind"],"type":"object"}]},"authorUserId":{"type":["string","null"]},"kind":{"const":"created","type":"string"},"workflowId":{"type":"string"}},"required":["kind","at","workflowId","author","authorUserId"],"type":"object"}]},"type":"array"},"workflows":{"items":{"additionalProperties":false,"properties":{"consecutiveFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"cron":{"type":"string"},"deliveryKind":{"anyOf":[{"type":"string","x-extensible-enum":["email","webhook"]},{"type":"null"}]},"enabled":{"type":"boolean"},"health":{"oneOf":[{"additionalProperties":false,"properties":{"kind":{"const":"none","type":"string"}},"required":["kind"],"type":"object"},{"additionalProperties":false,"properties":{"inARow":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"kind":{"const":"failed","type":"string"}},"required":["kind","inARow"],"type":"object"},{"additionalProperties":false,"properties":{"at":{"type":"string"},"kind":{"const":"succeeded","type":"string"}},"required":["kind","at"],"type":"object"}]},"id":{"type":"string"},"lastRunAt":{"type":["string","null"]},"name":{"type":"string"},"nextRunAt":{"type":["string","null"]},"pauseReason":{"anyOf":[{"type":"string","x-extensible-enum":["failures","manual","exhausted"]},{"type":"null"}]},"timezone":{"type":"string"},"webSearch":{"type":"boolean"},"webSearchPerRun":{"type":["number","null"]}},"required":["id","name","cron","timezone","enabled","pauseReason","nextRunAt","consecutiveFailures","health","lastRunAt","deliveryKind","webSearch","webSearchPerRun"],"type":"object"},"type":"array"}},"required":["checkedAt","workflows","attention","events","counts"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get workspace status","x-api-key-scopes":["workflows:read","runs:read"],"x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"workflows:read"}},"/api/v1/workspaces/{ws}/usage":{"get":{"operationId":"get_usage","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"usage":{"items":{"additionalProperties":false,"properties":{"freeAgainAt":{"type":["string","null"]},"kind":{"type":"string","x-extensible-enum":["email","web_search"]},"limit":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"used":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"windowSeconds":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"}},"required":["kind","used","limit","windowSeconds","freeAgainAt"],"type":"object"},"type":"array"}},"required":["usage"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get usage","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"usage:read"}},"/api/v1/workspaces/{ws}/workflows":{"get":{"operationId":"list_workflows","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"workflows":{"items":{"additionalProperties":false,"properties":{"createdAt":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"schedule":{"additionalProperties":false,"properties":{"consecutiveFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"cron":{"type":"string"},"enabled":{"type":"boolean"},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":"string"},"pauseReason":{"anyOf":[{"type":"string","x-extensible-enum":["failures","manual","exhausted"]},{"type":"null"}]},"timezone":{"type":"string"}},"required":["cron","timezone","enabled","nextRunAt","lastRunAt","consecutiveFailures","pauseReason"],"type":"object"}},"required":["id","name","createdAt","schedule"],"type":"object"},"type":"array"}},"required":["workflows"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"List workflows","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"workflows:read"},"post":{"operationId":"create_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"description":"One key per intended request, 1 to 255 visible characters without \" or \\, bare or quoted. A retry with the same key and request replays the first answer, marked Idempotent-Replayed: true.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"cron":{"maxLength":120,"minLength":1,"type":"string"},"delivery":{"oneOf":[{"additionalProperties":false,"properties":{"kind":{"const":"webhook","type":"string"},"url":{"maxLength":2048,"minLength":1,"type":"string"}},"required":["kind","url"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"email","type":"string"}},"required":["kind"],"type":"object"}]},"name":{"maxLength":120,"minLength":1,"type":"string"},"prompt":{"maxLength":8000,"minLength":1,"type":"string"},"runImmediately":{"type":"boolean"},"systemPrompt":{"maxLength":4000,"type":"string"},"timezone":{"maxLength":64,"minLength":1,"type":"string"},"webSearch":{"enum":["off","staan","parallel"],"type":"string"}},"required":["name","prompt","cron","timezone","delivery"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedWorkflowBody"}}},"description":"Created","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}},"Idempotent-Replayed":{"description":"Present on a replay of an earlier answer to the same key.","schema":{"enum":["true"],"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"A request with this Idempotency-Key is still being handled, or the change conflicts; retry after Retry-After when it is given."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"This Idempotency-Key was used for a different request."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Create workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"}},"/api/v1/workspaces/{ws}/workflows/{id}":{"delete":{"operationId":"delete_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"204":{"description":"No Content"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Delete workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"},"get":{"operationId":"get_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowView"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}}}},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"workflows:read"},"patch":{"operationId":"update_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}},{"description":"The workflow's entity tag, quoted, as its ETag gave it. A save without it answers 428, a stale one 412 with the workflow as it is now.","in":"header","name":"If-Match","required":true,"schema":{"type":"string"}},{"description":"One key per intended request, 1 to 255 visible characters without \" or \\, bare or quoted. A retry with the same key and request replays the first answer, marked Idempotent-Replayed: true.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"cron":{"maxLength":120,"minLength":1,"type":"string"},"delivery":{"oneOf":[{"additionalProperties":false,"properties":{"kind":{"const":"webhook","type":"string"},"url":{"maxLength":2048,"minLength":1,"type":"string"}},"required":["kind","url"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"email","type":"string"}},"required":["kind"],"type":"object"}]},"name":{"maxLength":120,"minLength":1,"type":"string"},"prompt":{"maxLength":8000,"minLength":1,"type":"string"},"systemPrompt":{"maxLength":4000,"type":"string"},"timezone":{"maxLength":64,"minLength":1,"type":"string"},"webSearch":{"enum":["off","staan","parallel"],"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedWorkflowBody"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}},"Idempotent-Replayed":{"description":"Present on a replay of an earlier answer to the same key.","schema":{"enum":["true"],"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"A request with this Idempotency-Key is still being handled, or the change conflicts; retry after Retry-After when it is given."},"412":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The workflow changed since its entity tag was read; `current` holds it as it is now."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"This Idempotency-Key was used for a different request."},"428":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No If-Match header."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Update workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"}},"/api/v1/workspaces/{ws}/workflows/{id}/pause":{"post":{"operationId":"pause_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowView"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Pause workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"}},"/api/v1/workspaces/{ws}/workflows/{id}/restore":{"post":{"operationId":"restore_revision","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}},{"description":"The workflow's entity tag, quoted, as its ETag gave it. A save without it answers 428, a stale one 412 with the workflow as it is now.","in":"header","name":"If-Match","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"revision_id":{"minLength":1,"type":"string"}},"required":["revision_id"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedWorkflowBody"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"412":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The workflow changed since its entity tag was read; `current` holds it as it is now."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"428":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No If-Match header."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Restore revision","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"}},"/api/v1/workspaces/{ws}/workflows/{id}/resume":{"post":{"operationId":"resume_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowView"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Resume workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false},"x-scope":"workflows:write"}},"/api/v1/workspaces/{ws}/workflows/{id}/revisions":{"get":{"operationId":"list_revisions","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}},{"in":"query","name":"after","required":false,"schema":{"maxLength":64,"minLength":1,"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":200,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"nextCursor":{"type":["string","null"]},"revisions":{"items":{"additionalProperties":false,"properties":{"changelog":{"type":["string","null"]},"createdAt":{"type":"string"},"createdBy":{"anyOf":[{"additionalProperties":false,"properties":{"kind":{"const":"user","type":"string"},"name":{"type":["string","null"]}},"required":["kind","name"],"type":"object"},{"additionalProperties":false,"properties":{"kind":{"const":"system","type":"string"}},"required":["kind"],"type":"object"}]},"current":{"type":"boolean"},"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256","createdAt","createdBy","current","changelog"],"type":"object"},"type":"array"}},"required":["revisions","nextCursor"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"List revisions","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"workflows:read"}},"/api/v1/workspaces/{ws}/workflows/{id}/rotate-secret":{"post":{"operationId":"rotate_webhook_secret","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"canManage":{"type":"boolean"},"createdAt":{"type":"string"},"delivery":{"additionalProperties":false,"properties":{"kind":{"const":"webhook","type":"string"},"secret":{"type":"string"},"secretHint":{"type":["string","null"]},"url":{"type":"string"}},"required":["kind","url","secretHint","secret"],"type":"object"},"entityTag":{"type":"string"},"id":{"type":"string"},"model":{"type":["string","null"]},"name":{"type":"string"},"prompt":{"type":"string"},"revision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256"],"type":"object"},{"type":"null"}]},"runs":{"items":{"additionalProperties":false,"properties":{"deliveryStatus":{"anyOf":[{"type":"string","x-extensible-enum":["none","pending","held","rendered","delivered","failed"]},{"type":"null"}],"description":"What became of the run's result after its steps ended: `none` when the run delivers nothing, `pending` until the delivery ends, then `delivered` or `failed`. Null as `outcome` is."},"durationMs":{"type":["number","null"]},"finishedAt":{"type":["string","null"]},"id":{"type":"string"},"outcome":{"anyOf":[{"type":"string","x-extensible-enum":["ok","failed","refused","overloaded","check_failed","timeout","crashed","unknown"]},{"type":"null"}],"description":"How the run's steps ended, whatever became of the delivery: `ok` or why not. Null until the run closes, and for a run that closed before this was recorded."},"scheduledFor":{"type":["string","null"]},"slotReason":{"anyOf":[{"type":"string","x-extensible-enum":["platform_outage","overlap","starting_deadline","delivery_held"]},{"type":"null"}],"description":"Why this fire time did not execute, set exactly when `status` is `missed` or `skipped`: the scheduler reached it late (`platform_outage`), another run of the schedule was queued or not over (`overlap`), or it came later than the schedule's starting deadline."},"startedAt":{"type":["string","null"]},"status":{"description":"`failed` when `outcome` is not `ok` or `deliveryStatus` is `failed`; read those two to tell which. `running` until the delivery has ended, so `succeeded` and `failed` are final. `missed` and `skipped` are fire times that did not execute: `slotReason` says why.","type":"string","x-extensible-enum":["queued","running","succeeded","failed","missed","skipped"]},"trigger":{"type":"string","x-extensible-enum":["schedule","manual"]}},"required":["id","trigger","status","outcome","deliveryStatus","slotReason","scheduledFor","startedAt","finishedAt","durationMs"],"type":"object"},"type":"array"},"schedule":{"additionalProperties":false,"properties":{"consecutiveFailures":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"cron":{"type":"string"},"enabled":{"type":"boolean"},"lastRunAt":{"type":["string","null"]},"nextRunAt":{"type":"string"},"pauseReason":{"anyOf":[{"type":"string","x-extensible-enum":["failures","manual","exhausted"]},{"type":"null"}]},"timezone":{"type":"string"}},"required":["cron","timezone","enabled","nextRunAt","lastRunAt","consecutiveFailures","pauseReason"],"type":"object"},"systemPrompt":{"type":["string","null"]},"webSearch":{"anyOf":[{"type":"string","x-extensible-enum":["staan","parallel"]},{"type":"null"}]}},"required":["id","name","createdAt","schedule","prompt","systemPrompt","model","webSearch","delivery","runs","canManage","revision","entityTag"],"type":"object"}}},"description":"OK","headers":{"ETag":{"description":"The workflow's entity tag, for If-Match.","schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Rotate webhook secret","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false},"x-scope":"deliveries:write"}},"/api/v1/workspaces/{ws}/workflows/{id}/runs":{"post":{"operationId":"run_workflow","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}},{"description":"One key per intended request, 1 to 255 visible characters without \" or \\, bare or quoted. A retry with the same key and request replays the first answer, marked Idempotent-Replayed: true.","in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetail"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"Present on a replay of an earlier answer to the same key.","schema":{"enum":["true"],"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request is not valid; `issues` says where."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session: sign in first."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"409":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"A request with this Idempotency-Key is still being handled, or the change conflicts; retry after Retry-After when it is given."},"415":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The body is not application/json."},"422":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"This Idempotency-Key was used for a different request."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]}],"summary":"Run workflow","x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false},"x-scope":"runs:trigger"}},"/api/v1/workspaces/{ws}/workflows/{id}/trends":{"get":{"operationId":"get_workflow_trends","parameters":[{"description":"The workspace: the caller's active organization, as get_me answers it. Another workspace answers 404.","in":"path","name":"ws","required":true,"schema":{"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"minLength":1,"type":"string"}},{"in":"query","name":"from","required":false,"schema":{"description":"The start of the period.","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}},{"in":"query","name":"to","required":false,"schema":{"description":"The end of the period.","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"notRecorded":{"items":false,"maxItems":1,"minItems":1,"prefixItems":[{"const":"cost","type":"string"}],"type":"array"},"period":{"additionalProperties":false,"properties":{"from":{"type":["string","null"]},"to":{"type":["string","null"]}},"required":["from","to"],"type":"object"},"versions":{"items":{"additionalProperties":false,"properties":{"duration":{"additionalProperties":false,"properties":{"medianMs":{"type":["number","null"]},"runs":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"slowest":{"anyOf":[{"additionalProperties":false,"properties":{"durationMs":{"type":"number"},"runId":{"type":"string"}},"required":["runId","durationMs"],"type":"object"},{"type":"null"}]}},"required":["runs","medianMs","slowest"],"type":"object"},"failed":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"failureRate":{"type":"number"},"failureReasons":{"items":{"additionalProperties":false,"properties":{"error":{"description":"For an API key, every http(s) URL in the text reads as its origin, the scheme and host (e.g. https://hooks.example.com); a session reads the text as stored.","type":["string","null"]},"runs":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"}},"required":["error","runs"],"type":"object"},"type":"array"},"revision":{"anyOf":[{"additionalProperties":false,"properties":{"id":{"type":"string"},"savedAt":{"type":"string"},"sha256":{"type":"string"},"version":{"type":"string"}},"required":["id","version","sha256","savedAt"],"type":"object"},{"type":"null"}]},"runs":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"succeeded":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"},"tokens":{"additionalProperties":false,"properties":{"max":{"type":["number","null"]},"median":{"type":["number","null"]},"runs":{"maximum":9007199254740991,"minimum":-9007199254740991,"type":"integer"}},"required":["runs","median","max"],"type":"object"}},"required":["revision","runs","succeeded","failed","failureRate","failureReasons","duration","tokens"],"type":"object"},"type":"array"},"workflowId":{"type":"string"}},"required":["workflowId","period","versions","notRecorded"],"type":"object"}}},"description":"OK"},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No session, or an Authorization header without a valid API key."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Not found, or not the caller's workspace or resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Requests are limited per minute, counted in fixed windows: 20 per API key and 50 per workspace across all its keys; 120 per signed-in person with a session, the pages of the app they open included; 5 per client address for requests without a valid credential; 60 per client address for the OpenAPI document and the published schemas; and 30 per client address and echo endpoint for deliveries to an echo endpoint, except the service's own deliveries from a run, which are counted apart, 120 per echo endpoint. An IPv6 client address is counted per /56. A request past a limit is answered 429 with the problem code `rate_limited` and a `Retry-After` header, the whole seconds until its window ends; its operation does not run. An API key or a session is checked before the request is counted, since a valid one never counts against its address: a refused request that carries one still costs that check.","headers":{"Retry-After":{"description":"Whole seconds until the window that refused the request ends.","schema":{"minimum":1,"type":"integer"}}}},"default":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"Any other refusal, as a problem."}},"security":[{"session":[]},{"bearer":[]}],"summary":"Get workflow trends","x-api-key-scopes":["workflows:read","runs:read"],"x-maturity":"alpha","x-mcp-annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true},"x-scope":"workflows:read"}}},"security":[{"session":[]}],"servers":[{"url":"/"}],"x-planned":[]}