{"openapi":"3.1.0","info":{"title":"walkerOS Tag Manager API","version":"1","description":"API for managing walkerOS flows, projects, and real-time event observation.","contact":{"name":"elbwalker","url":"https://www.elbwalker.com"}},"servers":[{"url":"/","description":"Current server"}],"tags":[{"name":"Auth","description":"Authentication (magic link, session, identity)"},{"name":"OAuth","description":"OAuth 2.1 authorization server (client registration, admin clients)"},{"name":"Projects","description":"Project management and membership"},{"name":"Shares","description":"Frame shares: managing who may open a frame, and reading it through its share"},{"name":"Flows","description":"Flow CRUD (project-scoped)"},{"name":"Versions","description":"Flow version history"},{"name":"Deployments","description":"Flow deployment management"},{"name":"Settings","description":"Per-settings management (named flows within a Config)"},{"name":"Tokens","description":"API token management"},{"name":"Invitations","description":"Project membership invitations"},{"name":"Billing","description":"Project billing details"},{"name":"Bundle","description":"Flow bundling utility"},{"name":"Observe","description":"Real-time event observation"},{"name":"Chat","description":"AI chat sessions and elicitation"},{"name":"Telemetry","description":"Anonymous CLI/MCP usage telemetry"},{"name":"System","description":"Health and documentation"},{"name":"Observer","description":"Observer service (Fastify, port 3001)"},{"name":"Feedback","description":"Public feedback submission (CLI, MCP, in-app)"}],"components":{"schemas":{"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Validation failed"},"details":{"type":"object","properties":{"field":{"type":"string"},"reason":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}},"required":["path","message"]}}},"additionalProperties":{}}},"required":["code","message"]}},"required":["error"]},"ClientOutdatedError":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["CLIENT_OUTDATED"]},"message":{"type":"string","example":"This endpoint requires @walkeros/cli >= 3.5.0 (you are on 3.3.1)."},"minVersion":{"type":"string","example":"3.5.0"},"clientVersion":{"type":"string","example":"3.3.1"},"client":{"type":"string","example":"cli"},"upgrade":{"type":"string","example":"npm install -g @walkeros/cli@latest"},"docs":{"type":"string","format":"uri","example":"https://walkeros.io/docs/upgrading"}},"required":["code","message","minVersion","clientVersion","client","upgrade","docs"]}},"required":["error"]},"FlowConfig":{"type":"object","properties":{"version":{"type":"number","enum":[4]},"$schema":{"type":"string"},"include":{"type":"array","items":{"type":"string"}},"variables":{"type":"object","additionalProperties":{}},"definitions":{"type":"object","additionalProperties":{}},"flows":{"type":"object","additionalProperties":{}},"contract":{"type":"object","additionalProperties":{}}},"required":["version"],"additionalProperties":{}},"Flow":{"type":"object","properties":{"id":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"config":{"$ref":"#/components/schemas/FlowConfig"},"settings":{"type":"array","items":{"$ref":"#/components/schemas/FlowSettingsSummary"}},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"deletedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","config","createdAt","updatedAt"]},"FlowSettingsSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"name":{"type":"string"},"platform":{"type":"string","enum":["web","server"],"example":"web"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","platform","createdAt","updatedAt"]},"FlowSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"placeholder":{"type":"boolean"},"summary":{"type":"string"},"settings":{"type":"array","items":{"$ref":"#/components/schemas/FlowSettingsListItem"}},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"deletedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","placeholder","createdAt","updatedAt","deletedAt"]},"FlowSettingsListItem":{"type":"object","properties":{"id":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"name":{"type":"string"},"platform":{"type":"string","enum":["web","server"],"example":"web"},"serving":{"$ref":"#/components/schemas/ServingStatus"},"latestAttempt":{"$ref":"#/components/schemas/LatestAttemptStatus"},"deploymentUrl":{"type":["string","null"]},"deployedAt":{"type":["string","null"]}},"required":["id","name","platform","serving","latestAttempt","deploymentUrl","deployedAt"]},"ServingStatus":{"type":"string","enum":["live","none"]},"LatestAttemptStatus":{"type":["string","null"],"enum":["idle","deploying","published","active","stopped","failed",null]},"Version":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"example":1},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string","enum":["user","auto_save","restore","deploy","preview"],"example":"user"},"contentHash":{"type":"string","example":"sha256:abc123..."}},"required":["version","createdAt","createdBy"]},"Project":{"type":"object","properties":{"id":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"name":{"type":"string","example":"My Website"},"role":{"type":"string","enum":["owner","admin","member","viewer"],"example":"owner"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"memberCount":{"type":"integer","example":3},"flowCount":{"type":"integer","example":5},"deploymentCount":{"type":"integer","example":2},"isDemo":{"type":"boolean","example":false}},"required":["id","name","role","createdAt","updatedAt","memberCount","flowCount","deploymentCount","isDemo"]},"Member":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","admin","member","viewer"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["userId","email","role","createdAt"]},"DeleteAccountRequest":{"type":"object","properties":{"confirm":{"type":"string","minLength":1,"example":"me@example.com"}},"required":["confirm"]},"DeleteAccountBlocked":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["SOLE_OWNER"],"example":"SOLE_OWNER"},"message":{"type":"string"},"details":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"string"},"example":["proj_abc123"]}},"required":["projects"]}},"required":["code","message","details"]}},"required":["error"]},"AccountExportResponse":{"type":"object","properties":{"exportedAt":{"type":"string","example":"2026-06-10T12:00:00.000Z"},"profile":{"type":"object","properties":{"id":{"type":"string","example":"user_a1b2c3d4"},"email":{"type":"string","example":"me@example.com"},"displayName":{"type":["string","null"]},"createdAt":{"type":"string"},"lastLoginAt":{"type":["string","null"]},"globalRole":{"type":"string","example":"user"},"traits":{"type":"array","items":{"type":"string"}}},"required":["id","email","displayName","createdAt","lastLoginAt","globalRole","traits"]},"memberships":{"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string"},"projectName":{"type":"string"},"role":{"type":"string"},"joinedAt":{"type":"string"}},"required":["projectId","projectName","role","joinedAt"]}},"tokens":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","example":"automation"},"scope":{"type":"string","example":"read write"},"audience":{"type":"string","example":"api mcp"},"projectId":{"type":["string","null"]},"createdAt":{"type":"string"},"lastUsedAt":{"type":["string","null"]},"expiresAt":{"type":"string"},"revokedAt":{"type":["string","null"]}},"required":["id","name","kind","scope","audience","projectId","createdAt","lastUsedAt","expiresAt","revokedAt"]}},"sessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"lastTouchedAt":{"type":"string"}},"required":["id","createdAt","expiresAt","lastTouchedAt"]}},"mcpSessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":["string","null"]},"createdAt":{"type":"string"},"lastActiveAt":{"type":"string"},"expiresAt":{"type":"string"},"messages":{"type":"array","items":{"type":"object","properties":{"seq":{"type":"number"},"role":{"type":"string"},"content":{},"createdAt":{"type":"string"}},"required":["seq","role","createdAt"]}}},"required":["id","projectId","createdAt","lastActiveAt","expiresAt","messages"]}},"feedback":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":["string","null"]},"text":{"type":"string"},"source":{"type":"string"},"createdAt":{"type":"string"}},"required":["id","projectId","text","source","createdAt"]}},"invitations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"invitedEmail":{"type":"string"},"role":{"type":"string"},"status":{"type":"string"},"createdAt":{"type":"string"},"expiresAt":{"type":"string"},"acceptedAt":{"type":["string","null"]},"declinedAt":{"type":["string","null"]},"cancelledAt":{"type":["string","null"]}},"required":["id","projectId","invitedEmail","role","status","createdAt","expiresAt","acceptedAt","declinedAt","cancelledAt"]}}},"required":["exportedAt","profile","memberships","tokens","sessions","mcpSessions","feedback","invitations"]},"AutomationTokenSummary":{"type":"object","properties":{"id":{"type":"string","example":"tok_a1b2c3d4"},"name":{"type":"string","example":"CI Pipeline"},"tokenPrefix":{"type":"string","example":"wos_pat_a1b2"},"scope":{"type":"array","items":{"type":"string"},"example":["read","write"]},"audience":{"type":"array","items":{"type":"string"},"example":["api","mcp"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"lastUsedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"},"expiresAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"revokedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","tokenPrefix","scope","audience","createdAt","lastUsedAt","expiresAt","revokedAt"]},"FlowSettingsDetail":{"type":"object","properties":{"id":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"name":{"type":"string"},"platform":{"type":"string","enum":["web","server"],"example":"web"},"config":{"type":"object","additionalProperties":{}},"deployment":{"type":["object","null"],"properties":{"id":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"containerUrl":{"type":["string","null"]},"publicUrl":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","status","type","createdAt","updatedAt"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","platform","config","createdAt","updatedAt"]},"DeploySettingsRequest":{"type":"object","properties":{"flow":{"type":"string"},"humanText":{"type":"string","maxLength":4000}}},"DeploySettingsResponse":{"type":"object","properties":{"deploymentId":{"type":"string"},"settingsId":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"status":{"type":"string"}},"required":["deploymentId","settingsId","status"]},"FlowDetailResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"config":{"$ref":"#/components/schemas/FlowConfig"},"placeholder":{"type":"boolean"},"settings":{"type":"array","items":{"$ref":"#/components/schemas/FlowSettingsEnriched"}},"bundleId":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"deletedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","config","placeholder","createdAt","updatedAt","deletedAt"]},"FlowSettingsEnriched":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"platform":{"type":"string","enum":["web","server"]},"deployment":{"type":["object","null"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"target":{"type":["string","null"]},"containerUrl":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":["string","null"]}},"required":["id","slug","status","type","target","containerUrl","createdAt","updatedAt"]},"serving":{"$ref":"#/components/schemas/ServingStatus"},"latestAttempt":{"$ref":"#/components/schemas/LatestAttemptStatus"},"deployedAt":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","platform","deployment","serving","latestAttempt","deployedAt","createdAt","updatedAt"]},"FlowUpdateResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"config":{"$ref":"#/components/schemas/FlowConfig"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","config","createdAt","updatedAt"]},"FlowConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["PRECONDITION_FAILED"]},"message":{"type":"string"}},"required":["code","message"]},"head":{"type":"object","properties":{"config":{"$ref":"#/components/schemas/FlowConfig"},"etag":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["config","etag","updatedAt"]}},"required":["error","head"]},"CreateProjectResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"name":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","createdAt"]},"UpdateProjectResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"name":{"type":"string"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","updatedAt"]},"DeploymentSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"type":{"type":"string","enum":["web","server"],"example":"web"},"slug":{"type":"string","pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"target":{"type":["string","null"]},"label":{"type":["string","null"]},"origin":{"type":"string","enum":["cloud","self-hosted"],"example":"cloud"},"status":{"type":"string","enum":["idle","deploying","published","active","stopped","failed"],"example":"active"},"serving":{"$ref":"#/components/schemas/ServingStatus"},"currentVersionNumber":{"type":["integer","null"],"exclusiveMinimum":0},"url":{"type":["string","null"]},"flowId":{"type":["string","null"],"pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"flowName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usageSummary":{"type":"object","properties":{"eventsIn24h":{"type":"integer","minimum":0},"healthy":{"type":"boolean"}},"required":["eventsIn24h","healthy"]}},"required":["id","type","slug","target","label","origin","status","serving","currentVersionNumber","url","flowId","flowName","createdAt","updatedAt"]},"DeploymentDetailResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"type":{"type":"string","enum":["web","server"],"example":"web"},"slug":{"type":"string","pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"target":{"type":["string","null"]},"label":{"type":["string","null"]},"flowId":{"type":["string","null"],"pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"origin":{"type":"string","enum":["cloud","self-hosted"],"example":"cloud"},"status":{"type":"string","enum":["idle","deploying","published","active","stopped","failed"],"example":"active"},"currentVersion":{"anyOf":[{"$ref":"#/components/schemas/DeploymentVersionDetail"},{"type":"null"}]},"versions":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentVersionHistoryEntry"}},"error":{"anyOf":[{"$ref":"#/components/schemas/DeploymentError"},{"type":"null"}]},"recentErrors":{"type":["array","null"],"items":{"type":"object","properties":{"message":{"type":"string"},"count":{"type":"integer"},"firstSeen":{"type":"string"},"lastSeen":{"type":"string"}},"required":["message","count","firstSeen","lastSeen"]}},"recentLogs":{"type":["array","null"],"items":{"type":"object","properties":{"time":{"type":"string"},"level":{"type":"string"},"message":{"type":"string"}},"required":["time","level","message"]}},"url":{"type":["string","null"]},"selfHosted":{"type":["object","null"],"properties":{"lastHeartbeatAt":{"type":"string","format":"date-time"},"instanceId":{"type":["string","null"]},"cliVersion":{"type":["string","null"]},"healthy":{"type":"boolean"}},"required":["lastHeartbeatAt","instanceId","cliVersion","healthy"]},"lastHeartbeatAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","type","slug","target","label","flowId","origin","status","currentVersion","versions","error","url","selfHosted","createdAt","updatedAt"]},"DeploymentVersionDetail":{"type":"object","properties":{"number":{"type":"integer","exclusiveMinimum":0},"status":{"type":"string"},"source":{"type":"object","properties":{"type":{"type":"string"},"flowId":{"type":"string"},"flowSettingsId":{"type":"string"},"configHash":{"type":"string"}},"required":["type"]},"errorMessage":{"type":["string","null"]},"errorCode":{"type":["string","null"]},"publishedAt":{"type":"string","format":"date-time"},"publishedBy":{"type":["string","null"]}},"required":["number","status","source","errorMessage","errorCode","publishedAt","publishedBy"]},"DeploymentVersionHistoryEntry":{"type":"object","properties":{"versionNumber":{"type":"integer","exclusiveMinimum":0},"status":{"type":"string"},"source":{"type":"string"},"errorCode":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"errorPhase":{"type":["string","null"]},"errorDetail":{"type":["string","null"]},"publishedAt":{"type":"string","format":"date-time"}},"required":["versionNumber","status","source","errorCode","errorMessage","errorPhase","publishedAt"]},"DeploymentError":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"phase":{"type":"string","enum":["preflight","deploy","bundle","publish","provision"],"example":"bundle"},"detail":{"type":"string"}},"required":["code","message","phase"]},"CreateDeploymentResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"type":{"type":"string","enum":["web","server"],"example":"web"},"slug":{"type":"string","pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"target":{"type":["string","null"]},"label":{"type":["string","null"]},"origin":{"type":"string","enum":["cloud","self-hosted"],"example":"cloud"},"status":{"type":"string","enum":["idle","deploying","published","active","stopped","failed"],"example":"active"},"serving":{"$ref":"#/components/schemas/ServingStatus"},"currentVersionNumber":{"type":["integer","null"],"exclusiveMinimum":0},"url":{"type":["string","null"]},"flowId":{"type":["string","null"],"pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"flowName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usageSummary":{"type":"object","properties":{"eventsIn24h":{"type":"integer","minimum":0},"healthy":{"type":"boolean"}},"required":["eventsIn24h","healthy"]}},"required":["id","type","slug","target","label","origin","status","serving","currentVersionNumber","url","flowId","flowName","createdAt","updatedAt"]},"StartDeploymentResponse":{"anyOf":[{"type":"object","properties":{"deploymentId":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"slug":{"type":"string","pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"target":{"type":["string","null"]},"type":{"type":"string","enum":["web","server"],"example":"web"},"status":{"type":"string","enum":["deploying"]},"settingsId":{"type":"string"},"versionId":{"type":"string"},"versionNumber":{"type":"integer","exclusiveMinimum":0}},"required":["deploymentId","slug","target","type","status","versionId","versionNumber"]},{"type":"object","properties":{"deploymentId":{"type":"string"},"status":{"type":"string","enum":["already_created"]}},"required":["deploymentId","status"]}]},"DeploymentStreamStatusEvent":{"type":"object","properties":{"status":{"type":"string"},"substatus":{"type":["string","null"]},"type":{"type":"string","enum":["web","server"],"example":"web"},"target":{"type":["string","null"]},"containerUrl":{"type":["string","null"]},"errorCode":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["status","substatus","type","target","containerUrl","errorCode","errorMessage","createdAt","updatedAt"]},"ListDeploymentsResponse":{"type":"object","properties":{"deployments":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentSummary"}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","exclusiveMinimum":0},"offset":{"type":"integer","minimum":0},"nextCursor":{"type":["string","null"]}},"required":["deployments","total","limit","offset","nextCursor"]},"UpdateDeploymentResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"type":{"type":"string","enum":["web","server"],"example":"web"},"slug":{"type":"string","pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"target":{"type":["string","null"]},"label":{"type":["string","null"]},"origin":{"type":"string","enum":["cloud","self-hosted"],"example":"cloud"},"status":{"type":"string","enum":["idle","deploying","published","active","stopped","failed"],"example":"active"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","type","slug","target","label","origin","status","createdAt","updatedAt"]},"LatestDeploymentsByFlow":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":"string"},"flowId":{"type":"string"},"slug":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"target":{"type":["string","null"]},"containerUrl":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","flowId","slug","type","status","target","containerUrl","createdAt"]}},"ListDeploymentVersionsResponse":{"type":"object","properties":{"versions":{"type":"array","items":{"type":"object","properties":{"number":{"type":"integer","exclusiveMinimum":0},"status":{"type":"string"},"source":{"type":"object","properties":{"type":{"type":"string"},"flowId":{"type":"string"},"flowSettingsId":{"type":"string"},"configHash":{"type":"string"}},"required":["type"]},"errorMessage":{"type":["string","null"]},"errorCode":{"type":["string","null"]},"bundlePath":{"type":["string","null"]},"publishedAt":{"type":"string","format":"date-time"},"publishedBy":{"type":["string","null"]}},"required":["number","status","source","errorMessage","errorCode","bundlePath","publishedAt","publishedBy"]}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","exclusiveMinimum":0},"offset":{"type":"integer","minimum":0}},"required":["versions","total","limit","offset"]},"ListFlowReleasesResponse":{"type":"object","properties":{"releases":{"type":"array","items":{"$ref":"#/components/schemas/FlowRelease"}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","exclusiveMinimum":0},"offset":{"type":"integer","minimum":0}},"required":["releases","total","limit","offset"]},"FlowRelease":{"type":"object","properties":{"id":{"type":"string"},"deploymentId":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"deploymentSlug":{"type":["string","null"],"pattern":"^[a-z0-9]{12}$","example":"k7m2x9p4q1w8"},"deploymentType":{"type":["string","null"],"enum":["web","server",null],"example":"web"},"versionNumber":{"type":"integer","exclusiveMinimum":0},"flowVersionId":{"type":["string","null"],"pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"flowVersionNumber":{"type":["integer","null"],"exclusiveMinimum":0},"status":{"type":"string"},"source":{"type":"string"},"errorCode":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"createdBy":{"type":["string","null"]},"createdByLabel":{"type":["string","null"]},"rationale":{"anyOf":[{"$ref":"#/components/schemas/ReleaseRationaleSummary"},{"type":"null"}]}},"required":["id","deploymentId","deploymentSlug","deploymentType","versionNumber","flowVersionId","flowVersionNumber","status","source","errorCode","createdAt","createdBy","createdByLabel"]},"ReleaseRationaleSummary":{"type":"object","properties":{"hasHumanText":{"type":"boolean"},"hasGeneratedSummary":{"type":"boolean"},"firstLine":{"type":["string","null"]}},"required":["hasHumanText","hasGeneratedSummary","firstLine"]},"ReleaseContentResponse":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"versionNumber":{"type":"integer","exclusiveMinimum":0,"example":22},"content":{"$ref":"#/components/schemas/FlowConfig"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string","enum":["user","auto_save","restore","deploy","preview"]}},"required":["versionId","versionNumber","content","createdAt","createdBy"]},"ReleaseDiff":{"type":"object","properties":{"prevVersionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"prevVersionNumber":{"type":"integer","exclusiveMinimum":0},"text":{"type":"string"},"contentIdentical":{"type":"boolean"}},"required":["prevVersionId","prevVersionNumber","text","contentIdentical"]},"ReleaseDetailResponse":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"versionNumber":{"type":"integer","exclusiveMinimum":0},"contentHash":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string"},"rationale":{"anyOf":[{"$ref":"#/components/schemas/VersionAnnotation"},{"type":"null"}]},"diff":{"anyOf":[{"$ref":"#/components/schemas/ReleaseDiff"},{"type":"null"}]}},"required":["versionId","versionNumber","contentHash","createdAt","createdBy","rationale","diff"]},"VersionAnnotation":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"humanText":{"type":["string","null"]},"generatedSummary":{"type":["string","null"]},"author":{"type":"string","example":"user_a1b2c3d4"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["versionId","humanText","generatedSummary","author","createdAt","updatedAt"]},"ListVersionAnnotationsResponse":{"type":"object","properties":{"annotations":{"type":"array","items":{"$ref":"#/components/schemas/VersionAnnotation"}}},"required":["annotations"]},"UpsertVersionAnnotationResponse":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"humanText":{"type":["string","null"]},"generatedSummary":{"type":["string","null"]},"author":{"type":"string","example":"user_a1b2c3d4"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["versionId","humanText","generatedSummary","author","createdAt","updatedAt"]},"ListHubThreadsResponse":{"type":"object","properties":{"threads":{"type":"array","items":{"$ref":"#/components/schemas/HubThread"}},"hasMoreThreads":{"type":"boolean"}},"required":["threads","hasMoreThreads"]},"HubThread":{"type":"object","properties":{"id":{"type":"string","pattern":"^thr_[a-z0-9]+$","example":"thr_a1b2c3d4"},"anchorType":{"type":"string","enum":["step","entity_action","release","contract","tag"],"example":"release"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"status":{"type":"string","enum":["open","resolved"],"example":"open"},"resolvedByVersionId":{"type":["string","null"]},"resolvedByVersionNumber":{"type":["integer","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"},"resolvedBy":{"type":["string","null"]},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"messageCount":{"type":"integer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/HubMessage"}},"hasMoreMessages":{"type":"boolean"}},"required":["id","anchorType","anchorKey","anchorLabel","status","resolvedByVersionId","resolvedByVersionNumber","resolvedAt","resolvedBy","createdBy","createdAt","updatedAt","messageCount"]},"HubMessage":{"type":"object","properties":{"id":{"type":"string"},"author":{"type":"string","example":"user_a1b2c3d4"},"text":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","author","text","createdAt"]},"HubThreadResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^thr_[a-z0-9]+$","example":"thr_a1b2c3d4"},"anchorType":{"type":"string","enum":["step","entity_action","release","contract","tag"],"example":"release"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"status":{"type":"string","enum":["open","resolved"],"example":"open"},"resolvedByVersionId":{"type":["string","null"]},"resolvedByVersionNumber":{"type":["integer","null"]},"resolvedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"},"resolvedBy":{"type":["string","null"]},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"messageCount":{"type":"integer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/HubMessage"}},"hasMoreMessages":{"type":"boolean"}},"required":["id","anchorType","anchorKey","anchorLabel","status","resolvedByVersionId","resolvedByVersionNumber","resolvedAt","resolvedBy","createdBy","createdAt","updatedAt","messageCount"]},"ListKnowledgeResponse":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeEntry"}},"hasMoreEntries":{"type":"boolean"}},"required":["entries","hasMoreEntries"]},"KnowledgeEntry":{"oneOf":[{"$ref":"#/components/schemas/KnowledgeThread"},{"$ref":"#/components/schemas/KnowledgeDescription"}],"discriminator":{"propertyName":"kind","mapping":{"thread":"#/components/schemas/KnowledgeThread","description":"#/components/schemas/KnowledgeDescription"}}},"KnowledgeThread":{"type":"object","properties":{"id":{"type":"string"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"frameName":{"type":["string","null"]},"flowId":{"type":["string","null"]},"subjectKey":{"type":["string","null"]},"spatial":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeSpatial"},{"type":"null"}]},"validity":{"$ref":"#/components/schemas/KnowledgeValidity"},"freshness":{"type":"string","enum":["current","subject_changed","unknown"]},"author":{"$ref":"#/components/schemas/KnowledgeAuthor"},"source":{"type":"string","enum":["tag_mode","hub","mcp"]},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["thread"]},"anchorType":{"type":"string","enum":["step","entity_action","release","contract","tag","page"],"example":"tag"},"status":{"type":"string","enum":["open","resolved"],"example":"open"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"messageCount":{"type":"integer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeMessage"}},"hasMoreMessages":{"type":"boolean"}},"required":["id","anchorKey","anchorLabel","frameId","frameName","flowId","subjectKey","spatial","validity","freshness","author","source","updatedAt","kind","anchorType","status","createdAt","messageCount"]},"KnowledgeSpatial":{"type":"object","properties":{"at":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1}},"required":["x","y"]},"element":{"type":"object","additionalProperties":{}}},"required":["at"]},"KnowledgeValidity":{"oneOf":[{"type":"object","properties":{"tier":{"type":"string","enum":["release"]},"versionId":{"type":"string"},"versionNumber":{"type":"integer"},"promoted":{"type":"boolean"}},"required":["tier","versionId","versionNumber","promoted"]},{"type":"object","properties":{"tier":{"type":"string","enum":["draft"]},"versionId":{"type":"string"}},"required":["tier"]},{"type":"object","properties":{"tier":{"type":"string","enum":["none"]}},"required":["tier"]}]},"KnowledgeAuthor":{"type":"object","properties":{"kind":{"type":"string","enum":["user","preview","agent"]},"id":{"type":["string","null"]},"label":{"type":"string"}},"required":["kind","id","label"]},"KnowledgeMessage":{"type":"object","properties":{"id":{"type":"string"},"author":{"type":"string","example":"user_a1b2c3d4"},"authorLabel":{"type":"string","example":"ayla@elbwalker.com"},"text":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"clientMessageId":{"type":["string","null"]}},"required":["id","author","authorLabel","text","createdAt","clientMessageId"]},"KnowledgeDescription":{"type":"object","properties":{"id":{"type":"string"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"frameName":{"type":["string","null"]},"flowId":{"type":["string","null"]},"subjectKey":{"type":["string","null"]},"spatial":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeSpatial"},{"type":"null"}]},"validity":{"$ref":"#/components/schemas/KnowledgeValidity"},"freshness":{"type":"string","enum":["current","subject_changed","unknown"]},"author":{"$ref":"#/components/schemas/KnowledgeAuthor"},"source":{"type":"string","enum":["tag_mode","hub","mcp"]},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["description"]},"anchorType":{"type":"string","enum":["tag","page"],"example":"tag"},"body":{"type":"string"}},"required":["id","anchorKey","anchorLabel","frameId","frameName","flowId","subjectKey","spatial","validity","freshness","author","source","updatedAt","kind","anchorType","body"]},"KnowledgeThreadResponse":{"type":"object","properties":{"id":{"type":"string"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"frameName":{"type":["string","null"]},"flowId":{"type":["string","null"]},"subjectKey":{"type":["string","null"]},"spatial":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeSpatial"},{"type":"null"}]},"validity":{"$ref":"#/components/schemas/KnowledgeValidity"},"freshness":{"type":"string","enum":["current","subject_changed","unknown"]},"author":{"$ref":"#/components/schemas/KnowledgeAuthor"},"source":{"type":"string","enum":["tag_mode","hub","mcp"]},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["thread"]},"anchorType":{"type":"string","enum":["step","entity_action","release","contract","tag","page"],"example":"tag"},"status":{"type":"string","enum":["open","resolved"],"example":"open"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"messageCount":{"type":"integer"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeMessage"}},"hasMoreMessages":{"type":"boolean"}},"required":["id","anchorKey","anchorLabel","frameId","frameName","flowId","subjectKey","spatial","validity","freshness","author","source","updatedAt","kind","anchorType","status","createdAt","messageCount"]},"KnowledgeDescriptionResponse":{"type":"object","properties":{"id":{"type":"string"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"frameName":{"type":["string","null"]},"flowId":{"type":["string","null"]},"subjectKey":{"type":["string","null"]},"spatial":{"anyOf":[{"$ref":"#/components/schemas/KnowledgeSpatial"},{"type":"null"}]},"validity":{"$ref":"#/components/schemas/KnowledgeValidity"},"freshness":{"type":"string","enum":["current","subject_changed","unknown"]},"author":{"$ref":"#/components/schemas/KnowledgeAuthor"},"source":{"type":"string","enum":["tag_mode","hub","mcp"]},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["description"]},"anchorType":{"type":"string","enum":["tag","page"],"example":"tag"},"body":{"type":"string"}},"required":["id","anchorKey","anchorLabel","frameId","frameName","flowId","subjectKey","spatial","validity","freshness","author","source","updatedAt","kind","anchorType","body"]},"FrameLink":{"type":"object","properties":{"id":{"type":"string","pattern":"^lnk_[A-Za-z0-9_-]{21}$","example":"lnk_V1StGXR8Z5jdHi6BmyT7K"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number","exclusiveMinimum":0},"h":{"type":"number","exclusiveMinimum":0}},"required":["id","frameId","x","y","w","h"],"additionalProperties":false},"FrameInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}},"source":{"$ref":"#/components/schemas/FrameSource"},"origin":{"type":"string","enum":["drawn","imported","observed"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/FrameLink"},"maxItems":256},"variantSetId":{"type":["string","null"],"pattern":"^vst_[A-Za-z0-9_-]{21}$"},"labels":{"type":"array","items":{"type":"string","maxLength":128},"maxItems":32}},"required":["name","size","marks","source","origin","links","variantSetId","labels"],"additionalProperties":false},"PlanSize":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["width","height"]},"FrameSource":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["page"]},"key":{"type":"string","minLength":1,"maxLength":1024},"url":{"type":"string","minLength":1,"maxLength":2048}},"required":["kind","key","url"]},{"type":"object","properties":{"kind":{"type":"string","enum":["figma"]},"fileKey":{"type":"string","minLength":1,"maxLength":255},"nodeId":{"type":"string","minLength":1,"maxLength":255}},"required":["kind","fileKey","nodeId"]},{"type":"object","properties":{"kind":{"type":"string","enum":["image"]}},"required":["kind"]}]},"Frame":{"type":"object","properties":{"id":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"projectId":{"type":"string"},"name":{"type":"string"},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}},"source":{"$ref":"#/components/schemas/FrameSource"},"origin":{"type":"string","enum":["drawn","imported","observed"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/FrameLink"}},"variantSetId":{"type":["string","null"]},"labels":{"type":"array","items":{"type":"string"}},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/FrameScreenshot"},{"type":"null"}]},"markupAssetId":{"type":["string","null"],"pattern":"^fas_[A-Za-z0-9_-]{21}$","example":"fas_V1StGXR8Z5jdHi6BmyT7K"},"version":{"type":"integer"},"lastSavedVersion":{"type":["integer","null"]},"lastSavedNumber":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string"},"updatedBy":{"type":"string"},"deletedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","projectId","name","size","marks","source","origin","links","variantSetId","labels","flowId","screenshot","markupAssetId","version","lastSavedVersion","lastSavedNumber","createdAt","updatedAt","createdBy","updatedBy","deletedAt"]},"FrameScreenshot":{"type":"object","properties":{"assetId":{"type":"string"},"capturedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"size":{"$ref":"#/components/schemas/PlanSize"},"dpr":{"type":"number","exclusiveMinimum":0},"capturedRect":{"$ref":"#/components/schemas/PlanRect"}},"required":["assetId","capturedAt","size","dpr","capturedRect"]},"PlanRect":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number"},"h":{"type":"number"}},"required":["x","y","w","h"]},"FrameLean":{"type":"object","properties":{"id":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"projectId":{"type":"string"},"name":{"type":"string"},"size":{"$ref":"#/components/schemas/PlanSize"},"source":{"$ref":"#/components/schemas/FrameSource"},"origin":{"type":"string","enum":["drawn","imported","observed"]},"links":{"type":"array","items":{"$ref":"#/components/schemas/FrameLink"}},"variantSetId":{"type":["string","null"]},"labels":{"type":"array","items":{"type":"string"}},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/FrameScreenshot"},{"type":"null"}]},"markupAssetId":{"type":["string","null"],"pattern":"^fas_[A-Za-z0-9_-]{21}$","example":"fas_V1StGXR8Z5jdHi6BmyT7K"},"version":{"type":"integer"},"lastSavedVersion":{"type":["integer","null"]},"lastSavedNumber":{"type":["integer","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string"},"updatedBy":{"type":"string"},"deletedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","projectId","name","size","source","origin","links","variantSetId","labels","flowId","screenshot","markupAssetId","version","lastSavedVersion","lastSavedNumber","createdAt","updatedAt","createdBy","updatedBy","deletedAt"]},"FrameListResponse":{"type":"object","properties":{"frames":{"type":"array","items":{"$ref":"#/components/schemas/Frame"}}},"required":["frames"]},"FrameLeanListResponse":{"type":"object","properties":{"frames":{"type":"array","items":{"$ref":"#/components/schemas/FrameLean"}}},"required":["frames"]},"PutFrameResponse":{"type":"object","properties":{"version":{"type":"integer"}},"required":["version"]},"FrameConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["FRAME_VERSION_CONFLICT"]},"message":{"type":"string"}},"required":["code","message"]},"head":{"$ref":"#/components/schemas/Frame"}},"required":["error","head"]},"DeleteFrameResponse":{"type":"object","properties":{},"additionalProperties":false},"FrameDeleteConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["FRAME_VERSION_CONFLICT"]},"message":{"type":"string"}},"required":["code","message"]},"version":{"type":"integer"}},"required":["error","version"]},"FrameLinkRefusalResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["SHOWN_FRAME_NOT_FOUND","LINK_CLOSES_LOOP"]},"message":{"type":"string"}},"required":["code","message"]},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^lnk_[A-Za-z0-9_-]{21}$","example":"lnk_V1StGXR8Z5jdHi6BmyT7K"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"}},"required":["id","frameId"],"additionalProperties":false}}},"required":["error","links"]},"VersionFrame":{"type":"object","properties":{"id":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$"},"name":{"type":"string","minLength":1,"maxLength":255},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}},"links":{"type":"array","items":{"$ref":"#/components/schemas/VersionLink"}},"parentId":{"type":["string","null"],"pattern":"^frm_[A-Za-z0-9_-]{21}$"},"placements":{"type":"array","items":{"$ref":"#/components/schemas/FramePlacement"}}},"required":["id","name","size","marks"]},"VersionLink":{"type":"object","properties":{"id":{"type":"string","pattern":"^lnk_[A-Za-z0-9_-]{21}$","example":"lnk_V1StGXR8Z5jdHi6BmyT7K"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"x":{"type":"number"},"y":{"type":"number"},"w":{"type":"number","exclusiveMinimum":0},"h":{"type":"number","exclusiveMinimum":0},"name":{"type":"string"},"size":{"$ref":"#/components/schemas/PlanSize"}},"required":["id","frameId","x","y","w","h","name","size"],"additionalProperties":false},"FramePlacement":{"type":"object","properties":{"id":{"type":"string","pattern":"^pl_[A-Za-z0-9_-]{21}$"},"rect":{"$ref":"#/components/schemas/PlanRect"},"selector":{"type":"string","maxLength":2048},"anchor":{"type":"object","additionalProperties":{}}},"required":["id","rect"]},"MarkupSnapshot":{"type":"object","properties":{"prefix":{"type":"string","minLength":1,"maxLength":64},"breadcrumb":{"type":"array","items":{"type":"string","maxLength":2048}},"root":{"type":"object","properties":{"kind":{"type":"string","enum":["element"]}},"required":["kind"],"additionalProperties":{}},"linked":{"type":"object","additionalProperties":{"type":"object","properties":{"index":{"type":"integer","minimum":0},"css":{"type":"string","maxLength":2048}},"required":["index","css"]}},"shortened":{"type":"boolean"}},"required":["prefix","breadcrumb","root","linked","shortened"]},"SaveFrameVersionResponse":{"type":"object","properties":{"number":{"type":"integer","minimum":1},"version":{"type":"integer"},"picture":{"anyOf":[{"$ref":"#/components/schemas/FrameScreenshot"},{"type":"null"}]},"markupAssetId":{"type":["string","null"],"pattern":"^fas_[A-Za-z0-9_-]{21}$"}},"required":["number","version","picture","markupAssetId"]},"FrameVersionSummary":{"type":"object","properties":{"number":{"type":"integer","minimum":1},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"author":{"type":"string"}},"required":["number","createdAt","author"]},"FrameVersionListResponse":{"type":"object","properties":{"versions":{"type":"array","items":{"$ref":"#/components/schemas/FrameVersionSummary"}}},"required":["versions"]},"FrameVersion":{"type":"object","properties":{"number":{"type":"integer","minimum":1},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"author":{"type":"string"},"atVersion":{"type":"integer"},"composed":{"type":"array","items":{"$ref":"#/components/schemas/VersionFrame"}},"picture":{"anyOf":[{"$ref":"#/components/schemas/FrameScreenshot"},{"type":"null"}]},"markupAssetId":{"type":["string","null"],"pattern":"^fas_[A-Za-z0-9_-]{21}$"}},"required":["number","createdAt","author","atVersion","composed","picture","markupAssetId"]},"CanvasDocument":{"type":"object","properties":{"v":{"type":"number","enum":[1]},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/CanvasNodeEntry"},"maxItems":2000},"edges":{"type":"array","items":{"$ref":"#/components/schemas/CanvasEdgeEntry"},"maxItems":4000},"hidden":{"type":"array","items":{"type":"string","maxLength":200},"maxItems":4000}},"required":["v","nodes","edges","hidden"]},"CanvasNodeEntry":{"type":"object","properties":{"kind":{"type":"string","pattern":"^[a-z][a-z0-9-]{0,31}$"},"ref":{"type":"string","minLength":1,"maxLength":128},"position":{"$ref":"#/components/schemas/CanvasPoint"},"parent":{"type":"string","maxLength":200},"size":{"type":"object","properties":{"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0}},"required":["width","height"]},"label":{"type":"string","maxLength":255}},"required":["kind","ref","position"]},"CanvasPoint":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]},"CanvasEdgeEntry":{"type":"object","properties":{"id":{"type":"string","pattern":"^edg_[A-Za-z0-9_-]{21}$"},"kind":{"type":"string","enum":["navigation"]},"from":{"type":"string","maxLength":200},"to":{"type":"string","maxLength":200},"label":{"type":"string","maxLength":255}},"required":["id","kind","from","to"]},"Canvas":{"type":"object","properties":{"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"projectId":{"type":"string"},"document":{"$ref":"#/components/schemas/CanvasDocument"},"version":{"type":"integer"}},"required":["flowId","projectId","document","version"]},"PutCanvasResponse":{"type":"object","properties":{"version":{"type":"integer"}},"required":["version"]},"CanvasConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["CANVAS_VERSION_CONFLICT"]},"message":{"type":"string"}},"required":["code","message"]},"head":{"$ref":"#/components/schemas/Canvas"}},"required":["error","head"]},"FrameShare":{"type":"object","properties":{"id":{"type":"string","pattern":"^shr_[a-z0-9]{21}$","example":"shr_v1stgxr8z5jdhi6bmyt7k"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"frameName":{"type":"string"},"url":{"type":"string","example":"https://app.walkeros.io/s/shr_v1stgxr8z5jdhi6bmyt7k"},"linkAccess":{"type":"string","enum":["restricted","anyone"],"example":"restricted"},"linkRole":{"type":"string","enum":["viewer","commenter"],"example":"viewer"},"linkUrl":{"type":["string","null"]},"version":{"type":"integer"},"grants":{"type":"array","items":{"$ref":"#/components/schemas/FrameShareGrant"}},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","frameId","frameName","url","linkAccess","linkRole","linkUrl","version","grants","createdAt","updatedAt"]},"FrameShareGrant":{"type":"object","properties":{"id":{"type":"string","pattern":"^shg_[a-z0-9]{21}$"},"email":{"type":"string"},"role":{"type":"string","enum":["viewer","commenter","editor"],"example":"commenter"},"invitedBy":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","email","role","invitedBy","createdAt","updatedAt"]},"FrameShareResponse":{"type":"object","properties":{"share":{"anyOf":[{"$ref":"#/components/schemas/FrameShare"},{"type":"null"}]},"coveredBy":{"type":"array","items":{"$ref":"#/components/schemas/CoveringShare"}}},"required":["share","coveredBy"]},"CoveringShare":{"type":"object","properties":{"shareId":{"type":"string","pattern":"^shr_[a-z0-9]{21}$","example":"shr_v1stgxr8z5jdhi6bmyt7k"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"frameName":{"type":"string"}},"required":["shareId","frameId","frameName"]},"FrameShareWriteResponse":{"type":"object","properties":{"share":{"$ref":"#/components/schemas/FrameShare"}},"required":["share"]},"FrameShareConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["SHARE_VERSION_CONFLICT"]},"message":{"type":"string"}},"required":["code","message"]},"share":{"anyOf":[{"$ref":"#/components/schemas/FrameShare"},{"type":"null"}]}},"required":["error","share"]},"AddShareGrantsResponse":{"type":"object","properties":{"share":{"anyOf":[{"$ref":"#/components/schemas/FrameShare"},{"type":"null"}]},"results":{"type":"array","items":{"$ref":"#/components/schemas/ShareGrantResult"}}},"required":["share","results"]},"ShareGrantResult":{"type":"object","properties":{"email":{"type":"string"},"outcome":{"type":"string","enum":["added","GRANT_EXISTS","ALREADY_MEMBER","GRANT_LIMIT","INVALID_EMAIL"]},"emailFailed":{"type":"boolean"}},"required":["email","outcome"]},"ListProjectSharesResponse":{"type":"object","properties":{"shares":{"type":"array","items":{"$ref":"#/components/schemas/ShareSummary"}}},"required":["shares"]},"ShareSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^shr_[a-z0-9]{21}$","example":"shr_v1stgxr8z5jdhi6bmyt7k"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"url":{"type":"string"},"linkAccess":{"type":"string","enum":["restricted","anyone"],"example":"restricted"},"linkRole":{"type":"string","enum":["viewer","commenter"],"example":"viewer"},"grantCount":{"type":"integer"},"openThreadCount":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","frameId","url","linkAccess","linkRole","grantCount","openThreadCount","updatedAt"]},"UpdateAccountResponse":{"type":"object","properties":{"displayName":{"type":["string","null"]}},"required":["displayName"]},"ShareArtifact":{"type":"object","properties":{"share":{"$ref":"#/components/schemas/ShareInfo"},"frames":{"type":"array","items":{"$ref":"#/components/schemas/ShareFrame"}}},"required":["share","frames"]},"ShareInfo":{"type":"object","properties":{"id":{"type":"string","pattern":"^shr_[a-z0-9]{21}$","example":"shr_v1stgxr8z5jdhi6bmyt7k"},"rootFrameId":{"type":"string"},"role":{"type":"string","enum":["viewer","commenter","editor"],"example":"commenter"},"signedIn":{"type":"boolean"},"viewerLabel":{"type":["string","null"]},"sharedBy":{"type":["string","null"]},"project":{"type":["object","null"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"}},"required":["id","name","flowId"]},"linkRole":{"type":["string","null"],"enum":["viewer","commenter",null],"example":"viewer"},"canManage":{"type":"boolean"},"viewerNamed":{"type":"boolean"},"keyAccepted":{"type":["boolean","null"],"default":true}},"required":["id","rootFrameId","role","signedIn","viewerLabel","sharedBy","project","linkRole","canManage","viewerNamed"]},"ShareFrame":{"type":"object","properties":{"id":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"name":{"type":"string"},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}},"links":{"type":"array","items":{"$ref":"#/components/schemas/FrameLink"}},"variantSetId":{"type":["string","null"]},"source":{"$ref":"#/components/schemas/FrameSource"},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/FrameScreenshot"},{"type":"null"}]},"markupAssetId":{"type":["string","null"],"pattern":"^fas_[A-Za-z0-9_-]{21}$","example":"fas_V1StGXR8Z5jdHi6BmyT7K"},"version":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","size","marks","links","variantSetId","source","screenshot","markupAssetId","version","updatedAt"]},"ListShareKnowledgeResponse":{"type":"object","properties":{"entries":{"type":"array","items":{"$ref":"#/components/schemas/ShareKnowledgeEntry"}},"hasMoreEntries":{"type":"boolean"}},"required":["entries","hasMoreEntries"]},"ShareKnowledgeEntry":{"oneOf":[{"$ref":"#/components/schemas/ShareThread"},{"$ref":"#/components/schemas/ShareDescription"}],"discriminator":{"propertyName":"kind","mapping":{"thread":"#/components/schemas/ShareThread","description":"#/components/schemas/ShareDescription"}}},"ShareThread":{"type":"object","properties":{"id":{"type":"string"},"anchorType":{"type":"string","enum":["tag","page"],"example":"tag"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"markId":{"type":["string","null"]},"spatial":{"type":["object","null"],"properties":{"at":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]}},"required":["at"]},"author":{"$ref":"#/components/schemas/ShareAuthor"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["thread"]},"status":{"type":"string","enum":["open","resolved"],"example":"open"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"messageCount":{"type":"integer"},"removable":{"type":"boolean"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ShareMessage"}},"hasMoreMessages":{"type":"boolean"}},"required":["id","anchorType","anchorKey","anchorLabel","frameId","markId","spatial","author","updatedAt","kind","status","createdAt","messageCount","removable"]},"ShareAuthor":{"type":"object","properties":{"label":{"type":"string"},"badge":{"type":"string","enum":["member","guest"]},"isYou":{"type":"boolean"}},"required":["label","badge","isYou"]},"ShareMessage":{"type":"object","properties":{"id":{"type":"string"},"text":{"type":"string"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"author":{"$ref":"#/components/schemas/ShareAuthor"},"clientMessageId":{"type":["string","null"]}},"required":["id","text","createdAt","author","clientMessageId"]},"ShareDescription":{"type":"object","properties":{"id":{"type":"string"},"anchorType":{"type":"string","enum":["tag","page"],"example":"tag"},"anchorKey":{"type":"string"},"anchorLabel":{"type":"string"},"frameId":{"type":["string","null"]},"markId":{"type":["string","null"]},"spatial":{"type":["object","null"],"properties":{"at":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"}},"required":["x","y"]}},"required":["at"]},"author":{"$ref":"#/components/schemas/ShareAuthor"},"updatedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"kind":{"type":"string","enum":["description"]},"body":{"type":"string"}},"required":["id","anchorType","anchorKey","anchorLabel","frameId","markId","spatial","author","updatedAt","kind","body"]},"PutSharedFrameResponse":{"type":"object","properties":{"version":{"type":"integer"}},"required":["version"]},"SharedFrameConflictResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["FRAME_VERSION_CONFLICT"]},"message":{"type":"string"}},"required":["code","message"]},"version":{"type":"integer"}},"required":["error","version"]},"SharedFrameLinkRefusalResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["SHOWN_FRAME_NOT_FOUND","LINK_CLOSES_LOOP","LINK_OUTSIDE_SHARE"]},"message":{"type":"string"}},"required":["code","message"]},"links":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^lnk_[A-Za-z0-9_-]{21}$","example":"lnk_V1StGXR8Z5jdHi6BmyT7K"},"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"}},"required":["id","frameId"],"additionalProperties":false}}},"required":["error","links"]},"DeleteSharedFrameResponse":{"type":"object","properties":{},"additionalProperties":false},"SharedWithMeResponse":{"type":"object","properties":{"shares":{"type":"array","items":{"$ref":"#/components/schemas/SharedWithMeEntry"}}},"required":["shares"]},"SharedWithMeEntry":{"type":"object","properties":{"shareId":{"type":"string","pattern":"^shr_[a-z0-9]{21}$","example":"shr_v1stgxr8z5jdhi6bmyt7k"},"frameName":{"type":"string"},"role":{"type":"string","enum":["viewer","commenter","editor"],"example":"commenter"},"sharedBy":{"type":"string"},"sharedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["shareId","frameName","role","sharedBy","sharedAt"]},"SummarizeReleaseResponse":{"type":"object","properties":{"mode":{"type":"string","enum":["draft","check"]},"text":{"type":"string"},"cached":{"type":"boolean"},"modelId":{"type":"string","example":"mistral/platform/mistral-large-2512"},"versionNumber":{"type":"integer"},"prevVersionNumber":{"type":"integer"}},"required":["mode","text","cached","modelId","versionNumber","prevVersionNumber"]},"StepHistoryResponse":{"type":"object","properties":{"step":{"type":"string"},"flow":{"type":["string","null"]},"entries":{"type":"array","items":{"$ref":"#/components/schemas/StepHistoryEntry"}},"scanned":{"type":"integer"},"truncated":{"type":"boolean"},"entriesTruncated":{"type":"boolean"},"knownSteps":{"type":"array","items":{"type":"string"}}},"required":["step","flow","entries","scanned","truncated","entriesTruncated"]},"StepHistoryEntry":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"versionNumber":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"flow":{"type":["string","null"]},"change":{"type":"string","enum":["added","removed","changed"],"example":"changed"},"humanText":{"type":["string","null"]},"generatedSummary":{"type":["string","null"]}},"required":["versionId","versionNumber","createdAt","flow","change","humanText","generatedSummary"]},"HeartbeatResponse":{"type":"object","properties":{"ack":{"type":"boolean","enum":[true]},"deploymentId":{"type":"string","pattern":"^dep_[a-zA-Z0-9_-]+$","example":"dep_a1b2c3d4"},"action":{"type":"string","enum":["none","stop","update"]},"versionNumber":{"type":"integer","exclusiveMinimum":0},"bundleUrl":{"type":"string"}},"required":["ack","deploymentId","action"]},"ObserveTicketRequest":{"type":"object","properties":{"scope":{"type":"object","properties":{"kind":{"type":"string","enum":["session"]},"sessionId":{"type":"string","minLength":1}},"required":["kind","sessionId"]}}},"ObserveTicketResponse":{"type":"object","properties":{"ticket":{"type":"string","minLength":1},"observerUrl":{"type":"string","format":"uri"}},"required":["ticket","observerUrl"]},"PreviewResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^prv_[a-z0-9]+$","example":"prv_abc123xyz456"},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"flowSettingsId":{"type":"string"},"projectId":{"type":"string"},"bundleUrl":{"type":"string","format":"uri"},"activationUrl":{"type":["string","null"]},"tagMode":{"type":"boolean"},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","flowId","flowSettingsId","projectId","bundleUrl","activationUrl","tagMode","createdBy","createdAt"]},"CreatePreviewResponse":{"allOf":[{"$ref":"#/components/schemas/PreviewResponse"},{"type":"object","properties":{"grant":{"type":["string","null"]}},"required":["grant"]}]},"ListPreviewsResponse":{"type":"object","properties":{"previews":{"type":"array","items":{"$ref":"#/components/schemas/PreviewResponse"}},"total":{"type":"integer","minimum":0}},"required":["previews","total"]},"CreatePreviewRequest":{"type":"object","properties":{"flowSettingsId":{"type":"string"},"source":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["draft"]}},"required":["kind"]},{"type":"object","properties":{"kind":{"type":"string","enum":["deployment-version"]},"deploymentVersionId":{"type":"string"}},"required":["kind","deploymentVersionId"]}]},"tagMode":{"type":"boolean","default":true}},"required":["flowSettingsId"]},"MintGrantRequest":{"type":"object","properties":{"origins":{"type":"array","items":{"type":"string","maxLength":253,"example":"https://shop.example.com"},"minItems":1,"maxItems":5},"sessionId":{"type":"string"}},"required":["origins"]},"MintGrantResponse":{"type":"object","properties":{"grant":{"type":"string"},"activationUrl":{"type":"string","format":"uri"},"sessionExpiresAt":{"type":"string","format":"date-time"},"sessionGrant":{"type":"string"},"sessionId":{"type":"string"}},"required":["grant","activationUrl","sessionExpiresAt"]},"ObserveSessionResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"projectId":{"type":"string"},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"status":{"type":"string"},"errorMessage":{"type":["string","null"]},"configSnapshot":{"type":"object","additionalProperties":{}},"observedFlowName":{"type":["string","null"]},"serverFlowName":{"type":["string","null"]},"serverEndpoint":{"type":["string","null"]},"web":{"anyOf":[{"$ref":"#/components/schemas/ObserveSessionWeb"},{"type":"null"}]},"server":{"anyOf":[{"$ref":"#/components/schemas/ObserveSessionServer"},{"type":"null"}]},"expiresAt":{"type":"string","format":"date-time"},"recordsReceived":{"type":"integer","minimum":0},"createdBy":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","flowId","status","errorMessage","configSnapshot","observedFlowName","serverFlowName","serverEndpoint","web","server","expiresAt","recordsReceived","createdBy","createdAt"]},"ObserveSessionWeb":{"type":"object","properties":{"activationUrl":{"type":["string","null"],"format":"uri"},"credential":{"type":"string"},"previewEnabled":{"type":"boolean"},"bundleUrl":{"type":"string","format":"uri"},"url":{"type":"string","format":"uri"},"binding":{"type":"string"}},"required":["activationUrl","credential","previewEnabled","bundleUrl"]},"ObserveSessionServer":{"type":"object","properties":{"endpoint":{"type":["string","null"],"format":"uri"},"env":{"$ref":"#/components/schemas/ObserveSessionServerEnv"}},"required":["endpoint","env"]},"ObserveSessionServerEnv":{"type":"object","properties":{"WALKEROS_OBSERVER_URL":{"type":"string","format":"uri"},"WALKEROS_DEPLOYMENT_ID":{"type":"string"},"WALKEROS_INGEST_TOKEN":{"type":"string"}},"required":["WALKEROS_OBSERVER_URL","WALKEROS_DEPLOYMENT_ID","WALKEROS_INGEST_TOKEN"]},"ObserveSessionJourneysResponse":{"type":"object","properties":{"sessionId":{"type":"string","pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"assembledAt":{"type":"string","format":"date-time"},"journeys":{"type":"array","items":{"type":"object","additionalProperties":{}}},"gaps":{"type":"array","items":{"type":"object","additionalProperties":{}}},"unattributed":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["sessionId","flowId","assembledAt","journeys","gaps"]},"CreateObserveSessionRequest":{"type":"object","properties":{"settingsName":{"type":"string","minLength":1},"force":{"type":"boolean"},"replace":{"type":"boolean"},"level":{"$ref":"#/components/schemas/ObserveLevel"},"origins":{"type":"array","items":{"type":"string","maxLength":253,"example":"https://shop.example.com"},"maxItems":20},"tagMode":{"type":"boolean"}},"required":["settingsName"]},"ObserveLevel":{"type":"string","enum":["off","standard","trace"]},"ObserveSessionHeartbeatResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]},"SecretName":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Z_][A-Z0-9_]*$"},"CreateSecretRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Z_][A-Z0-9_]*$"},"value":{"type":"string","minLength":1,"maxLength":65536}},"required":["name","value"]},"UpdateSecretRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":65536}},"required":["value"]},"SecretSummary":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","flowId","createdAt","updatedAt"]},"SecretListResponse":{"type":"object","properties":{"secrets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","flowId","createdAt","updatedAt"]}}},"required":["secrets"]},"FeedbackRequest":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":5000,"example":"The MCP flow_bundle tool is great but slow on large configs."},"userId":{"type":"string","format":"email","example":"alex@example.com"},"projectId":{"type":"string","maxLength":255,"example":"proj_abc123"},"version":{"type":"string","maxLength":100,"example":"0.4.2"}},"required":["text"]},"FeedbackResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"id":{"type":"string","example":"fb_abcdef1234567890"}},"required":["ok","id"]},"StepExample":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"public":{"type":"boolean"},"trigger":{"type":"object","properties":{"type":{"type":"string"},"options":{}}},"mapping":{},"command":{"type":"string"},"in":{"$ref":"#/components/schemas/StepExampleEvent"},"out":{"type":"array","items":{"type":"array","items":{}}}},"required":["in"]},"StepExampleEvent":{"type":"object","properties":{"entity":{"type":"string"},"action":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"context":{"type":"object","additionalProperties":{}},"globals":{"type":"object","additionalProperties":{}},"custom":{"type":"object","additionalProperties":{}},"id":{"type":"string"},"timestamp":{"type":"string"},"timing":{"type":"object","additionalProperties":{}},"user":{"type":"object","additionalProperties":{}},"version":{"type":"string"},"source":{"type":"string"},"trigger":{"type":"string"}}},"CreateStepExampleRequest":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"public":{"type":"boolean"},"trigger":{"type":"object","properties":{"type":{"type":"string"},"options":{}}},"mapping":{},"command":{"type":"string"},"name":{"type":"string","minLength":1},"event":{"$ref":"#/components/schemas/StepExampleEvent"},"out":{"type":"array","items":{"type":"array","items":{}}}},"required":["name","event"]},"EditStepExampleRequest":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"public":{"type":"boolean"},"trigger":{"type":"object","properties":{"type":{"type":"string"},"options":{}}},"mapping":{},"command":{"type":"string"},"name":{"type":"string","minLength":1},"event":{"$ref":"#/components/schemas/StepExampleEvent"},"out":{"type":"array","items":{"type":"array","items":{}}}},"required":["name"]},"StepExamplesResponse":{"type":"object","properties":{"examples":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/StepExample"}}},"required":["examples"]},"ObserveStepExample":{"type":"object","properties":{"in":{},"out":{},"mapping":{},"title":{"type":"string"},"description":{"type":"string"}}},"ObserveSaveExampleRequest":{"type":"object","properties":{"stepPath":{"type":"string","minLength":1},"scenario":{"type":"string","minLength":1},"example":{"$ref":"#/components/schemas/ObserveStepExample"}},"required":["stepPath","scenario","example"]},"SecretValuesResponse":{"type":"object","properties":{"values":{"type":"object","additionalProperties":{"type":"string"}}},"required":["values"]},"Invitation":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"member","example":"member"},"status":{"type":"string","enum":["pending","accepted","declined","expired","cancelled"]},"invitedBy":{"type":["string","null"]},"expiresAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","email","status","invitedBy","expiresAt","createdAt"]},"CreateInvitationRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"member","example":"member"}},"required":["email"]},"CreateInvitationResponse":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"member","example":"member"},"status":{"type":"string","enum":["pending"]},"expiresAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","email","status","expiresAt","createdAt"]},"ListInvitationsResponse":{"type":"object","properties":{"invitations":{"type":"array","items":{"$ref":"#/components/schemas/Invitation"}},"total":{"type":"number"}},"required":["invitations","total"]},"InvitationPreview":{"type":"object","properties":{"projectName":{"type":"string"},"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"member","example":"member"},"status":{"type":"string","enum":["pending","accepted","declined","expired","cancelled"]},"expiresAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"invitedByEmail":{"type":"string","format":"email","example":"user@example.com"}},"required":["projectName","email","status","expiresAt","invitedByEmail"]},"AcceptInvitationResponse":{"type":"object","properties":{"projectId":{"type":"string"},"projectName":{"type":"string"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"member","example":"member"},"alreadyMember":{"type":"boolean"}},"required":["projectId","projectName","alreadyMember"]},"TelemetryEvent":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"entity":{"type":"string"},"action":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"context":{"type":"object","additionalProperties":{}},"globals":{"type":"object","additionalProperties":{}},"custom":{"type":"object","additionalProperties":{}},"user":{"type":"object","properties":{"device":{"type":"string"},"session":{"type":"string"},"os":{"type":"string"},"osVersion":{"type":"string"},"node":{"type":"string"},"language":{"type":"string"},"timezone":{"type":"string"}},"required":["device","os","osVersion","node","language","timezone"],"additionalProperties":{}},"nested":{"type":"array","items":{}},"consent":{"type":"object","additionalProperties":{"type":"boolean"}},"trigger":{"type":"string"},"timestamp":{"type":"number"},"timing":{"type":"number"},"source":{"type":"object","properties":{"type":{"type":"string","enum":["cli","mcp"]},"platform":{"type":"string"},"release":{"type":"object","additionalProperties":{"type":"string"}},"version":{"type":"string"},"schema":{"type":"string"},"tool":{"type":"string"},"command":{"type":"string"}},"required":["type"],"additionalProperties":{}}},"required":["id","name","entity","action","data","context","globals","custom","user","nested","consent","trigger","timestamp","timing","source"]},"UpsertBillingDetailsRequest":{"type":"object","properties":{"companyName":{"type":"string","minLength":1,"maxLength":255},"address":{"type":"string","minLength":1,"maxLength":255},"address2":{"type":"string","maxLength":255},"postalCode":{"type":"string","minLength":1,"maxLength":20},"city":{"type":"string","minLength":1,"maxLength":255},"country":{"type":"string","minLength":2,"maxLength":2},"vatId":{"type":"string","maxLength":50},"invoiceEmail":{"type":"string","format":"email"},"contactName":{"type":"string","maxLength":255}},"required":["companyName","address","postalCode","city","country","invoiceEmail"]},"BillingDetailsResponse":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"companyName":{"type":"string"},"address":{"type":"string"},"address2":{"type":["string","null"]},"postalCode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"vatId":{"type":["string","null"]},"invoiceEmail":{"type":"string"},"contactName":{"type":["string","null"]},"taxTreatment":{"type":"string","enum":["reverse_charge","domestic","export","eu_standard"]},"viesStatus":{"type":"string","enum":["verified","invalid","unavailable","not_checked"]},"viesCompanyName":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","projectId","companyName","address","address2","postalCode","city","country","vatId","invoiceEmail","contactName","taxTreatment","viesStatus","viesCompanyName","createdAt","updatedAt"]},"DeployedContentResponse":{"type":"object","properties":{"deploymentId":{"type":["string","null"]},"versionNumber":{"type":["integer","null"],"exclusiveMinimum":0},"status":{"type":["string","null"]},"flowSettingsName":{"type":["string","null"]},"publishedAt":{"type":["string","null"],"format":"date-time"},"content":{}},"required":["deploymentId","versionNumber","status","flowSettingsName","publishedAt"]},"ListHeartbeatsResponse":{"type":"object","properties":{"records":{"type":"array","items":{"$ref":"#/components/schemas/HeartbeatRecord"}},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","exclusiveMinimum":0},"offset":{"type":"integer","minimum":0}},"required":["records","total","limit","offset"]},"HeartbeatRecord":{"type":"object","properties":{"id":{"type":"string"},"instanceId":{"type":["string","null"]},"cliVersion":{"type":["string","null"]},"configVersion":{"type":["integer","null"]},"mode":{"type":["string","null"]},"uptime":{"type":["integer","null"]},"eventsIn":{"type":["integer","null"],"minimum":0},"eventsOut":{"type":["integer","null"],"minimum":0},"eventsFailed":{"type":["integer","null"],"minimum":0},"perDestinationBreakdown":{},"receivedAt":{"type":"string","format":"date-time"}},"required":["id","instanceId","cliVersion","configVersion","mode","uptime","eventsIn","eventsOut","eventsFailed","receivedAt"]},"RotateIngestTokenResponse":{"type":"object","properties":{"ingestToken":{"type":"string"}},"required":["ingestToken"]},"DeploymentUsageResponse":{"type":"object","properties":{"totalEventsIn":{"type":"integer","minimum":0},"totalEventsOut":{"type":"integer","minimum":0},"totalEventsFailed":{"type":"integer","minimum":0},"totalInstances":{"type":"integer","minimum":0},"heartbeatCount":{"type":"integer","minimum":0},"from":{"type":"string","format":"date-time"},"to":{"type":"string","format":"date-time"},"averageThroughputPerHour":{"type":"integer","minimum":0},"period":{"type":"string"},"buckets":{"type":"array","items":{"$ref":"#/components/schemas/UsageBucket"}},"destinations":{"type":"array","items":{"$ref":"#/components/schemas/UsageDestination"}}},"required":["totalEventsIn","totalEventsOut","totalEventsFailed","totalInstances","heartbeatCount","from","to","averageThroughputPerHour","period","buckets"]},"UsageBucket":{"type":"object","properties":{"bucket":{"type":"string","format":"date-time"},"eventsIn":{"type":"integer","minimum":0},"eventsOut":{"type":"integer","minimum":0},"eventsFailed":{"type":"integer","minimum":0},"instances":{"type":"integer","minimum":0}},"required":["bucket","eventsIn","eventsOut","eventsFailed","instances"]},"UsageDestination":{"type":"object","properties":{"name":{"type":"string"},"count":{"type":"integer","minimum":0},"failed":{"type":"integer","minimum":0},"duration":{"type":"number","minimum":0},"dlqSize":{"type":"integer","minimum":0},"dropped":{"type":"integer","minimum":0}},"required":["name","count","failed","duration","dlqSize","dropped"]},"CreateCustomDomainRequest":{"type":"object","properties":{"hostname":{"type":"string","minLength":1,"maxLength":253},"deploymentId":{"type":"string","minLength":1}},"required":["hostname"]},"CustomDomain":{"type":"object","properties":{"id":{"type":"string"},"deploymentId":{"type":"string"},"hostname":{"type":"string"},"kind":{"type":"string"},"status":{"type":"string"},"scwResourceId":{"type":["string","null"]},"certStatus":{"type":"string"},"verifiedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","deploymentId","hostname","kind","status","scwResourceId","certStatus","verifiedAt","createdAt","updatedAt"]},"ListCustomDomainsResponse":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/CustomDomain"}}},"required":["domains"]},"DeployTokenStatusResponse":{"anyOf":[{"type":"object","properties":{"hasToken":{"type":"boolean","enum":[false]}},"required":["hasToken"]},{"type":"object","properties":{"hasToken":{"type":"boolean","enum":[true]},"deploymentId":{"type":"string"},"status":{"type":"string"},"healthy":{"type":"boolean"},"lastHeartbeatAt":{"type":["string","null"],"format":"date-time"},"instanceId":{"type":["string","null"]},"cliVersion":{"type":["string","null"]}},"required":["hasToken","deploymentId","status","healthy","lastHeartbeatAt","instanceId","cliVersion"]}]},"CreateDeployTokenResponse":{"type":"object","properties":{"token":{"type":"string"},"deploymentId":{"type":"string"},"projectId":{"type":"string"},"flowId":{"type":"string"},"configName":{"type":"string"}},"required":["token","deploymentId","projectId","flowId","configName"]},"EntitlementsResponse":{"type":"object","properties":{"planId":{"type":"string"},"role":{"type":"string"},"entitlements":{"type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"}]}}},"required":["planId","role","entitlements"]},"SetLlmConfigRequest":{"oneOf":[{"type":"object","properties":{"action":{"type":"string","enum":["clear"]}},"required":["action"]},{"type":"object","properties":{"action":{"type":"string","enum":["set"]},"config":{"oneOf":[{"type":"object","properties":{"provider":{"type":"string","enum":["mistral"]},"modelId":{"type":"string","minLength":1},"apiKey":{"type":"string","minLength":1}},"required":["provider","modelId","apiKey"]},{"type":"object","properties":{"provider":{"type":"string","enum":["anthropic"]},"modelId":{"type":"string","minLength":1},"apiKey":{"type":"string","minLength":1}},"required":["provider","modelId","apiKey"]},{"type":"object","properties":{"provider":{"type":"string","enum":["openai"]},"modelId":{"type":"string","minLength":1},"apiKey":{"type":"string","minLength":1}},"required":["provider","modelId","apiKey"]},{"type":"object","properties":{"provider":{"type":"string","enum":["google"]},"modelId":{"type":"string","minLength":1},"apiKey":{"type":"string","minLength":1}},"required":["provider","modelId","apiKey"]},{"type":"object","properties":{"provider":{"type":"string","enum":["openai-compatible"]},"modelId":{"type":"string","minLength":1},"apiKey":{"type":"string","minLength":1},"baseURL":{"type":"string","format":"uri"}},"required":["provider","modelId","apiKey","baseURL"]}]}},"required":["action","config"]}]},"SetLlmConfigResponse":{"anyOf":[{"type":"object","properties":{"cleared":{"type":"boolean","enum":[true]}},"required":["cleared"]},{"type":"object","properties":{"saved":{"type":"boolean","enum":[true]}},"required":["saved"]}]},"LlmConfigStatusResponse":{"type":"object","properties":{"provider":{"type":"string"},"source":{"type":"string","enum":["platform","byok","byom"]}},"required":["provider","source"]},"ListChatSessionsResponse":{"type":"object","properties":{"sessions":{"type":"array","items":{"$ref":"#/components/schemas/ChatSessionSummary"}},"total":{"type":"integer","minimum":0}},"required":["sessions","total"]},"ChatSessionSummary":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastActiveAt":{"type":"string","format":"date-time"},"messageCount":{"type":"integer","minimum":0},"firstUserMessage":{"type":"string"}},"required":["id","createdAt","lastActiveAt","messageCount"]},"ChatSessionDetailResponse":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"lastActiveAt":{"type":"string","format":"date-time"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ChatSessionMessage"}}},"required":["id","createdAt","lastActiveAt","messages"]},"ChatSessionMessage":{"type":"object","properties":{"seq":{"type":"integer"},"role":{"type":"string"},"content":{},"createdAt":{"type":"string","format":"date-time"}},"required":["seq","role","createdAt"]},"ElicitRequest":{"type":"object","properties":{"sessionId":{"type":"string","minLength":1,"maxLength":128},"elicitationId":{"type":"string","minLength":1,"maxLength":128},"result":{"anyOf":[{"type":"object","properties":{"action":{"type":"string","enum":["accept"]},"content":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]}}},"required":["action"]},{"type":"object","properties":{"action":{"type":"string","enum":["decline"]}},"required":["action"]},{"type":"object","properties":{"action":{"type":"string","enum":["cancel"]}},"required":["action"]}]}},"required":["sessionId","elicitationId","result"]},"ElicitResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]},"PackageCatalogResponse":{"type":"object","properties":{"catalog":{"type":"array","items":{"$ref":"#/components/schemas/PackageCatalogEntry"}},"count":{"type":"integer","minimum":0}},"required":["catalog","count"]},"PackageCatalogEntry":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"type":{"type":"string"},"platform":{"type":"array","items":{"type":"string"}}},"required":["name","version","type","platform"]},"PackageSearchResponse":{"type":"object","properties":{"packages":{"type":"array","items":{"$ref":"#/components/schemas/PackageSearchHit"}},"count":{"type":"integer","minimum":0}},"required":["packages","count"]},"PackageSearchHit":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"}},"required":["name","version","description"]},"PackageSearchLogRequest":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":214},"result":{"type":"string","enum":["hit","miss"]},"platform":{"type":"string","enum":["web","server"]},"projectId":{"type":"string","maxLength":64}},"required":["query","result"]},"RunnerHeartbeatResponse":{"type":"object","properties":{"id":{"type":"string"},"instanceId":{"type":"string"},"deploymentId":{"type":"string"}},"required":["id","instanceId","deploymentId"]},"ObserveTimingRequest":{"type":"object","properties":{"connectId":{"type":"string","minLength":1},"ticketMs":{"type":"number","minimum":0},"sseMs":{"type":"number","minimum":0},"totalMs":{"type":"number","minimum":0}},"required":["connectId","ticketMs","sseMs","totalMs"]},"MagicLinkResponse":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Magic link sent"}},"required":["success","message"]},"MagicLinkRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"user@example.com"},"redirect_to":{"type":"string","example":"/dashboard"}},"required":["email"]},"VerifyResponse":{"oneOf":[{"type":"object","properties":{"status":{"type":"string","enum":["ok"]},"redirectTo":{"type":"string","example":"/"}},"required":["status","redirectTo"]},{"type":"object","properties":{"status":{"type":"string","enum":["confirm_required"]},"email":{"type":"string","example":"user@example.com"}},"required":["status","email"]},{"type":"object","properties":{"status":{"type":"string","enum":["expired","used","invalid","malformed"]}},"required":["status"]}]},"VerifyRequest":{"type":"object","properties":{"token":{"type":"string","minLength":1},"confirm":{"type":"boolean"}},"required":["token"]},"WhoamiResponse":{"type":"object","properties":{"userId":{"type":"string","example":"user_a1b2c3d4"},"email":{"type":"string","format":"email","example":"user@example.com"}},"required":["userId","email"]},"ListSessionsResponse":{"type":"object","properties":{"sessions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"lastTouchedAt":{"type":"string","format":"date-time"},"isCurrent":{"type":"boolean"}},"required":["id","createdAt","expiresAt","lastTouchedAt","isCurrent"]}}},"required":["sessions"]},"ListProjectsResponse":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"total":{"type":"number"},"nextCursor":{"type":["string","null"]}},"required":["projects","total","nextCursor"]},"CreateProjectRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255}},"required":["name"]},"ProjectDetailResponse":{"type":"object","properties":{"id":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"name":{"type":"string"},"siteUrl":{"type":["string","null"],"format":"uri","example":"https://example.com"},"role":{"type":"string","enum":["owner","admin","member","viewer"]}},"required":["id","name","role"]},"UpdateProjectRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"siteUrl":{"type":["string","null"],"maxLength":2048,"format":"uri","example":"https://example.com"}}},"ListMembersResponse":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"total":{"type":"number"}},"required":["members","total"]},"AddMemberRequest":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"user@example.com"},"role":{"type":"string","enum":["owner","admin","member","viewer"],"default":"member"}},"required":["email"]},"UpdateMemberRequest":{"type":"object","properties":{"role":{"type":"string","enum":["owner","admin","member","viewer"]}},"required":["role"]},"ListFlowsResponse":{"type":"object","properties":{"flows":{"type":"array","items":{"$ref":"#/components/schemas/FlowSummary"}},"total":{"type":"integer","minimum":0},"nextCursor":{"type":["string","null"]}},"required":["flows","total","nextCursor"]},"CreateFlowRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"config":{"$ref":"#/components/schemas/FlowConfig"}},"required":["name"]},"UpdateFlowRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"},"config":{"$ref":"#/components/schemas/FlowConfig"}}},"DuplicateFlowRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"example":"my-website-flow"}}},"DeploymentResponse":{"type":["object","null"],"properties":{"id":{"type":"string"},"flowId":{"type":"string"},"type":{"type":"string","enum":["web","server"]},"status":{"type":"string"},"containerUrl":{"type":["string","null"]},"publicUrl":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","flowId","type","status","containerUrl","errorMessage","createdAt","updatedAt"]},"ListSettingsResponse":{"type":"object","properties":{"settings":{"type":"array","items":{"$ref":"#/components/schemas/FlowSettingsSummary"}}},"required":["settings"]},"SettingsDeploymentResponse":{"type":["object","null"],"properties":{"id":{"type":"string"},"flowId":{"type":"string"},"settingsId":{"type":"string"},"type":{"type":"string","enum":["web","server"]},"status":{"type":"string"},"containerUrl":{"type":["string","null"]},"publicUrl":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","flowId","settingsId","type","status","containerUrl","publicUrl","errorMessage","createdAt","updatedAt"]},"SettingsDeploymentDetailResponse":{"type":"object","properties":{"id":{"type":"string"},"flowId":{"type":"string"},"settingsId":{"type":"string"},"status":{"type":"string"},"type":{"type":"string","enum":["web","server"]},"containerUrl":{"type":["string","null"]},"publicUrl":{"type":["string","null"]},"errorMessage":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","flowId","settingsId","status","type","containerUrl","publicUrl","errorMessage","createdAt","updatedAt"]},"FlowJourneysResponse":{"type":"object","properties":{"sessionId":{"type":["string","null"],"pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"assembledAt":{"type":"string","format":"date-time"},"journeys":{"type":"array","items":{"type":"object","additionalProperties":{}}},"gaps":{"type":"array","items":{"type":"object","additionalProperties":{}}},"unattributed":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["sessionId","flowId","assembledAt","journeys","gaps"]},"ListVersionsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Version"}},"flowId":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"total":{"type":"integer","minimum":0},"limit":{"type":"integer","exclusiveMinimum":0},"offset":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"}},"required":["data","flowId","total","limit","offset","hasMore"]},"GetVersionResponse":{"type":"object","properties":{"version":{"type":"integer","exclusiveMinimum":0,"example":1},"content":{"$ref":"#/components/schemas/FlowConfig"},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"createdBy":{"type":"string","enum":["user","auto_save","restore","deploy","preview"]}},"required":["version","content","createdAt","createdBy"]},"ListAutomationTokensResponse":{"type":"object","properties":{"tokens":{"type":"array","items":{"$ref":"#/components/schemas/AutomationTokenSummary"}}},"required":["tokens"]},"CreateAutomationTokenResponse":{"type":"object","properties":{"id":{"type":"string","example":"tok_a1b2c3d4"},"name":{"type":"string","example":"CI Pipeline"},"token":{"type":"string","example":"wos_pat_a1b2c3d4..."},"tokenPrefix":{"type":"string","example":"wos_pat_a1b2"},"scope":{"type":"array","items":{"type":"string"},"example":["read","write"]},"audience":{"type":"array","items":{"type":"string"},"example":["api","mcp"]},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"expiresAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","name","token","tokenPrefix","scope","audience","createdAt","expiresAt"]},"CreateAutomationTokenRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"example":"CI Pipeline"},"scope":{"type":"string","enum":["read","read write"],"example":"read write"},"expiresInDays":{"anyOf":[{"type":"number","enum":[30]},{"type":"number","enum":[90]},{"type":"number","enum":[180]},{"type":"number","enum":[365]}],"example":90}},"required":["name","scope","expiresInDays"]},"ValidateTicketResponse":{"type":"object","properties":{"userId":{"type":"string"},"projectId":{"type":"string"},"replay":{"type":"object","properties":{"size":{"type":"number"},"ttlMs":{"type":"number"}},"required":["size","ttlMs"]},"scope":{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["session"]},"sessionId":{"type":"string"}},"required":["kind","sessionId"]},{"type":"null"}]}},"required":["userId","projectId","replay","scope"]},"ValidateTicketRequest":{"type":"object","properties":{"ticket":{"type":"string","minLength":1}},"required":["ticket"]},"HealthResponse":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"appVersion":{"type":"string","example":"a1b2c3d","description":"Build identity of the running app (git short hash injected at build time)."}},"required":["status","appVersion"]},"DeclineInvitationResponse":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"ScreenshotUploadResponse":{"type":"object","properties":{"assetId":{"type":"string","pattern":"^fas_[A-Za-z0-9_-]{21}$","example":"fas_V1StGXR8Z5jdHi6BmyT7K"},"reused":{"type":"boolean"},"markupAssetId":{"type":"string","pattern":"^fas_[A-Za-z0-9_-]{21}$","example":"fas_V1StGXR8Z5jdHi6BmyT7K"}},"required":["assetId","reused"]},"FrameScreenshotMeta":{"type":"object","properties":{"capturedAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"size":{"$ref":"#/components/schemas/PlanSize"},"dpr":{"type":"number","exclusiveMinimum":0},"capturedRect":{"$ref":"#/components/schemas/PlanRect"}},"required":["capturedAt","size","dpr","capturedRect"]},"VersionFrameInput":{"type":"object","properties":{"id":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$"},"name":{"type":"string","minLength":1,"maxLength":255},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}}},"required":["id","name","size","marks"],"additionalProperties":false},"SharedFrameCreate":{"type":"object","properties":{"frameId":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"frame":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"size":{"$ref":"#/components/schemas/PlanSize"},"marks":{"type":"object","additionalProperties":{}},"links":{"type":"array","items":{"$ref":"#/components/schemas/FrameLink"},"maxItems":256}},"required":["name","size","marks","links"],"additionalProperties":false},"clientWriteId":{"type":"string","pattern":"^cw_[A-Za-z0-9_-]{21}$"}},"required":["frameId","frame","clientWriteId"],"additionalProperties":false},"HeartbeatRequest":{"type":"object","properties":{"instanceId":{"type":"string","minLength":1,"maxLength":64,"example":"a1b2c3d4e5f6"},"flowId":{"type":"string","example":"flow_abc123"},"configVersion":{"type":"string"},"mode":{"type":"string","enum":["local","collect","serve"]},"cliVersion":{"type":"string","example":"1.3.0"},"uptime":{"type":"integer","minimum":0},"metadata":{"type":"object","additionalProperties":{}},"deploymentId":{"type":"string","example":"dpl_abc123"},"counters":{"type":"object","properties":{"eventsIn":{"type":"integer","minimum":0},"eventsOut":{"type":"integer","minimum":0},"eventsFailed":{"type":"integer","minimum":0},"destinations":{"type":"object","additionalProperties":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"failed":{"type":"integer","minimum":0},"duration":{"type":"number","minimum":0},"dlqSize":{"type":"integer","minimum":0},"dropped":{"type":"integer","minimum":0}},"required":["count","failed","duration"]}}},"required":["eventsIn","eventsOut","eventsFailed","destinations"]},"recentErrors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string","maxLength":256},"count":{"type":"integer","minimum":1},"firstSeen":{"type":"string","format":"date-time"},"lastSeen":{"type":"string","format":"date-time"}},"required":["message","count","firstSeen","lastSeen"]},"maxItems":50},"recentLogs":{"type":"array","items":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"level":{"type":"string","enum":["error","warn","info","debug"]},"message":{"type":"string","maxLength":256}},"required":["time","level","message"]},"maxItems":100}},"required":["instanceId","flowId"]},"OAuthClientRegistrationResponse":{"type":"object","properties":{"client_id":{"type":"string","example":"client_abc"},"client_id_issued_at":{"type":"integer","example":1725400000},"client_name":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_method":{"type":"string","enum":["none"]},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}}},"required":["client_id","client_id_issued_at","client_name","redirect_uris","token_endpoint_auth_method","grant_types","response_types"]},"OAuthRegistrationError":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_client_metadata","invalid_redirect_uri"]},"error_description":{"type":"string"}},"required":["error","error_description"]},"OAuthClientRegistrationRequest":{"type":"object","properties":{"redirect_uris":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":10,"example":["https://claude.ai/api/mcp/auth_callback"]},"client_name":{"type":"string","minLength":1,"maxLength":255},"token_endpoint_auth_method":{"type":"string","enum":["none"]},"grant_types":{"type":"array","items":{"type":"string","enum":["authorization_code","refresh_token"]},"minItems":1},"response_types":{"type":"array","items":{"type":"string","enum":["code"]}},"client_uri":{"type":"string","format":"uri"},"logo_uri":{"type":"string","format":"uri"},"scope":{"type":"string"},"software_id":{"type":"string"},"software_version":{"type":"string"}},"required":["redirect_uris"]},"TokenResponse":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer","example":3600},"refresh_token":{"type":"string"},"scope":{"type":"string","example":"read write offline_access"}},"required":["access_token","token_type","expires_in","scope"]},"OAuthError":{"type":"object","properties":{"error":{"type":"string","example":"invalid_client"},"error_description":{"type":"string"}},"required":["error","error_description"]},"TokenRequest":{"type":"object","properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"],"example":"authorization_code"},"client_id":{"type":"string","example":"client_abc"},"code":{"type":"string"},"redirect_uri":{"type":"string"},"code_verifier":{"type":"string"},"refresh_token":{"type":"string"},"scope":{"type":"string","example":"read offline_access"},"resource":{"type":"string","example":"https://app.walkeros.io/api"}},"required":["grant_type","client_id"]},"RevocationRequest":{"type":"object","properties":{"token":{"type":"string"},"token_type_hint":{"type":"string","enum":["access_token","refresh_token"]},"client_id":{"type":"string"}},"required":["token","client_id"]},"OAuthConsentDecisionResponse":{"type":"object","properties":{"redirectTo":{"type":"string","example":"https://claude.ai/api/mcp/auth_callback?code=abc&state=xyz"}},"required":["redirectTo"]},"OAuthConsentDecisionRequest":{"type":"object","properties":{"ticket":{"type":"string","minLength":1}},"required":["ticket"],"additionalProperties":false},"ListOAuthGrantsResponse":{"type":"object","properties":{"grants":{"type":"array","items":{"$ref":"#/components/schemas/OAuthGrantSummary"}}},"required":["grants"]},"OAuthGrantSummary":{"type":"object","properties":{"id":{"type":"string"},"clientId":{"type":"string"},"clientName":{"type":"string"},"scope":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","example":"2026-01-26T14:30:00.000Z"},"lastUsedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["id","clientId","clientName","scope","createdAt","lastUsedAt"]},"ListOAuthClientsResponse":{"type":"object","properties":{"clients":{"type":"array","items":{"$ref":"#/components/schemas/OAuthClientSummary"}}},"required":["clients"]},"OAuthClientSummary":{"type":"object","properties":{"clientId":{"type":"string"},"kind":{"type":"string","enum":["dcr","cimd"]},"name":{"type":"string"},"redirectUris":{"type":"array","items":{"type":"string"}},"grantTypes":{"type":"array","items":{"type":"string"}},"tokenEndpointAuthMethod":{"type":"string","enum":["none"]},"allowedResources":{"type":"array","items":{"type":"string","enum":["mcp","api"]}},"revokedAt":{"type":["string","null"],"format":"date-time","example":"2026-01-26T14:30:00.000Z"}},"required":["clientId","kind","name","redirectUris","grantTypes","tokenEndpointAuthMethod","allowedResources","revokedAt"]}},"parameters":{}},"paths":{"/api/auth/whoami":{"get":{"tags":["Auth"],"summary":"Current identity","description":"Return the identity of the authenticated user. Supports session cookie and Bearer token.","responses":{"200":{"description":"Current user identity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoamiResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects":{"get":{"tags":["Projects"],"summary":"List my projects","description":"List all projects where the authenticated user is a member.","parameters":[{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of projects","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProjectsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Projects"],"summary":"Create project","description":"Create a new project. The authenticated user becomes the owner.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"201":{"description":"Project created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}":{"get":{"tags":["Projects"],"summary":"Get project","description":"Get a single project by ID. Any member, viewer included.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"}],"responses":{"200":{"description":"Project details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetailResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Projects"],"summary":"Update project","description":"Update project details. Requires owner role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectRequest"}}}},"responses":{"200":{"description":"Project updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Projects"],"summary":"Delete project","description":"Delete a project and all its resources. Requires owner role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"}],"responses":{"204":{"description":"Project deleted"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows":{"get":{"tags":["Flows"],"summary":"List flows","description":"List all flows for a project.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","enum":["name","updated_at","created_at"],"example":"updated_at"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"example":"desc"},"required":false,"name":"order","in":"query"},{"schema":{"type":"string","enum":["true","false"],"example":"false"},"required":false,"name":"include_deleted","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of flows","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFlowsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Flows"],"summary":"Create flow","description":"Create a new flow in the project. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFlowRequest"}}}},"responses":{"201":{"description":"Flow created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flow"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}":{"get":{"tags":["Flows"],"summary":"Get flow","description":"Get a single flow by ID. Use ?fields to select specific sections (reduces response size).","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","description":"Comma-separated dot-paths to select specific fields (e.g., \"config.variables,config.flows.tracking.sources\"). Always includes id, createdAt, updatedAt.","example":"config.variables,config.flows.tracking.sources"},"required":false,"description":"Comma-separated dot-paths to select specific fields (e.g., \"config.variables,config.flows.tracking.sources\"). Always includes id, createdAt, updatedAt.","name":"fields","in":"query"}],"responses":{"200":{"description":"Flow details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowDetailResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Flows"],"summary":"Update flow","description":"Update an existing flow. Creates a version snapshot before applying changes. Requires member role. Use Content-Type: application/merge-patch+json to send only changed fields (RFC 7386). With If-Match, the write happens only while the stored config still has that ETag, checked under the row lock; otherwise the answer is 412 with the flow as it is now in `head`. Writing again with `head.etag` puts this write on top of it. The first config write of a placeholder flow ends it being one. The answer's ETag is the one the next GET carries.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","description":"ETag from a previous GET. Returns 412 if flow was modified since.","example":"\"a1b2c3d4e5f6g7h8\""},"required":false,"description":"ETag from a previous GET. Returns 412 if flow was modified since.","name":"if-match","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFlowRequest"}},"application/merge-patch+json":{"schema":{"$ref":"#/components/schemas/UpdateFlowRequest"}}}},"responses":{"200":{"description":"Flow updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowUpdateResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"ETag mismatch: the flow was modified since last read; `head` is the flow as it is now","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowConflictResponse"}}}}}},"delete":{"tags":["Flows"],"summary":"Soft-delete flow","description":"Soft-delete the flow, its settings and every frame it holds, in one transaction; the captures those frames showed are released, and a share of one of its frames stops resolving. Its deployments are stopped and removed first, one by one, as DELETE on a deployment does; a flow with deployments therefore needs the owner role (403 `INSUFFICIENT_ROLE`), one without needs the member role. A deployment whose infrastructure cannot be torn down answers 502 `DEPLOYMENT_TEARDOWN_FAILED` naming it, and the flow stays; a retry continues with the deployments left.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","description":"ETag from a previous GET. Returns 412 if flow was modified since.","example":"\"a1b2c3d4e5f6g7h8\""},"required":false,"description":"ETag from a previous GET. Returns 412 if flow was modified since.","name":"if-match","in":"header"}],"responses":{"204":{"description":"Flow deleted"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A deployment was created for the flow while it was deleted (`FLOW_HAS_DEPLOYMENTS`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"412":{"description":"ETag mismatch — flow was modified since last read"},"502":{"description":"A deployment could not be torn down (`DEPLOYMENT_TEARDOWN_FAILED`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/duplicate":{"post":{"tags":["Flows"],"summary":"Duplicate flow","description":"Create a copy of an existing flow with a new ID and no version history. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateFlowRequest"}}}},"responses":{"201":{"description":"Flow duplicated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flow"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/secrets":{"get":{"tags":["Secrets"],"summary":"List secrets","description":"List a flow's secrets as metadata only (name, id, timestamps). Values are never returned. Requires member role and the secrets entitlement.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"responses":{"200":{"description":"Secret metadata list","content":{"application/json":{"schema":{"type":"object","properties":{"secrets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","flowId","createdAt","updatedAt"]}}},"required":["secrets"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Secrets"],"summary":"Create secret","description":"Create a secret for a flow. The value is encrypted at rest and never returned. Requires member role and the secrets entitlement.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Z_][A-Z0-9_]*$"},"value":{"type":"string","minLength":1,"maxLength":65536}},"required":["name","value"]}}}},"responses":{"201":{"description":"Secret created (metadata only)","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","flowId","createdAt","updatedAt"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/secrets/{secretId}":{"put":{"tags":["Secrets"],"summary":"Update secret value","description":"Rotate a secret's value (re-encrypts). The value is never returned. Requires member role and the secrets entitlement.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","example":"sec_abc123"},"required":true,"name":"secretId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":65536}},"required":["value"]}}}},"responses":{"200":{"description":"Secret updated (metadata only)","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"flowId":{"type":"string"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","name","flowId","createdAt","updatedAt"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Secrets"],"summary":"Delete secret","description":"Soft-delete a secret. Idempotent: deleting a missing secret returns 204. Requires member role and the secrets entitlement.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","example":"sec_abc123"},"required":true,"name":"secretId","in":"path"}],"responses":{"204":{"description":"Secret deleted"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/deploy":{"get":{"tags":["Deployments"],"summary":"Get latest deployment","description":"Get the latest deployment for a flow.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"responses":{"200":{"description":"Latest deployment (or null)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Deployments"],"summary":"Start deployment","description":"Start a new deployment for a flow. The bundle runs asynchronously on the worker. Returns 400 AMBIGUOUS_CONFIG when the flow has multiple named settings (use the per-settings deploy endpoint instead). When an Idempotency-Key replays a prior request, returns 200 with status `already_created`.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"responses":{"200":{"description":"Deployment started, or idempotent replay of a prior request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartDeploymentResponse"}}}},"201":{"description":"Deployment started","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartDeploymentResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Deployment already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited or concurrent deploy limit (Retry-After header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/settings/{settingsId}/deploy":{"post":{"tags":["Settings"],"summary":"Deploy settings","description":"Start a deployment for a specific settings entry. Detects platform from the settings. The body is optional and carries only `humanText`, the reason for the change, which becomes the description of the release this deploy produces; it is ignored when the release already has one.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"required":true,"name":"settingsId","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploySettingsRequest"}}}},"responses":{"201":{"description":"Deployment started","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploySettingsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Deployment already in progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Settings orphaned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Settings"],"summary":"Get latest settings deployment","description":"Get the latest deployment for a specific settings entry.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^cfg_[a-zA-Z0-9_-]+$","example":"cfg_a1b2c3d4"},"required":true,"name":"settingsId","in":"path"}],"responses":{"200":{"description":"Latest deployment (or null)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsDeploymentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/previews":{"post":{"tags":["Previews"],"summary":"Create preview","description":"Create a new preview for a web flow settings entry. Bundles the flow and publishes to a unique token-based URL.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePreviewRequest"}}}},"responses":{"201":{"description":"Preview created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePreviewResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Quota exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Bundle or upload failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["Previews"],"summary":"List previews","description":"List all previews for a flow, ordered by creation date descending.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"responses":{"200":{"description":"List of previews","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPreviewsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/previews/{previewId}":{"get":{"tags":["Previews"],"summary":"Get preview","description":"Get a single preview by ID.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^prv_[a-z0-9]+$","example":"prv_abc123xyz456"},"required":true,"name":"previewId","in":"path"}],"responses":{"200":{"description":"Preview details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Previews"],"summary":"Delete preview","description":"Delete a preview and its S3 bundle. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^prv_[a-z0-9]+$","example":"prv_abc123xyz456"},"required":true,"name":"previewId","in":"path"}],"responses":{"204":{"description":"Preview deleted"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/previews/{previewId}/grant":{"post":{"tags":["Previews"],"summary":"Mint preview activation grant","description":"Mint a fresh, origin-bound activation grant for an existing preview. Grants are origin-bound, so a preview needs one grant per host origin — re-mint whenever the target origin changes.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^prv_[a-z0-9]+$","example":"prv_abc123xyz456"},"required":true,"name":"previewId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintGrantRequest"}}}},"responses":{"200":{"description":"Grant minted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MintGrantResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"No active web deployment / host bundle not preview-enabled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/observe-sessions":{"post":{"tags":["Observe Sessions"],"summary":"Start observe session","description":"Start an Observe session for a flow. Validates the flow topology, inserts the row, and kicks off detached provisioning. Returns the row immediately as arming.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateObserveSessionRequest"}}}},"responses":{"201":{"description":"Observe session started","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObserveSessionResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Flow topology not supported","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}":{"get":{"tags":["Observe Sessions"],"summary":"Get observe session","description":"Get an observe session: status, error message, config snapshot, web activation info, and the live server endpoint when live.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"required":true,"name":"sessionId","in":"path"}],"responses":{"200":{"description":"Observe session details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObserveSessionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Observe Sessions"],"summary":"End observe session","description":"End an observe session: tear down the container, revoke credentials, delete the web preview, delete the row. Idempotent.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"required":true,"name":"sessionId","in":"path"}],"responses":{"204":{"description":"Observe session ended"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/journeys":{"get":{"tags":["Observe Sessions"],"summary":"Get flow journeys","description":"Resolve the flow's single active Observe session and assemble its cross-runtime journeys server-side. `observe_sessions.flow_id` is UNIQUE, so a flow has at most one session; when none is active the response carries `sessionId: null` with empty journeys rather than a 404. Narrow with `traceId` (one trace) and `limit` (page cap, most recent kept). This is the MCP `observe_journeys` REST contract.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","minLength":1},"required":false,"name":"traceId","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Assembled flow journeys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlowJourneysResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Observer unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/observe-sessions/{sessionId}/heartbeat":{"post":{"tags":["Observe Sessions"],"summary":"Heartbeat observe session","description":"Keep an observe session warm. The window posts this every 30s while open; a stale session is reaped by the janitor.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^ses_[a-zA-Z0-9_-]+$","example":"ses_abc123xyz456"},"required":true,"name":"sessionId","in":"path"}],"responses":{"200":{"description":"Heartbeat recorded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObserveSessionHeartbeatResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/deployments":{"get":{"tags":["Deployments"],"summary":"List deployments","description":"List deployments for a project. Supports filtering by status, type, origin, and flowId, plus pagination.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","enum":["idle","deploying","published","active","stopped","failed"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["web","server"]},"required":false,"name":"type","in":"query"},{"schema":{"type":"string","enum":["cloud","self-hosted"]},"required":false,"name":"origin","in":"query"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":false,"name":"flowId","in":"query"},{"schema":{"type":"string","enum":["created_at","updated_at"]},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"]},"required":false,"name":"order","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"List of deployments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListDeploymentsResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Deployments"],"summary":"Create deployment","description":"Create a new deployment slot. Supports an Idempotency-Key header: a repeated key returns the original deployment id with status `already_created`. Requires member role. A `flowId` must name a live flow of the project (404 `FLOW_NOT_FOUND` otherwise). Without one, the deployment gets a placeholder flow of its own, named `{label} ({slug})` or `Self-hosted ({slug})`; a flow already named that answers 409 `FLOW_NAME_EXISTS`.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","description":"Optional client key to make creation idempotent."},"required":false,"description":"Optional client key to make creation idempotent.","name":"idempotency-key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["web","server"],"example":"web"},"label":{"type":"string","maxLength":255},"flowId":{"type":"string"},"flowSettingsId":{"type":"string"}},"required":["type"]}}}},"responses":{"201":{"description":"Deployment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeploymentResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/health":{"get":{"tags":["System"],"summary":"Health check","description":"Check the health of the API and its dependencies.","responses":{"200":{"description":"Health status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/openapi.json":{"get":{"tags":["System"],"summary":"OpenAPI spec","description":"Return the OpenAPI 3.1 specification for this API.","responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":{}}}}}}}},"/api/feedback":{"post":{"tags":["Feedback"],"summary":"Submit user feedback","description":"Accepts free-form feedback from the walkerOS CLI, MCP, or a future in-app form. Public endpoint — no authentication required. The body `userId` is stored verbatim as a best-effort contact email and is not validated against the app users table.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"201":{"description":"Feedback stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/telemetry":{"post":{"tags":["Telemetry"],"summary":"Submit telemetry event","description":"Accept a single walkerOS v4 event from the CLI or MCP telemetry emitter. Public endpoint — no authentication. `source.type` is constrained to `cli` or `mcp`.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryEvent"}}}},"responses":{"204":{"description":"Telemetry event accepted"},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/deployments/{deploymentId}":{"get":{"tags":["Deployments"],"summary":"Get deployment detail","description":"Get deployment detail. Accepts a dep_ID or a slug. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","example":"dep_abc123"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"Deployment detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentDetailResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Deployments"],"summary":"Delete deployment","description":"Tear down and soft-delete a deployment. Idempotent. Requires owner role. Infrastructure already gone counts as torn down; any other teardown failure answers 502 `DEPLOYMENT_TEARDOWN_FAILED` and keeps the deployment.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","example":"dep_abc123"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"204":{"description":"Deployment deleted (or already absent)"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The deployment could not be torn down; it is kept","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/deployments/{deploymentId}/stream":{"get":{"tags":["Deployments"],"summary":"Stream deployment status (SSE)","description":"Server-Sent Events (`text/event-stream`) stream of a deployment's live status. Emits named events: `status` (a snapshot payload, schema below), `done` (terminal, no body), and `timeout`. The CLI consumes this with a raw fetch while waiting for a deploy to finish. Requires member role. The schema documents the JSON `data:` of a `status` event; `errorCode`/`errorMessage` carry the persisted, redacted classification of a failed deploy.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","example":"dep_abc123"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"SSE stream; `status` event payload shape documented here.","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/DeploymentStreamStatusEvent"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/releases":{"get":{"tags":["Deployments"],"summary":"List flow releases","description":"List the release history for a flow across all of its deployment lineages, newest first, paginated. Each entry is a deployed version joined to its parent deployment (slug and type). `rationale=true` joins each row's stored rationale summary on, which requires the `hub` feature; without it the `rationale` key is absent from every row rather than null, and no feature beyond member role is needed. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"rationale","in":"query"}],"responses":{"200":{"description":"Flow release history","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListFlowReleasesResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/releases/{versionId}":{"get":{"tags":["Deployments"],"summary":"Read one release in full","description":"One release of this flow with its rationale and its diff. The path segment is either the spine version id (`ver_...`) or the flow-unique spine number, and the route decides which it was, so a caller holding only the number needs no lookup first. The diff is computed server-side from the two stored snapshots and is never accepted from a caller; its predecessor is the next LOWER spine number, not the previous row by time, because spine rows are reused across redeploys of identical content. `diff.text` is rendered from masked content, so an empty string can still mean the releases differ inside an inline secret: `diff.contentIdentical`, compared over the unmasked hashes, is the trustworthy answer. `diff` is null for the flow's oldest release. An unknown address, a sibling flow's version, and an autosave revision all answer 404 alike. Requires member role and the `hub` feature.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^(ver_[a-zA-Z0-9_-]+|[1-9][0-9]*)$","example":"ver_a1b2c3d4","description":"Spine version id of the release (ver_...) or its spine number"},"required":true,"description":"Spine version id of the release (ver_...) or its spine number","name":"versionId","in":"path"}],"responses":{"200":{"description":"The release, its rationale, and its diff","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseDetailResponse"}}}},"400":{"description":"Invalid release reference","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/releases/annotations":{"put":{"tags":["Deployments"],"summary":"Write release rationale","description":"Create or update the human rationale for one release of this flow. A null `humanText` clears it. The generated summary is machine-written and cannot be set through this route. The target must be a numbered release version of this flow, not an autosave revision. Requires member role and the `hub` feature: a release's rationale is its description, and `frames` does not reach it. Without `hub` the answer is 403 `FEATURE_NOT_AVAILABLE`, \"hub is not available on your current plan\".","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"versionId":{"type":"string","pattern":"^ver_[a-zA-Z0-9_-]+$","example":"ver_a1b2c3d4"},"humanText":{"type":["string","null"],"maxLength":4000}},"required":["versionId","humanText"]}}}},"responses":{"200":{"description":"The stored rationale","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertVersionAnnotationResponse"}}}},"400":{"description":"Invalid body, or the target is not a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/threads":{"get":{"tags":["Deployments"],"summary":"List discussion threads on a flow","description":"Threads anchored to things in this flow, most recently active first. `anchorType` and `anchorKey` narrow to one anchor and are only meaningful together. `includeMessages=true` attaches the messages; otherwise each thread carries `messageCount` alone. Attaching them holds the page to a smaller ceiling than the lean index and caps each thread at its newest 50 messages, with `hasMoreMessages` set when a thread holds more. Because that ceiling is below the `limit` a caller may pass, the response carries `hasMoreThreads`: a full page is not proof of a complete list. A resolved thread carries the release that settled it, and `resolvedByVersionId` is null once that release is gone, which is what `anchorLabel` is kept for. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","enum":["step","entity_action","release","contract","tag"],"example":"release"},"required":false,"name":"anchorType","in":"query"},{"schema":{"type":"string","example":"ver_a1b2c3d4"},"required":false,"name":"anchorKey","in":"query"},{"schema":{"type":"string","enum":["open","resolved"],"example":"open"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"includeMessages","in":"query"},{"schema":{"type":"integer","example":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Threads on this flow","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListHubThreadsResponse"}}}},"400":{"description":"Invalid query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Deployments"],"summary":"Open a discussion thread","description":"Open a thread on one anchor, with its first message. A thread never exists empty, so `text` is required and may not be blank. A `release` anchor must name a numbered release of this flow: the server verifies it and derives the label, so `anchorLabel` is ignored for that type. For any other anchor type `anchorLabel` is a display snapshot of the anchor as it reads now, stored so a later rename leaves the thread readable instead of unlabeled, and defaults to the anchor key. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"anchorType":{"type":"string","enum":["step","entity_action","release","contract","tag"],"example":"release"},"anchorKey":{"type":"string","minLength":1,"maxLength":255},"anchorLabel":{"type":"string","minLength":1,"maxLength":255},"text":{"type":"string","minLength":1,"maxLength":4000}},"required":["anchorType","anchorKey","text"]}}}},"responses":{"201":{"description":"The opened thread, with its first message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubThreadResponse"}}}},"400":{"description":"Invalid body, or the anchor is not a release","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Flow not found, or the anchor names no release of it","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/threads/{threadId}/messages":{"post":{"tags":["Deployments"],"summary":"Reply to a thread","description":"Append a message to a thread. `text` may not be blank: a message cannot be cleared, so empty is invalid rather than a way to erase one. Replying does not reopen a resolved thread: the resolve link is a statement about a release and is never retracted implicitly. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^thr_[a-z0-9]+$","example":"thr_a1b2c3d4","description":"Thread ID (thr_...)"},"required":true,"description":"Thread ID (thr_...)","name":"threadId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":4000}},"required":["text"]}}}},"responses":{"201":{"description":"The thread, with the new message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HubThreadResponse"}}}},"400":{"description":"Invalid body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/knowledge":{"get":{"tags":["Projects"],"summary":"List knowledge captured in this project","description":"What people wrote on the frames of a page, most recently active first. Two kinds come back together and `kind` separates them: a `thread` carries its text in messages, a `description` carries one body and cannot be replied to. `flowId` narrows to the knowledge written on one flow's frames. `pageKey` narrows to one page, resolved server-side to the frames whose own page it is; `frameId` narrows to one frame; `markId` narrows to one mark within it and is refused without `frameId`, since a mark id alone addresses nothing. `includeMessages=true` attaches message bodies and holds the page to a much smaller ceiling, so `hasMoreEntries` is what separates a complete answer from a truncated one. `validity` says when an entry was true and `freshness` compares that against the flow’s newest release; neither is a verdict. Requires member role and the `frames` or `hub` feature. With `frames` alone, only the threads and descriptions on a frame or a mark of one come back; every other entry, such as a flow or release thread, needs `hub`. Without either feature the answer is 403 `FEATURE_NOT_AVAILABLE`, \"frames is not available on your current plan\".","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":false,"name":"flowId","in":"query"},{"schema":{"type":"string","example":"https://shop.example/checkout"},"required":false,"name":"pageKey","in":"query"},{"schema":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","example":"frm_V1StGXR8Z5jdHi6BmyT7K"},"required":false,"name":"frameId","in":"query"},{"schema":{"type":"string","example":"mark_add_to_cart"},"required":false,"name":"markId","in":"query"},{"schema":{"type":"string","enum":["true","false"]},"required":false,"name":"includeMessages","in":"query"},{"schema":{"type":"integer","example":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Knowledge in this project","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListKnowledgeResponse"}}}},"400":{"description":"Invalid query, or a mark filter with no frame","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/frames":{"get":{"tags":["Projects"],"summary":"List the frames of a flow, or of one page of it","description":"A frame is a named rectangle with marks inside it, the spatial unit of a measurement plan, and every frame belongs to one flow of the project. A frame has no parent. What it shows of other frames is its `links`: each link is a rectangle in fractions of the showing frame plus the id of the frame shown, and the order of the array is the paint order. Naming a `pageKey` returns the flow’s live frames whose own page that is, marks and all, newest updated first. That read is flat: a frame of another page that one of them shows is not in the answer, and its id is in `links`. Naming no page returns every live frame of the flow WITHOUT its marks, which is what makes that read cheap enough to answer \"what does this flow have\": the marks are the bulk of a frame and a listing never renders them. Both reads carry `links` and `variantSetId` on every frame, and a link to a deleted frame is left out of every read. `include=marks` asks that flow-wide read for the marks anyway, for a surface that spans pages and cannot fetch a page at a time; it is a second, heavier read of the same rows, taken after the lean list has already painted, and omitting it returns exactly the lean rows. It says nothing to the page read, which carries marks either way. A flow that is not a live flow of the project answers 404 `FLOW_NOT_FOUND`, one answer for an unknown, a foreign and a deleted flow. Requires viewer role: project viewers read the board, and every write stays with members.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":1024},"required":false,"name":"pageKey","in":"query"},{"schema":{"type":"string","enum":["marks"]},"required":false,"name":"include","in":"query"}],"responses":{"200":{"description":"The page’s frames with their marks, or the flow’s frames without them","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/FrameListResponse"},{"$ref":"#/components/schemas/FrameLeanListResponse"}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The flow is not a live flow of this project (`FLOW_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/frames/{frameId}":{"get":{"tags":["Projects"],"summary":"Read one frame","description":"One frame of the flow with its marks and its links to live frames; a link to a deleted frame is left out. A frame the flow does not hold answers 404 `FRAME_NOT_FOUND`, whether it is absent, in another flow, or in another project, which reads back as nothing: never 403, so this route cannot become an oracle for what exists elsewhere. A deleted frame is gone to every read. Requires viewer role: project viewers read the board, and every write stays with members.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","pattern":"^frm_[A-Za-z0-9_-]{21}$","description":"Frame ID (frm_...)"},"required":true,"description":"Frame ID (frm_...)","name":"frameId","in":"path"}],"responses":{"200":{"description":"The frame","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Frame"}}}},"400":{"description":"The path segment does not address a frame","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The flow is not a live flow of this project (`FLOW_NOT_FOUND`), or the flow does not hold the frame (`FRAME_NOT_FOUND`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/projects/{projectId}/flows/{flowId}/releases/step-history":{"get":{"tags":["Deployments"],"summary":"List the releases that touched one step","description":"The releases of this flow that added, changed, or removed one step, newest first, each carrying the rationale stored for it. `step` is a `type.name` key over source, transformer, destination, store, and contract. `flow` narrows the scan to one named flow inside the config and is ignored for a contract key. `limit` bounds the releases scanned, not the entries returned. When nothing matched, `knownSteps` lists the addressable keys of the newest scanned release. Requires member role.","parameters":[{"schema":{"type":"string","pattern":"^proj_[a-zA-Z0-9_-]+$","example":"proj_x7y8z9"},"required":true,"name":"projectId","in":"path"},{"schema":{"type":"string","pattern":"^flow_[a-zA-Z0-9_-]+$","example":"flow_a1b2c3d4"},"required":true,"name":"flowId","in":"path"},{"schema":{"type":"string","example":"destination.ga4"},"required":true,"name":"step","in":"query"},{"schema":{"type":"string","example":"web"},"required":false,"name":"flow","in":"query"},{"schema":{"type":["integer","null"],"example":25},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"The releases that touched the step","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepHistoryResponse"}}}},"400":{"description":"Invalid step key or query","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/packages":{"get":{"tags":["System"],"summary":"Package catalog","description":"Resolved `@walkeros/*` package catalog for the add-step picker, optionally filtered by type and platform.","parameters":[{"schema":{"type":"string","description":"Filter by package type."},"required":false,"description":"Filter by package type.","name":"type","in":"query"},{"schema":{"type":"string","description":"Filter by platform."},"required":false,"description":"Filter by platform.","name":"platform","in":"query"}],"responses":{"200":{"description":"Package catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageCatalogResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Package catalog unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/oauth/token":{"post":{"tags":["OAuth"],"summary":"Exchange a grant for tokens","description":"RFC 6749 section 3.2. Runs the authorization code and refresh token grants. Every client is public: it sends its `client_id` in the form and proves itself with PKCE, and a request that presents a client secret is refused with `invalid_client` (with a `WWW-Authenticate: Basic` challenge when it tried HTTP Basic). Body is `application/x-www-form-urlencoded` only; errors use the RFC 6749 section 5.2 shape, not the standard error envelope. Responses are never cacheable. Rate limited per `client_id`, and per `client_id` and address for a client id metadata URL.","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"Tokens issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"400":{"description":"invalid_request, invalid_grant, invalid_scope, invalid_target or unsupported_grant_type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"invalid_client: unknown or revoked client, or a request that presents a client secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Per-client token budget reached (Retry-After header)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/oauth/revoke":{"post":{"tags":["OAuth"],"summary":"Revoke a token","description":"RFC 7009. The client names itself as at the token endpoint. A refresh token revokes its whole rotation family, an access token only itself. A request from a known client always answers 200 with an empty body, unknown tokens included: a distinguishable answer would be an oracle. Body is `application/x-www-form-urlencoded`.","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RevocationRequest"}}}},"responses":{"200":{"description":"Revoked, or nothing matched"},"400":{"description":"invalid_request or unsupported_token_type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"invalid_client: unknown or revoked client, or a request that presents a client secret","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}}}},"webhooks":{},"x-walkeros-subset":"public"}