API
SG-1no stateimmutable
One URL in, one avatar out. The same seed renders the same avatar on every request, from every replica, forever.
Endpoints
GET /v1/avatar/{seed}.svgimage/svg+xmlGET /v1/avatar/{seed}.pngimage/pngGET /v1/decode/{seed}JSON: spec, hex, palette, cellsGET /healthz200 okshell
curl 'https://sigil.oddkin.co/v1/avatar/ada@lovelace.dev.svg?size=128' curl 'https://sigil.oddkin.co/v1/decode/ada@lovelace.dev'
html
<img src="https://sigil.oddkin.co/v1/avatar/ada@lovelace.dev.svg" width="32" height="32" alt="">
Seeds
The path segment is URL-decoded UTF-8 and hashed exactly as given. Ada@Example.com and ada@example.com are different avatars. For email avatars, lowercase and trim the address before you build the URL. Encode / as %2F.
Parameters
size16–102464Rendered px; the viewBox is always 64.glyphtee | elbow | stubteeBase connection set, rotated per cell.paletteauto | copper | phosphor | cobalt | monoautoauto reads hash bits 96–97.substratedark | light | nonedarklight switches to the ink ramp.shaperounded | square | circleroundedClip path; rounded is rx 10.padding0–8 | auto0Insets the grid so corner elements clear the clip; auto is 6 for circle, 0 otherwise.blendtrue | falsetrueGrade joined traces between both shades.elementsmixed | viamixedvia draws every cell as a via.emptynone | some | manysomeShare of blank cells: 0, ≈25%, ≈50%.hash32 hex—Replaces the seed's hash; the seed is ignored.Errors
An invalid parameter returns 400 with the field that failed and what was expected.
{"error": "Expected 32 hex characters.", "field": "hash"}Caching
Output is a pure function of the spec, the seed or hash, and the parameters. Every response carries Cache-Control: public, max-age=31536000, immutable and an ETag of the form "SG-1-<sha1>", and answers If-None-Match with 304.