{"openapi":"3.0.3","info":{"title":"Nexor Drink Public API","version":"1.0.0","description":"Public REST API for Nexor Drink — bold energy drink by Atlasimex S.L. Read endpoints need no authentication. The contact endpoint is public but rate-limited. Full human documentation lives at /docs and the agent entrypoint at /llms.txt.","contact":{"name":"Atlasimex S.L.","url":"https://nexordrinks.com","email":"contact@nexordrinks.com"},"license":{"name":"All rights reserved — Atlasimex S.L."}},"servers":[{"url":"https://nexordrinks.com","description":"Production"}],"tags":[{"name":"meta","description":"API discovery, health and machine-readable index."},{"name":"engagement","description":"Contact form submission."},{"name":"mcp","description":"Model Context Protocol endpoint (Streamable HTTP, stateless JSON)."}],"paths":{"/api":{"get":{"operationId":"listEndpoints","summary":"List all public API endpoints","description":"Returns the machine-readable index of every public endpoint with its method, path and description. Start here for discovery.","tags":["meta"],"responses":{"200":{"description":"Endpoint index.","content":{"application/json":{"schema":{"type":"object","required":["success","endpoints"],"properties":{"success":{"type":"boolean","example":true},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string","example":"GET"},"path":{"type":"string","example":"/api/status"},"description":{"type":"string"}}}},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}}}}},"/api/status":{"get":{"operationId":"getStatus","summary":"API health and version","description":"Public health check returning the API version, site name and current timestamp.","tags":["meta"],"responses":{"200":{"description":"Service is healthy.","content":{"application/json":{"schema":{"type":"object","required":["success","status","version","site"],"properties":{"success":{"type":"boolean","example":true},"status":{"type":"string","example":"ok"},"version":{"type":"string","example":"1.0.0"},"site":{"type":"string","example":"Nexor Drink"},"timestamp":{"type":"string","format":"date-time"}}}}}}}}},"/api/contact":{"post":{"operationId":"submitContact","summary":"Submit a contact form","description":"Forwards a contact inquiry to the Nexor Drink sales team by email (Stalwart webmail form). Public endpoint, honeypot-protected and rate-limited server-side.","tags":["engagement"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","message"],"properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string","format":"email"},"message":{"type":"string"},"website_hp":{"type":"string","description":"Honeypot spam trap: always send empty. A filled value is treated as a bot and silently discarded."}}}}}},"responses":{"200":{"description":"Submission sent.","headers":{"API-Version":{"description":"Pinned API version.","schema":{"type":"string","example":"1.0.0"}},"RateLimit-Limit":{"description":"Max contact submissions per hour per IP.","schema":{"type":"integer","example":10}},"RateLimit-Remaining":{"description":"Submissions left in the current window.","schema":{"type":"integer","example":9}},"RateLimit-Reset":{"description":"Window reset as Unix epoch seconds.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"provider":{"type":"string"}}}}}},"400":{"description":"Validation failure.","content":{"application/json":{"schema":{"type":"object","required":["success","code","message","hint"],"properties":{"success":{"type":"boolean","example":false},"code":{"type":"string","example":"NOT_FOUND","description":"Stable machine-readable error code."},"message":{"type":"string","example":"Human-readable summary of what went wrong."},"error":{"type":"string","description":"Alias of message (legacy clients)."},"hint":{"type":"string","example":"What to do next to resolve the error."},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}},"405":{"description":"Wrong HTTP method.","content":{"application/json":{"schema":{"type":"object","required":["success","code","message","hint"],"properties":{"success":{"type":"boolean","example":false},"code":{"type":"string","example":"NOT_FOUND","description":"Stable machine-readable error code."},"message":{"type":"string","example":"Human-readable summary of what went wrong."},"error":{"type":"string","description":"Alias of message (legacy clients)."},"hint":{"type":"string","example":"What to do next to resolve the error."},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"description":"Seconds until the next retry.","schema":{"type":"integer"}},"RateLimit-Limit":{"schema":{"type":"integer","example":10}},"RateLimit-Remaining":{"schema":{"type":"integer","example":0}},"RateLimit-Reset":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["success","code","message","hint"],"properties":{"success":{"type":"boolean","example":false},"code":{"type":"string","example":"NOT_FOUND","description":"Stable machine-readable error code."},"message":{"type":"string","example":"Human-readable summary of what went wrong."},"error":{"type":"string","description":"Alias of message (legacy clients)."},"hint":{"type":"string","example":"What to do next to resolve the error."},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}},"502":{"description":"Mail provider unreachable.","content":{"application/json":{"schema":{"type":"object","required":["success","code","message","hint"],"properties":{"success":{"type":"boolean","example":false},"code":{"type":"string","example":"NOT_FOUND","description":"Stable machine-readable error code."},"message":{"type":"string","example":"Human-readable summary of what went wrong."},"error":{"type":"string","description":"Alias of message (legacy clients)."},"hint":{"type":"string","example":"What to do next to resolve the error."},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}}}}},"/mcp":{"post":{"operationId":"mcpJsonRpc","summary":"MCP Streamable HTTP endpoint","description":"Model Context Protocol over plain HTTPS POST (stateless JSON responses). Methods: initialize, tools/list, tools/call (tools: get_status, list_endpoints, submit_contact), ping. Send Accept: application/json, text/event-stream. Unknown methods return JSON-RPC error -32601; unknown tools -32602.","tags":["mcp"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","id","method"],"properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{},"method":{"type":"string","example":"tools/list"},"params":{"type":"object"}}}}}},"responses":{"200":{"description":"JSON-RPC result object.","content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","id"],"properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{},"result":{"type":"object"}}}}}},"202":{"description":"Accepted notification (no content)."},"500":{"description":"JSON-RPC internal error (-32603).","content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{"nullable":true},"error":{"type":"object","properties":{"code":{"type":"integer","example":-32603},"message":{"type":"string"}}}}}}}}}}}}}