{"openapi":"3.1.0","info":{"title":"Plansmith API","version":"1.0.0","description":"Plan, spec and push from anything. Credentials act as the person who created them: they reach exactly the plans that person can reach.","contact":{"url":"https://www.plansmith.co/docs/developers/api"}},"servers":[{"url":"https://api.plansmith.co"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Identity","description":"Who a credential is, and what it may do."},{"name":"Projects","description":"Projects, their Context and their formats."},{"name":"Plans","description":"Plans, Specs, dependencies, sharing, prototypes and push."},{"name":"Context","description":"The sources the planning agent reads."},{"name":"Formats","description":"The Spec and Epic document shapes."},{"name":"Skills","description":"The playbooks the agent opens when they are relevant."},{"name":"Connectors","description":"Issue trackers and MCP servers."},{"name":"Credentials","description":"API keys and connected apps."},{"name":"Workspace","description":"Members and invites."},{"name":"Spec","description":"This document."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A personal API key (`psk_…`) or an OAuth access token (`plan_at_…`). Scopes: read, write."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string"},"details":{}},"required":["code","message"]}},"required":["error"]},"Workspace":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["id"]},"ApiKey":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"prefix":{"type":"string"},"scope":{"type":"string","enum":["read","write"]},"lastUsedAt":{"type":["string","null"],"format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","name","prefix","scope","createdAt"]},"Member":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":["string","null"]},"role":{"type":"string","enum":["OWNER","MEMBER","VIEWER"]},"joinedAt":{"type":["string","null"],"format":"date-time"},"isPlatformAdmin":{"type":"boolean"}},"required":["userId","role","isPlatformAdmin"]},"Invite":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["OWNER","MEMBER","VIEWER"]},"status":{"type":"string","enum":["PENDING","ACCEPTED","REVOKED"]},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":["string","null"],"format":"date-time"}},"required":["id","email","role","status","createdAt"]},"OAuthConnection":{"type":"object","properties":{"id":{"type":"string"},"clientId":{"type":"string"},"clientName":{"type":"string"},"scope":{"type":"string","enum":["read","write"]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","clientId","clientName","scope","createdAt"]},"Project":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":["string","null"]},"name":{"type":"string"},"repositoryId":{"type":["string","null"]},"repositoryIds":{"type":"array","items":{"type":"string"}},"repositories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"provider":{"type":"string"},"fullName":{"type":"string"},"defaultBranch":{"type":"string"},"primary":{"type":"boolean"}},"required":["id","provider","fullName","defaultBranch","primary"]}}},"required":["id","name"]},"Dependency":{"type":"object","properties":{"id":{"type":"string"},"fromPlanId":{"type":["string","null"]},"fromSpecId":{"type":["string","null"]},"toPlanId":{"type":["string","null"]},"toSpecId":{"type":["string","null"]}},"required":["id"]},"PushStatus":{"type":"object","properties":{"provider":{"type":"string","enum":["linear","jira","radial"]},"total":{"type":"integer"},"pushedCount":{"type":"integer"},"changedCount":{"type":"integer"},"lastPushedAt":{"type":["string","null"],"format":"date-time"},"neverPushed":{"type":"boolean"},"externalUrl":{"type":["string","null"]},"externalKey":{"type":["string","null"]}},"required":["provider","total","pushedCount","changedCount","neverPushed"]},"Plan":{"type":"object","properties":{"id":{"type":"string"},"shortId":{"type":["string","null"],"description":"The handle, e.g. `PLAN-12`."},"archivedAt":{"type":["string","null"],"format":"date-time","description":"Non-null means the plan is hidden and scheduled for deletion; writes 409."},"name":{"type":"string"},"status":{"type":"string","enum":["PLANNING","READY","PUSHED","BUILDING","DONE"]},"statusLabel":{"type":"string","description":"The word the console shows for `status`."},"projectId":{"type":"string"},"parentPlanId":{"type":["string","null"]},"rootPlanId":{"type":"string"},"visibility":{"type":["string","null"],"enum":["PRIVATE","TEAM",null]},"ownerUserId":{"type":["string","null"]},"capability":{"type":"string","enum":["NONE","READ","EDIT","OWN"],"description":"Your access to this plan. Present on reads that resolve it."},"specCount":{"type":"integer"}},"required":["id","name","status","statusLabel","projectId","rootPlanId"]},"Spec":{"type":"object","properties":{"id":{"type":"string"},"shortId":{"type":"string","description":"The handle within its plan, e.g. `SPEC-3`."},"title":{"type":"string"},"content":{"type":"string","description":"Markdown, including the numbered acceptance criteria."},"status":{"type":"string"},"parentSpecId":{"type":["string","null"]},"parentShortId":{"type":["string","null"]},"needsFirst":{"type":"array","items":{"type":"string"},"description":"SHORT IDS, not uuids, so a client can render \"needs SPEC-3 first\" directly."},"effort":{"type":["integer","null"],"minimum":1,"maximum":5},"effortLabel":{"type":["string","null"],"description":"Low · Med · High."},"readiness":{"type":["integer","null"],"minimum":1,"maximum":5},"readinessLabel":{"type":["string","null"],"description":"Rough · Shaping · Ready."}},"required":["id","shortId","title","content","status","needsFirst"]},"SpecWithCriteria":{"allOf":[{"$ref":"#/components/schemas/Spec"},{"type":"object","properties":{"acceptanceCriteria":{"type":"array","items":{"type":"object","properties":{"id":{"type":["string","null"]},"text":{"type":"string"}}}},"doneWhen":{"type":"array","items":{"type":"string"},"deprecated":true,"description":"DEPRECATED text-only alias of `acceptanceCriteria`, kept for plansmith.co CLI v0.1.x. Labels are stripped, so do not string-match these back against `content`."}}}]},"ContextSource":{"type":"object","properties":{"id":{"type":"string"},"scope":{"type":"string","enum":["TEAM","PROJECT","PLAN"]},"kind":{"type":"string","description":"Free-form source kind, e.g. `prd`."},"sourceKind":{"type":["string","null"],"enum":["PASTED","UPLOADED","URL","RESEARCH",null]},"title":{"type":"string"},"description":{"type":["string","null"]},"tokenCount":{"type":"integer"},"folderPath":{"type":"string","description":"Empty string at the scope root, never null."},"hasFile":{"type":"boolean"},"createdAt":{"type":["string","null"],"format":"date-time"},"updatedAt":{"type":["string","null"],"format":"date-time"},"degraded":{"type":"boolean"},"skipped":{"type":"boolean"},"replaced":{"type":"boolean"},"keptBothAs":{"type":"string"}},"required":["id","scope","kind","title","tokenCount","folderPath","hasFile"]},"ContextSourceDetail":{"allOf":[{"$ref":"#/components/schemas/ContextSource"},{"type":"object","properties":{"text":{"type":["string","null"],"description":"Truncated at 1,000,000 characters."},"textChars":{"type":"integer","description":"The FULL length, even when `text` is truncated."},"url":{"type":["string","null"]}}}]},"Format":{"type":"object","properties":{"kind":{"type":"string","enum":["spec","epic"]},"tier":{"type":"string","enum":["built-in","company","project"]},"markdown":{"type":"string"},"path":{"type":["string","null"]},"problem":{"type":["object","null"],"description":"Set when a saved override exists but could not be read.","properties":{"path":{"type":"string"},"tier":{"type":"string"}}}},"required":["kind","tier","markdown"]},"Skill":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"scope":{"type":"string","enum":["built-in","company","project"]},"path":{"type":"string"},"editable":{"type":"boolean"},"body":{"type":"string","description":"Present on a single-skill read, absent from the list."}},"required":["slug","name","description","scope","path","editable"]},"Connector":{"type":"object","properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["tracker","mcp"]},"provider":{"type":["string","null"],"enum":["linear","jira","radial",null]},"label":{"type":"string"},"vendor":{"type":"string"},"description":{"type":"string"},"connectScope":{"type":"string","enum":["personal","workspace"]},"auth":{"type":"object","properties":{"oauth":{"type":"boolean"},"oauthOnly":{"type":"boolean"},"acceptsApiKey":{"type":"boolean"}}},"tools":{"type":"object","properties":{"enabled":{"type":"boolean"},"curated":{"type":"integer"}}},"connection":{"description":"Discriminated by `scope`: personal grants versus a workspace key.","type":"object"},"links":{"type":"object","properties":{"connect":{"type":"string"},"toolsets":{"type":"string"}}}},"required":["id","kind","label","connectScope","auth","tools","connection","links"]},"PolicyState":{"type":"object","properties":{"workspace":{"type":"boolean"},"project":{"type":["boolean","null"],"description":"null means it follows the workspace."},"effective":{"type":"boolean"}},"required":["workspace","effective"]},"McpServer":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"connectorId":{"type":"string","description":"The `x_`-prefixed connector id."},"label":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"authMode":{"type":"string","enum":["anonymous","bearer"]},"enabled":{"type":"boolean"},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"enabled":{"type":"boolean"},"access":{"type":"string","enum":["read","write"]}}}},"toolCap":{"type":"integer"},"lastProbe":{"type":"object","properties":{"status":{"type":["string","null"]},"error":{"type":["string","null"]},"at":{"type":["string","null"],"format":"date-time"}}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","slug","connectorId","label","url","authMode","enabled","tools"]}}},"paths":{"/v1":{"get":{"operationId":"getV1","summary":"API index, plus the identity of the calling credential when one is sent","tags":["Identity"],"security":[{},{"bearerAuth":[]}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"},"workspace":{"$ref":"#/components/schemas/Workspace"},"scope":{"type":"string","enum":["read","write"]},"credential":{"type":"string","enum":["api_key","oauth"]},"authentication":{"type":"object","description":"How to obtain a credential. Present on the anonymous response only.","additionalProperties":true},"links":{"type":"object","additionalProperties":{"type":"string"}}},"required":["name","version","links"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/api-keys":{"get":{"operationId":"getV1ApiKeys","summary":"List your API keys in this workspace","tags":["Credentials"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/ApiKey"}}},"required":["keys"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ApiKeys","summary":"Mint an API key (the secret is returned once)","tags":["Credentials"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"scope":{"type":"string","enum":["read","write"]}},"required":["name"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ApiKey"},"secret":{"type":"string","description":"Returned once, at creation, and never again."},"message":{"type":"string"}},"required":["key","secret"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/api-keys/{keyId}":{"delete":{"operationId":"deleteV1ApiKeysByKeyId","summary":"Revoke one of your API keys","tags":["Credentials"],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string"},"description":"API key id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/ApiKey"}},"required":["key"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/connectors":{"get":{"operationId":"getV1Connectors","summary":"The connector catalog, with this workspace’s connection status","tags":["Connectors"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"connectors":{"type":"array","items":{"$ref":"#/components/schemas/Connector"}}},"required":["connectors"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/connectors/{connectorId}/connect":{"post":{"operationId":"createV1ConnectorsByConnectorIdConnect","summary":"Connect a tracker or MCP connector","tags":["Connectors"],"parameters":[{"name":"connectorId","in":"path","required":true,"schema":{"type":"string"},"description":"Connector id, e.g. `linear`. Custom servers use the `x_` prefix."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string"},"returnTo":{"type":"string","description":"A local path; anything else is refused."}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["workspace_key","api_key","already_connected","oauth"]},"connected":{"type":"boolean"},"connector":{"type":"string"},"authorizeUrl":{"type":"string","description":"Present when `mode` is `oauth`."},"remainingGrants":{"type":"integer"},"message":{"type":"string"}},"required":["mode","connected","connector"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ConnectorsByConnectorIdConnect","summary":"Disconnect a connector","tags":["Connectors"],"parameters":[{"name":"connectorId","in":"path","required":true,"schema":{"type":"string"},"description":"Connector id, e.g. `linear`. Custom servers use the `x_` prefix."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"disconnected":{"type":"boolean"},"connector":{"type":"string"}},"required":["disconnected","connector"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/connectors/{connectorId}/toolsets":{"get":{"operationId":"getV1ConnectorsByConnectorIdToolsets","summary":"The connector’s MCP toolset","tags":["Connectors"],"parameters":[{"name":"connectorId","in":"path","required":true,"schema":{"type":"string"},"description":"Connector id, e.g. `linear`. Custom servers use the `x_` prefix."},{"name":"projectSlug","in":"query","required":false,"schema":{"type":"string"},"description":"Read the project override instead."},{"name":"refresh","in":"query","required":false,"schema":{"type":"string"},"description":"Pass `true` to re-probe the server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"connectorId":{"type":"string"},"label":{"type":"string"},"enabled":{"$ref":"#/components/schemas/PolicyState"},"toolset":{"type":"object","properties":{"count":{"type":"integer"},"discoveredAt":{"type":["string","null"]},"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"access":{"type":"string","enum":["read","write"]},"description":{"type":"string"}}}}},"required":["count","tools"]}},"required":["connectorId","label","enabled","toolset"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateV1ConnectorsByConnectorIdToolsets","summary":"Enable or disable a connector’s MCP tools","tags":["Connectors"],"parameters":[{"name":"connectorId","in":"path","required":true,"schema":{"type":"string"},"description":"Connector id, e.g. `linear`. Custom servers use the `x_` prefix."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"projectSlug":{"type":"string","description":"Present writes a project override; absent writes the workspace value."}},"required":["enabled"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"connectorId":{"type":"string"},"enabled":{"$ref":"#/components/schemas/PolicyState"}},"required":["connectorId","enabled"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/context":{"get":{"operationId":"getV1Context","summary":"List the Context sources for the workspace","tags":["Context"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/components/schemas/ContextSource"}}},"required":["sources"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1Context","summary":"Attach a Context source to the workspace","tags":["Context"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceKind":{"type":"string","enum":["PASTED","URL"]},"title":{"type":"string"},"kind":{"type":"string","description":"Defaults to `prd`."},"description":{"type":["string","null"]},"text":{"type":"string","description":"Required when `sourceKind` is `PASTED`."},"url":{"type":"string","description":"Required when `sourceKind` is `URL`."}},"required":["sourceKind","title"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSource"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/context/upload":{"post":{"operationId":"createV1ContextUpload","summary":"Upload a file as a Context source (on_conflict: keep_both | replace | skip)","tags":["Context"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"title":{"type":"string","description":"Defaults to the file name."},"kind":{"type":"string"},"description":{"type":"string"},"folderPath":{"type":"string"},"onConflict":{"type":"string","enum":["keep_both","replace","skip"],"description":"Defaults to `keep_both`. `on_conflict` is accepted as an alias."},"expectedSourceId":{"type":"string","format":"uuid"}},"required":["file"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSource"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/context/{sourceId}":{"get":{"operationId":"getV1ContextBySourceId","summary":"Get a Context source","tags":["Context"],"parameters":[{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ContextBySourceId","summary":"Remove a Context source","tags":["Context"],"parameters":[{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."},{"name":"expectedUpdatedAt","in":"query","required":false,"schema":{"type":"string"},"description":"Compare-and-set: a mismatch answers 409 rather than overwriting a newer edit."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/context/{sourceId}/refresh":{"post":{"operationId":"createV1ContextBySourceIdRefresh","summary":"Re-fetch a URL-backed Context source","tags":["Context"],"parameters":[{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/formats/{kind}":{"get":{"operationId":"getV1FormatsByKind","summary":"The resolved Spec or Epic format, with its source tier","tags":["Formats"],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/Format"}},"required":["format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"setV1FormatsByKind","summary":"Set the workspace’s Spec or Epic format (owner only)","tags":["Formats"],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string"}},"required":["markdown"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/Format"}},"required":["format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1FormatsByKind","summary":"Reset the workspace format to the built-in","tags":["Formats"],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"},"format":{"$ref":"#/components/schemas/Format"}},"required":["removed","format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invites":{"get":{"operationId":"getV1Invites","summary":"List pending invites","tags":["Workspace"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"invites":{"type":"array","items":{"$ref":"#/components/schemas/Invite"}}},"required":["invites"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1Invites","summary":"Invite someone to the workspace","tags":["Workspace"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"role":{"type":"string","enum":["MEMBER","VIEWER"]}},"required":["email"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"invite":{"$ref":"#/components/schemas/Invite"}},"required":["invite"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/invites/{inviteId}":{"delete":{"operationId":"deleteV1InvitesByInviteId","summary":"Revoke a pending invite","tags":["Workspace"],"parameters":[{"name":"inviteId","in":"path","required":true,"schema":{"type":"string"},"description":"Invite id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"boolean"}},"required":["revoked"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mcp-servers":{"get":{"operationId":"getV1McpServers","summary":"List this workspace’s own MCP servers","tags":["Connectors"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"servers":{"type":"array","items":{"$ref":"#/components/schemas/McpServer"}},"limit":{"type":"integer"}},"required":["servers","limit"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1McpServers","summary":"Register an MCP server by URL","tags":["Connectors"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"},"apiKey":{"type":["string","null"]},"description":{"type":"string"}},"required":["label","url"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/McpServer"},"probe":{"type":"object","properties":{"toolsDiscovered":{"type":"integer"},"toolsDropped":{"type":"array","items":{"type":"string"}}}},"message":{"type":"string"}},"required":["server"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/mcp-servers/{slug}":{"get":{"operationId":"getV1McpServersBySlug","summary":"Get a registered MCP server","tags":["Connectors"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/McpServer"},"toolset":{"type":"object","properties":{"count":{"type":"integer"},"discoveredAt":{"type":["string","null"]}},"required":["count"]}},"required":["server","toolset"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateV1McpServersBySlug","summary":"Update a registered MCP server","tags":["Connectors"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"apiKey":{"type":["string","null"],"description":"Omit to leave it alone; null clears it."},"tools":{"type":"object","additionalProperties":{"type":"object","properties":{"enabled":{"type":"boolean"},"access":{"type":"string","enum":["read","write"]}}}}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"server":{"$ref":"#/components/schemas/McpServer"},"probe":{"type":"object","properties":{"toolsDiscovered":{"type":"integer"},"toolsDropped":{"type":"array","items":{"type":"string"}}}}},"required":["server"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1McpServersBySlug","summary":"Remove a registered MCP server","tags":["Connectors"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"},"connectorId":{"type":"string"}},"required":["removed","connectorId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/me":{"get":{"operationId":"getV1Me","summary":"Who this credential is, and what it can do","tags":["Identity"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":["string","null"]}},"required":["id"]},"workspace":{"$ref":"#/components/schemas/Workspace"},"role":{"type":["string","null"],"enum":["OWNER","MEMBER","VIEWER",null]},"scope":{"type":"string","enum":["read","write"]},"credential":{"type":"object","properties":{"kind":{"type":"string","enum":["api_key","oauth"]},"id":{"type":"string"}},"required":["kind","id"]}},"required":["user","workspace","scope","credential"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members":{"get":{"operationId":"getV1Members","summary":"List the members of this workspace","tags":["Workspace"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/Member"}}},"required":["members"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/members/{userId}":{"patch":{"operationId":"updateV1MembersByUserId","summary":"Change a member’s role","tags":["Workspace"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"User id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["OWNER","MEMBER","VIEWER"]}},"required":["role"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"member":{"type":"object","properties":{"userId":{"type":"string"},"role":{"type":"string","enum":["OWNER","MEMBER","VIEWER"]}},"required":["userId","role"]}},"required":["member"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1MembersByUserId","summary":"Remove a member (name a successor if they own plans)","tags":["Workspace"],"parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"User id."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"successorUserId":{"type":"string","description":"Required when the member owns plans; the removal 409s without one."}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"}},"required":["removed"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/oauth-connections":{"get":{"operationId":"getV1OauthConnections","summary":"List the apps you have connected","tags":["Credentials"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"connections":{"type":"array","items":{"$ref":"#/components/schemas/OAuthConnection"}}},"required":["connections"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/oauth-connections/{grantId}":{"delete":{"operationId":"deleteV1OauthConnectionsByGrantId","summary":"Disconnect an app and kill its tokens","tags":["Credentials"],"parameters":[{"name":"grantId","in":"path","required":true,"schema":{"type":"string"},"description":"OAuth connection id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"disconnected":{"type":"boolean"}},"required":["disconnected"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"getV1OpenapiJson","summary":"This document, describing every endpoint","tags":["Spec"],"security":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","description":"This document."}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects":{"get":{"operationId":"getV1Projects","summary":"List projects","tags":["Projects"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}},"required":["projects"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1Projects","summary":"Create a project","tags":["Projects"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200}},"required":["name"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/Project"}},"required":["project"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}":{"get":{"operationId":"getV1ProjectsByProjectSlug","summary":"Get a project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/Project"}},"required":["project"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateV1ProjectsByProjectSlug","summary":"Rename a project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200}},"required":["name"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/Project"}},"required":["project"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/context":{"get":{"operationId":"getV1ProjectsByProjectSlugContext","summary":"List the Context sources for a project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sources":{"type":"array","items":{"$ref":"#/components/schemas/ContextSource"}}},"required":["sources"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugContext","summary":"Attach a Context source to a project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceKind":{"type":"string","enum":["PASTED","URL"]},"title":{"type":"string"},"kind":{"type":"string","description":"Defaults to `prd`."},"description":{"type":["string","null"]},"text":{"type":"string","description":"Required when `sourceKind` is `PASTED`."},"url":{"type":"string","description":"Required when `sourceKind` is `URL`."}},"required":["sourceKind","title"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSource"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/context/upload":{"post":{"operationId":"createV1ProjectsByProjectSlugContextUpload","summary":"Upload a file as a Context source (on_conflict: keep_both | replace | skip)","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"title":{"type":"string","description":"Defaults to the file name."},"kind":{"type":"string"},"description":{"type":"string"},"folderPath":{"type":"string"},"onConflict":{"type":"string","enum":["keep_both","replace","skip"],"description":"Defaults to `keep_both`. `on_conflict` is accepted as an alias."},"expectedSourceId":{"type":"string","format":"uuid"}},"required":["file"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSource"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/context/{sourceId}":{"get":{"operationId":"getV1ProjectsByProjectSlugContextBySourceId","summary":"Get a Context source","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugContextBySourceId","summary":"Remove a Context source","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."},{"name":"expectedUpdatedAt","in":"query","required":false,"schema":{"type":"string"},"description":"Compare-and-set: a mismatch answers 409 rather than overwriting a newer edit."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/context/{sourceId}/refresh":{"post":{"operationId":"createV1ProjectsByProjectSlugContextBySourceIdRefresh","summary":"Re-fetch a URL-backed Context source","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/formats/{kind}":{"get":{"operationId":"getV1ProjectsByProjectSlugFormatsByKind","summary":"The format resolved for this project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/Format"}},"required":["format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"setV1ProjectsByProjectSlugFormatsByKind","summary":"Set this project’s format","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string"}},"required":["markdown"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"$ref":"#/components/schemas/Format"}},"required":["format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugFormatsByKind","summary":"Reset this project’s format","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"kind","in":"path","required":true,"schema":{"type":"string"},"description":"Either `spec` or `epic`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"},"format":{"$ref":"#/components/schemas/Format"}},"required":["removed","format"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans":{"get":{"operationId":"getV1ProjectsByProjectSlugPlans","summary":"List the plans you can see in a project","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"status","in":"query","required":false,"schema":{"type":"string"},"description":"Exact match on the lifecycle status."},{"name":"roots","in":"query","required":false,"schema":{"type":"string"},"description":"Pass `true` for top-level plans only."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}},"required":["plans"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugPlans","summary":"Create a plan, or a sub-plan under an existing one","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200},"parent":{"type":["string","null"],"description":"A `PLAN-n` handle or a uuid; creates a sub-plan."},"idea":{"type":"string","description":"The business requirement to plan from."}},"required":["name"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/Plan"}},"required":["plan"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortId","summary":"Get a plan and its epic","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/Plan"},"epic":{"type":"object","properties":{"own":{"type":["string","null"]},"inherited":{"type":["object","null"],"properties":{"planName":{"type":"string"},"content":{"type":"string"}}}}}},"required":["plan","epic"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateV1ProjectsByProjectSlugPlansByPlanShortId","summary":"Rename, re-parent, or move a plan through its lifecycle","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string","enum":["PLANNING","READY","PUSHED","BUILDING","DONE"]},"parent":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/Plan"}},"required":["plan"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortId","summary":"Delete a plan","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"shortId":{"type":["string","null"]}},"required":["deleted"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/context":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdContext","summary":"List the Context sources for a plan","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sources":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/ContextSource"},{"type":"object","properties":{"active":{"type":"boolean","description":"Whether this source is in play for the plan."}}}]}}},"required":["sources"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdContext","summary":"Attach a Context source to a plan","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceKind":{"type":"string","enum":["PASTED","URL"]},"title":{"type":"string"},"kind":{"type":"string","description":"Defaults to `prd`."},"description":{"type":["string","null"]},"text":{"type":"string","description":"Required when `sourceKind` is `PASTED`."},"url":{"type":"string","description":"Required when `sourceKind` is `URL`."}},"required":["sourceKind","title"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSource"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/context/{sourceId}":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdContextBySourceId","summary":"Get a Context source","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdContextBySourceId","summary":"Remove a Context source","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."},{"name":"expectedUpdatedAt","in":"query","required":false,"schema":{"type":"string"},"description":"Compare-and-set: a mismatch answers 409 rather than overwriting a newer edit."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/context/{sourceId}/refresh":{"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdContextBySourceIdRefresh","summary":"Re-fetch a URL-backed Context source","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"sourceId","in":"path","required":true,"schema":{"type":"string"},"description":"Context source id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"source":{"$ref":"#/components/schemas/ContextSourceDetail"}},"required":["source"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/dependencies":{"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdDependencies","summary":"Add a needs-first edge between plans","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"A `SPEC-n` handle. Defaults to the plan itself."},"needsFirst":{"type":"string","description":"`PLAN-3` or `PLAN-3/SPEC-2`."}},"required":["needsFirst"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"dependency":{"$ref":"#/components/schemas/Dependency"}},"required":["dependency"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/dependencies/{edgeId}":{"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdDependenciesByEdgeId","summary":"Remove a needs-first edge","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"edgeId","in":"path","required":true,"schema":{"type":"string"},"description":"Dependency edge id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/epic":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdEpic","summary":"Read a plan’s epic","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"epic":{"type":["string","null"]},"inherited":{"type":["object","null"],"properties":{"planName":{"type":"string"},"content":{"type":"string"}}}}}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"setV1ProjectsByProjectSlugPlansByPlanShortIdEpic","summary":"Replace a plan’s epic","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string"}},"required":["content"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"epic":{"type":"string"},"bytes":{"type":"integer"}},"required":["epic","bytes"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/export":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdExport","summary":"Export a plan as markdown, CSV or JSON","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["md","markdown","csv","json"]},"description":"Defaults to `md`. Markdown and CSV come back as a file download."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"specs":{"type":"array","items":{"$ref":"#/components/schemas/Spec"}}},"required":["name","specs"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/prototype":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdPrototype","summary":"Get the plan’s clickable prototype","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"html","in":"query","required":false,"schema":{"type":"string"},"description":"Pass `1` to download the rendered HTML instead."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"prototype":{"type":["object","null"],"properties":{"status":{"type":"string"},"specsFingerprint":{"type":["string","null"]},"stale":{"type":"boolean"},"htmlBytes":{"type":"integer"},"path":{"type":"string"},"updatedAt":{"type":"string"}}}}}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/prototype/comments":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeComments","summary":"List prototype comments","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"path","in":"query","required":false,"schema":{"type":"string"},"description":"Scope to one prototype file."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"comments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"author_name":{"type":"string"},"body":{"type":"string"},"created_at":{"type":"string"},"anchor":{"type":"object","description":"Omitted when the comment is unanchored."},"resolved_at":{"type":"string","description":"Omitted while the comment is open."},"resolved_by":{"type":"string"},"author_email":{"type":"string"}},"required":["id","author_name","body","created_at"]}},"contentHash":{"type":["string","null"]},"path":{"type":["string","null"]}},"required":["comments"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeComments","summary":"Add a prototype comment","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"body":{"type":"string"},"path":{"type":"string"}},"required":["body"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"object","properties":{"id":{"type":"string"},"author_name":{"type":"string"},"body":{"type":"string"},"created_at":{"type":"string"},"anchor":{"type":"object","description":"Omitted when the comment is unanchored."},"resolved_at":{"type":"string","description":"Omitted while the comment is open."},"resolved_by":{"type":"string"},"author_email":{"type":"string"}},"required":["id","author_name","body","created_at"]}},"required":["comment"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/prototype/comments/{commentId}":{"patch":{"operationId":"updateV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeCommentsByCommentId","summary":"Resolve or reopen a comment","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"},"description":"Prototype comment id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resolved":{"type":"boolean"}},"required":["resolved"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"type":"object","properties":{"id":{"type":"string"},"author_name":{"type":"string"},"body":{"type":"string"},"created_at":{"type":"string"},"anchor":{"type":"object","description":"Omitted when the comment is unanchored."},"resolved_at":{"type":"string","description":"Omitted while the comment is open."},"resolved_by":{"type":"string"},"author_email":{"type":"string"}},"required":["id","author_name","body","created_at"]}},"required":["comment"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeCommentsByCommentId","summary":"Delete a comment","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"commentId","in":"path","required":true,"schema":{"type":"string"},"description":"Prototype comment id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"commentId":{"type":"string"}},"required":["deleted","commentId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/prototype/shares":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeShares","summary":"List live public links for this prototype","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"shares":{"type":"array","items":{"type":"object","properties":{"path":{"type":["string","null"]},"token":{"type":["string","null"],"description":"Null unless you own the plan and the link is live."},"url":{"type":["string","null"]},"expiresAt":{"type":["string","null"]},"revoked":{"type":"boolean"},"live":{"type":"boolean"}},"required":["revoked","live"]}}},"required":["shares"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeShares","summary":"Mint or rotate a public link (owner only)","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"path":{"type":["string","null"],"description":"An `.html` under the plan’s specs root."},"expiresAt":{"type":["string","null"]}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"share":{"type":"object","properties":{"path":{"type":["string","null"]},"token":{"type":["string","null"],"description":"Null unless you own the plan and the link is live."},"url":{"type":["string","null"]},"expiresAt":{"type":["string","null"]},"revoked":{"type":"boolean"},"live":{"type":"boolean"}},"required":["revoked","live"]}},"required":["share"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdPrototypeShares","summary":"Revoke every public link for this plan","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"integer","description":"How many links were killed."}},"required":["revoked"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/push":{"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdPush","summary":"Push a plan and its Specs to the connected tracker","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["linear","jira","radial"]}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"push":{"type":"object","properties":{"status":{"type":"string","const":"pushed"},"provider":{"type":"string","enum":["linear","jira","radial"]},"planShortId":{"type":["string","null"]},"planName":{"type":"string"},"projectExternalId":{"type":"string"},"pushedItemCount":{"type":"integer"},"dependencyCount":{"type":"integer"},"containerCount":{"type":"integer"},"planEdgeCount":{"type":"integer"},"ancestorNames":{"type":"array","items":{"type":"string"}},"caveats":{"type":"array","items":{"type":"string"}},"message":{"type":"string"}},"required":["status","provider","planName","pushedItemCount"]}},"required":["push"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Nothing was pushed. Either an issue changed in the tracker since the last push (`check_in_drift`, with `details.conflicts`), or the check could not run (`check_in_scan_failed`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/push/status":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdPushStatus","summary":"What has been pushed, and what changed since","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"spec","in":"query","required":false,"schema":{"type":"string"},"description":"Narrow to one `SPEC-n`."},{"name":"provider","in":"query","required":false,"schema":{"type":"string"},"description":"Ask about one destination."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/PushStatus"}},"required":["status"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/sharing":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdSharing","summary":"Who this plan is shared with (owner only)","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"sharing":{"type":"object","properties":{"rootPlanId":{"type":"string"},"planName":{"type":"string"},"visibility":{"type":"string","enum":["PRIVATE","TEAM"]},"capability":{"type":"string","enum":["READ","EDIT","OWN"]},"canManage":{"type":"boolean"},"owner":{"type":"object","properties":{"userId":{"type":["string","null"]},"email":{"type":["string","null"]}}},"collaborators":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":["string","null"]},"role":{"type":"string","enum":["VIEWER","EDITOR"]},"orgRole":{"type":["string","null"]},"isPlatformAdmin":{"type":"boolean"}},"required":["userId","role","isPlatformAdmin"]}},"publicLinkCount":{"oneOf":[{"type":"integer"},{"type":"string","const":"unknown"}],"description":"A failed read reports `\"unknown\"`, never 0 — 0 would claim exclusivity it cannot prove."}},"required":["rootPlanId","planName","visibility","capability","canManage","collaborators"]}},"required":["sharing"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/sharing/collaborators":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdSharingCollaborators","summary":"List collaborators (owner only)","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"rootPlanId":{"type":"string"},"owner":{"type":"object","properties":{"userId":{"type":["string","null"]},"email":{"type":["string","null"]}}},"collaborators":{"type":"array","items":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":["string","null"]},"role":{"type":"string","enum":["VIEWER","EDITOR"]},"orgRole":{"type":["string","null"]},"isPlatformAdmin":{"type":"boolean"}},"required":["userId","role","isPlatformAdmin"]}}},"required":["rootPlanId","collaborators"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdSharingCollaborators","summary":"Share a plan with a workspace member","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"email":{"type":"string"},"role":{"type":"string","enum":["VIEWER","EDITOR"]}},"required":["role"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"collaborator":{"type":"object","properties":{"userId":{"type":"string"},"role":{"type":"string","enum":["VIEWER","EDITOR"]}},"required":["userId","role"]},"rootPlanId":{"type":"string"}},"required":["collaborator","rootPlanId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/sharing/collaborators/{userId}":{"patch":{"operationId":"updateV1ProjectsByProjectSlugPlansByPlanShortIdSharingCollaboratorsByUserId","summary":"Change a collaborator’s role","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"User id."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["VIEWER","EDITOR"]}},"required":["role"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"collaborator":{"type":"object","properties":{"userId":{"type":"string"},"role":{"type":"string","enum":["VIEWER","EDITOR"]}},"required":["userId","role"]},"rootPlanId":{"type":"string"}},"required":["collaborator","rootPlanId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdSharingCollaboratorsByUserId","summary":"Remove a collaborator","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"userId","in":"path","required":true,"schema":{"type":"string"},"description":"User id."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"},"userId":{"type":"string"},"rootPlanId":{"type":"string"}},"required":["removed","userId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/sharing/visibility":{"put":{"operationId":"setV1ProjectsByProjectSlugPlansByPlanShortIdSharingVisibility","summary":"Make a plan private or visible to the whole workspace","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"visibility":{"type":"string","enum":["PRIVATE","TEAM"]}},"required":["visibility"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"object","properties":{"id":{"type":"string"},"shortId":{"type":["string","null"]},"visibility":{"type":"string","enum":["PRIVATE","TEAM"]}},"required":["id","visibility"]},"rootPlanId":{"type":"string"},"publicLinkCount":{"oneOf":[{"type":"integer"},{"type":"string","const":"unknown"}],"description":"A failed read reports `\"unknown\"`, never 0 — 0 would claim exclusivity it cannot prove."},"publicLinkWarning":{"type":["string","null"],"description":"Set when live prototype links survive a switch to PRIVATE."}},"required":["plan","rootPlanId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/specs":{"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdSpecs","summary":"Add a Spec to a plan","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"content":{"type":"string"},"effort":{"type":"integer","minimum":1,"maximum":5},"readiness":{"type":"integer","minimum":1,"maximum":5},"parent":{"type":["string","null"],"description":"A `SPEC-n` handle or uuid."},"needsFirst":{"type":"array","items":{"type":"string"},"description":"`SPEC-n` handles in this plan."}},"required":["title"]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"spec":{"$ref":"#/components/schemas/Spec"}},"required":["spec"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/specs/{specShortId}":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdSpecsBySpecShortId","summary":"Get a Spec, including its numbered Acceptance Criteria","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"specShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Spec handle within the plan, e.g. `SPEC-3`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"spec":{"$ref":"#/components/schemas/SpecWithCriteria"},"planShortId":{"type":["string","null"]}},"required":["spec"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateV1ProjectsByProjectSlugPlansByPlanShortIdSpecsBySpecShortId","summary":"Update a Spec","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"specShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Spec handle within the plan, e.g. `SPEC-3`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"string"},"effort":{"type":"integer","minimum":1,"maximum":5},"readiness":{"type":"integer","minimum":1,"maximum":5},"needsFirst":{"type":"array","items":{"type":"string"}},"parent":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"spec":{"$ref":"#/components/schemas/SpecWithCriteria"}},"required":["spec"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugPlansByPlanShortIdSpecsBySpecShortId","summary":"Delete a Spec","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"specShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Spec handle within the plan, e.g. `SPEC-3`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"shortId":{"type":"string"}},"required":["deleted","shortId"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/specs/{specShortId}/promote":{"post":{"operationId":"createV1ProjectsByProjectSlugPlansByPlanShortIdSpecsBySpecShortIdPromote","summary":"Promote a Spec subtree into its own sub-plan","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."},{"name":"specShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Spec handle within the plan, e.g. `SPEC-3`."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"contextSourceIds":{"type":"array","items":{"type":"string","format":"uuid"}}}}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/Plan"},"specs":{"type":"array","items":{"$ref":"#/components/schemas/Spec"}},"shortIdMap":{"type":"object","additionalProperties":{"type":"string"},"description":"Old handle to new handle, for every Spec that moved."},"conversions":{"type":"array","items":{"type":"object","properties":{"direction":{"type":"string","enum":["outbound","inbound"]},"movedSpecShortId":{"type":"string"},"otherSpecShortId":{"type":"string"}}}},"detachedParent":{"type":["object","null"],"properties":{"itemId":{"type":"string"},"formerParentItemId":{"type":"string"}}},"movedContextSourceIds":{"type":"array","items":{"type":"string"}}},"required":["plan","specs","shortIdMap"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/plans/{planShortId}/tree":{"get":{"operationId":"getV1ProjectsByProjectSlugPlansByPlanShortIdTree","summary":"Get a plan with every Spec, sub-plan and dependency in one call","tags":["Plans"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"planShortId","in":"path","required":true,"schema":{"type":"string"},"description":"Plan handle within the project, e.g. `PLAN-12`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"$ref":"#/components/schemas/Plan"},"specs":{"type":"array","items":{"$ref":"#/components/schemas/Spec"}},"subPlans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}},"dependencies":{"type":"array","items":{"$ref":"#/components/schemas/Dependency"}}},"required":["plan","specs","subPlans","dependencies"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/skills":{"get":{"operationId":"getV1ProjectsByProjectSlugSkills","summary":"List a project’s skills","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skills":{"type":"array","items":{"$ref":"#/components/schemas/Skill"}}},"required":["skills"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/projects/{projectSlug}/skills/{slug}":{"get":{"operationId":"getV1ProjectsByProjectSlugSkillsBySlug","summary":"Read a project skill","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skill":{"$ref":"#/components/schemas/Skill"}},"required":["skill"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"setV1ProjectsByProjectSlugSkillsBySlug","summary":"Write a project skill","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string"},"body":{"type":"string"},"name":{"type":"string"}},"required":["description","body"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skill":{"$ref":"#/components/schemas/Skill"}},"required":["skill"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1ProjectsByProjectSlugSkillsBySlug","summary":"Delete a project skill","tags":["Projects"],"parameters":[{"name":"projectSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project slug, e.g. `recipe-box`."},{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"}},"required":["removed"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/skills":{"get":{"operationId":"getV1Skills","summary":"List skills (built-in and workspace)","tags":["Skills"],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skills":{"type":"array","items":{"$ref":"#/components/schemas/Skill"}}},"required":["skills"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/skills/{slug}":{"get":{"operationId":"getV1SkillsBySlug","summary":"Read a workspace skill","tags":["Skills"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skill":{"$ref":"#/components/schemas/Skill"}},"required":["skill"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"setV1SkillsBySlug","summary":"Write a workspace skill (owner only)","tags":["Skills"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string"},"body":{"type":"string"},"name":{"type":"string"}},"required":["description","body"]}}}},"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"skill":{"$ref":"#/components/schemas/Skill"}},"required":["skill"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteV1SkillsBySlug","summary":"Delete a workspace skill (owner only)","tags":["Skills"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug of the skill or MCP server."}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object","properties":{"removed":{"type":"boolean"}},"required":["removed"]}}}},"401":{"description":"An error, in the API's standard envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. A plan you do not have access to answers 404, exactly like a plan that does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. `Retry-After` names the seconds to wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}