{"openapi":"3.1.0","info":{"title":"Flowline public API","version":"1.0.0","summary":"Public, read-only REST API of Flowline (flowlineworkspace.com).","description":"Flowline is a productivity workspace for tasks, habits, calendar, focus time, workspaces and teams. This API exposes its plans, documentation and product information; it needs no authentication and allows cross-origin requests. It does not give access to user data yet — AI agent integrations are on the roadmap.\n\n**Versioning.** The version is in the path (`/api/v1`). Within a version, changes are additive only; a breaking change ships as a new path version next to the old one. A deprecated endpoint keeps working for at least six months and says so on every response with `Deprecation` (RFC 9745), `Sunset` (RFC 8594) and a `Link` to its successor (rel=\"successor-version\").\n\n**Errors.** Every error is an RFC 9457 problem details object (`application/problem+json`) with a stable machine-readable `code`.\n\n**Rate limits.** 60 requests per 60 seconds per client IP. Every response carries the IETF `RateLimit` and `RateLimit-Policy` headers (plus `RateLimit-Limit`, `-Remaining`, `-Reset`); a 429 also carries `Retry-After`.\n\nHuman-readable guide: https://flowlineworkspace.com/docs/api. Site index for agents: https://flowlineworkspace.com/llms.txt.","contact":{"name":"Flowline support","email":"support@flowlineworkspace.com","url":"https://flowlineworkspace.com/contact"}},"externalDocs":{"description":"Flowline API guide","url":"https://flowlineworkspace.com/docs/api"},"servers":[{"url":"https://flowlineworkspace.com"}],"security":[],"tags":[{"name":"Plans","description":"Plans and prices."},{"name":"Docs","description":"The documentation."},{"name":"Product","description":"What Flowline does."},{"name":"Pages","description":"Public pages with Markdown content negotiation."}],"paths":{"/api/v1/plans":{"get":{"operationId":"listPlans","summary":"List the plans","description":"Every plan (Free, Plus, Pro) with its monthly and annual price in EUR, free trial length, included features and announced features. Use it to answer pricing questions.","tags":["Plans"],"responses":{"200":{"description":"Success.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["plans"],"properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/plans/{planId}":{"get":{"operationId":"getPlan","summary":"Get one plan","description":"One plan by id, with its prices, free trial and features.","tags":["Plans"],"parameters":[{"name":"planId","in":"path","required":true,"description":"The plan id.","schema":{"type":"string","enum":["free","plus","pro"]}}],"responses":{"200":{"description":"Success.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["plan"],"properties":{"plan":{"$ref":"#/components/schemas/Plan"}}}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/docs":{"get":{"operationId":"listDocsPages","summary":"List the documentation pages","description":"Every page of the Flowline documentation with its title, summary, section and URL. Fetch a page URL with `Accept: text/markdown` where available, or read it as HTML.","tags":["Docs"],"responses":{"200":{"description":"Success.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["pages"],"properties":{"pages":{"type":"array","items":{"$ref":"#/components/schemas/DocsPage"}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/product":{"get":{"operationId":"getProduct","summary":"Describe the product","description":"What Flowline does: a description, each feature with a link to its docs, the roadmap, and links to sign up, pricing, docs and support.","tags":["Product"],"responses":{"200":{"description":"Success.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"type":"object","required":["product"],"properties":{"product":{"$ref":"#/components/schemas/Product"}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/plans":{"get":{"operationId":"listPlansLegacy","summary":"List the plans (deprecated)","description":"Deprecated alias of `/api/v1/plans`, removed after 2027-04-30. Same body; responses carry Deprecation, Sunset and Link headers.","tags":["Plans"],"deprecated":true,"responses":{"200":{"description":"Success.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Deprecation":{"description":"RFC 9745: when the endpoint was deprecated (@unix-seconds).","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594: the date after which the endpoint is removed.","schema":{"type":"string"}},"Link":{"description":"The successor endpoint (rel=\"successor-version\").","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","required":["plans"],"properties":{"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/":{"get":{"operationId":"getHomepage","summary":"Homepage","description":"What Flowline does, feature by feature, with links to the docs of each feature. Send `Accept: text/markdown` to get Markdown instead of HTML (the response carries `Vary: Accept`).","tags":["Pages"],"parameters":[{"name":"Accept","in":"header","required":false,"description":"Send `text/markdown` to get Markdown; anything else returns HTML.","schema":{"type":"string","enum":["text/markdown","text/html"],"default":"text/html"}}],"responses":{"200":{"description":"The page, as Markdown or HTML depending on the Accept header.","headers":{"Vary":{"schema":{"type":"string"},"description":"Includes `Accept`."}},"content":{"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}},"404":{"description":"No such page. With `Accept: text/markdown`, the body is Markdown with links to the docs, llms.txt and the sitemap.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/{page}":{"get":{"operationId":"getPage","summary":"Public page","description":"Pricing, the docs index, About or Contact. Send `Accept: text/markdown` to get Markdown instead of HTML (the response carries `Vary: Accept`).","tags":["Pages"],"parameters":[{"name":"page","in":"path","required":true,"description":"Which page.","schema":{"type":"string","enum":["pricing","docs","about","contact"]}},{"name":"Accept","in":"header","required":false,"description":"Send `text/markdown` to get Markdown; anything else returns HTML.","schema":{"type":"string","enum":["text/markdown","text/html"],"default":"text/html"}}],"responses":{"200":{"description":"The page, as Markdown or HTML depending on the Accept header.","headers":{"Vary":{"schema":{"type":"string"},"description":"Includes `Accept`."}},"content":{"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}},"404":{"description":"No such page. With `Accept: text/markdown`, the body is Markdown with links to the docs, llms.txt and the sitemap.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Plan":{"type":"object","required":["id","name","description","currency","price","trialDays","features","comingSoon"],"properties":{"id":{"type":"string","enum":["free","plus","pro"]},"name":{"type":"string","examples":["Plus"]},"description":{"type":"string"},"currency":{"type":"string","const":"EUR"},"price":{"type":"object","required":["monthly","annual"],"properties":{"monthly":{"type":"number","description":"Price per month, billed monthly."},"annual":{"type":"number","description":"Price per year, billed annually."}}},"trialDays":{"type":["integer","null"],"description":"Length of the free trial, if any."},"features":{"type":"array","items":{"type":"string"}},"comingSoon":{"type":"array","items":{"type":"string"},"description":"Announced features that are not available yet."}}},"DocsPage":{"type":"object","required":["title","description","section","url"],"properties":{"title":{"type":"string"},"description":{"type":"string"},"section":{"type":"string","description":"The docs section, e.g. \"Your productivity\"."},"url":{"type":"string","format":"uri"}}},"Product":{"type":"object","required":["name","url","description","features","roadmap","links"],"properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"features":{"type":"array","items":{"type":"object","required":["name","title","description","docsUrl"],"properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"docsUrl":{"type":"string","format":"uri"}}}},"roadmap":{"type":"array","items":{"type":"object","required":["name","description","status"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["in_development"]}}}},"links":{"type":"object","required":["signUp","pricing","docs","apiDocs","openapi","llmsTxt","contact"],"properties":{"signUp":{"type":"string","format":"uri"},"pricing":{"type":"string","format":"uri"},"docs":{"type":"string","format":"uri"},"apiDocs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llmsTxt":{"type":"string","format":"uri"},"contact":{"type":"string","format":"uri"}}}}},"Problem":{"type":"object","description":"RFC 9457 problem details.","required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","format":"uri","description":"Documentation of this error type."},"title":{"type":"string","description":"Short summary of the error type."},"status":{"type":"integer","description":"The HTTP status code."},"detail":{"type":"string","description":"What went wrong, for a human."},"instance":{"type":"string","description":"The request path."},"code":{"type":"string","enum":["not_found","rate_limited","internal_error"],"description":"Stable machine-readable error code."}}}},"responses":{"NotFound":{"description":"The endpoint or the resource does not exist (code `not_found`).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"TooManyRequests":{"description":"Rate limit reached (code `rate_limited`). Wait `Retry-After` seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"InternalError":{"description":"Unexpected failure (code `internal_error`). Safe to retry later.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"headers":{"RateLimit":{"description":"IETF RateLimit field: remaining quota and seconds until reset, e.g. `\"default\";r=59;t=42`.","schema":{"type":"string"}},"RateLimitPolicy":{"description":"IETF RateLimit-Policy field: `\"default\";q=60;w=60`.","schema":{"type":"string"}},"RateLimitLimit":{"description":"Requests allowed per window.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}}}}}