{"openapi":"3.1.0","info":{"title":"VibeHost API","version":"dev"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"vh_pat_*"}},"schemas":{},"parameters":{}},"paths":{"/api/v1/account/set-password":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":8,"maxLength":200}},"required":["password"]}}}},"responses":{"200":{"description":"Set password for the authenticated user"}}}},"/api/v1/account/change-password":{"post":{"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"oldPassword":{"type":"string","minLength":1,"maxLength":200},"newPassword":{"type":"string","minLength":8,"maxLength":200}},"required":["oldPassword","newPassword"]}}}},"responses":{"200":{"description":"Change password for the authenticated user"}}}},"/workspaces/{workspaceId}/redeem":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":32}},"required":["code"]}}}},"responses":{"200":{"description":"Redeem a promo/invitation code for the workspace"}}}},"/referral/me":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"Get or create the caller's referral code"}}}},"/referral/code":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":3,"maxLength":32,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},"required":["code"]}}}},"responses":{"200":{"description":"Rename the caller's referral code"}}}},"/referral/list":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"List referrals for the authenticated user"}}}},"/me/referral/bind":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":32}},"required":["code"]}}}},"responses":{"200":{"description":"Bind a referral code (user-scope canonical path)"}}}},"/workspaces/{workspaceId}/referral/bind":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":32}},"required":["code"]}}}},"responses":{"200":{"description":"Bind a referral code (workspace-scoped legacy alias for SP-3 callers in flight)"}}}},"/referral/badge":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"Get unclaimed referral credit badge count"}}}},"/referral/credits":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"List referral credits for the authenticated user"}}}},"/referral/claim":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"creditId":{"type":"string","minLength":1},"workspaceId":{"type":"string","minLength":1}},"required":["creditId","workspaceId"]}}}},"responses":{"200":{"description":"Claim a referral credit to a workspace"}}}},"/workspaces/{workspaceId}/billing/checkout":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"plan":{"type":"string","enum":["free","business"]},"interval":{"type":"string","enum":["month","year"],"default":"month"}},"required":["plan"]}}}},"responses":{"200":{"description":"Start a Stripe checkout session"}}}},"/workspaces/{workspaceId}/billing/checkout-resume":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Resume a pending Stripe checkout session"}}}},"/workspaces/{workspaceId}/billing/cancel":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Schedule subscription cancellation at period end"}}}},"/workspaces/{workspaceId}/billing/reactivate":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Cancel a scheduled subscription cancellation"}}}},"/workspaces/{workspaceId}/billing/portal":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Create a Stripe Customer Portal session"}}}},"/workspaces/{workspaceId}/billing/subscription":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Get workspace subscription and plan details"}}}},"/workspaces/{workspaceId}/billing/usage":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Get workspace storage and bandwidth usage"}}}},"/workspaces/{workspaceId}/billing/can-create-workspace":{"get":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Check whether the caller can create a free workspace"}}}},"/workspaces/{workspaceId}/billing/budget":{"patch":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"501":{"description":"Budget limits (not yet implemented)"}}}},"/workspaces/joinable":{"get":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List workspaces the caller can join"}}}},"/workspaces/invitations/{code}":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Get a workspace invitation by code"}}}},"/workspaces/invitations/{code}/accept":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Accept a workspace invitation"}}}},"/workspaces/invitations/{code}/decline":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Decline a workspace invitation"}}}},"/workspaces":{"get":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List workspaces the caller belongs to"}}},"post":{"security":[{"bearerAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","minLength":2,"maxLength":48,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"name":{"type":"string","minLength":1,"maxLength":80},"plan":{"type":"string","enum":["free","business"],"default":"free"}},"required":["slug","name"]}}}},"responses":{"201":{"description":"Create a new workspace"}}}},"/workspaces/{workspaceId}":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Get workspace details"}}},"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Delete workspace"}}}},"/workspaces/{workspaceId}/policy":{"patch":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"adminCanSeePrivateAppMetadata":{"type":"boolean"},"autoAcceptInvites":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Update workspace policy"}}}},"/workspaces/{workspaceId}/domains":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List workspace email domains"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","minLength":1,"maxLength":253},"tier":{"type":"string","enum":["verified","member"]}},"required":["domain","tier"]}}}},"responses":{"200":{"description":"Add a workspace email domain"}}}},"/workspaces/{workspaceId}/domains/{domainId}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Remove a workspace email domain"}}}},"/workspaces/{workspaceId}/domains/{domainId}/verify":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Verify a workspace email domain via DNS TXT"}}}},"/workspaces/{workspaceId}/members":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List workspace members"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","admin","member"],"default":"member"},"expiresInHours":{"type":"integer","minimum":1,"maximum":720,"default":168}},"required":["email"]}}}},"responses":{"201":{"description":"Add a member to the workspace"}}}},"/workspaces/{workspaceId}/members/{userId}":{"patch":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["owner","admin","member"]}},"required":["role"]}}}},"responses":{"200":{"description":"Change a workspace member's role"}}},"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"200":{"description":"Remove a member from the workspace"}}}},"/workspaces/{workspaceId}/usage":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Get workspace quota and usage"}}}},"/workspaces/{workspaceId}/audit-logs":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string"},"required":false,"name":"before","in":"query"}],"responses":{"200":{"description":"List workspace audit logs"}}}},"/workspaces/{workspaceId}/invitations":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","admin","member"],"default":"member"},"expiresInHours":{"type":"integer","minimum":1,"maximum":720,"default":168}},"required":["email"]}}}},"responses":{"201":{"description":"Invite someone to the workspace"}}},"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List workspace invitations"}}}},"/workspaces/{workspaceId}/invitations/{invitationId}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"invitationId","in":"path"}],"responses":{"200":{"description":"Revoke a pending workspace invitation"}}}},"/workspaces/{workspaceId}/teams":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List teams in the workspace"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","minLength":2,"maxLength":48,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$"},"name":{"type":"string","minLength":1,"maxLength":80}},"required":["slug","name"]}}}},"responses":{"201":{"description":"Create a new team"}}}},"/workspaces/{workspaceId}/teams/{teamId}/join":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Admin joins a team within the workspace"}}}},"/workspaces/{workspaceId}/join":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"Join a workspace via domain match"}}}},"/workspaces/{workspaceId}/admin-mode":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"204":{"description":"Enter admin mode (owner only)"}}},"delete":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"204":{"description":"Exit admin mode"}}}},"/workspaces/{workspaceId}/apps/{appId}/env":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get app environment variables"}}},"put":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Set app environment variables"}}},"delete":{"security":[{"bearerAuth":["env:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":256,"pattern":"^[A-Z_][A-Z0-9_]*$"},"channel":{"type":"string","minLength":1,"maxLength":64}},"required":["key"]}}}},"responses":{"200":{"description":"Remove an env var from an app"}}}},"/workspaces/{workspaceId}/apps/summary":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"deployedBy","in":"query"},{"schema":{"type":"string"},"required":false,"name":"mine","in":"query"},{"schema":{"type":"string"},"required":false,"name":"q","in":"query"}],"responses":{"200":{"description":"Workspace apps summary counts and contributors"}}}},"/workspaces/{workspaceId}/apps":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List apps in a workspace"}}},"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":40,"pattern":"^[a-z][a-z0-9-]*$"},"runtime":{"type":"string","enum":["nextjs","static","skill"],"default":"static"},"primaryTeamId":{"type":"string"},"visibility":{"type":"string","enum":["public","workspace","private"],"default":"private"}},"required":["name"]}}}},"responses":{"201":{"description":"Create an app"}}}},"/workspaces/{workspaceId}/apps/by-name/{name}":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"name","in":"path"}],"responses":{"200":{"description":"Get an app by name"}}}},"/workspaces/{workspaceId}/apps/{appId}/usage":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get per-app bandwidth and storage usage"}}}},"/workspaces/{workspaceId}/apps/{appId}/visibility":{"patch":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"visibility":{"type":"string","enum":["public","workspace","private"]}},"required":["visibility"]}}}},"responses":{"200":{"description":"Update app visibility"}}}},"/workspaces/{workspaceId}/apps/{appId}/og-watermark":{"patch":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"disabled":{"type":"boolean"}},"required":["disabled"]}}}},"responses":{"200":{"description":"Toggle per-app OG watermark"}}}},"/workspaces/{workspaceId}/apps/{appId}":{"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Delete an app"}}},"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get an app by ID"}}}},"/workspaces/{workspaceId}/apps/{appId}/grants/team":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List team grants for an app"}}},"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"role":{"type":"string","enum":["viewer","deployer","admin"]}},"required":["teamId","role"]}}}},"responses":{"201":{"description":"Add team grant to an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/owner":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get app owner"}}}},"/workspaces/{workspaceId}/apps/{appId}/grants/team/{teamId}":{"patch":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["viewer","deployer","admin"]}},"required":["role"]}}}},"responses":{"200":{"description":"Update team grant role on an app"}}},"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Remove team grant from an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/grants/email":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List email grants for an app"}}},"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["viewer","deployer","admin"],"default":"viewer"}},"required":["email"]}}}},"responses":{"201":{"description":"Add email grant to an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/grants/email/{email}":{"patch":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"email","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["viewer","deployer","admin"]}},"required":["role"]}}}},"responses":{"200":{"description":"Update email grant role on an app"}}},"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"email","in":"path"}],"responses":{"200":{"description":"Remove email grant from an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/grants/self":{"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"role":{"type":"string","enum":["viewer","deployer","admin"]}},"required":["role"]}}}},"responses":{"201":{"description":"Self-grant app access"}}}},"/workspaces/{workspaceId}/apps/{appId}/share-links":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List share links for an app"}}},"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"201":{"description":"Create a share link for an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/share-links/{linkId}":{"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"linkId","in":"path"}],"responses":{"200":{"description":"Revoke a share link for an app"}}}},"/workspaces/{workspaceId}/install-tokens":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"scope","in":"query"}],"responses":{"200":{"description":"List install tokens for the workspace"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"forEmail":{"type":"string","format":"email"}}}}}},"responses":{"201":{"description":"Mint a personal install token"}}}},"/workspaces/{workspaceId}/install-tokens/{tokenId}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"tokenId","in":"path"}],"responses":{"200":{"description":"Revoke an install token"}}}},"/workspaces/{workspaceId}/install-tokens/ephemeral":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"201":{"description":"Mint an ephemeral install token"}}}},"/workspaces/{workspaceId}/apps/{appId}/password":{"put":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","minLength":4,"maxLength":1024}},"required":["password"]}}}},"responses":{"200":{"description":"Set or rotate app password protection"}}},"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Clear app password protection"}}},"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get app password protection status"}}}},"/workspaces/{workspaceId}/apps/{appId}/og":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Get OG override state for an app"}}},"put":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"ogTitle":{"type":["string","null"],"minLength":1,"maxLength":200},"ogDescription":{"type":["string","null"],"minLength":1,"maxLength":500}}}}}},"responses":{"200":{"description":"Update OG override for an app"}}},"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":false,"name":"field","in":"query"}],"responses":{"200":{"description":"Delete OG override (or a single field) for an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/og/image":{"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Upload OG image for an app"}}}},"/api/v1/workspaces/{workspaceId}/apps/{appId}/access-requests":{"get":{"security":[{"bearerAuth":["apps:read"]}],"responses":{"200":{"description":"List pending access requests for an app"}}}},"/api/v1/workspaces/{workspaceId}/apps/{appId}/access-requests/{requestId}/{action}":{"post":{"security":[{"bearerAuth":["apps:write"]}],"responses":{"200":{"description":"Approve or deny an access request (dashboard 1-click)"}}}},"/api/v1/me/pending-access-requests":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"Pending access requests across all apps the user admins"}}}},"/api/v1/me/pending-access-requests/mark-seen":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"responses":{"200":{"description":"Mark pending-access-request inbox as seen"}}}},"/workspaces/{workspaceId}/pats":{"post":{"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"expiresInDays":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":3650},{"type":"null"}]},"scopes":{"type":"array","items":{"type":"string","enum":["apps:read","apps:write","apps:deploy","domains:read","domains:write","env:read","env:write","members:read","members:write","billing:read","workspace:read","workspace:write"]},"minItems":1},"resources":{"type":"object","properties":{"apps":{"type":"array","items":{"type":"string","minLength":1}},"domains":{"type":"array","items":{"type":"string","minLength":1}},"env":{"type":"array","items":{"type":"string","minLength":1}}},"additionalProperties":false}},"required":["name","expiresInDays"]}}}},"responses":{"200":{"description":"Create a personal access token"}}},"get":{"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List personal access tokens"}}}},"/workspaces/{workspaceId}/pats/{patId}":{"delete":{"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"patId","in":"path"}],"responses":{"200":{"description":"Revoke a personal access token"}}}},"/workspaces/{workspaceId}/teams/{teamId}":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Get a team"}}},"patch":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Update a team"}}},"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Delete a team"}}}},"/workspaces/{workspaceId}/teams/{teamId}/usage":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Get workspace usage (team-scoped URL)"}}}},"/workspaces/{workspaceId}/teams/{teamId}/invitations":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["member","manager"],"default":"member"},"expiresInHours":{"type":"integer","minimum":1,"maximum":720,"default":168}},"required":["email"]}}}},"responses":{"201":{"description":"Invite a member to the team"}}},"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"List team invitations"}}}},"/workspaces/{workspaceId}/teams/{teamId}/invitations/{invitationId}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"invitationId","in":"path"}],"responses":{"200":{"description":"Revoke a pending team invitation"}}}},"/teams/invitations/{code}":{"get":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Get an invitation by code"}}}},"/teams/invitations/{code}/accept":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Accept a team invitation"}}}},"/teams/invitations/{code}/decline":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"code","in":"path"}],"responses":{"200":{"description":"Decline a team invitation"}}}},"/workspaces/{workspaceId}/teams/{teamId}/members":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"List team members"}}}},"/workspaces/{workspaceId}/teams/{teamId}/members/{userId}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"userId","in":"path"}],"responses":{"200":{"description":"Remove a member from the team"}}}},"/workspaces/{workspaceId}/teams/{teamId}/leave":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"teamId","in":"path"}],"responses":{"200":{"description":"Leave a team"}}}},"/workspaces/{workspaceId}/apps/{appId}/domains":{"get":{"security":[{"bearerAuth":["domains:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List custom domains for an app"}}},"post":{"security":[{"bearerAuth":["domains:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"hostname":{"type":"string","minLength":3,"maxLength":253},"channelId":{"type":["string","null"]}},"required":["hostname"]}}}},"responses":{"201":{"description":"Add a custom domain to an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/domains/{domainId}/verify":{"post":{"security":[{"bearerAuth":["domains:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Trigger DNS verification for a custom domain"}}}},"/workspaces/{workspaceId}/apps/{appId}/domains/{domainId}":{"delete":{"security":[{"bearerAuth":["domains:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"domainId","in":"path"}],"responses":{"200":{"description":"Remove a custom domain from an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/redirects":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List redirect rules for an app"}}},"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":2048},"destination":{"type":"string","minLength":1,"maxLength":2048},"statusCode":{"type":"integer"},"isRewrite":{"type":"boolean"},"priority":{"type":"integer","minimum":0}},"required":["source","destination"]}}}},"responses":{"201":{"description":"Create a redirect rule for an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/redirects/{ruleId}":{"put":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"ruleId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":2048},"destination":{"type":"string","minLength":1,"maxLength":2048},"statusCode":{"type":"integer"},"isRewrite":{"type":"boolean"},"priority":{"type":"integer","minimum":0}}}}}},"responses":{"200":{"description":"Update a redirect rule"}}},"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"ruleId","in":"path"}],"responses":{"200":{"description":"Delete a redirect rule"}}}},"/workspaces/{workspaceId}/apps/{appId}/redirects/bulk":{"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":2048},"destination":{"type":"string","minLength":1,"maxLength":2048},"statusCode":{"type":"integer"},"isRewrite":{"type":"boolean"},"priority":{"type":"integer","minimum":0}},"required":["source","destination"]},"minItems":1,"maxItems":1000}},"required":["rules"]}}}},"responses":{"201":{"description":"Bulk import redirect rules for an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/redirects/sync":{"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"Force-sync redirect rules for an app to the dispatcher"}}}},"/workspaces/{workspaceId}/apps/{appId}/deploy":{"post":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"201":{"description":"Deploy an app via raw tarball"}}}},"/workspaces/{workspaceId}/apps/{appId}/deploy-zip":{"post":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"201":{"description":"Deploy from zip file"}}}},"/workspaces/{workspaceId}/apps/{appId}/deploy-manifest":{"post":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"201":{"description":"Deploy from blob manifest"}}}},"/workspaces/{workspaceId}/apps/{appId}/rollback":{"post":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"201":{"description":"Rollback app to previous healthy release"}}}},"/workspaces/{workspaceId}/apps/{appId}/deployments":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List deployments for an app"}}}},"/workspaces/{workspaceId}/deployments/{deploymentId}":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"Get a deployment"}}}},"/workspaces/{workspaceId}/deployments/{deploymentId}/logs":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"Get deployment logs"}}}},"/workspaces/{workspaceId}/deployments/{deploymentId}/files":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"List deployment file manifest"}}}},"/workspaces/{workspaceId}/deployments/{deploymentId}/files/content":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"Get deployment file content"}}}},"/workspaces/{workspaceId}/apps/{appId}/deployments/{deploymentId}/download":{"get":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"deploymentId","in":"path"}],"responses":{"200":{"description":"Download deployment as gzip tarball"}}}},"/workspaces/{workspaceId}/apps/{appId}/channels":{"get":{"security":[{"bearerAuth":["apps:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"responses":{"200":{"description":"List preview channels for an app"}}}},"/workspaces/{workspaceId}/apps/{appId}/channels/{name}":{"delete":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"name","in":"path"}],"responses":{"200":{"description":"Delete a preview channel"}}}},"/workspaces/{workspaceId}/apps/{appId}/promote":{"post":{"security":[{"bearerAuth":["apps:deploy"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"appId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"deploymentId":{"type":"string"},"toChannel":{"type":"string"}}}}}},"responses":{"201":{"description":"Promote a deployment to a channel"}}}},"/hosts":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"responses":{"200":{"description":"List registered hosts"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"dockerEndpoint":{"type":"string"},"tlsCa":{"type":"string"},"tlsCert":{"type":"string"},"tlsKey":{"type":"string"}},"required":["name","dockerEndpoint"]}}}},"responses":{"201":{"description":"Register a new host"}}}},"/hosts/{idOrName}":{"delete":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"idOrName","in":"path"}],"responses":{"200":{"description":"Remove a host by id or name"}}}},"/workspaces/{workspaceId}/oauth-clients":{"get":{"security":[{"bearerAuth":["workspace:read"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"responses":{"200":{"description":"List OAuth clients for a workspace"}}},"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":280},"redirectUris":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":10}},"required":["name","redirectUris"]}}}},"responses":{"200":{"description":"Create an OAuth client owned by the workspace"}}}},"/workspaces/{workspaceId}/oauth-clients/{clientId}/revoke":{"post":{"security":[{"bearerAuth":["workspace:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"},{"schema":{"type":"string"},"required":true,"name":"clientId","in":"path"}],"responses":{"200":{"description":"Revoke an OAuth client and its issued tokens"}}}},"/authorized-apps":{"get":{"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"List authorized OAuth applications for the current user"}}}},"/authorized-apps/{consentId}/revoke":{"post":{"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"consentId","in":"path"}],"responses":{"200":{"description":"Revoke an authorized application consent"}}}},"/workspaces/{workspaceId}/gc":{"post":{"security":[{"bearerAuth":["apps:write"]}],"parameters":[{"schema":{"type":"string"},"required":true,"name":"workspaceId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"keepPerChannel":{"type":"integer","exclusiveMinimum":0},"dryRun":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Garbage-collect workspace deployments"}}}}},"webhooks":{}}