{ "openapi": "3.1.0", "info": { "title": "PageAudit", "version": "f5ac3ca0", "description": "Technical SEO auditor that ships the fix. Main client: AI agents. Browsable index at GET /api/." }, "servers": [ { "url": "https://pageaudit.online" } ], "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "description": "Guest token (`POST /api/guest`) in `X-Guest-Token: pa_…`, `Authorization: Bearer pa_…` or `?guest_token=pa_…`. A user session (`sess_…`) also works and takes precedence." } }, "schemas": { "Audit": { "type": "object", "properties": { "id": { "type": "string", "description": "ID of the stored audit; `null` when the database was unavailable.", "nullable": true }, "score": { "type": "integer", "description": "Score from 0 to 100, computed from the findings below." }, "issues": { "type": "array", "items": { "$ref": "#/components/schemas/Achado" }, "description": "Everything found, from most to least severe." }, "summary": { "allOf": [ { "$ref": "#/components/schemas/ResumoPagina" } ], "description": "What the page declares: title, meta, canonical, OG, headings, links…" }, "counts": { "allOf": [ { "$ref": "#/components/schemas/ContagemAchados" } ], "description": "How many findings of each severity." }, "headers": { "type": "object", "description": "Every header of the target's response. `Set-Cookie` is removed on purpose: it is a third party's credential." }, "htmlTruncated": { "type": "boolean", "description": "`true` when the page passed 2 MB and was read only that far." }, "jsonLd": { "type": "array", "items": { "type": "object" }, "description": "The raw JSON-LD blocks, as they were on the page." }, "jsonLdStored": { "type": "integer", "description": "How many blocks survived the size cap — compare with `summary.jsonLdBlocks`." }, "truncated": { "type": "array", "items": { "type": "string" }, "description": "What was cut and why: `jsonld_size`, `jsonld_nodes_over_50`, `result_size`. Empty means nothing cut." }, "fixes": { "type": "array", "items": { "$ref": "#/components/schemas/Correcao" }, "description": "The ready fix of each finding, without a model — paste, fill in or decide. The consolidated one is at `_links.patch`." }, "quota": { "allOf": [ { "$ref": "#/components/schemas/CotaAudit" } ], "description": "How much is still free and what it costs past that." }, "_links": { "allOf": [ { "$ref": "#/components/schemas/LinksAudit" } ], "description": "This audit, the patch, the share and the API index." } }, "required": [ "id", "score", "issues", "summary", "counts", "headers", "htmlTruncated", "jsonLd", "jsonLdStored", "truncated", "fixes", "quota", "_links" ], "description": "The report of one audit: score, findings and everything observed on the page." }, "Achado": { "type": "object", "properties": { "severity": { "type": "string", "description": "Severity of the finding." }, "code": { "type": "string", "description": "Stable check code, e.g. `title_missing`. It is what you filter by." }, "message": { "type": "string", "description": "The finding in one sentence, ready to show a person." } }, "required": [ "severity", "code", "message" ], "description": "A problem (or a pass) found on the page." }, "ResumoPagina": { "type": "object", "properties": { "finalUrl": { "type": "string", "description": "URL after following every redirect." }, "status": { "type": "integer", "description": "Final HTTP status of the target." }, "contentType": { "type": "string", "description": "Content-Type of the final response.", "nullable": true }, "title": { "type": "string", "description": "Content of `