{"openapi":"3.1.2","info":{"title":"Quantlix public website API","version":"2.0.0","description":"Read published content and use the existing contact and newsletter forms. These interfaces do not expose customer records or administrative access. MCP is a separate Streamable HTTP interface at /mcp/.","contact":{"name":"Quantlix","email":"info@quantlix.com","url":"https://quantlix.com/en/contact/"}},"servers":[{"url":"https://quantlix.com"}],"externalDocs":{"description":"Quantlix developer guide: public API, MCP and authentication policy.","url":"https://quantlix.com/en/developers/"},"security":[],"paths":{"/api/content/":{"get":{"operationId":"getPublishedContent","summary":"Search public pages or read one page as Markdown","description":"Search matches all query words against page title, description and path. With path, returns that exact published page and its Markdown body; other filters are ignored. Only generated published paths can be read.","parameters":[{"name":"Quantlix-API-Version","in":"header","required":false,"description":"Optional contract major version. Defaults to 2. Unsupported versions return 400. Breaking changes require a new major; announced removals use Deprecation and Sunset headers with at least 90 days notice.","schema":{"type":"string","enum":["2"],"default":"2"}},{"name":"cursor","in":"query","schema":{"type":"string","maxLength":1500},"description":"Opaque nextCursor from the same query. Invalid, changed-query or stale snapshot cursors return 400; restart without cursor."},{"name":"q","in":"query","schema":{"type":"string","maxLength":200}},{"name":"language","in":"query","schema":{"type":"string","enum":["en","pt-BR","fr-FR"]}},{"name":"path","in":"query","schema":{"type":"string","maxLength":500},"example":"/en/about/"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":150,"default":20}}],"responses":{"200":{"description":"Published page metadata list, or one page plus Markdown.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["pages"],"properties":{"nextCursor":{"type":["string","null"]},"hasMore":{"type":"boolean"},"pages":{"type":"array","items":{"$ref":"#/components/schemas/Page"}}}},{"allOf":[{"$ref":"#/components/schemas/Page"},{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string"}}}]}]}}}},"400":{"description":"Structured error with a stable code, message and resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Structured error with a stable code, message and resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Structured error with a stable code, message and resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Structured error with a stable code, message and resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/contact/":{"post":{"operationId":"submitInquiry","parameters":[{"name":"Quantlix-API-Version","in":"header","required":false,"description":"Optional contract major version. Defaults to 2. Unsupported versions return 400. Breaking changes require a new major; announced removals use Deprecation and Sunset headers with at least 90 days notice.","schema":{"type":"string","enum":["2"],"default":"2"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"Use a unique key for each approved submission. Same key and normalized input replay 201 without another write; different input returns 409. Keys are scoped to the operation and retained without automatic expiry. Retry only with the original key and identical approved input. Unkeyed writes have no replay guarantee."}],"summary":"Submit a contact inquiry with explicit consent","description":"Public submission endpoint. Submit only at the user's direction. Never invent consent or send incidental live leads. JSON clients receive JSON. Native URL-encoded forms receive an accessible HTML result and require a same-origin Origin header, enforced by Astro. Rejected cross-origin forms can receive plain text before the handler. Form fields must occur only once. Maximum body: 20 KiB. Retry an uncertain write only with the original Idempotency-Key and identical approved input; without a key, do not retry automatically.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":200},"email":{"format":"email","type":"string","maxLength":320},"company":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":64},"subject":{"type":"string","minLength":2,"maxLength":300},"message":{"type":"string","minLength":10,"maxLength":8000},"consent":{"type":"boolean","const":true},"source":{"type":"string","maxLength":64}},"required":["name","email","subject","message","consent"]}},"application/x-www-form-urlencoded":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":200},"email":{"format":"email","type":"string","maxLength":320},"company":{"type":"string","maxLength":200},"phone":{"type":"string","maxLength":64},"subject":{"type":"string","minLength":2,"maxLength":300},"message":{"type":"string","minLength":10,"maxLength":8000},"consent":{"type":"string","enum":["yes"]},"source":{"type":"string","maxLength":64},"locale":{"type":"string","enum":["en","pt-br","fr-fr"],"default":"en"}},"required":["name","email","subject","message","consent"]}}}},"responses":{"201":{"description":"Submission stored successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"const":true}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"400":{"description":"Invalid payload or required fields.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"403":{"description":"Browser Origin is not allowed.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"405":{"description":"Only POST is supported.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"409":{"description":"Idempotency key already used with different normalized input.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"413":{"description":"Payload exceeds 20 KiB.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"415":{"description":"Content type is not supported.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"500":{"description":"The write could not be completed.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"503":{"description":"Submission backend is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}}}}},"/api/newsletter/":{"post":{"operationId":"subscribeNewsletter","parameters":[{"name":"Quantlix-API-Version","in":"header","required":false,"description":"Optional contract major version. Defaults to 2. Unsupported versions return 400. Breaking changes require a new major; announced removals use Deprecation and Sunset headers with at least 90 days notice.","schema":{"type":"string","enum":["2"],"default":"2"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","minLength":16,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"Use a unique key for each approved submission. Same key and normalized input replay 201 without another write; different input returns 409. Keys are scoped to the operation and retained without automatic expiry. Retry only with the original key and identical approved input. Unkeyed writes have no replay guarantee."}],"summary":"Subscribe an email at the user's direction","description":"Public submission endpoint. Submit only at the user's direction. Never invent consent or send incidental live leads. JSON clients receive JSON. Native URL-encoded forms receive an accessible HTML result and require a same-origin Origin header, enforced by Astro. Rejected cross-origin forms can receive plain text before the handler. Form fields must occur only once. Maximum body: 20 KiB. Retry an uncertain write only with the original Idempotency-Key and identical approved input; without a key, do not retry automatically.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"format":"email","type":"string","maxLength":320},"source":{"type":"string","maxLength":64}},"required":["email"]}},"application/x-www-form-urlencoded":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"email":{"format":"email","type":"string","maxLength":320},"source":{"type":"string","maxLength":64},"locale":{"type":"string","enum":["en","pt-br","fr-fr"],"default":"en"}},"required":["email"]}}}},"responses":{"201":{"description":"Submission stored successfully.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"const":true}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"400":{"description":"Invalid payload or required fields.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"403":{"description":"Browser Origin is not allowed.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"405":{"description":"Only POST is supported.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"409":{"description":"Idempotency key already used with different normalized input.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"413":{"description":"Payload exceeds 20 KiB.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/plain":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"415":{"description":"Content type is not supported.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"500":{"description":"The write could not be completed.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}},"503":{"description":"Submission backend is unavailable.","content":{"application/json":{"schema":{"type":"object","required":["ok","error","code","message","hint"],"properties":{"ok":{"const":false},"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}}},"text/html":{"schema":{"type":"string","description":"Localized result document for native form submissions. Never echoes submitted personal data."}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error","code","message","hint"],"properties":{"error":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}}},"Page":{"type":"object","required":["url","path","markdownUrl","markdownPath","title","description","language"],"properties":{"url":{"type":"string","format":"uri"},"path":{"type":"string"},"markdownUrl":{"type":"string","format":"uri"},"markdownPath":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"language":{"type":"string","enum":["en","pt-BR","fr-FR"]}}}}}}