{"openapi":"3.1.0","info":{"title":"Fluos HTTP API","summary":"Public Fluos discovery, documentation, search, and inbound webhook API.","description":"Fluos is an AI motion agent. This specification describes the public discovery HTTP surface and the paid video API.\n\nPublic operations (docs search, OpenAPI, the docs MCP at `/api/v1/mcp`) do not require a session.\nPaid video operations under `/api/v1/videos`, `/api/v1/assets`, `/api/v1/projects`, `/api/v1/exports`, and `/api/v1/mcp/app` require a Clerk OAuth bearer token on a paid plan.\n\nEvery operation has a unique `operationId` and typed JSON request/response schemas so agents can register function-calling tools from this document.\n\n## Versioning\n\nFluos versions its public HTTP API in the URL path (/api/v1/) and with the API-Version header. The current version is 1. Unversioned aliases such as /api/search and /openapi.json are equivalent to v1. Breaking changes ship as a new path prefix (/api/v2/) rather than silently changing v1. Deprecated versions and operations send Deprecation (RFC 9745) and Sunset (RFC 8594) response headers, plus a Link header with rel=\"deprecation\" and rel=\"successor-version\", at least 180 days before removal. Agents should pin integrations to /api/v1/ and honor Sunset / Retry-After rather than calling unversioned product routes.\n\n## Rate limits\n\nPublic Fluos HTTP endpoints are limited to 120 requests per 60 seconds per client IP. Every response includes RateLimit, RateLimit-Policy, RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset (plus X-RateLimit-* aliases). When the quota is exhausted the API returns 429 Too Many Requests with Retry-After set to the remaining window in seconds. Authenticated dashboard routes (/api/chat, /api/exports) and inbound provider webhooks are not governed by this public discovery quota.\n\nDeveloper resources:\n- Fluos developer resources: https://www.fluos.io/developers\n- Fluos OpenAPI specification: https://www.fluos.io/openapi.json\n- Fluos API v1 OpenAPI specification: https://www.fluos.io/api/v1/openapi.json\n- Fluos developer documentation: https://www.fluos.io/docs/developers\n- Fluos API reference: https://www.fluos.io/docs/api\n- Fluos API versioning and deprecation: https://www.fluos.io/docs/api-versioning\n- Fluos API authentication: https://www.fluos.io/docs/authentication\n- Fluos webhooks: https://www.fluos.io/docs/webhooks\n- Fluos MCP server: https://www.fluos.io/mcp\n- Fluos MCP documentation: https://www.fluos.io/docs/mcp\n- Fluos CLI: https://www.fluos.io/cli\n- Fluos CLI documentation: https://www.fluos.io/docs/cli\n- Fluos llms.txt: https://www.fluos.io/llms.txt\n- Fluos llms-full.txt: https://www.fluos.io/llms-full.txt\n- Fluos AI policy: https://www.fluos.io/ai.txt","version":"1.0.0","contact":{"name":"Fluos","email":"ask@fluos.io","url":"https://www.fluos.io/developers"},"license":{"name":"Terms of Service","url":"https://www.fluos.io/terms"}},"servers":[{"url":"https://www.fluos.io","description":"Fluos production. Canonical public API paths are under /api/v1/. Unversioned aliases resolve to v1."}],"tags":[{"name":"Discovery","description":"Machine-readable indexes (OpenAPI, llms.txt, sitemap, AI policy)."},{"name":"Content","description":"Public pages that negotiate HTML vs Markdown via Accept."},{"name":"Search","description":"Documentation full-text search."},{"name":"Webhooks","description":"Inbound provider webhooks. Not callable by third parties without a valid signature."},{"name":"Versioning","description":"Canonical /api/v1/ aliases, OpenAPI, and MCP."},{"name":"Video","description":"Paid video jobs: generate, edit, compose, mix, and export. Clerk OAuth required."}],"paths":{"/openapi.json":{"get":{"operationId":"getFluosOpenApiSpec","summary":"Download the Fluos OpenAPI specification","description":"Returns this OpenAPI 3.1 document. Agents should fetch it to discover operationIds, typed parameters, and response schemas for function calling.","tags":["Discovery"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"OpenAPI 3.1 document.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}},"/llms.txt":{"get":{"operationId":"getFluosLlmsTxt","summary":"Fetch the Fluos llms.txt index","description":"Curated Markdown index of Fluos product, audience, docs, and developer URLs.","tags":["Discovery"],"responses":{"200":{"description":"Fetch the Fluos llms.txt index","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getFluosLlmsFullTxt","summary":"Fetch the Fluos full-text llms dump","description":"llms.txt plus processed documentation bodies for offline agent context.","tags":["Discovery"],"responses":{"200":{"description":"Fetch the Fluos full-text llms dump","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/ai.txt":{"get":{"operationId":"getFluosAiTxt","summary":"Fetch the Fluos AI crawler policy","description":"Preferred resources and contact for AI systems crawling Fluos.","tags":["Discovery"],"responses":{"200":{"description":"Fetch the Fluos AI crawler policy","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getFluosSitemap","summary":"Fetch the Fluos XML sitemap","description":"Complete list of public Fluos URLs.","tags":["Discovery"],"responses":{"200":{"description":"Fetch the Fluos XML sitemap","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/robots.txt":{"get":{"operationId":"getFluosRobotsTxt","summary":"Fetch robots.txt","description":"Crawler rules. AI crawlers are allowed on public pages; /api and /dashboard are disallowed.","tags":["Discovery"],"responses":{"200":{"description":"Fetch robots.txt","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/feed.xml":{"get":{"operationId":"getFluosRssFeed","summary":"Fetch the Fluos blog RSS feed","description":"RSS 2.0 feed of published Fluos blog posts.","tags":["Discovery"],"responses":{"200":{"description":"Fetch the Fluos blog RSS feed","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/rss+xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/TextFileDocument"}}}}}}},"/":{"get":{"operationId":"getFluosHome","summary":"Fluos homepage","description":"Product overview for the Fluos AI motion agent. Markdown includes the definition, audience pages, and agent links.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/developers":{"get":{"operationId":"getFluosDevelopers","summary":"Fluos developer resources","description":"Human and agent hub listing the OpenAPI spec, auth docs, webhooks, CLI, MCP server, and llms.txt.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/studio":{"get":{"operationId":"getFluosStudio","summary":"Fluos Studio","description":"The Fluos studio — chat plus a live preview. Brief a video, watch it build, then export MP4.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/cli":{"get":{"operationId":"getFluosCli","summary":"Fluos CLI","description":"Official Fluos command-line tool. Install with `npx fluos` or `npm install -g fluos`.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/mcp":{"get":{"operationId":"getFluosMcp","summary":"Fluos MCP server","description":"Official Fluos Model Context Protocol server documentation and connection URL.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/docs":{"get":{"operationId":"getFluosDocsIndex","summary":"Fluos documentation index","description":"Start page for Fluos product documentation. Also available as `/docs.mdx` and via Accept: text/markdown.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/docs/{slug}":{"get":{"operationId":"getFluosDocPage","summary":"Fluos documentation page","description":"A single Fluos docs article. `slug` is the path after `/docs/`, for example `getting-started` or `api`. Append `.md` or `.mdx` for the raw Markdown sibling.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"},{"name":"slug","in":"path","required":true,"description":"Documentation path without the `/docs/` prefix.","schema":{"type":"string","examples":["getting-started","api","authentication","webhooks"]}}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"404":{"description":"Unknown docs slug. Markdown body lists sitemap, llms.txt, and developer links.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/NotFoundMarkdown"}},"text/html":{"schema":{"type":"string"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/about":{"get":{"operationId":"getFluosAbout","summary":"About Fluos","description":"Company and product story.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/pricing":{"get":{"operationId":"getFluosPricing","summary":"Fluos pricing","description":"Free and Pro (pay-what-you-want) plans, plus pricing FAQ.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/enterprise":{"get":{"operationId":"getFluosEnterprise","summary":"Fluos enterprise","description":"Team deployment, brand systems, and enterprise support.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/contact":{"get":{"operationId":"getFluosContact","summary":"Contact Fluos","description":"Support, partnerships, press, and careers routing.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/contact-sales":{"get":{"operationId":"getFluosContactSales","summary":"Contact Fluos sales","description":"Enterprise sales intake.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/blog":{"get":{"operationId":"getFluosBlogIndex","summary":"Fluos blog index","description":"Published Fluos articles.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/blog/{slug}":{"get":{"operationId":"getFluosBlogPost","summary":"Fluos blog post","description":"A published Fluos article. Markdown includes excerpt, metadata, and FAQ when present.","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"},{"name":"slug","in":"path","required":true,"description":"Blog post slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"404":{"description":"Unknown post.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/NotFoundMarkdown"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/use-cases/{slug}":{"get":{"operationId":"getFluosUseCase","summary":"Fluos use-case page","description":"A Fluos use-case landing page (social ads, launches, brand kits, explainers).","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"},{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["social-ads","product-launch-videos","brand-motion-kits","explainers"]}}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/for/{slug}":{"get":{"operationId":"getFluosAudiencePage","summary":"Fluos audience page","description":"Audience landing page (`marketing`, `founders`, `product`, `sales`, `educators`).","tags":["Content"],"parameters":[{"$ref":"#/components/parameters/Accept"},{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["marketing","founders","product","sales","educators"]}}],"responses":{"200":{"description":"The page in the negotiated representation.","headers":{"Vary":{"description":"Must include Accept so caches store HTML, Markdown, and JSON separately.","schema":{"type":"string","examples":["Accept"]}},"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}},"application/json":{"schema":{"$ref":"#/components/schemas/PageDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML, Markdown, and JSON).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}},"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/search":{"get":{"operationId":"searchFluosDocs","summary":"Search Fluos documentation","description":"Full-text search over Fluos docs (Orama via fumadocs). Public, no authentication. Use for agent retrieval before answering product questions. Canonical versioned alias: `/api/v1/search`.","tags":["Search"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"query","in":"query","required":false,"description":"Search query (fumadocs/Orama). Empty or omitted returns an empty hit list.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Alias of `query` for agents and the Fluos CLI.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search hits.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocsSearchResponse"}}}},"429":{"description":"Rate limit exceeded. Honor Retry-After and RateLimit-Reset.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/webhooks/clerk":{"post":{"operationId":"receiveClerkWebhook","summary":"Clerk inbound webhook","description":"Receives Clerk user lifecycle events. Requires a valid Svix signature (`svix-id`, `svix-timestamp`, `svix-signature`) using `CLERK_WEBHOOK_SIGNING_SECRET`. Third parties cannot call this as a general API.","tags":["Webhooks"],"parameters":[{"name":"svix-id","in":"header","required":true,"schema":{"type":"string"},"description":"Svix message id."},{"name":"svix-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Svix timestamp."},{"name":"svix-signature","in":"header","required":true,"schema":{"type":"string"},"description":"Svix signature header."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClerkWebhookPayload"}}}},"responses":{"200":{"description":"Event accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAck"}}}},"400":{"description":"Signature verification failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/stripe/webhook":{"post":{"operationId":"receiveStripeWebhook","summary":"Stripe inbound webhook","description":"Receives Stripe billing events. Requires `stripe-signature` verified with `STRIPE_WEBHOOK_SECRET`. Not a public write API.","tags":["Webhooks"],"parameters":[{"name":"stripe-signature","in":"header","required":true,"schema":{"type":"string"},"description":"Stripe-Signature header."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeWebhookPayload"}}}},"responses":{"200":{"description":"Event accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAck"}}}},"400":{"description":"Missing or invalid signature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/webhooks/resend":{"post":{"operationId":"receiveResendWebhook","summary":"Resend inbound webhook","description":"Receives Resend email events (open tracking). Requires Svix headers verified with `RESEND_WEBHOOK_SECRET`.","tags":["Webhooks"],"parameters":[{"name":"svix-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"svix-timestamp","in":"header","required":true,"schema":{"type":"string"}},{"name":"svix-signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendWebhookPayload"}}}},"responses":{"200":{"description":"Event accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAck"}}}},"400":{"description":"Signature verification failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/v1/search":{"get":{"operationId":"searchFluosDocsV1","summary":"Search Fluos documentation (API v1)","description":"Canonical versioned Fluos docs search. Same payload as `/api/search`. Send `API-Version: 1` or rely on the `/api/v1/` path.","tags":["Search","Versioning"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"query","in":"query","required":false,"description":"Search query (fumadocs/Orama). Empty or omitted returns an empty hit list.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Alias of `query` for agents and the Fluos CLI.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search hits.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocsSearchResponse"}}}},"429":{"description":"Rate limit exceeded.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/v1/openapi.json":{"get":{"operationId":"getFluosOpenApiSpecV1","summary":"Download the Fluos OpenAPI specification (API v1)","description":"Versioned alias of `/openapi.json`.","tags":["Discovery","Versioning"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"OpenAPI 3.1 document.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}},"/api/v1/mcp":{"get":{"operationId":"getFluosMcpServerCard","summary":"Fluos MCP server card","description":"Discovery document for the official Fluos MCP server (Streamable HTTP). POST JSON-RPC to the same URL.","tags":["Discovery","Versioning"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"MCP server card.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCard"}}}}}},"post":{"operationId":"callFluosMcp","summary":"Fluos MCP JSON-RPC","description":"Streamable HTTP MCP endpoint. Methods: initialize, tools/list, tools/call, ping. Tools search Fluos docs and return OpenAPI / llms.txt.","tags":["Discovery","Versioning"],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC 2.0 response.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"429":{"description":"Rate limit exceeded.","headers":{"API-Version":{"description":"Echo of the Fluos API version in force for this response (currently 1).","schema":{"type":"string","examples":["1"]}},"RateLimit":{"description":"IETF RateLimit header: limit, remaining, and reset (seconds) for the current window.","schema":{"type":"string","examples":["limit=120, remaining=119, reset=60"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: quota and window in seconds.","schema":{"type":"string","examples":["120;w=60"]}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","examples":[119]}},"RateLimit-Reset":{"description":"Seconds until the current window resets.","schema":{"type":"integer","examples":[60]}},"Retry-After":{"description":"Seconds to wait before retrying. Present on 429 responses.","schema":{"type":"integer","examples":[60]}},"Deprecation":{"description":"RFC 9745. Sent as `true` when this version or operation is deprecated. Absent on current v1.","schema":{"type":"string","examples":["true"]}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated version may be removed. Absent on current v1.","schema":{"type":"string","examples":["Wed, 01 Jan 2028 00:00:00 GMT"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessage"}}}}}}},"/api/v1/mcp/app":{"get":{"operationId":"getFluosAppMcpServerCard","summary":"Paid Fluos video MCP server card","description":"Authenticated discovery document for the paid Fluos video MCP. Unauthenticated GET returns 401 with WWW-Authenticate.","tags":["Video","Versioning"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"App MCP server card (no tool list on this GET).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerCard"}}}}}},"post":{"operationId":"callFluosAppMcp","summary":"Paid Fluos video MCP JSON-RPC","description":"Clerk OAuth Streamable HTTP MCP. Tools create and poll video jobs. Free plans receive PLAN_REQUIRED.","tags":["Video","Versioning"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC 2.0 response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}}}}},"/api/v1/workspaces":{"get":{"operationId":"listFluosWorkspaces","summary":"List workspaces","description":"List Fluos workspaces the authenticated user can access.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Workspace list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceList"}}}}}}},"/api/v1/projects":{"get":{"operationId":"listFluosProjects","summary":"List projects","description":"List projects in a workspace. Requires workspaceId.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"workspaceId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Project list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}}}},"post":{"operationId":"createFluosProject","summary":"Create a project","description":"Create a Fluos project and its default chat in a workspace.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectRequest"}}}},"responses":{"200":{"description":"Created project ids.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectResponse"}}}}}}},"/api/v1/assets":{"get":{"operationId":"listFluosAssets","summary":"List library assets","description":"List workspace library assets the agent can attach to create_video.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"workspaceId","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Asset list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetList"}}}}}},"post":{"operationId":"completeFluosAssetUpload","summary":"Complete a library upload","description":"Register a library asset after PUTting bytes to the signed upload URL. Do not send raw video in JSON.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAssetUploadRequest"}}}},"responses":{"200":{"description":"Created asset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}}}}},"/api/v1/assets/uploads":{"post":{"operationId":"startFluosAssetUpload","summary":"Start a library upload","description":"Returns a signed Convex upload URL. PUT bytes there, then complete the asset.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Signed upload URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadUrlResponse"}}}}}}},"/api/v1/videos":{"post":{"operationId":"createFluosVideo","summary":"Create a video job","description":"Start generate, edit, compose, or mix. Returns the full job view immediately. Poll GET /api/v1/videos/{jobId}.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVideoRequest"}}}},"responses":{"200":{"description":"Queued video job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}}}}},"/api/v1/videos/{jobId}":{"get":{"operationId":"getFluosVideoJob","summary":"Get a video job","description":"Poll job status. Failures are status=failed with an error code, not HTTP 500.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Video job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}}}}},"/api/v1/videos/{jobId}/cancel":{"post":{"operationId":"cancelFluosVideo","summary":"Cancel a video job","description":"Request cancellation of a queued or running job. Returns the updated job view. Terminal jobs are returned unchanged.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Cancellation accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}}}}},"/api/v1/videos/{jobId}/revise":{"post":{"operationId":"reviseFluosVideo","summary":"Revise a video job","description":"Start a follow-up job from a ready parent. Returns the new job view. The parent stays available.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviseVideoRequest"}}}},"responses":{"200":{"description":"Revision job created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}},"201":{"description":"Revision job created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}}}}},"/api/v1/exports":{"post":{"operationId":"exportFluosVideo","summary":"Export a ready video job","description":"Export a ready clip, edit, or composition as mp4 or gif.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportVideoRequest"}}}},"responses":{"200":{"description":"Export handle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoExport"}}}}}}},"/api/v1/exports/{exportId}":{"get":{"operationId":"getFluosVideoExport","summary":"Get an export","description":"Poll an export until it is ready and has a download URL.","tags":["Video"],"security":[{"clerkOAuth":["profile","email"]},{"bearerAuth":[]}],"parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"exportId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Export status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoExport"}}}}}}}},"components":{"parameters":{"Accept":{"name":"Accept","in":"header","required":false,"description":"Content negotiation. Send `text/markdown` to receive Markdown from the same URL that serves HTML. Missing Accept defaults to HTML.","schema":{"type":"string","examples":["text/html","text/markdown","text/markdown, text/html;q=0.8"]}},"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Fluos API version. Omit or send `1` for the current `/api/v1/` contract. Breaking changes ship as `/api/v2/`.","schema":{"type":"string","enum":["1"],"default":"1"}}},"securitySchemes":{"clerkSession":{"type":"apiKey","in":"cookie","name":"__session","description":"Clerk session cookie used by the Fluos dashboard. Public operations in this spec do not require it. Product APIs under `/api/chat`, `/api/exports`, and `/dashboard` do."},"clerkOAuth":{"type":"oauth2","description":"Clerk OAuth for the paid Fluos video API and `/api/v1/mcp/app`. Use public client ID `vZg47Po1X1v3rHtU`. Dynamic client registration remains available via the authorization server metadata.","flows":{"authorizationCode":{"authorizationUrl":"https://www.fluos.io/.well-known/oauth-authorization-server","tokenUrl":"https://www.fluos.io/.well-known/oauth-authorization-server","scopes":{"profile":"Read the Fluos user profile","email":"Read the Fluos user email"}}}},"bearerAuth":{"type":"http","scheme":"bearer","description":"Clerk OAuth access token or Convex-minted session JWT."}},"schemas":{"MarkdownDocument":{"type":"string","description":"CommonMark document served with Content-Type: text/markdown; charset=utf-8."},"PageDocument":{"type":"object","additionalProperties":false,"required":["product","title","url","path","format","markdown"],"properties":{"product":{"type":"string","const":"Fluos"},"title":{"type":"string"},"url":{"type":"string","format":"uri"},"path":{"type":"string"},"format":{"type":"string","const":"json"},"markdown":{"$ref":"#/components/schemas/MarkdownDocument"}}},"TextFileDocument":{"type":"object","additionalProperties":false,"required":["product","path","contentType","text"],"properties":{"product":{"type":"string","const":"Fluos"},"path":{"type":"string"},"contentType":{"type":"string"},"text":{"type":"string"}}},"McpServerCard":{"type":"object","required":["name","title","url","transport"],"properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"websiteUrl":{"type":"string"},"documentationUrl":{"type":"string"},"transport":{"type":"string","const":"streamable-http"},"url":{"type":"string"},"protocolVersion":{"type":"string"},"tools":{"type":"array","items":{"type":"string"}}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"}}}}},"PlainTextDocument":{"type":"string","description":"UTF-8 plain text."},"XmlDocument":{"type":"string","description":"XML document."},"OpenApiDocument":{"type":"object","description":"OpenAPI 3.1 document (this file).","additionalProperties":true,"properties":{"openapi":{"type":"string","const":"3.1.0"},"info":{"type":"object","additionalProperties":true},"paths":{"type":"object","additionalProperties":true}},"required":["openapi","info","paths"]},"NotAcceptable":{"type":"string","description":"Plain-text 406 body listing available types."},"NotFoundMarkdown":{"type":"string","description":"Markdown 404 body pointing at sitemap.xml, llms.txt, /docs, /developers, and /openapi.json."},"DocsSearchHit":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"url":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"}}},"DocsSearchResponse":{"description":"Fumadocs/Orama search payload — either a hit array or an object containing hits.","oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/DocsSearchHit"}},{"type":"object","additionalProperties":true,"properties":{"hits":{"type":"array","items":{"$ref":"#/components/schemas/DocsSearchHit"}}}}]},"WebhookAck":{"type":"object","additionalProperties":true,"properties":{"received":{"type":"boolean"}}},"ErrorMessage":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}},"ClerkWebhookPayload":{"type":"object","additionalProperties":true,"required":["type","data"],"properties":{"type":{"type":"string","description":"Clerk event type, e.g. user.created or user.deleted."},"data":{"type":"object","additionalProperties":true}}},"StripeWebhookPayload":{"type":"object","additionalProperties":true,"required":["id","type","data"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"data":{"type":"object","additionalProperties":true}}},"ResendWebhookPayload":{"type":"object","additionalProperties":true,"required":["type"],"properties":{"type":{"type":"string"},"created_at":{"type":"string"},"data":{"type":"object","additionalProperties":true,"properties":{"email_id":{"type":"string"}}}}},"WorkspaceList":{"type":"object","properties":{"workspaces":{"type":"array","items":{"type":"object","properties":{"workspaceId":{"type":"string"},"name":{"type":"string"}}}}}},"ProjectList":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string"},"name":{"type":"string"},"workspaceId":{"type":"string"}}}}}},"CreateProjectRequest":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string"},"name":{"type":"string"}}},"CreateProjectResponse":{"type":"object","properties":{"projectId":{"type":"string"},"chatId":{"type":"string"}}},"Asset":{"type":"object","properties":{"assetId":{"type":"string"},"filename":{"type":"string"},"kind":{"type":"string"},"mediaType":{"type":"string"},"processingStatus":{"type":["string","null"]},"url":{"type":["string","null"]}}},"AssetList":{"type":"object","properties":{"assets":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}}}},"UploadUrlResponse":{"type":"object","properties":{"uploadUrl":{"type":"string"},"next":{"type":"string"}}},"CompleteAssetUploadRequest":{"type":"object","required":["workspaceId","storageId","filename","mediaType","size"],"properties":{"workspaceId":{"type":"string"},"storageId":{"type":"string"},"filename":{"type":"string"},"mediaType":{"type":"string"},"size":{"type":"number"}}},"CreateVideoRequest":{"type":"object","required":["projectId","brief"],"properties":{"projectId":{"type":"string"},"brief":{"type":"string"},"recipe":{"type":"string","enum":["generate","edit","compose","mix"]},"assetIds":{"type":"array","items":{"type":"string"}}}},"ReviseVideoRequest":{"type":"object","required":["instruction"],"properties":{"instruction":{"type":"string"},"recipe":{"type":"string","enum":["generate","edit","compose","mix"]},"source":{"type":"string","enum":["mcp","cli","chat"]}}},"VideoJobProgressStep":{"type":"object","properties":{"idempotencyKey":{"type":"string"},"phase":{"type":"string"},"label":{"type":"string"},"state":{"type":"string","enum":["active","completed","failed"]},"progress":{"type":"number"},"updatedAt":{"type":"number"}}},"VideoJobPreview":{"type":"object","properties":{"availability":{"type":"string","enum":["none","live","rendering","ready","expired"]},"url":{"type":["string","null"]},"assetId":{"type":["string","null"]},"artifactId":{"type":["string","null"]},"renderJobId":{"type":["string","null"]},"projectVersionId":{"type":["string","null"]},"sandboxHost":{"type":["string","null"]},"expiresAt":{"type":["number","null"]}}},"VideoJobQuality":{"type":["object","null"],"properties":{"status":{"type":"string"},"summary":{"type":["string","null"]},"findings":{"type":"array","items":{"type":"object"}},"warningCount":{"type":"number"},"blockerCount":{"type":"number"},"repairIterations":{"type":"number"},"reviewDurationMs":{"type":["number","null"]},"updatedAt":{"type":["number","null"]}}},"VideoJob":{"type":"object","required":["jobId","workspaceId","projectId","chatId","source","recipe","brief","assetIds","status","createdAt","updatedAt"],"properties":{"jobId":{"type":"string"},"workspaceId":{"type":"string"},"projectId":{"type":"string"},"chatId":{"type":"string"},"source":{"type":"string","enum":["mcp","cli","chat"]},"recipe":{"type":"string","enum":["generate","edit","compose","mix"]},"brief":{"type":"string"},"assetIds":{"type":"array","items":{"type":"string"}},"format":{"type":"object","properties":{"aspectRatio":{"type":"string","enum":["16:9","9:16","1:1","4:5"]},"durationHintSeconds":{"type":"number"},"resolution":{"type":"string"}}},"status":{"type":"string","enum":["queued","running","ready","failed","cancelled"]},"phase":{"type":["string","null"]},"progress":{"type":["number","null"]},"progressSteps":{"type":"array","items":{"$ref":"#/components/schemas/VideoJobProgressStep"}},"parentJobId":{"type":["string","null"]},"artifactKind":{"type":["string","null"],"enum":["clip","edit","composition",null]},"previewUrl":{"type":["string","null"]},"previewAssetId":{"type":["string","null"]},"preview":{"$ref":"#/components/schemas/VideoJobPreview"},"exportId":{"type":["string","null"]},"exportUrl":{"type":["string","null"]},"composeRunId":{"type":["string","null"]},"workflowRunId":{"type":["string","null"]},"cancelRequestedAt":{"type":["number","null"]},"cancelledAt":{"type":["number","null"]},"quality":{"$ref":"#/components/schemas/VideoJobQuality"},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"recoverable":{"type":"boolean"}}},"credits":{"type":"object","properties":{"chargedCents":{"type":"number"}}},"createdAt":{"type":"number"},"updatedAt":{"type":"number"}}},"ExportVideoRequest":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"string"},"format":{"type":"string","enum":["mp4","gif"]}}},"VideoExport":{"type":"object","properties":{"exportId":{"type":"string"},"jobId":{"type":"string"},"status":{"type":"string"},"url":{"type":["string","null"]},"format":{"type":"string"}}}}}}