EVOLVE_API_KEY from the environment, or takes { apiKey, baseUrl }. Create a key on the dashboard’s API keys page.
Start a job
datasets is a list of selectors. A bare name resolves to the active version; task_names, exclude_task_names and n_tasks narrow the task set.
Every arm in agents names a model_name, and version, reasoning_effort, kwargs, preset and skills are optional. sandbox_provider picks "e2b", "daytona" or "modal". The fields are the same ones a -c config file takes on the CLI.
Wait for it
watch() returns a handle you either await, for the final job, or iterate, for each event. Pick one form per call.
event.type narrows event.data, so the fields above are typed.
Read the result
passAtK(job) reads a finished job’s pass@k out of its stats as sorted numbers. A refused request throws EvolveApiError; see errors.
A trial id is global, so trials() reaches one without the job.
artifact() takes the same names as evolve trial download --stream. Null means the trial never stored that artifact; it is a normal answer, not an error.
Download
evolve job download unpacks.
Analyze
analyze() enqueues one analysis per trial and returns at once. watchAnalysis() follows the batch of analyses to its end.
The catalog
Everything else
analyses(), checks(), skills(), agents(), auth() and orgs() are built the same way. meta() fetches the platform’s capability document, the live list of harnesses, models and limits, and needs no key. hosted() builds every client from one configuration.

