What the app receives
The app gets the same identity headers as a signed-in browser request, so it needs no change:X-Floo-User-Role is your app role. The Authorization header never reaches the app.
Who can call which route
floo checks your membership and the key on every request, so removing a member or revoking a key stops the next call. A read-scoped floo API key can send
GET, HEAD, and OPTIONS; other methods need write scope. An org that requires SSO accepts browser sign-in only, and refuses floo API keys with SSO_REQUIRED. WebSocket upgrades still need browser sign-in.
A refusal comes back as JSON naming the fix:
Authorization header. floo removes it there; a key in a query string or a body reaches the app.
From the floo MCP
With the floo MCP server connected (https://api.getfloo.com/mcp), your agent gets three tools that make the same calls:
Each takes
app_id (from list_apps) and environment: dev to build and test, prod for live data, or a preview’s slug. The environment is required, so a call never reaches prod by accident, and every result names the environment it called. An environment that is not deployed returns ENVIRONMENT_NOT_LIVE with the app’s live environments. path is an app path such as /api/notes; full URLs, .. segments, and /__floo/* paths are refused. floo drops any Authorization, Cookie, Accept-Encoding, or X-Floo-* header the agent passes, so the call always runs as you.
Responses return the app’s status, content type, and body, cut at 256 KB. A call with no answer in 25 seconds fails with APP_TIMEOUT. floo keeps request and response bodies out of its logs and error reports.
read_app_api is marked read-only and write_app_api destructive, so your MCP client can approve reads on its own and ask you before writes.
Expose an OpenAPI spec
search_app_api reads /openapi.json, then /api/openapi.json, or the spec_path the agent passes. Each match lists its method, path, operationId, summary, parameters, and request body, with the spec’s local $refs filled in, so the agent can build the call without reading your code. The spec must be JSON and at most 5 MB. A result holds about 256 KB at most; when a big spec doesn’t fit, the agent is told to narrow its query. With no spec, it says why for each path (its HTTP status, too large, or not an OpenAPI document) and tells the agent to pass spec_path or call the paths it already knows.
FastAPI
FastAPI
Built in: FastAPI serves
/openapi.json unless you set openapi_url=None.Next.js (floo starter)
Next.js (floo starter)
Apps from
floo projects create already serve /api/openapi.json, generated from their Zod validators. Describe each new endpoint in app/api/<name>/openapi.ts; the starter’s tests fail when a handler is undocumented.Express
Express
swagger-jsdoc builds the spec from @openapi comments on your route handlers.Django REST framework
Django REST framework
Rails and other stacks
Rails and other stacks
Commit an OpenAPI 3 document and serve it as JSON at
/openapi.json, or tell your agent its path. In Rails:accounts or api_key access is read as you, like any other call.