{"openapi":"3.1.0","info":{"title":"Luma Grid public API","version":"1.0.0","summary":"Discover Luma Grid, read product facts, and send product feedback.","description":"Public, unauthenticated HTTP API for agents integrating with Luma Grid, the Spanish AAC/CAA communicator. Use this surface for product discovery and feedback. The pictogram board itself is a session-based web app (cookie auth) and is not exposed as REST.","contact":{"name":"Luma Grid","email":"contacto@lumagrid.app","url":"https://www.lumagrid.app/contact"},"license":{"name":"Proprietary — see terms","url":"https://www.lumagrid.app/terminos"}},"servers":[{"url":"https://www.lumagrid.app","description":"Luma Grid production"}],"tags":[{"name":"Discovery","description":"Find Luma Grid resources and confirm the API is up."},{"name":"Product","description":"Typed product metadata for agents and function calling."},{"name":"Feedback","description":"Send a message to the Luma Grid team."}],"paths":{"/api/v1":{"get":{"operationId":"listPublicApiIndex","tags":["Discovery"],"summary":"List public API entry points","description":"Returns the public Luma Grid API catalog: status, product, feedback, OpenAPI and llms.txt URLs. Call this first if you only have the origin.","responses":{"200":{"description":"API index","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/api/v1/status":{"get":{"operationId":"getApiStatus","tags":["Discovery"],"summary":"Health and readiness","description":"Lightweight liveness check. Returns `ok: true` when the public API can serve requests. No authentication. Use this before calling other endpoints.","responses":{"200":{"description":"Service is reachable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}}}}},"/api/v1/product":{"get":{"operationId":"getProduct","tags":["Product"],"summary":"Luma Grid product metadata","description":"Typed snapshot of Luma Grid: name, description, plans in EUR, docs, OpenAPI, llms.txt and contact. Prefer this over scraping HTML when answering questions about the product.","responses":{"200":{"description":"Product record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Product"}}}}}}},"/api/v1/feedback":{"post":{"operationId":"createFeedback","tags":["Feedback"],"summary":"Submit product feedback","description":"Stores a feedback message for the Luma Grid team. Anonymous submissions must omit `email`. Identified submissions require a valid email so the team can reply. Do not send health or education records; this is product feedback only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Feedback stored","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackSuccess"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Could not persist the message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","tags":["Discovery"],"summary":"OpenAPI 3.1 specification","description":"This document. Agents should cache it and bind function-calling tools to each unique operationId.","responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Discovery"],"summary":"Agent index (llms.txt)","description":"Curated markdown map of Luma Grid: when to use the product, docs, API and trust pages. Follow llmstxt.org v2.","responses":{"200":{"description":"llms.txt markdown","content":{"text/markdown":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Stable machine-readable error code (SCREAMING_SNAKE_CASE).","examples":["NOT_FOUND","INVALID_BODY","METHOD_NOT_ALLOWED"]},"message":{"type":"string","description":"Human-readable explanation of what went wrong."},"hint":{"type":"string","description":"How to resolve the error (docs URL, required fields, or retry advice)."}}}}},"Status":{"type":"object","additionalProperties":false,"required":["ok","name","docs"],"properties":{"ok":{"type":"boolean","enum":[true]},"name":{"type":"string","enum":["Luma Grid"]},"docs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"}}},"ApiIndex":{"type":"object","additionalProperties":false,"required":["name","openapi","llmsTxt","endpoints"],"properties":{"name":{"type":"string","enum":["Luma Grid"]},"openapi":{"type":"string","format":"uri"},"llmsTxt":{"type":"string","format":"uri"},"endpoints":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["method","path","operationId"],"properties":{"method":{"type":"string","enum":["GET","POST"]},"path":{"type":"string"},"operationId":{"type":"string"}}}}}},"Plan":{"type":"object","additionalProperties":false,"required":["id","name","priceEurMonthly","url"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"priceEurMonthly":{"type":"number"},"url":{"type":"string","format":"uri"}}},"Product":{"type":"object","additionalProperties":false,"required":["name","url","description","category","locale","contact","docs","openapi","llmsTxt","plans"],"properties":{"name":{"type":"string","enum":["Luma Grid"]},"legalName":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"category":{"type":"string"},"locale":{"type":"string"},"areaServed":{"type":"string"},"contact":{"type":"object","additionalProperties":false,"required":["email","url"],"properties":{"email":{"type":"string","format":"email"},"url":{"type":"string","format":"uri"}}},"docs":{"type":"string","format":"uri"},"developers":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llmsTxt":{"type":"string","format":"uri"},"sitemap":{"type":"string","format":"uri"},"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}},"example":{"name":"Luma Grid","legalName":"Casa Numa","url":"https://www.lumagrid.app","description":"Luma Grid es el comunicador AAC (CAA/SAAC) en español para España: tablero de pictogramas ARASAAC, Luma Grid Escucha (voz a pictos), predicción con IA, conjugación automática, voz natural y panel para familias, logopedas y centros. Plan gratis sin tarjeta.","category":"AAC / CAA communicator (HealthApplication)","locale":"es-ES","areaServed":"España","contact":{"email":"contacto@lumagrid.app","url":"https://www.lumagrid.app/contact"},"docs":"https://www.lumagrid.app/docs","developers":"https://www.lumagrid.app/developers","openapi":"https://www.lumagrid.app/openapi.json","llmsTxt":"https://www.lumagrid.app/llms.txt","sitemap":"https://www.lumagrid.app/sitemap.xml","plans":[{"id":"libre","name":"Plan Libre","priceEurMonthly":0,"url":"https://www.lumagrid.app/planes"},{"id":"voz","name":"Plan Voz","priceEurMonthly":9,"url":"https://www.lumagrid.app/planes"},{"id":"identidad","name":"Plan Identidad","priceEurMonthly":24,"url":"https://www.lumagrid.app/planes"},{"id":"terapeuta","name":"Plan Terapeuta","priceEurMonthly":69,"url":"https://www.lumagrid.app/planes#plan-terapeuta"}]}},"FeedbackRequest":{"type":"object","additionalProperties":false,"required":["anonymous","message"],"properties":{"anonymous":{"type":"boolean","description":"If true, omit `email`. If false, `email` is required."},"message":{"type":"string","minLength":1,"maxLength":8000,"description":"Product feedback in the user language. No medical records."},"email":{"type":"string","format":"email","description":"Reply address when `anonymous` is false."}}},"FeedbackSuccess":{"type":"object","additionalProperties":false,"required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]}}}}}}