πŸ“Š RTNEAT Dataset APIs

← Home 2D studio 3D studio
Read-only (GET-only) HTTP APIs over the evolution recorders. Every run streams its species, genomes, lineage, innovations, snapshots and fitness to append-only NDJSON β€” plus, in 3D, multi-angle creature PNGs. Pull as JSON / CSV / NDJSON. Two services: the 2D ecosystem sim and the 3D creature sim.
Auth on every data request. Pass the token as Authorization: Bearer <token>, X-Api-Token: <token>, or ?token=<token>. Through the public domain you must use ?token= β€” the relay does not forward custom headers. Wrong / missing β†’ 401. Get your key from the studio: it's revealed after a run starts (stored in the browser as eco_api_token / sim3d_api_token). The /auth/google/* sign-in routes need no token.
Scoping differs. The 2D API is owner-scoped β€” a per-user token only sees its own runs (others 404). The 3D API is not scoped β€” any valid token sees all runs. The admin service token sees everything on both. Anywhere a <run_id> appears you may use the literal active to target the current run (e.g. /runs/active/summary).

2D sim β€” base …/ecosystem-api

Dataset for the 2D RTNEAT ecosystem (agents, species, mating / predation, replay clips, innovations). Grain rows accept format=json|csv|ndjson from to limit offset β€” from/to window the grain's numeric range-key (see the table). limit defaults to 1000, max 50000.

Meta & account

GET /ecosystem-api/auth/me
Who the token belongs to β†’ {account_id, email, name}.
GET /ecosystem-api/health
Liveness β†’ {ok:true}.

Runs

GET /ecosystem-api/runs
Runs you own β€” rows {run_id, session_id, owner, start_ts, skill, latest_seq, n_agents, live}. Add ?session=<id> to filter to one studio session.
GET /ecosystem-api/runs/active
Your most-recently-modified run β†’ {run_id} (404 if none).
GET /ecosystem-api/runs/<run_id>  /  /summary
Run summary β†’ {run, counts{…}, latest} (the two paths are aliases).
GET /ecosystem-api/runs/<run_id>/latest
The most recent snapshot row.

Grains β€” GET /ecosystem-api/runs/<run_id>/<grain>

