{"openapi":"3.1.1","info":{"title":"MoveRoom HTTP API","version":"1.0.0","description":"Existing application HTTP endpoints. This is not a general-purpose booking API. Booking, waiver acceptance, and live-room access use authenticated product workflows. Webhooks and cron are restricted service integrations. Browser redirect endpoints retain redirects. HEAD is available wherever GET is listed; OPTIONS reports allowed methods."},"servers":[{"url":"https://moveroom.app"}],"paths":{"/api/v1/public/classes":{"get":{"operationId":"searchPublicClasses","summary":"Search upcoming public classes","description":"Read-only marketplace discovery for published classes from approved MoveRoom businesses. Returns only public class details, instructor display names, business names, state/timezone location data, and upcoming scheduled occurrences. It never creates bookings or exposes participant, payment, waiver, room, or private class data.","parameters":[{"name":"q","in":"query","description":"Search class title, description, category, instructor, or business name.","schema":{"type":"string","maxLength":160}},{"name":"category","in":"query","schema":{"type":"string","maxLength":160}},{"name":"instructor","in":"query","description":"Filter by instructor display name.","schema":{"type":"string","maxLength":160}},{"name":"from","in":"query","description":"Only occurrences starting at or after this ISO-8601 date/time.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","description":"Only occurrences starting at or before this ISO-8601 date/time.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Upcoming public classes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicClassesResponse"}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/ready":{"get":{"operationId":"getReadiness","summary":"Check application readiness","responses":{"200":{"description":"Application is ready.","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"const":"ready"}}}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Not ready. Includes status: not_ready; no configuration details are exposed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/public/waivers/{waiverId}":{"get":{"operationId":"downloadWaiver","summary":"Download a published participant agreement version","parameters":[{"name":"waiverId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Agreement text attachment. This does not record acceptance.","headers":{"Content-Disposition":{"schema":{"type":"string"}}},"content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/client-errors":{"post":{"operationId":"reportClientError","summary":"Report an application render error","description":"For MoveRoom's application client. Do not send fabricated reports, free-form messages, or personal data.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["digest","path"],"properties":{"digest":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,128}$"},"path":{"type":"string","pattern":"^/","maxLength":500}}}}}},"responses":{"202":{"description":"Report accepted. Empty response body."},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/insurance":{"post":{"operationId":"uploadInsuranceDocument","summary":"Upload an instructor insurance policy document","security":[{"browserSession":[]}],"description":"Requires an authenticated instructor in editable onboarding and a saved policy draft owned by that instructor. This browser form endpoint is separate from the public class-discovery API.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["policyId","documentType","file"],"properties":{"policyId":{"type":"string","format":"uuid"},"documentType":{"enum":["certificate","policy","declarations","other"]},"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Stored policy document.","content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","required":["id","documentType","fileName"],"properties":{"id":{"type":"string","format":"uuid"},"documentType":{"type":"string"},"fileName":{"type":"string"}}}}}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/media":{"post":{"operationId":"createMedia","summary":"Upload or generate a business image","security":[{"browserSession":[]}],"description":"Requires instructor membership and manage_classes or manage_site capability. Generation uses the configured provider.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["mode","scope","purpose","description"],"properties":{"mode":{"const":"generate"},"scope":{"enum":["class","site"]},"purpose":{"enum":["class","logo","hero","about"]},"description":{"type":"string"}}}},"multipart/form-data":{"schema":{"type":"object","required":["scope","file"],"properties":{"scope":{"enum":["class","site"]},"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"Stored image URL.","content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"}}}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/cron":{"post":{"operationId":"runDueJobs","summary":"Run due background jobs (operator only)","security":[{"cronBearer":[]},{"cronHeader":[]}],"responses":{"200":{"description":"Due job results.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/hms/webhook":{"post":{"operationId":"receiveHmsWebhook","summary":"Receive a 100ms provider event","security":[{"hmsSecret":[]},{"hmsSecretAlias":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Provider event acknowledged, including duplicate or ignored state.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/mailgun/webhook":{"post":{"operationId":"receiveMailgunWebhook","summary":"Receive a signed Mailgun provider event","description":"Requires a valid Mailgun HMAC signature in the body; only the provider or an authorized integration operator should call this endpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signature"],"properties":{"signature":{"type":"object","required":["timestamp","token","signature"],"properties":{"timestamp":{"type":"string"},"token":{"type":"string"},"signature":{"type":"string"}}},"event-data":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Provider event acknowledged.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/stripe/webhook":{"post":{"operationId":"receiveStripeWebhook","summary":"Receive a signed Stripe event","security":[{"stripeSignature":[]}],"description":"The Stripe-Signature header must authenticate the exact raw request body using the configured webhook secret.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"responses":{"200":{"description":"Event acknowledged.","content":{"application/json":{"schema":{"type":"object","required":["received","duplicate"],"properties":{"received":{"const":true},"duplicate":{"type":"boolean"}}}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/stripe/connect/account-session":{"post":{"operationId":"createConnectSession","summary":"Create an embedded payout setup session","security":[{"browserSession":[]}],"description":"Requires instructor financial access. May create a connected account and records a financial audit event. Intended for the authenticated payout setup UI.","responses":{"200":{"description":"Sensitive session credential; never cache or share it.","content":{"application/json":{"schema":{"type":"object","required":["clientSecret","phoneRejected"],"properties":{"clientSecret":{"type":"string"},"phoneRejected":{"type":"boolean"}}}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/stripe/connect/return":{"get":{"operationId":"returnFromConnect","summary":"Browser callback after payout setup","security":[{"browserSession":[]}],"description":"Synchronizes the connected account and records an audit event. Browser navigation only; auth failures may redirect to login or verification.","responses":{"307":{"description":"Redirect to billing or authentication.","headers":{"Location":{"schema":{"type":"string"}}}},"500":{"description":"Browser error response."}}}},"/api/stripe/connect/refresh":{"get":{"operationId":"refreshConnect","summary":"Return the browser to billing","responses":{"307":{"description":"Redirect to /app/instructor/billing.","headers":{"Location":{"schema":{"type":"string"}}}}}}},"/api/video-room/reentry":{"post":{"operationId":"requestRoomReentry","summary":"Request re-entry after an explicit room removal","security":[{"browserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessId","occurrenceId"],"properties":{"businessId":{"type":"string","format":"uuid"},"occurrenceId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Re-entry request submitted.","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"const":"pending"}}}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/video-room/reentry-requests":{"get":{"operationId":"listRoomReentryRequests","summary":"List pending room re-entry requests","security":[{"browserSession":[]}],"parameters":[{"name":"businessId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"occurrenceId","in":"query","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Pending requests for the authenticated host.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"reviewRoomReentryRequest","summary":"Approve or reject a room re-entry request","security":[{"browserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessId","occurrenceId","requestId","decision"],"properties":{"businessId":{"type":"string","format":"uuid"},"occurrenceId":{"type":"string","format":"uuid"},"requestId":{"type":"string","format":"uuid"},"decision":{"enum":["approved","rejected"]}}}}}},"responses":{"200":{"description":"Request decision recorded.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/video-room/participant-removal":{"post":{"operationId":"recordRoomParticipantRemoval","summary":"Record an explicit participant removal","security":[{"browserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessId","occurrenceId","studentUserId"],"properties":{"businessId":{"type":"string","format":"uuid"},"occurrenceId":{"type":"string","format":"uuid"},"studentUserId":{"type":"string","format":"uuid"},"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"Removal recorded.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"clearRoomParticipantRemoval","summary":"Clear a persisted participant removal after provider failure","security":[{"browserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["businessId","occurrenceId","studentUserId"],"properties":{"businessId":{"type":"string","format":"uuid"},"occurrenceId":{"type":"string","format":"uuid"},"studentUserId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Removal cleared.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"schema":{"type":"string"},"description":"Seconds to wait."}}},"500":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error. Existing error text is retained; code, message, and hint are additive.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error","code","message","hint"],"properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}},"PublicClassesResponse":{"type":"object","required":["data","pagination","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PublicClass"}},"pagination":{"type":"object","required":["limit","offset","hasMore","nextOffset"],"properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hasMore":{"type":"boolean"},"nextOffset":{"type":["integer","null"]}}},"links":{"type":"object","properties":{"self":{"type":"string","format":"uri"}}}}},"PublicClass":{"type":"object","required":["id","slug","title","price","instructor","business","location","occurrence","links"],"properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"imageUrl":{"type":["string","null"],"format":"uri"},"category":{"type":["string","null"]},"skillLevel":{"type":["string","null"]},"equipment":{"type":["string","null"]},"durationMinutes":{"type":"integer"},"price":{"type":"object","required":["amount","currency"],"properties":{"amount":{"type":"number"},"currency":{"type":"string"}}},"recurrenceType":{"type":"string"},"instructor":{"type":"object","required":["id","name"],"properties":{"id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]}}},"business":{"type":"object","required":["id","name","slug"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"category":{"type":["string","null"]}}},"location":{"type":"object","properties":{"state":{"type":["string","null"]},"timezone":{"type":"string"}}},"occurrence":{"type":"object","required":["id","startsAt","endsAt","timezone"],"properties":{"id":{"type":"string","format":"uuid"},"startsAt":{"type":"string","format":"date-time"},"endsAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"}}},"links":{"type":"object","required":["business","class"],"properties":{"business":{"type":"string","format":"uri"},"class":{"type":"string","format":"uri"}}}}}},"securitySchemes":{"browserSession":{"type":"apiKey","in":"cookie","name":"sb-iuiqsoqntyeexjyiytvv-auth-token","description":"Existing browser session cookie (may be chunked with .0, .1 suffixes). Authenticate via /login. No agent API token is issued."},"cronBearer":{"type":"http","scheme":"bearer","description":"Configured CRON_SECRET."},"cronHeader":{"type":"apiKey","in":"header","name":"x-cron-secret"},"hmsSecret":{"type":"apiKey","in":"header","name":"x-moveroom-hms-webhook-secret"},"hmsSecretAlias":{"type":"apiKey","in":"header","name":"x-hms-webhook-secret"},"stripeSignature":{"type":"apiKey","in":"header","name":"stripe-signature","description":"Stripe timestamped HMAC signature; not a reusable API key."}}}}