{"openapi":"3.1.0","info":{"title":"PlatPhorm Layout API","description":"Public responsive layout builder, template, preview, deterministic scoring, export, discovery, and MCP tooling for layout.platphormnews.com. PLATPHORM_API_KEY is required for server mutations, trusted remote inspection, publishing, integration triggers, and administration.","version":"0.7.0","contact":{"name":"PlatPhormNews","url":"https://platphormnews.com","email":"support@platphormnews.com"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://layout.platphormnews.com","description":"Production"}],"tags":[{"name":"Layout","description":"Templates, drafts, preview, score, and export"},{"name":"Integrations","description":"Protected integration endpoints with explicit unsupported states until handlers exist"},{"name":"Discovery","description":"OpenAPI, llms, sitemap, RSS, trust, and well-known files"},{"name":"MCP","description":"JSON-RPC 2.0 Layout tooling"}],"paths":{"/api/health":{"get":{"tags":["Layout"],"summary":"Standard public-safe health summary","description":"Standard public-safe health summary. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/health":{"get":{"tags":["Layout"],"summary":"Versioned public-safe health summary","description":"Versioned public-safe health summary. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/docs":{"get":{"tags":["Layout"],"summary":"OpenAPI 3.1 JSON document","description":"OpenAPI 3.1 JSON document. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/templates":{"get":{"tags":["Layout"],"summary":"List real public layout templates","description":"List real public layout templates. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/templates/{slug}":{"get":{"tags":["Layout"],"summary":"Fetch one template","description":"Fetch one template. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/layouts":{"get":{"tags":["Layout"],"summary":"Public-safe persistence status without exposing protected drafts","description":"Public-safe persistence status without exposing protected drafts. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}},"post":{"tags":["Layout"],"summary":"Create a protected ephemeral server layout","description":"Create a protected ephemeral server layout. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/layouts/{id}":{"get":{"tags":["Layout"],"summary":"Read or update a protected ephemeral server layout","description":"Read or update a protected ephemeral server layout. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}},"put":{"tags":["Layout"],"summary":"Read or update a protected ephemeral server layout","description":"Read or update a protected ephemeral server layout. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/layouts/preview":{"post":{"tags":["Layout"],"summary":"Generate deterministic responsive preview data","description":"Generate deterministic responsive preview data. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/layouts/score":{"post":{"tags":["Layout"],"summary":"Run deterministic Layout score","description":"Run deterministic Layout score. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/layouts/export":{"post":{"tags":["Layout"],"summary":"Export JSON, HTML/CSS, React/Tailwind, Markdown, design spec JSON, or report output","description":"Export JSON, HTML/CSS, React/Tailwind, Markdown, design spec JSON, or report output. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/viewport/check":{"post":{"tags":["Layout"],"summary":"Check one viewport for overflow and tap-target risk","description":"Check one viewport for overflow and tap-target risk. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/grid/analyze":{"post":{"tags":["Layout"],"summary":"Analyze grid and region structure","description":"Analyze grid and region structure. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/accessibility/check":{"post":{"tags":["Layout"],"summary":"Run deterministic accessibility hints","description":"Run deterministic accessibility hints. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/responsive/check":{"post":{"tags":["Layout"],"summary":"Check configured breakpoints","description":"Check configured breakpoints. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/audit/url":{"post":{"tags":["Layout"],"summary":"Run public deterministic scoring and optional key-gated trusted-domain DOM inspection","description":"Run public deterministic scoring and optional key-gated trusted-domain DOM inspection. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/audit/config":{"post":{"tags":["Layout"],"summary":"Audit layout config with deterministic findings","description":"Audit layout config with deterministic findings. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/reports/layout":{"post":{"tags":["Layout"],"summary":"Return unsupported until protected report publishing is implemented","description":"Return unsupported until protected report publishing is implemented. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/status":{"get":{"tags":["Integrations"],"summary":"List Layout integration configuration/degraded state","description":"List Layout integration configuration/degraded state. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/phorm":{"post":{"tags":["Integrations"],"summary":"Protected Phorm handoff; currently unsupported","description":"Protected Phorm handoff; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/browserops":{"post":{"tags":["Integrations"],"summary":"Protected BrowserOps check; currently unsupported","description":"Protected BrowserOps check; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/docs":{"post":{"tags":["Integrations"],"summary":"Protected Docs publishing; currently unsupported","description":"Protected Docs publishing; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/decks":{"post":{"tags":["Integrations"],"summary":"Protected Deck generation; currently unsupported","description":"Protected Deck generation; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/sheets":{"post":{"tags":["Integrations"],"summary":"Protected Sheets reporting; currently unsupported","description":"Protected Sheets reporting; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/v1/integrations/insights":{"post":{"tags":["Integrations"],"summary":"Protected Insights handoff; currently unsupported","description":"Protected Insights handoff; currently unsupported. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/indexnow":{"get":{"tags":["Layout"],"summary":"Read IndexNow configuration status","description":"Read IndexNow configuration status. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}},"post":{"tags":["Layout"],"summary":"Submit bounded canonical Layout URLs to IndexNow","description":"Submit bounded canonical Layout URLs to IndexNow. Boundary: protected.","security":[{"PlatPhormApiKey":[]},{"PlatPhormBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/api/mcp":{"get":{"tags":["MCP"],"summary":"Layout MCP JSON-RPC endpoint","description":"Layout MCP JSON-RPC endpoint. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}},"post":{"tags":["MCP"],"summary":"Layout MCP JSON-RPC endpoint","description":"Layout MCP JSON-RPC endpoint. Boundary: public-safe.","security":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]}}}},"400":{"description":"Invalid request"},"401":{"description":"AUTH_REQUIRED for protected actions without a valid PLATPHORM_API_KEY"}}}},"/openapi.yaml":{"get":{"tags":["Discovery"],"summary":"Read /openapi.yaml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/openapi.json":{"get":{"tags":["Discovery"],"summary":"Read /openapi.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/llms.txt":{"get":{"tags":["Discovery"],"summary":"Read /llms.txt","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/llms-full.txt":{"get":{"tags":["Discovery"],"summary":"Read /llms-full.txt","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/llms-index.json":{"get":{"tags":["Discovery"],"summary":"Read /llms-index.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/robots.txt":{"get":{"tags":["Discovery"],"summary":"Read /robots.txt","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/sitemap.xml":{"get":{"tags":["Discovery"],"summary":"Read /sitemap.xml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/sitemap-main.xml":{"get":{"tags":["Discovery"],"summary":"Read /sitemap-main.xml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/sitemap-index.xml":{"get":{"tags":["Discovery"],"summary":"Read /sitemap-index.xml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/rss.xml":{"get":{"tags":["Discovery"],"summary":"Read /rss.xml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/feed.xml":{"get":{"tags":["Discovery"],"summary":"Read /feed.xml","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/manifest.webmanifest":{"get":{"tags":["Discovery"],"summary":"Read /manifest.webmanifest","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/.well-known/mcp.json":{"get":{"tags":["Discovery"],"summary":"Read /.well-known/mcp.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/.well-known/agents.json":{"get":{"tags":["Discovery"],"summary":"Read /.well-known/agents.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/.well-known/ai-plugin.json":{"get":{"tags":["Discovery"],"summary":"Read /.well-known/ai-plugin.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/.well-known/security.txt":{"get":{"tags":["Discovery"],"summary":"Read /.well-known/security.txt","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}},"/.well-known/trust.json":{"get":{"tags":["Discovery"],"summary":"Read /.well-known/trust.json","description":"Public-safe discovery surface generated from the Layout route registry.","security":[],"responses":{"200":{"description":"Discovery response"}}}}},"components":{"securitySchemes":{"PlatPhormApiKey":{"type":"apiKey","in":"header","name":"X-PlatPhorm-API-Key","description":"This protected action requires PLATPHORM_API_KEY."},"PlatPhormBearer":{"type":"http","scheme":"bearer","bearerFormat":"PLATPHORM_API_KEY","description":"Protected actions accept Authorization: Bearer $PLATPHORM_API_KEY."}},"schemas":{"ApiSuccess":{"type":"object","properties":{"ok":{"type":"boolean"},"data":{"type":"object"}},"required":["ok"]},"ApiError":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}},"required":["code","message"]}},"required":["ok","error"]}}}}