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.<run_id> appears you may use the literal active to target the current run (e.g. /runs/active/summary).β¦/ecosystem-apiDataset 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.
{account_id, email, name}.{ok:true}.{run_id, session_id, owner, start_ts, skill, latest_seq, n_agents, live}. Add ?session=<id> to filter to one studio session.{run_id} (404 if none).{run, counts{β¦}, latest} (the two paths are aliases).| Grain | Range key (from/to) | Each row |
|---|---|---|
snapshots | seq | periodic population snapshot (pop / agent count per tick) |
species | snapshot_id | per-species snapshot (members, fitness) |
species-dim | β | species dimension (first-seen, founder, color) |
morphology | snapshot_id | per-creature shape (worm spine / blob ΞΌ,Ο, size, diet) |
events | ts | birth / death / mating / predation β filter with ?type= |
innovations | β | NEAT structural innovation catalog (#, fromβto, node|conn, first seen) |
innovation-richness | snapshot_id | innovation richness per snapshot |
innovation-prevalence | snapshot_id | carrier counts per innovation over time |
creature-innovations | β | per-creature innovation set at birth |
{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.seq (honors ?format=).{run_id, creature_id, count, rows[]}. Lineage in 2D is traced through creature_id.{clip_id, frames[]}. 2D only.β¦/sim3d-apiDataset 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).
{account_id, email, name} (admin β account_id:"shared").{limb_types:{leg:[{op, mutation_key, action, grows_on, description}β¦], β¦}}./flat is one tall table (honors ?format=).dim_run objects). ?session=<id> filters to one session.dim_run ({} if none).{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}}.{run_id, mode, medium, pop, started_at, hyperparams}.{genome_id, parent_id, gen_born, species_id}. Build the tree by joining parent_id β genome_id.{genome_id, depth, ancestry[selfβroot], descendants[direct children]}.{genome, metrics[], innovations[]}.images[]. ?n=<k> for the k most recent (default 1).{species, images[]}.[{url}].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.| Grain | Each row |
|---|---|
genomes | genome_id, species_id, gen_born, timestamp, parent_id, morphology{spine[],head,tail}, brain{n_nodes,n_conns,n_motors} |
genome-metrics | genome_id, gen, fitness, eaten (per genome / generation) |
species | per species (last per id): species_id, first_seen_gen, founder_genome_id, representative_genome_id, member_count, color, image_dir |
snapshots | gen, timestamp, pop, n_species, best_fitness, mean_fitness |
species-snapshots | gen, species_id, members, best_fitness, mean_fitness |
population-metrics | rich 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_* |
innovations | brain NEAT genes: innovation_number, from_node, to_node, kind, first_seen_gen, first_seen_genome_id |
creature-innovations | genome_id, gen_born, innovation_numbers[] |
morph-innovations | first-seen body parts: morph_key (flex-spine, flipper@side, fluke@tail-tip, spine_len=Nβ¦), first_seen_gen, first_seen_genome_id |
events | type (new_species, rep_changed, birth, death), species_id, gen, genome_id, timestamp |
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.