{"openapi":"3.1.0","info":{"title":"FluoSite public API","version":"1.0.0","summary":"Read-only facts about FluoSite, a web design studio in Amsterdam.","description":"FluoSite builds custom, conversion-focused websites, redesigns, process automation, UX/UI audits and startup MVPs, usually for a fixed €2,000 to €4,000.\n\nUse this API to answer questions about FluoSite's services, prices, case studies, articles and contact details with the same text the website shows.\n\nNo authentication, no API key and no rate-limit headers. Every response is JSON, including errors, which carry a code, a message and a resolution hint.\n\nTo start a project, send people to the booking link in GET /api/v1/company; there is no endpoint that books or submits leads.","contact":{"name":"FluoSite","email":"info@fluosite.com","url":"https://fluosite.com/developers"}},"externalDocs":{"description":"Developer and agent documentation","url":"https://fluosite.com/developers"},"servers":[{"url":"https://fluosite.com"}],"security":[],"tags":[{"name":"FluoSite","description":"Company, services, pricing, case studies and blog."}],"paths":{"/api":{"get":{"operationId":"getApiIndex","summary":"List API endpoints","description":"Entry point: links to every endpoint, the documentation and this OpenAPI document.","tags":["FluoSite"],"responses":{"200":{"description":"API index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/company":{"get":{"operationId":"getCompany","summary":"Company profile and contact details","description":"Who FluoSite is, how to contact or book a call, address, registration numbers and typical price range.","tags":["FluoSite"],"parameters":[{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"Company profile and contact details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Company"}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/services":{"get":{"operationId":"listServices","summary":"List services","description":"The six services FluoSite offers, as shown on the homepage.","tags":["FluoSite"],"parameters":[{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"List services","content":{"application/json":{"schema":{"type":"object","required":["locale","services"],"properties":{"locale":{"type":"string"},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pricing":{"get":{"operationId":"getPricing","summary":"Pricing tiers and payment terms","description":"Fixed-price tiers (from €2,000 to about €4,000) with what each includes, plus payment terms.","tags":["FluoSite"],"parameters":[{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"Pricing tiers and payment terms","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pricing"}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/case-studies":{"get":{"operationId":"listCaseStudies","summary":"List case studies","description":"Client projects with the problem, what changed and the measured result.","tags":["FluoSite"],"parameters":[{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"List case studies","content":{"application/json":{"schema":{"type":"object","required":["locale","caseStudies"],"properties":{"locale":{"type":"string"},"caseStudies":{"type":"array","items":{"$ref":"#/components/schemas/CaseStudy"}}}}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/posts":{"get":{"operationId":"listPosts","summary":"List blog articles","description":"Articles on website cost, choosing a web partner and AI search visibility, newest first.","tags":["FluoSite"],"parameters":[{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"List blog articles","content":{"application/json":{"schema":{"type":"object","required":["locale","posts"],"properties":{"locale":{"type":"string"},"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}}}}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/posts/{slug}":{"get":{"operationId":"getPost","summary":"Get one blog article","description":"Full article text as Markdown, with its FAQ.","tags":["FluoSite"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Article slug, as returned by listPosts.","schema":{"type":"string","enum":["website-cost-netherlands","agency-vs-freelancer-vs-builder","ai-search-local-business","web-developer-holding-site-hostage","what-to-ask-before-hiring-web-agency","flat-price-not-subscription","custom-website-vs-coachpro","why-your-site-looks-like-everyone-elses","wix-alternatives","restaurant-cafe-website-netherlands","wordpress-vs-custom-website"]}},{"$ref":"#/components/parameters/Locale"}],"responses":{"200":{"description":"Get one blog article","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"The locale parameter is not en, nl or cs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Nothing exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Only GET is supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"parameters":{"Locale":{"name":"locale","in":"query","required":false,"description":"Language of the returned text: en (default), nl or cs.","schema":{"type":"string","enum":["en","nl","cs"],"default":"en"}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","status","message","hint","docs"],"properties":{"code":{"type":"string","enum":["not_found","method_not_allowed","invalid_locale","invalid_request"],"description":"Stable machine-readable error code."},"status":{"type":"integer","description":"HTTP status code."},"message":{"type":"string","description":"What went wrong."},"hint":{"type":"string","description":"How to fix the request."},"docs":{"type":"string","format":"uri"}}}}},"ApiIndex":{"type":"object","required":["name","docs","openapi","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"type":"object","required":["operationId","method","path","description"],"properties":{"operationId":{"type":"string"},"method":{"type":"string"},"path":{"type":"string"},"description":{"type":"string"}}}}}},"Company":{"type":"object","required":["locale","name","url","description","contact"],"properties":{"locale":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"summary":{"type":"string"},"founder":{"type":"string"},"languages":{"type":"array","items":{"type":"string"}},"pricing":{"type":"object","properties":{"currency":{"type":"string"},"typicalMin":{"type":"integer"},"typicalMax":{"type":"integer"},"model":{"type":"string"}}},"contact":{"type":"object","required":["email","bookingUrl"],"properties":{"email":{"type":"string","format":"email"},"telephone":{"type":"string"},"bookingUrl":{"type":"string","format":"uri"},"contactPage":{"type":"string","format":"uri"},"fitQuizUrl":{"type":"string","format":"uri"}}},"address":{"type":"object","properties":{"streetAddress":{"type":"string"},"postalCode":{"type":"string"},"addressLocality":{"type":"string"},"addressCountry":{"type":"string"}}},"registration":{"type":"object","properties":{"kvk":{"type":"string"},"vat":{"type":"string"}}},"sameAs":{"type":"array","items":{"type":"string","format":"uri"}}}},"Service":{"type":"object","required":["id","name","description"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"}}},"Pricing":{"type":"object","required":["locale","currency","tiers"],"properties":{"locale":{"type":"string"},"summary":{"type":"string"},"currency":{"type":"string"},"url":{"type":"string","format":"uri"},"tiers":{"type":"array","items":{"type":"object","required":["id","name","price","description"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"price":{"type":"string","description":"Display price, e.g. 'from €2,000'."},"description":{"type":"string"},"bestFor":{"type":"string"},"includes":{"type":"string"},"popular":{"type":"boolean"}}}},"terms":{"type":"array","items":{"type":"string"}}}},"CaseStudy":{"type":"object","required":["slug","client","title","result","url"],"properties":{"slug":{"type":"string"},"client":{"type":"string"},"title":{"type":"string"},"problem":{"type":"string"},"whatChanged":{"type":"string"},"result":{"type":"string"},"url":{"type":"string","format":"uri"}}},"PostSummary":{"type":"object","required":["slug","title","publishedDate","url"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string"},"category":{"type":"string"},"publishedDate":{"type":"string","format":"date"},"author":{"type":"string"},"url":{"type":"string","format":"uri"}}},"Post":{"allOf":[{"$ref":"#/components/schemas/PostSummary"},{"type":"object","required":["locale","bodyMarkdown"],"properties":{"locale":{"type":"string"},"bodyMarkdown":{"type":"string"},"faq":{"type":"array","items":{"type":"object","required":["question","answer"],"properties":{"question":{"type":"string"},"answer":{"type":"string"}}}}}}]}}}}