{"openapi":"3.1.0","info":{"title":"Shakel CDN API","version":"1.0.0","termsOfService":"https://shakel.netlify.app/policies/terms","contact":{"name":"Shakel support","url":"https://shakel.netlify.app/support"},"description":"Stateless validation, immutable themes, and deterministic avatar representations."},"externalDocs":{"description":"Shakel policies, licenses, and service guidance","url":"https://shakel.netlify.app/policies"},"x-shakel-policies":{"privacy":"https://shakel.netlify.app/policies/privacy","acceptableUse":"https://shakel.netlify.app/policies/acceptable-use","licenses":"https://shakel.netlify.app/policies/licenses"},"servers":[{"url":"https://cdn.shakel.lab.sa"}],"paths":{"/v1/avatars/{recipe}.svg":{"get":{"summary":"Render canonical SVG","parameters":[{"name":"recipe","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$","example":"AQAEAAAA"}}],"responses":{"200":{"description":"Deterministic immutable avatar representation","headers":{"ETag":{"schema":{"type":"string"}},"Content-Location":{"schema":{"type":"string","format":"uri"}},"Cache-Control":{"schema":{"type":"string"}}},"content":{"image/svg+xml":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Validator matched"},"400":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"406":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/avatars/{recipe}.png":{"get":{"summary":"Render bounded PNG","parameters":[{"name":"recipe","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$","example":"AQAEAAAA"}},{"name":"size","in":"query","schema":{"type":"integer","enum":[128,256,512,1024,2048],"default":1024}}],"responses":{"200":{"description":"Deterministic immutable avatar representation","headers":{"ETag":{"schema":{"type":"string"}},"Content-Location":{"schema":{"type":"string","format":"uri"}},"Cache-Control":{"schema":{"type":"string"}}},"content":{"image/png":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Validator matched"},"400":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"406":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/avatars/{recipe}.webp":{"get":{"summary":"Render bounded lossless WebP","parameters":[{"name":"recipe","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$","example":"AQAEAAAA"}},{"name":"size","in":"query","schema":{"type":"integer","enum":[128,256,512,1024,2048],"default":1024}}],"responses":{"200":{"description":"Deterministic immutable avatar representation","headers":{"ETag":{"schema":{"type":"string"}},"Content-Location":{"schema":{"type":"string","format":"uri"}},"Cache-Control":{"schema":{"type":"string"}}},"content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"Validator matched"},"400":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"406":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"413":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/avatars/{recipe}.json":{"get":{"summary":"Decode an avatar recipe","parameters":[{"name":"recipe","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{8}$","example":"AQAEAAAA"}}],"responses":{"200":{"description":"Decoded avatar and canonical links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Avatar"}}}},"304":{"description":"Validator matched"},"400":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/themes":{"get":{"summary":"List immutable theme releases","responses":{"200":{"description":"Theme registry","content":{"application/json":{"schema":{"type":"object"}}}},"304":{"description":"Validator matched"}}}},"/v1/themes/{themeId}":{"get":{"summary":"Read an immutable theme manifest","parameters":[{"name":"themeId","in":"path","required":true,"schema":{"type":"integer","minimum":0,"maximum":255}}],"responses":{"200":{"description":"Theme manifest","content":{"application/json":{"schema":{"type":"object"}}}},"304":{"description":"Validator matched"},"400":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Structured client or server error","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/schemas/theme":{"get":{"summary":"Read the theme-manifest JSON Schema","responses":{"200":{"description":"JSON Schema 2020-12 document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/schemas/theme-registry":{"get":{"summary":"Read the theme-registry JSON Schema","responses":{"200":{"description":"JSON Schema 2020-12 document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/schemas/avatar-library-backup":{"get":{"summary":"Read the avatar-library backup JSON Schema","responses":{"200":{"description":"JSON Schema 2020-12 document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/health/live":{"get":{"summary":"Process liveness","responses":{"200":{"description":"Process is live"}}}},"/health/ready":{"get":{"summary":"Renderer and catalog readiness","responses":{"200":{"description":"Renderer is ready"},"503":{"description":"Renderer is unavailable"}}}}},"components":{"schemas":{"Avatar":{"type":"object","required":["payload","recipe","theme","assets","renderer","links","source"],"properties":{"payload":{"type":"string","example":"AQAEAAAA"},"recipe":{"type":"object"},"theme":{"type":"object"},"assets":{"type":"object"},"renderer":{"type":"object","properties":{"version":{"const":"1.0.0"},"fingerprint":{"type":"string"},"digest":{"type":"string"}}},"links":{"type":"object"},"source":{"type":"object"}}},"Problem":{"type":"object","required":["type","title","status","detail","code","instance"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string"},"code":{"type":"string"},"instance":{"type":"string"}}}}}}