{"openapi":"3.1.0","info":{"title":"PixelHue Mirror API","version":"1.0.0","description":"Public read-only API for PixelHue Mirror, an unofficial mirror of PixelHue video processor firmware, software, and documentation. No authentication is required. All endpoints are GET-only and safe to call programmatically. The homepage and error responses additionally support content negotiation: send `Accept: text/markdown` for Markdown or `Accept: application/json` for structured JSON errors. Versioning: the current API version is 1, returned in the `API-Version` response header on every API response; clients may send the optional `API-Version` request header to pin a version. Breaking changes ship under a new major version — deprecated operations emit `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers at least 90 days before removal. Rate limits: responses carry `RateLimit-Limit`/`RateLimit-Remaining`/`RateLimit-Reset` policy headers (60 requests per minute per client); exceeded clients receive 429 with `Retry-After`."},"servers":[{"url":"https://mirror.pixelhue.wiki"}],"paths":{"/api":{"get":{"operationId":"getApiIndex","summary":"Get the API index","description":"Returns a machine-readable index of all API endpoints with links to the documentation and this OpenAPI specification.","parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The API index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/":{"get":{"operationId":"getHomepage","summary":"Get the file catalog homepage","description":"Returns the full catalog. Content negotiation via `Accept`: `text/html` (default) for the interactive page, `text/markdown` for a Markdown listing of every group, product, and file with download links, or `application/json` for the same payload as getCatalog. Responses include `Vary: Accept` and an ETag.","parameters":[{"name":"Accept","in":"header","required":false,"description":"Response format: `text/html` (default), `text/markdown`, or `application/json`.","schema":{"type":"string","enum":["text/html","text/markdown","application/json"],"default":"text/html"}},{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The catalog homepage in the negotiated format.","content":{"text/markdown":{"schema":{"type":"string","description":"Markdown catalog: one section per product group, one list item per file with a download link."}},"text/html":{"schema":{"type":"string","description":"Interactive HTML catalog with search and filters."}},"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}},"503":{"description":"Catalog database is syncing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/catalog.json":{"get":{"operationId":"getCatalog","summary":"Get the full catalog as JSON","description":"Returns every product group with its products and files (latest version per file kind). Use `groups[].products[].files[].url`, take the last path segment, and URL-encode it to build a download URL via the downloadFile operation. Supports ETag/If-None-Match caching.","parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The full catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}},"503":{"description":"Catalog database is syncing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/changes.json":{"get":{"operationId":"getChanges","summary":"List recently changed files","description":"Returns files whose upstream version changed recently, sorted by lastChangedAt descending. Poll this endpoint to detect firmware, software, or document updates.","parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Recently changed files, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangesResponse"}}}},"503":{"description":"Catalog database is syncing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/{filename}":{"get":{"operationId":"downloadFile","summary":"Download or view a file by filename","description":"Serves a catalog file by its URL-encoded filename (the last path segment of any file URL, also listed in /sitemap.xml). Documents (PDF/TXT) are rendered inline and are indexable; binaries (firmware/software packages) download as attachments and carry `X-Robots-Tag: noindex`.","parameters":[{"name":"filename","in":"path","required":true,"description":"URL-encoded filename, e.g. `PixelFlow_u5_V2.2.0.zip`.","schema":{"type":"string"}},{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The requested file. Content-Type matches the file type; Content-Disposition is `inline` for documents and `attachment` for binaries.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"No file with that name exists. The body format follows the Accept header: Markdown for text/markdown, structured JSON for application/json, plain text otherwise.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Catalog database is syncing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sitemap.xml":{"get":{"operationId":"getSitemap","summary":"Get the XML sitemap","description":"XML sitemap covering the homepage and every file URL, including superseded versions.","parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The sitemap.","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Get agent instructions","description":"llms.txt file describing when to use this site and how an agent should call each endpoint.","parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"The llms.txt document.","content":{"text/plain":{"schema":{"type":"string"}}}}}}}},"components":{"parameters":{"ApiVersionHeader":{"name":"API-Version","in":"header","required":false,"description":"Pin the API version. Current version is `1`; every response echoes the active version in the `API-Version` header. Deprecated operations emit `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers at least 90 days before removal.","schema":{"type":"string","enum":["1"],"default":"1"}}},"schemas":{"ApiIndex":{"type":"object","required":["name","version","documentation","openapi","endpoints"],"properties":{"name":{"type":"string"},"version":{"type":"integer","description":"Current API major version."},"description":{"type":"string"},"documentation":{"type":"string","description":"Human-readable API documentation URL."},"openapi":{"type":"string","description":"URL of this OpenAPI specification."},"endpoints":{"type":"array","items":{"type":"object","required":["operationId","method","path"],"properties":{"operationId":{"type":"string"},"method":{"type":"string","enum":["GET"]},"path":{"type":"string"},"notes":{"type":"string"}}}}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint"],"properties":{"code":{"type":"string","description":"Machine-readable error code, e.g. `not_found` or `syncing`.","enum":["not_found","syncing"]},"message":{"type":"string","description":"Human-readable explanation of what went wrong."},"hint":{"type":"string","description":"Actionable next step: where to find valid resources or when to retry."}}}}},"CatalogFile":{"type":"object","required":["kind","category","title","url"],"properties":{"kind":{"type":"string","description":"File kind, e.g. `Firmware`, `User Manual`, `Specification`."},"category":{"type":"string","enum":["firmware","software","document","other"]},"title":{"type":"string","description":"Full display title."},"version":{"type":["string","null"],"description":"Parsed version number, when present."},"url":{"type":"string","description":"Upstream file URL; use its last path segment with the downloadFile operation."},"size":{"type":"string","description":"Human-readable file size, e.g. `233 MB`."},"date":{"type":["string","null"],"description":"Release or modification date (ISO 8601)."},"recentlyUpdated":{"type":"boolean"},"lastChangedAt":{"type":["string","null"],"description":"When this entry last changed upstream (ISO 8601)."}}},"CatalogProduct":{"type":"object","required":["name","files"],"properties":{"name":{"type":"string","description":"File category, e.g. `Firmware`, `Software`, `Specifications`."},"files":{"type":"array","items":{"$ref":"#/components/schemas/CatalogFile"}}}},"CatalogGroup":{"type":"object","required":["name","products"],"properties":{"name":{"type":"string","description":"Product model, e.g. `Q8`."},"products":{"type":"array","items":{"$ref":"#/components/schemas/CatalogProduct"}}}},"CatalogResponse":{"type":"object","required":["generatedAt","fileCount","groups"],"properties":{"generatedAt":{"type":["string","null"],"description":"When the upstream catalog snapshot was generated (ISO 8601)."},"fileCount":{"type":"integer","description":"Total number of files in the catalog."},"groups":{"type":"array","items":{"$ref":"#/components/schemas/CatalogGroup"}}}},"ChangesResponse":{"type":"object","required":["count","changes"],"properties":{"count":{"type":"integer"},"changes":{"type":"array","items":{"type":"object","required":["title","url","category","lastChangedAt"],"properties":{"group":{"type":"string"},"product":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"category":{"type":"string"},"size":{"type":["string","number","null"],"description":"File size as reported upstream."},"lastModified":{"type":["string","null"],"description":"Upstream last-modified timestamp (ISO 8601)."},"recentlyUpdated":{"type":"boolean"},"lastChangedAt":{"type":["string","null"]}}}}}}}}}