{"openapi":"3.1.0","info":{"title":"FloatJet Content API","version":"1.0.0","summary":"Read-only JSON access to FloatJet reviews, comparisons and guides for remote workers.","description":"FloatJet publishes buying guides and how-to guides for remote workers, freelancers and digital nomads. This API exposes the article catalog as static JSON regenerated on every deploy. No authentication is required and there are no API keys. All endpoints are GET only. Unknown /api/* paths return a JSON error with a code, message and resolution hint.","termsOfService":"https://floatjet.com/terms/","contact":{"name":"FloatJet","url":"https://floatjet.com/contact/","email":"hello@floatjet.com"}},"externalDocs":{"description":"Developer documentation","url":"https://floatjet.com/developers/"},"servers":[{"url":"https://floatjet.com","description":"Production"}],"security":[],"tags":[{"name":"Articles","description":"Reviews, comparisons and guides"},{"name":"Sections","description":"Site sections and categories"},{"name":"Discovery","description":"Entry points for agents"}],"paths":{"/api/index.json":{"get":{"operationId":"getApiIndex","summary":"Get the API index","description":"Returns the API name, version, and links to the OpenAPI spec, documentation and every endpoint.","tags":["Discovery"],"responses":{"200":{"description":"API index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/api/articles.json":{"get":{"operationId":"listArticles","summary":"List all articles","description":"Returns every published article with its section, category, dates, reading time and canonical URL, newest update first. Filter client-side by section or category.","tags":["Articles"],"responses":{"200":{"description":"All articles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleList"}}}}}}},"/api/articles/{slug}.json":{"get":{"operationId":"getArticle","summary":"Get one article","description":"Returns metadata for a single article. Slugs come from listArticles.","tags":["Articles"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Article slug, for example best-vpn-digital-nomads","schema":{"type":"string","pattern":"^[a-z0-9-]+$"}}],"responses":{"200":{"description":"The article","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetail"}}}},"404":{"description":"No article with this slug","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/sections.json":{"get":{"operationId":"listSections","summary":"List sections and categories","description":"Returns the four site sections (tools, gear, guides, blog) with their categories and article counts.","tags":["Sections"],"responses":{"200":{"description":"All sections","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionList"}}}}}}},"/index.md":{"get":{"operationId":"getHomepageMarkdown","summary":"Get the homepage as Markdown","description":"Returns the homepage content as Markdown, including every article grouped by section. The same body is served at / when the request sends Accept: text/markdown.","tags":["Discovery"],"responses":{"200":{"description":"Homepage Markdown","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Get llms.txt","description":"Returns the llms.txt index (https://llmstxt.org) with the most important pages and every article.","tags":["Discovery"],"responses":{"200":{"description":"llms.txt file","content":{"text/plain":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Article":{"type":"object","description":"One FloatJet article","required":["slug","section","category","title","description","url","published","updated","readingTimeMinutes","image","imageAlt","featured","apiUrl"],"properties":{"slug":{"type":"string","description":"Unique article identifier","examples":["best-vpn-digital-nomads"]},"section":{"type":"string","enum":["tools","gear","guides","blog"],"description":"Site section"},"category":{"type":"string","description":"Category slug within the section","examples":["vpn"]},"title":{"type":"string"},"description":{"type":"string","description":"One or two sentence summary"},"url":{"type":"string","format":"uri","description":"Canonical HTML page"},"published":{"type":"string","format":"date"},"updated":{"type":"string","format":"date","description":"Last substantive review, or the publish date"},"readingTimeMinutes":{"type":"integer","minimum":1},"image":{"type":"string","format":"uri"},"imageAlt":{"type":"string"},"featured":{"type":"boolean"},"apiUrl":{"type":"string","format":"uri","description":"This resource in the API"}}},"ArticleList":{"type":"object","required":["count","updated","articles"],"properties":{"count":{"type":"integer","minimum":0},"updated":{"type":"string","format":"date","description":"Most recent article update"},"articles":{"type":"array","items":{"$ref":"#/components/schemas/Article"}}}},"ArticleDetail":{"type":"object","required":["article"],"properties":{"article":{"$ref":"#/components/schemas/Article"}}},"Category":{"type":"object","required":["slug","name","description","url","articleCount"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"articleCount":{"type":"integer","minimum":0}}},"Section":{"type":"object","required":["section","name","heading","description","url","articleCount","categories"],"properties":{"section":{"type":"string","enum":["tools","gear","guides","blog"]},"name":{"type":"string"},"heading":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"articleCount":{"type":"integer","minimum":0},"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"SectionList":{"type":"object","required":["sections"],"properties":{"sections":{"type":"array","items":{"$ref":"#/components/schemas/Section"}}}},"ApiIndex":{"type":"object","required":["name","description","version","openapi","documentation","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"openapi":{"type":"string","format":"uri"},"documentation":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}}}}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["status","code","message","hint","documentation"],"properties":{"status":{"type":"integer","description":"HTTP status code"},"code":{"type":"string","description":"Stable machine-readable error code","examples":["not_found"]},"message":{"type":"string","description":"What went wrong"},"hint":{"type":"string","description":"How to resolve it"},"documentation":{"type":"string","format":"uri"}}}}}}}}