{"openapi":"3.1.0","info":{"title":"favi HTTP API","summary":"favi developer resources — search free icon libraries and export favicon packages","description":"Public favi API hosted at getfavi.vercel.app. No authentication. Search Lucide, Tabler, Phosphor, Hugeicons, and Remix Icon; export a favicon zip (SVG, ICO, apple-touch, PWA). Versioning: URL path /api/v1/ is canonical (also declared via the optional API-Version header). Unversioned /api/* aliases v1 and is not deprecated. Breaking changes ship as /api/v2/. When a version is retired, responses include Deprecation: true and Sunset: <HTTP-date> (RFC 8594) for at least 90 days. Production is rate-limited by client IP; responses include RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, RateLimit, RateLimit-Policy, and Retry-After on 429. See /docs/versioning and /docs/rate-limits.","version":"1.0.0","contact":{"name":"favi","url":"https://github.com/JoeBuildsStuff/favi-next"},"license":{"name":"See repository","url":"https://github.com/JoeBuildsStuff/favi-next"}},"servers":[{"url":"https://getfavi.vercel.app","description":"Production (Vercel). Prefer /api/v1 paths."},{"url":"http://127.0.0.1:3000","description":"Local override"}],"tags":[{"name":"health","description":"Service status"},{"name":"icons","description":"Icon catalog search and lookup"},{"name":"export","description":"Favicon package export"}],"paths":{"/api/v1":{"get":{"tags":["health"],"operationId":"getApiIndex","summary":"favi HTTP API index","description":"Return the machine-readable entry point for the public favi API, including its canonical version, documentation URLs, error media type, and endpoint list.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Endpoint index","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"versioning":{"type":"string"},"openapi":{"type":"string"},"documentation":{"type":"string"},"endpoints":{"type":"array"}}}}}}}}},"/api/v1/health":{"get":{"tags":["health"],"operationId":"getHealth","summary":"Health and indexed icon count","description":"Check that the favi service is available and read the number of icons currently indexed across the supported free icon libraries.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Service is up","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"icons":{"type":"integer"}},"required":["status","icons"]}}}},"405":{"description":"Method not allowed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/libraries":{"get":{"tags":["icons"],"operationId":"listLibraries","summary":"List icon packs, licenses, and styles","description":"List the icon libraries available to favi, including their slugs, licenses, attribution notes, styles, and indexed icon counts.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Library list","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"libraries":{"type":"array","items":{"$ref":"#/components/schemas/Library"}}},"required":["libraries"]}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/icons":{"get":{"tags":["icons"],"operationId":"searchIcons","summary":"Search icons","description":"Search the indexed icon catalog by text and optionally filter by library or style. The q parameter expands curated synonyms such as photo to image and trash to delete.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query; expands curated synonyms"},{"name":"library","in":"query","schema":{"type":"string"}},{"name":"style","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":300,"default":96}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Search page","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconSearchResponse"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/icons/{library}/{name}":{"get":{"tags":["icons"],"operationId":"getIcon","summary":"Exact icon lookup","description":"Fetch one exact icon by its library slug and name, optionally selecting a style. The response includes the raw SVG and attribution metadata.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."},{"name":"library","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"style","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Icon with SVG","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconItem"}}}},"404":{"description":"Icon not found","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/v1/export":{"post":{"tags":["export"],"operationId":"exportFavicon","summary":"Export a favicon zip","description":"Create a downloadable favicon package from an indexed icon or one to two initials. The zip contains SVG, ICO, apple-touch, Android, and PWA assets, with optional dark-mode variants.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportBody"}}}},"responses":{"200":{"description":"Zip containing SVG, ICO, apple-touch, and PWA assets","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Invalid body","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Icon not found","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"Method not allowed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Export failed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api":{"get":{"tags":["health"],"operationId":"getApiIndexAlias","summary":"favi HTTP API index (alias of /api/v1)","description":"Stable unversioned alias of /api/v1. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Endpoint index","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"versioning":{"type":"string"},"openapi":{"type":"string"},"documentation":{"type":"string"},"endpoints":{"type":"array"}}}}}}}}},"/api/health":{"get":{"tags":["health"],"operationId":"getHealthAlias","summary":"Health and indexed icon count (alias of /api/v1/health)","description":"Stable unversioned alias of /api/v1/health. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Service is up","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"icons":{"type":"integer"}},"required":["status","icons"]}}}},"405":{"description":"Method not allowed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/libraries":{"get":{"tags":["icons"],"operationId":"listLibrariesAlias","summary":"List icon packs, licenses, and styles (alias of /api/v1/libraries)","description":"Stable unversioned alias of /api/v1/libraries. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"responses":{"200":{"description":"Library list","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"libraries":{"type":"array","items":{"$ref":"#/components/schemas/Library"}}},"required":["libraries"]}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/icons":{"get":{"tags":["icons"],"operationId":"searchIconsAlias","summary":"Search icons (alias of /api/v1/icons)","description":"Stable unversioned alias of /api/v1/icons. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query; expands curated synonyms"},{"name":"library","in":"query","schema":{"type":"string"}},{"name":"style","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":300,"default":96}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Search page","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconSearchResponse"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/icons/{library}/{name}":{"get":{"tags":["icons"],"operationId":"getIconAlias","summary":"Exact icon lookup (alias of /api/v1/icons/{library}/{name})","description":"Stable unversioned alias of /api/v1/icons/{library}/{name}. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."},{"name":"library","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"style","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Icon with SVG","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconItem"}}}},"404":{"description":"Icon not found","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Index unavailable","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/export":{"post":{"tags":["export"],"operationId":"exportFaviconAlias","summary":"Export a favicon zip (alias of /api/v1/export)","description":"Stable unversioned alias of /api/v1/export. Prefer the /api/v1 path for new integrations.","parameters":[{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportBody"}}}},"responses":{"200":{"description":"Zip containing SVG, ICO, apple-touch, and PWA assets","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"Invalid body","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Icon not found","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"description":"Method not allowed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limited","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Export failed","headers":{"API-Version":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimit-Limit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}},"components":{"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"schema":{"type":"string","enum":["1"]},"description":"Optional. Canonical versioning is the URL path /api/v1/. Send 1 to declare you target v1. Unversioned /api/* is a stable alias of v1."}},"headers":{"ApiVersion":{"description":"Current API major version. Always 1 for this document.","schema":{"type":"string","example":"1"}},"RateLimitLimit":{"description":"Maximum requests in the current window.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Advertised remaining quota. Production enforcement is the Vercel WAF (may 429 independently).","schema":{"type":"integer"}},"RateLimitReset":{"description":"Seconds until the advertised window resets.","schema":{"type":"integer"}},"RateLimit":{"description":"Combined RateLimit header: limit, remaining, reset.","schema":{"type":"string"}},"RateLimitPolicy":{"description":"Quota and window as {limit};w={seconds}.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying (RFC 9110). Sent on HTTP 429.","schema":{"type":"integer"}},"Deprecation":{"description":"RFC 9745 / IETF deprecation header. Sent as true when a version is retired. Not sent for v1.","schema":{"type":"string","example":"true"}},"Sunset":{"description":"RFC 8594 Sunset HTTP-date when a deprecated version will be removed. Not sent for v1.","schema":{"type":"string"}}},"schemas":{"Library":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"license":{"type":"string"},"attribution_note":{"type":"string"},"icon_count":{"type":"integer"},"styles":{"type":"array","items":{"type":"string"}}}},"IconItem":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"style":{"type":"string"},"tags":{"type":"string"},"library":{"type":"string"},"library_name":{"type":"string"},"license":{"type":"string"},"svg":{"type":"string"},"attribution_note":{"type":"string"}}},"IconSearchResponse":{"type":"object","properties":{"total":{"type":"integer"},"icons":{"type":"array","items":{"$ref":"#/components/schemas/IconItem"}},"limit":{"type":"integer"},"offset":{"type":"integer"}}},"ExportBody":{"type":"object","description":"Provide library+name, or text (1–2 initials). Color and plate fields are optional.","properties":{"library":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"style":{"type":"string"},"text":{"type":"string","nullable":true},"bg":{"type":"string","nullable":true},"fg":{"type":"string","nullable":true},"stroke":{"type":"string","nullable":true},"fill":{"type":"string","nullable":true},"padding":{"type":"number"},"stroke_scale":{"type":"number"},"shape":{"type":"string","enum":["rounded-square","circle","none"]},"bg_mode":{"type":"string","enum":["solid","linear"]},"bg_to":{"type":"string","nullable":true},"bg_angle":{"type":"number"},"include_dark_mode":{"type":"boolean"},"dark_bg":{"type":"string","nullable":true},"dark_bg_to":{"type":"string","nullable":true},"dark_fg":{"type":"string","nullable":true},"dark_stroke":{"type":"string","nullable":true},"dark_fill":{"type":"string","nullable":true},"site_name":{"type":"string"}}},"Problem":{"type":"object","description":"RFC 9457 application/problem+json error. Machine-readable code plus human-readable detail and hint.","required":["type","title","status","detail","instance","code","hint"],"properties":{"type":{"type":"string","format":"uri","description":"Canonical error URI on /docs/errors#{code}"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string","enum":["not_found","method_not_allowed","invalid_json","invalid_shape","invalid_bg_mode","invalid_text","missing_export_source","icon_not_found","index_unavailable","export_failed","rate_limited"]},"hint":{"type":"string","description":"How to recover or which request to send next"}}}}},"externalDocs":{"description":"favi developer resources","url":"https://getfavi.vercel.app/docs"}}