On-Chain Normies Data for Builders
The Normies API provides programmatic access to on-chain Normies NFT data, active rendering, Canvas history, Zombies, ERC-8004 agents, Legendary Canvas, and rarity data.
https://api.normies.art. Token IDs range from
0 to 9999. Most mutable data is served from the
Ponder indexer to avoid per-request RPC reads. See also:
/llms.txt for LLM-friendly documentation.
/normie/:id/* endpoints
apply current zombie and Canvas state. Zombie-converted tokens use zombie art and
attributes; Canvas-edited tokens use active base art XOR transform. Use
/normie/:id/original/* for original mint data.
Human-readable API documentation.
Markdown-style documentation intended for LLM and tool ingestion.
Health check returning { "status": "ok" }.
Bulk original mint dump with token ID, raw image data, decoded traits, pixel count, block number, timestamp, and transaction hash.
curl https://your-api-domain.com/normie/all/original
Alias-style bulk original mint dump with the same token rows.
Decoded original traits for all indexed tokens.
Raw original bytes8 trait hex for all indexed tokens.
Original raw image data and pixel counts for all indexed tokens.
Canvas-oriented alias for original bitmap rows.
Current indexed owner for a token. Returns upstream 404 if burned or not indexed.
Returns the active 40x40 bitmap as a 1600-character binary string. Zombie art and Canvas transforms are applied when present.
curl https://your-api-domain.com/normie/0/pixels
Returns the raw original mint bytes8 trait data as a hex string.
Returns decoded original mint traits as human-readable attributes.
Returns the active SVG image. Zombie art and Canvas transforms are applied when present.
curl https://your-api-domain.com/normie/0/image.svg -o normie.svg
Returns the active 1000x1000 PNG image rendered from the active SVG.
Returns active NFT metadata including Level, Pixel Count, Action Points, Customized, zombie attributes when converted, and Legendary Canvas artist when set.
Legendary Canvas state for a token.
Original mint bitmap as a 1600-character binary string, ignoring zombie and Canvas state.
Original mint SVG, ignoring zombie and Canvas state.
Original mint PNG, ignoring zombie and Canvas state.
Global Canvas contract status: paused state, max burn percent, tier thresholds, and tier minimum percents.
Canvas transform bitmap as a 1600-character string.
Pixel diff between active base art and Canvas transform: added, removed, and net change.
Canvas level, action points, customized flag, delegate, and delegate setter.
Paginated Canvas burn commitments.
One burn commitment plus its burned token details.
Burn commitments created by a wallet.
Burn commitments that transferred action points to a receiver token.
Paginated list of burned token records.
Burn record for a token.
Original SVG for a burned token.
Original PNG for a burned token.
Canvas transform event sync feed. Returns events, unique token IDs, count, pagination flag, and requested timestamp cursor.
Transform versions for a token with change count, new pixel count, transformer, block, timestamp, and transaction hash.
Historical composited pixel string for a transform version.
Historical composited SVG for a transform version.
Historical composited PNG for a transform version.
Indexer summary counts for burn commitments, burned tokens, transforms, token data, zombies, Legendary Canvas, and total action points.
Current indexed token IDs held by a wallet.
Zombie contract status and pool configuration.
Paginated zombie conversion commitments and reveal state.
Zombie conversions for a qualifying wallet.
Zombie info plus conversion history for a token.
Zombie attributes for a token.
Zombie bitmap as a 1600-character string.
Zombie SVG image.
Zombie PNG image.
Paginated list of tokens marked with the Legendary Canvas artist trait.
Legendary Canvas state for a single token.
ERC-8004 metadata JSON served as the on-chain agent URI.
Persona JSON for any token, whether or not it is registered as an agent.
Trait-derived agent name, type, and raw trait map.
Registered-agent persona, traits, live Canvas state, registration metadata, and placeholder interaction/MCP status.
Reverse lookup by ERC-8004 agent ID, returning the same shape as /agents/info/:tokenId.
Paginated registered-agent gallery feed enriched with identity.
Search registered agents by name, token ID, or agent ID.
Total registered Normies agents.
A2A v0.3.0 Agent Card JSON linked from ERC-8004 metadata.
Composited SVG image for an agent.
Normies-only ERC-8004 binding lookup for one token.
Batch ERC-8004 binding lookup. Body: { "tokenIds": [...] }.
Reverse lookup returning the raw binding for an agent ID.
rarity.normies.art. They are backed by a bulk
Ponder snapshot plus short API-server caches. Historical routes recompute
ownership, burn counts, traits, and ranks at an Ethereum block number from
indexed event state; marketplace listings are current-only and omitted from
historical responses.
Small JSON list of rarity endpoints.
Live rarity stats: indexed count, live supply, burned count, weights, listing count, floor price, and awakened-agent count.
Paginated live rarity list with rank, score, attributes, listing data, fair value, underpriced flag, burn count, and awakened-agent metadata.
Full live rarity detail for one token. Returns 410 if burned.
Forces the live rarity collection cache to reload, then returns the same detail shape as /rarity/normie/:id.
Awakened-agent persona fields used by the rarity modal. Returns 404 if the token is not an agent.
Trait filter counts over live, non-burned tokens.
Current indexed rarity holdings for a wallet. ENS names are accepted and resolved at request time.
Leaderboard of current wallets by recursive burn count of held customized tokens.
Rarity stats recomputed at an Ethereum block number. Listings and floor price are omitted.
Paginated rarity list at a block number. Supports the same non-marketplace filters and sort modes as the live list.
Full rarity detail for one token at a block number. Returns 410 if burned at that block and 404 if not indexed yet.
Trait filter counts over live, non-burned tokens at a block number.
Indexed wallet holdings at a block number. ENS names are accepted but resolved at request time.
Leaderboard of wallets by recursive burn count of held customized tokens at a block number.
Server-Sent Events for listing changes: listed, sold, and cancelled.
Rarity-app Legendary Canvas curation config with current and upcoming arrays, loaded from the indexer database.
Admin-only save for Legendary Canvas curation config into the indexer database.
Every public endpoint above lists the Cache-Control header this server sets. none means the API server does not set an explicit cache header for that endpoint.
| Route family | Public cache header | Notes |
|---|---|---|
/rarity/* | public, max-age=15, s-maxage=30, stale-while-revalidate=120 | Except admin routes and listing stream. |
/rarity/admin/*, /rarity/listings/stream | no-store | The SSE route also emits event-stream headers. |
/canvas/status | public, max-age=300, s-maxage=300 | Derived from CANVAS_STATUS_CACHE_TTL_MS. |
/zombies/status | public, max-age=10, s-maxage=10 | Derived from ZOMBIE_STATUS_CACHE_TTL_MS. |
* /canvas/info | public, max-age=60, s-maxage=60 | Derived from CANVAS_INFO_CACHE_TTL_MS. |
| Owner and holder routes | public, max-age=10, s-maxage=10 | /normie/:id/owner and /holders/:address. |
| Original data and traits routes | public, max-age=300, s-maxage=3600 | Immutable mint data. |
/history/* | public, max-age=60, s-maxage=300 | Indexed append-only history and version rendering. |
| Default rendered/indexed routes | public, max-age=60, s-maxage=300 | Active images, metadata, zombie aliases, Legendary Canvas, and uncategorized cached routes. |
/agents/* | Varies by endpoint | Agent routes set explicit cache headers per endpoint. |
/favicon.png, /favicon.ico | public, max-age=86400 | Static icon. |
| Setting | Default | Used for |
|---|---|---|
CACHE_TTL_MS | 3600000 ms / 3600 s | Bulk token dump cache and positive agent binding cache. |
CANVAS_CACHE_TTL_MS | 60000 ms / 60 s | Canvas transform and transformed-state caches. |
CANVAS_INFO_CACHE_TTL_MS | 60000 ms / 60 s | Canvas info cache, agent response cache, and negative agent binding TTL. |
CANVAS_STATUS_CACHE_TTL_MS | 300000 ms / 300 s | Canvas global status cache. |
ZOMBIE_CACHE_TTL_MS | 60000 ms / 60 s | Zombie token info and bitmap caches. |
ZOMBIE_STATUS_CACHE_TTL_MS | 10000 ms / 10 s | Zombie status response cache. |
LEGENDARY_CANVAS_CACHE_TTL_MS | 60000 ms / 60 s | Legendary Canvas token info cache. |
RARITY_CACHE_TTL_MS | 60000 ms / 60 s | Live and historical rarity collection snapshots; historical cache keeps up to 32 block snapshots. |
RARITY_LISTINGS_REFRESH_MS | 60000 ms / 60 s | OpenSea listing poll interval for rarity listings. |
transformHistoryCache | 30000 ms / 30 s | Per-token transform history in memory. |
| Immutable token caches | No TTL | Original image data, raw traits, and decoded traits are cached in-process because mint data is immutable. |
| Category | Byte Index | Possible Values |
|---|---|---|
| Type | 0 | Human, Cat, Alien, Agent |
| Gender | 1 | Male, Female, Non-Binary |
| Age | 2 | Young, Middle-Aged, Old |
| Hair Style | 3 | 21 options (Short Hair, Long Hair, Curly Hair, ...) |
| Facial Feature | 4 | 17 options (Full Beard, Mustache, Goatee, ...) |
| Eyes | 5 | 14 options (Classic Shades, Big Shades, ...) |
| Expression | 6 | 7 options (Neutral, Slight Smile, Serious, ...) |
| Accessory | 7 | 15 options (Top Hat, Fedora, Cowboy Hat, ...) |
Each Normie is a 40x40 monochrome bitmap stored as 200 bytes on-chain: 1 bit per pixel, MSB first.
| Property | Value |
|---|---|
| Grid Size | 40 x 40 pixels |
| Bit Order | MSB first; most significant bit is the leftmost pixel |
| Layout | Row-major, top-left to bottom-right |
| Pixel On | 1 - dark gray (#48494b) |
| Pixel Off | 0 - light gray (#e3e5e4) |
| Storage Size | 200 bytes / 1600 bits |
flatIndex = y * 40 + x
byteIndex = flatIndex >> 3 // divide by 8
bitPos = 7 - (flatIndex & 7) // MSB first
pixel = (data[byteIndex] >> bitPos) & 1
Requests are rate-limited per IP address using a sliding window.
| Limit | Value |
|---|---|
| Requests | 60 per minute by default |
| Window | Sliding 60 seconds |
Rate limit headers are included in responses:
X-RateLimit-Limit - max requests per windowX-RateLimit-Remaining - remaining requests in the current windowRetry-After - seconds until retry is allowed, only on 429| Status | Meaning |
|---|---|
| 400 | Invalid token, address, query, or body |
| 401 | Invalid admin key |
| 403 | Admin disabled |
| 404 | Not found, not indexed, or data not set on-chain |
| 410 | Burned token on rarity detail |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
| 502 | Upstream indexer, RPC, or provider failure |
Error responses are JSON:
{ "error": "Invalid token ID: \"abc\". Must be an integer 0-9999." }
| Contract | Address | Description |
|---|---|---|
| Normies | 0x9Eb6E2025B64f340691e424b7fe7022fFDE12438 | Core ERC721C token with ERC-2981 royalties |
| NormiesStorage | 0x1B976bAf51cF51F0e369C070d47FBc47A706e602 | SSTORE2 bitmap and trait storage with XOR encryption |
| NormiesRenderer | 0xBe57fC4D0c729b8e8d33b638Dd441F57365e4c25 | V1 renderer: animated noise pre-reveal, static SVG post-reveal |
| NormiesRendererV2 | 0x7818f24d3239c945510e0a1a523dd9971812c6c0 | V2 renderer: static noise pre-reveal |
| NormiesRendererV3 | 0x1af01b902256d77cf9499a14ef4e494897380b05 | V3 renderer: RLE-optimized SVG, Pixel Count trait, canvas animation URL |
| NormiesMinter | 0xC74994dD70FFb621CC514cE18a4F6F52124e296d | V1 EIP-191 signature-verified minting |
| NormiesMinterV2 | 0xc513272597d3022D77b3d7EEBA92cea5D7fb2808 | V2 minting with delegate.xyz v1/v2 cold wallet delegation |
| NormiesCanvas | 0x64951d92e345C50381267380e2975f66810E869c | Burn-to-edit orchestrator: commit-reveal burns, action points, and pixel transforms |
| NormiesCanvasStorage | 0xC255BE0983776BAB027a156681b6925cde47B2D1 | SSTORE2 storage for transform layer bitmaps |
| NormiesRendererV4 | 0x8eC46Cc1f306652868a4dfbAAae87CBa2715A0eB | V4 Canvas-aware renderer with composited SVG and extra traits |
| NormiesZombie | 0x18533ad55a54c3847Da06A48b51aD7DcB2551202 | Merkle-gated commit-reveal converter that turns eligible Normies into bespoke Zombies |
| NormiesZombieStorage | 0xA331bD22C90D1DA096934Db8bc6b69F0e1491E26 | SSTORE2 storage for zombie pool assets and conversion records |
| NormiesLegendaryCanvas | 0xfA55f6592522dA74224a67c7D3Fd1DF759c628e8 | Owner-managed registry of selected Legendary Canvas artist traits |
| NormiesRendererV5 | 0x7c726f02C5e840e1656b522A5C22caaf87C1C35C | V5 renderer: V4-compatible renderer with zombie metadata and art branches |