GrainRange key (from/to)Each row
snapshotsseqperiodic population snapshot (pop / agent count per tick)
speciessnapshot_idper-species snapshot (members, fitness)
species-dimβ€”species dimension (first-seen, founder, color)
morphologysnapshot_idper-creature shape (worm spine / blob ΞΌ,Οƒ, size, diet)
eventstsbirth / death / mating / predation β€” filter with ?type=
innovations—NEAT structural innovation catalog (#, from→to, node|conn, first seen)
innovation-richnesssnapshot_idinnovation richness per snapshot
innovation-prevalencesnapshot_idcarrier counts per innovation over time
creature-innovationsβ€”per-creature innovation set at birth
JSON shape: a grain returns an envelope {run_id, grain, count, rows:[…]} for format=json; csv / ndjson emit the raw rows only. All responses send Access-Control-Allow-Origin: * (browser-fetchable); OPTIONS β†’ 204; any write (POST/PUT/DELETE/PATCH) β†’ 405.

Details & clips

GET /ecosystem-api/runs/<run_id>/agents/<seq>
Per-agent snapshot rows at snapshot seq (honors ?format=).
GET /ecosystem-api/runs/<run_id>/creatures/<cid>/innovations
One creature's innovation set β†’ {run_id, creature_id, count, rows[]}. Lineage in 2D is traced through creature_id.
GET /ecosystem-api/runs/<run_id>/clips  /  /clips/<clip_id>
Replayable champion clips β€” list (index rows) / one clip's frames {clip_id, frames[]}. 2D only.

3D sim β€” base …/sim3d-api

Dataset for the 3D creature-evolution sim. Includes auto-rendered multi-angle creature PNGs and full body morphology. Grain rows accept format=json|csv|ndjson limit offset since until (unix-time window) since_gen until_gen (generation window). Grain JSON is a bare array (no envelope).

Meta & reference

GET /sim3d-api/auth/me
Who the token belongs to β†’ {account_id, email, name} (admin β†’ account_id:"shared").
GET /sim3d-api/catalog
Every body mutation by limb type β†’ {limb_types:{leg:[{op, mutation_key, action, grows_on, description}…], …}}.
GET /sim3d-api/dictionary  /  /dictionary/hyperparams  /  /dictionary/fields  /  /dictionary/flat
Human-readable definitions of every hyperparameter & record field. /flat is one tall table (honors ?format=).

Runs

GET /sim3d-api/runs
All runs (rows are dim_run objects). ?session=<id> filters to one session.
GET /sim3d-api/runs/active
The most recently started run's dim_run ({} if none).
GET /sim3d-api/runs/<run_id>/summary
Counts + rollup β†’ {run, n_genomes, n_species, n_brain_innovations, n_morph_innovations, n_snapshots, n_population_metrics, dynamics{cum_births, cum_deaths, cum_new_species, avg_species_creation, total_mutations, latest_gen}}.
GET /sim3d-api/runs/<run_id>/config
β†’ {run_id, mode, medium, pop, started_at, hyperparams}.

🧬 Lineage

GET /sim3d-api/runs/<run_id>/lineage
The whole ancestry forest β€” every genome as {genome_id, parent_id, gen_born, species_id}. Build the tree by joining parent_id β†’ genome_id.
GET /sim3d-api/runs/<run_id>/genomes/<genome_id>/lineage
One genome's line → {genome_id, depth, ancestry[self→root], descendants[direct children]}.
GET /sim3d-api/runs/<run_id>/genomes/<genome_id>
One genome joined with its metric history + innovations β†’ {genome, metrics[], innovations[]}.

Species & images

GET /sim3d-api/runs/<run_id>/species/latest
Newest species (one row per id), each with its images[]. ?n=<k> for the k most recent (default 1).
GET /sim3d-api/runs/<run_id>/species/<species_id>
One species β†’ {species, images[]}.
GET /sim3d-api/runs/<run_id>/species/<species_id>/images
Just the token-baked PNG URL list β†’ [{url}].
GET /sim3d-api/runs/<run_id>/images/<species_id>/<file>.png
PNG bytes (image/png). Files are m<k>_<view>.png β€” view ∈ front | side | top | perspective, m<k> = the k-th morph member. Drop straight into an <img>; the token is already in the URL the API returns.

Grains β€” GET /sim3d-api/runs/<run_id>/<grain>

GrainEach row
genomesgenome_id, species_id, gen_born, timestamp, parent_id, morphology{spine[],head,tail}, brain{n_nodes,n_conns,n_motors}
genome-metricsgenome_id, gen, fitness, eaten (per genome / generation)
speciesper species (last per id): species_id, first_seen_gen, founder_genome_id, representative_genome_id, member_count, color, image_dir
snapshotsgen, timestamp, pop, n_species, best_fitness, mean_fitness
species-snapshotsgen, species_id, members, best_fitness, mean_fitness
population-metricsrich per-gen rollup: pop, births, deaths, birth_rate, death_rate, deaths_by_type, new_species, extinct_species, mutations, best/mean/std_fitness, mean_motors, cum_*
innovationsbrain NEAT genes: innovation_number, from_node, to_node, kind, first_seen_gen, first_seen_genome_id
creature-innovationsgenome_id, gen_born, innovation_numbers[]
morph-innovationsfirst-seen body parts: morph_key (flex-spine, flipper@side, fluke@tail-tip, spine_len=N…), first_seen_gen, first_seen_genome_id
eventstype (new_species, rep_changed, birth, death), species_id, gen, genome_id, timestamp
Morphology is embedded in each genomes row: spine = ordered segments {size:[x,y,z], side, dorsal, flex:{axis,rom}}, plus head / tail; fins / wings / flippers appear as side / dorsal appendages (decode via /catalog limb types). 3D has no owner scoping β€” any valid token sees every run.