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 (pixels attached), customized flag, delegate, delegate setter, gridSize, baseCleared, migrated, lockedPixels and freePixels.
Pixels on one Normie: attached, locked (backing the overlay), free (withdrawable without a reset), level, grid size, blank-canvas flag.
Ledger events that changed the pixels attached to a token, newest first.
Pixels spent on canvas services: enlargements and blank canvases, with cost, source and the paying wallet.
Wallet balance plus the pixels on the wallet's Normies (attached, locked, free, per-token breakdown).
Holders of #PIXEL, largest first. balance counts every pixel a wallet controls: wallet + listed (its open market listings) + attached (on the Normies it owns).
One wallet counted the same way: { address, balance, wallet, listed, attached, normiesWithPixels }.
Wallet balance moves involving the address, newest first.
Total pixels in wallets and attached to migrated Normies, plus the number of holding wallets.
Market config from the chain: paused flag, fee and revenue-share basis points, canvas service prices.
Listings with seller, price per pixel, amount, remaining, fill mode, expiry and status.
One listing plus its fills.
Active listings grouped by price level, cheapest first.
Fill feed with buyer, seller, amount, price, gross and fee.
Fills where the address bought or sold.
Totals, active listings, pixels listed, best ask, last price, 24h volume, fee config.
OHLC in wei per pixel from fills, with volume and pixel counts per bucket.
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.
Every burned token id in one response: { count, ids }, ids ascending.
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.
Original-canvas commitments never revealed there (that canvas is paused after the Pixel Market cutover). Anyone can replay them through NormiesCanvasV2.revealLegacyBurn. Burn commitments carry contractVersion (1 or 2); /history/burns/:commitId takes ?version= because ids restart at 0 on V2.
Indexer summary counts for burn commitments, burned tokens, transforms, token data, zombies, Legendary Canvas, and total action points, plus pixel supply, market totals and canvas sinks.
Current indexed token IDs held by a wallet.
Canvas edit rights delegated to a wallet, filtered to the delegations NormiesCanvas still honours. Delegations set by a previous owner are dropped. Returns tokenIds plus an owners map.
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. |
/pixels/*, /market/*, /canvas/sinks, /canvas/token/* | public, max-age=10, s-maxage=10 | Derived from MARKET_CACHE_TTL_MS. |
* /canvas/info | public, max-age=60, s-maxage=60 | Derived from CANVAS_INFO_CACHE_TTL_MS. |
| Owner, holder and delegation routes | public, max-age=10, s-maxage=10 | /normie/:id/owner, /holders/:address and /delegations/: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, Zombie (converted tokens only; served from zombie attributes, not the trait byte) |
| 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's original art is a 40x40 monochrome bitmap stored as 200 bytes on-chain: 1 bit per pixel, MSB first. A canvas can be enlarged to 50, 60, 70 or 80 pixels per side; the original art then sits centred and the active bitmap grows to ceil(n*n/8) bytes. Pixel strings served by the API are n*n characters long.
| Property | Value |
|---|---|
| Grid Size | 40 x 40 pixels by default; 50, 60, 70 or 80 after enlargement |
| 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 / 313 / 450 / 613 / 800 bytes for 40 / 50 / 60 / 70 / 80; the last 4 bits of a 50 or 70 bitmap are padding and always zero |
n = grid side (40, 50, 60, 70 or 80; 200 bytes means 40)
flatIndex = y * n + 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 |
| NormiesCanvasV2 | 0xF14f2852e1fD6A4108156054AF49B3915dc40E2e | Burns, painting, withdraw and deposit of pixels, canvas enlargement and blank canvas; the original canvas is paused |
| NormiesCanvasStorageV2 | 0x96F2DA32Bb9D429d59ac13dB469f4950cBe02084 | Overlay bitmaps of any grid size plus the pixel accounting: wallet and per-Normie balances, copied from NormiesCanvas once at cutover |
| NormiesPixelMarket | 0x86156A8d6e4B9925F7fEca527ea5D71B0deeDB64 | Sell-side order book: partial or all-or-nothing fills, fee out of seller proceeds |
| NormiesRendererV6 | 0xd6747533697878a6a3a29B5cCf815740BA23998D | Grid-size aware renderer with Canvas Size and Blank Canvas traits |
| NormiesRevenuePool | 0x481384812e79bf0d11FC0b1704af445D5F06813c | Holds the holders' half of market fees and royalties and pays it out in epochs with Merkle proofs |
| NormiesRoyaltySplitter | 0xA68A225f62772E6158f2B5f8afC184AdB69c3282 | Royalty receiver: splits royalties between the revenue pool and the team |