{"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** HTTP surface agents can call without a user session.\n\nIt is not a general-purpose video-generation REST API. Creating and exporting videos happens in the authenticated Fluos dashboard (`/dashboard`) via Clerk session cookies.\n\nEvery operation has a unique `operationId` and typed request/response schemas so agents can register function-calling tools from this document.\n\nDeveloper resources:\n- Fluos developer resources: https://www.fluos.io/developers\n- Fluos OpenAPI specification: https://www.fluos.io/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 authentication: https://www.fluos.io/docs/authentication\n- Fluos webhooks: https://www.fluos.io/docs/webhooks\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"}],"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."}],"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"],"responses":{"200":{"description":"OpenAPI 3.1 document.","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","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}}}}}}},"/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","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}}}}}}},"/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","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}}}}}}},"/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","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}}}}}}},"/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","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/PlainTextDocument"}}}}}}},"/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","content":{"application/rss+xml":{"schema":{"$ref":"#/components/schemas/XmlDocument"}}}}}}},"/":{"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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/developers":{"get":{"operationId":"getFluosDevelopers","summary":"Fluos developer resources","description":"Human and agent hub listing the OpenAPI spec, auth docs, webhooks, 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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"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 and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"404":{"description":"Unknown post.","content":{"text/markdown":{"schema":{"$ref":"#/components/schemas/NotFoundMarkdown"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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 and Markdown separately.","schema":{"type":"string","examples":["Accept"]}}},"content":{"text/html":{"schema":{"type":"string","description":"HTML document for browsers."}},"text/markdown":{"schema":{"$ref":"#/components/schemas/MarkdownDocument"}}}},"406":{"description":"The Accept header rejected every representation Fluos produces (HTML and Markdown).","headers":{"Vary":{"schema":{"type":"string","examples":["Accept"]}}},"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/NotAcceptable"}}}}}}},"/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.","tags":["Search"],"parameters":[{"name":"q","in":"query","required":false,"description":"Search query. Empty or omitted returns an empty hit list.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search hits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocsSearchResponse"}}}}}}},"/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"}}}}}}}},"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"]}}},"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."}},"schemas":{"MarkdownDocument":{"type":"string","description":"CommonMark document served with Content-Type: text/markdown; charset=utf-8."},"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"}}}}}}}}