# EggoxDB API

Every mint, blueprint and person in Eggox, as JSON anyone can read. No key, no account.

[EggoxDB](https://mints.eggox.net) is the official database of every
mint in Eggox: what it is, who made it, how many exist, who holds one,
whether its master is still alive. The same numbers the game shows in
a thing's Supply block. Beside the mints are their blueprints and the
people who make and hold them. It has a JSON API, open to everyone, so
you can build on it: a price guide, a collection tracker, a bot that
says when something new is struck.

No key and no account. Plain `GET` requests, JSON back, CORS open to
any origin. Please keep to a request or two a second; a caller that
goes well past that gets `429` for a minute.

The API lives at `https://mints.eggox.net/api/` and, the same, at
`https://eggox.net/api/`: `mints`, `blueprints` and `people`. There are no kinds: a Voxel coin or
a competition prize is a mint by `Eggox`, found like any other.

## The list

    GET /api/mints?q=lantern&in=name&sort=editions&page=1&per_page=50

| Parameter | What it does |
| --- | --- |
| `q` | A word of the name. |
| `in` | Where `q` looks: `name` (the default), `author`, or `any`. |
| `author` | An author's name, exactly (case aside). `Eggox` is the Mint: the Voxel coins and the competition prizes. |
| `holder` | A person's name, exactly (case aside): the mints they hold, Voxel coins aside. Each mint then has `held`, how many of it they hold, and `sort` may be `held`. |
| `from`, `to` | Days (`YYYY-MM-DD`) the first edition was struck between, both ends included. |
| `master` | `alive` or `destroyed`. |
| `sort` | `first` (first struck, the default), `last`, `name`, `author`, `editions`, `holders`, `master`, `version`. |
| `dir` | `asc` or `desc`. Names go up and numbers and dates down unless told. |
| `page`, `per_page` | Paging; `per_page` is 50 by default and at most 100. |

The answer:

    {
      "mints": [ { ...a mint... } ],
      "page": 1, "per_page": 50, "pages": 3, "total": 121
    }

## One mint

    GET /api/mints/ln_9df3dabd223d525eb08fe440

    {
      "mint": {
        "lineage_id": "ln_9df3dabd223d525eb08fe440",
        "name": "Harbour lantern",
        "creator": { "name": "Nadia", "status": "citizen", "url": "https://eggox.net/u/Nadia" },
        "editions": 25,
        "holders": 9,
        "master_alive": true,
        "master_destroyed_at": null,
        "blueprint": "https://mints.eggox.net/b/ln_9df3dabd223d525eb08fe440",
        "version": 2,
        "first_minted_at": "2026-10-02T14:11:08Z",
        "last_minted_at": "2026-10-02T14:11:08Z",
        "content_hash": "3f1c…",
        "picture": "https://mints.eggox.net/pictures/3f1c….png",
        "url": "https://mints.eggox.net/m/ln_9df3dabd223d525eb08fe440",
        "coin_value": null,
        "award": null,
        "held_by": [
          { "name": "Nadia", "held": 16, "picture": "https://mints.eggox.net/u/Nadia/picture.png?v=…", "url": "https://eggox.net/u/Nadia" },
          { "name": "Omar", "held": 2, "picture": "https://mints.eggox.net/u/Omar/picture.png?v=…", "url": "https://eggox.net/u/Omar" }
        ],
        "held_by_more": 0,
        "held_by_unknown": { "people": 0, "held": 0 },
        "held_by_gone": { "people": 0, "held": 0 },
        "held_by_url": "https://mints.eggox.net/api/mints/ln_9df3dabd223d525eb08fe440/holders"
      }
    }

Field by field:

- `lineage_id`: the mint's lineage, the id to keep. It never changes,
  whatever version an edition wears.
- `creator`: whoever holds the master, as the game shows it, with a
  `status`. A `citizen` (someone who has checked their age) is named
  and `url` is their profile. Eggox's own mints are `eggox`, named
  `Eggox`. Nobody else is ever named: an `unknown` user (not yet a
  citizen) and a `gone` one (who deleted their account) have `name`
  `null`, and `url` is the one page for all of them. The author of a
  destroyed master is still the person who held it when it went.
  `creator` is `null` only where nothing is known of the master.
- `editions`: how many exist, summed across every holder. `holders`:
  how many people hold at least one.
- `master_alive`: `false` means the supply is final: no more will ever
  be made. While it is alive no more can be struck either, as long as
  any of these exist. `master_destroyed_at` is when its author
  destroyed it (`null` while it's alive, or where that isn't known).
  `blueprint` is the master's page, alive or destroyed, or `null`.
- `content_hash`: the SHA-256 of the mint's bytes, the same
  certificate the game shows. `picture` is drawn from those bytes.
- `coin_value`: for a Voxel coin, its face value in Voxels; otherwise
  `null`.
- `award`: for a competition prize, the engraving: the competition,
  the place, the entry, the stars, the day; otherwise `null`.

- `held_by` (one mint only): the first ten citizens who hold it, most
  first. `held_by_more` counts the rest, named or not. Nobody else is
  named: `held_by_unknown` and `held_by_gone` say how many unknown and
  deleted users hold it and how many they hold, never who. Who holds
  Voxel coins is never listed (they're money): `held_by` is empty, the
  two pools are `null` and `held_by_more` is everyone. The rest, ten
  at a time, and a search, are at `held_by_url`:

Unknown id: `404` with `{"reason": "not_found"}`.

### Who holds a mint

    GET /api/mints/ln_9df3dabd223d525eb08fe440/holders?q=nad&page=1

    {
      "holders": [
        { "name": "Nadia", "held": 16, "picture": "https://mints.eggox.net/u/Nadia/picture.png?v=…", "url": "https://eggox.net/u/Nadia" }
      ],
      "total": 1, "page": 1, "per_page": 10, "pages": 1,
      "not_listed": null, "unknown": null, "gone": null
    }

Ten a page, most first. `q` is a word of the name. `total` counts the
citizens listed (matching `q`); `not_listed` the holders who aren't,
and `unknown` and `gone` the two pools as above, all `null` while
searching. `picture` is how they look, as for people.

## Blueprints

The master every mint is struck from, with its published versions. A
master its author destroyed stays, with `master_alive` `false`: who
made it, when, and every version it had. Drafts, and blueprints nobody
minted, stay their author's own.

    GET /api/blueprints?q=lantern&in=name&sort=published&page=1

`q`, `in`, `author`, `dir`, `page` and `per_page` as for mints; `sort`
is `published` (the last published, the default), `name`, `author`,
`versions` or `editions`.

    GET /api/blueprints/ln_9df3dabd223d525eb08fe440

    {
      "blueprint": {
        "lineage_id": "ln_9df3dabd223d525eb08fe440",
        "name": "Harbour lantern",
        "creator": { "name": "Nadia", "status": "citizen", "url": "https://eggox.net/u/Nadia" },
        "versions": 2,
        "editions": 25,
        "master_alive": true,
        "master_destroyed_at": null,
        "first_published_at": "2026-09-30T09:12:44Z",
        "last_published_at": "2026-10-02T14:02:51Z",
        "picture": "https://mints.eggox.net/pictures/3f1c….png?v=2",
        "mint": "https://mints.eggox.net/m/ln_9df3dabd223d525eb08fe440",
        "url": "https://mints.eggox.net/b/ln_9df3dabd223d525eb08fe440",
        "published": [
          { "version": 2, "name": "Harbour lantern", "published_at": "2026-10-02T14:02:51Z", "source": "https://mints.eggox.net/b/ln_9df3dabd223d525eb08fe440/sources/2" },
          { "version": 1, "name": "Lantern", "published_at": "2026-09-30T09:12:44Z", "source": "https://mints.eggox.net/b/ln_9df3dabd223d525eb08fe440/sources/1" }
        ]
      }
    }

`published` (one blueprint only) lists every published version, newest
first; `source` is its voxel bytes, the format the game's own code
reads. `editions` is how many of its mints exist, whatever version
each shows: anyone holding one can show it as any of them.

## People

Everyone who has stepped into the world: when they came, how many
mints they made (the masters they hold), how many they hold (Voxel
coins aside). Only citizens are listed: someone who hasn't checked
their age yet, or who deleted their account, is never named.

    GET /api/people?q=nad&sort=joined&page=1

`q` is a word of the name; `sort` is `joined` (the default, newest
first), `name`, `made` or `holds`; `dir`, `page` and `per_page` as for
mints.

    GET /api/people/Nadia

    {
      "person": {
        "name": "Nadia",
        "joined": "2026-09",
        "made": 4,
        "holds": 11,
        "editions_held": 37,
        "picture": "https://mints.eggox.net/u/Nadia/picture.png?v=4be0c1a7d2f3e865",
        "url": "https://eggox.net/u/Nadia",
        "wearing": [
          { "name": "Sunny", "version": 2, "mint": "https://mints.eggox.net/m/ln_…" }
        ],
        "card": "https://eggox.net/u/Nadia/card.png?v=56637968dc2521bd",
        "made_url": "https://mints.eggox.net/api/mints?author=Nadia",
        "holds_url": "https://mints.eggox.net/api/mints?holder=Nadia"
      }
    }

`joined` is the month. `wearing` is what they have on, as anyone
meeting them in the world sees it; `mint` is `null` for something that
isn't a mint. `url` is their profile, the page to share; `card` is the
picture a link to it shows (1200 × 630: their character, their name,
these numbers), whose `?v=` changes when anything on it does.
`picture` is them as the tables show them: their character and what
they wear, cut to a transparent square; its `?v=` changes when what
they wear does (everyone in the same outfit shares one). Names are
matched case aside; an unknown name is `404`.

## The numbers

    GET /api/mints/stats

    {
      "lineages": 312, "editions": 48210, "holders": 1203,
      "voxels": { "total": 182350, "wallets": 171900, "coins": 10450 },
      "coins": [
        { "value": 1, "name": "Voxel Bit", "count": 950, "voxels": 950 },
        { "value": 50, "name": "Voxel Egg", "count": 190, "voxels": 9500 }
      ]
    }

`voxels.total` is every Voxel in existence: what sits in wallets plus
the face value of every coin out there.

## Pictures

`GET /pictures/<content_hash>.png` is the mint drawn by the game's own
renderer, cut to the thing itself and centred on a transparent square,
kept forever under that hash. Use the `picture` field as it is: its
`?v=` changes when the pictures do, so a cache never holds an old one.
Hot-link it freely. The renderer draws one at a time, so a picture
asked for the first time can take a moment.

