snake_case, identical in TypeScript and Python. Four keys are the exception: TypeScript exposes nextCursor, hasMore, byStatus and taskMatrix as the wire spells them; Python maps them to next_cursor, has_more, by_status and task_matrix. Python results are dataclasses and their closed vocabularies are Literal types.
Eleven closed vocabularies are exported as runtime lists in TypeScript: TRIAL_STATUSES, ANALYSIS_STATUSES, CHECK_STATUSES, EVAL_SANDBOX_PROVIDERS, JOB_LIST_SCOPES, TRIAL_ARTIFACT_STREAMS, ANALYSIS_ARTIFACT_STREAMS, AGENT_EFFORT_SUPPORT_VALUES, TASK_LINKED_BY, TASK_LINK_REASONS and HOSTED_ERROR_CODES. Python exports HOSTED_ERROR_CODES.
Page
Every list answersPage<T>: items, nextCursor (pass it back as cursor; null means no next page) and hasMore. A list handle is awaited for one page or iterated for every page.
Job
One shape fromstart, get, list, cancel, resume, retry and regrade.
AgentArm
RetryConfig
max_retries, include_exceptions (string[] or null, null meaning no filter), exclude_exceptions (string[]), wait_multiplier, min_wait_sec, max_wait_sec. Backoff between attempts is min(min_wait_sec × wait_multiplier^attempt, max_wait_sec). The input shape accepts every field as optional; an explicit exclude_exceptions: null turns exclusions off, while omitting it keeps the default non-retryable set. include_exceptions null, omitted or [] all mean no filter.
AnalyzeConfig
model_name, rubric ({ criteria: [{ name, description, guidance }] }), prompt (string or null for the default body), reasoning_effort, sandbox_provider, n_concurrent (number or null for the organization’s ceiling alone), passing, failing (both false means every analyzable trial), n_trials (number or null for no cap). The input shape takes every field as optional.
JobStats
Counters are cumulative: errored trials are a subset of completed, cancelled a subset of errored. The disjoint breakdown isJob.trials.byStatus.
AgentDatasetStats: n_trials (trials that produced a rewards map), n_errors (trials carrying exception_info), metrics (a mean per arm, unrewarded trials counting 0), pass_at_k (a map of k as string to a value in [0, 1]; {} when the group cannot answer), reward_stats (reward key → value → trial ids), exception_stats (exception type → trial ids).
JobAnalysisStats: n_completed, n_failed, n_pending (trials by their latest analysis), cost_usd (the latest analyses’ measured spend summed; null when none was measured), checks (per criterion, { n_pass, n_fail, n_not_applicable, n_unknown }).
JobBuildExclusion
dataset ({ name, version }), n_tasks_ran, n_tasks_selected (what the filters matched before any n_tasks cap), n_tasks_failed_to_build, failed_task_names (sorted), note (the sentence to show).
UploadProvenance
original_job_id and original_job_name (what the archive’s own files said; null when they said nothing), uploaded_at, reported_totals (cost_usd, n_input_tokens, n_cache_tokens, n_output_tokens, each null when no trial reported it, plus n_trials_reporting; null on jobs ingested before the field existed), task_links (JobTaskLink[]; null on jobs ingested before task linking existed).
JobTaskLink: task_name, n_trials, n_linked, n_unlinked, linked_by (dataset_flag, job_dataset_record, task_hash or none), datasets (the name@version refs linked to), link_reasons (a count per reason: hash_mismatch, task_not_in_dataset, no_dataset_named, dataset_ambiguous, no_hash_match, no_task_digest), candidates (the refs an ambiguous hash matched).
Trial
One shape on list rows and ontrials().get(); the detail route alone serves exception_info.exception_message untruncated. Execution facts (sandbox_provider, verifier_environment_mode, agent_result.cost_usd, spend_source) are null until the trial has executed: null means “did not run”, never zero.
UsageReading
The same object, same keys, on trials, analyses and managed-agent sessions.TrialAnalysis
Check and TaskCheck
Check: id, status (queued, running, completed; a check never fails as a whole), source ({ type, sha256, bytes, dataset }: type is archive with bytes set and dataset null, or dataset with the resolved name@version and bytes null), model_name, reasoning_effort, rubric, prompt (null for the default), sandbox_provider, n_concurrent (null for the ceiling alone), include_task_names, exclude_task_names, n_tasks (null for no cap), results (TaskCheck[], sorted by task name), cost_usd (the sum of measured task costs; null when none), created_at, finished_at (null until every task settled).
TaskCheck: id, check_id, task_name, status (queued, running, completed, failed), checks (as on an analysis; no summary), label (has_a_problem, unclear, no_problem_found; null until completed and under a custom rubric), executed (true when none of the five run-based criteria is unknown; null exactly when label is null), cost_usd, attempts, failure, created_at, finished_at.
Dataset
list() returns the summary fields; get() adds versions, selected_version, tasks, failed_tasks, created_at and updated_at.
DatasetVersion
Task
Public fields only; instructions, environments and tests never leave the server.task_name, agent_timeout_sec, verifier_timeout_sec, gpus (0 for a CPU task), gpu_types (null means any type), providers (per provider { ok: true }, { ok: true, degrades_to: "modal", reason } or { ok: false, reason }), notes ({ code: "tests_dockerfile_not_built", message }[]; empty when there is nothing to say).
TaskBuild, from getTaskBuild(): task_name, state (READY or FAILED), failure ({ code, step, message, excerpt }; step is parse, image-build, image-config, skills-verify, compose-resolve, image-mirror or store; null on READY), build_log_ref (null on READY and on parse refusals).
UpstreamStatus
git_url (userinfo stripped), ref, current_commit, path (null for the repository root), latest_commit (null when the last check failed), acked_commit (the newest commit a local version exists for), moved (branch on this), behind_by (reserved, null), checked_at, error (why the last check failed; show “could not check”, never “up to date”), auto_import. A version pinned to a sha serves the watch at rest: latest_commit, checked_at and error null, moved false.
DatasetImport
JobImport
Events
jobs().watch() yields JobEvent: seq (the resume position) plus type and data. Switching on type narrows data.
Smaller shapes
JobTaskRollup, fromjobs().tasks():task_name,source,trials({ total, byStatus }),mean_reward(over SCORED trials; null when none),cost_usd,check(the task’s latestTaskCheckon a version this job spans; null when never checked).CompareResponse, fromjobs().compare():jobs(per job:id,datasets,status,mean_rewardover SCORED trials,coverage{ scored, total },cost_usd,agents,started_at) andtaskMatrix(per task:task_name,disagreement,cellsin the caller’s id order, each{ job_id, status, mean_reward, coverage }wherestatusis a trial status when every trial in the cell shares it,MIXEDwhen they differ,MISSINGwhen the job has no trial for the task). Disagreement rows come first.StopResponse, fromtrials().stop():stopped(Trial[]),stopped_analyses(TrialAnalysis[], eachfailedwith phasestopped),already_terminal(ids),not_found(ids that do not exist or are not yours; never told apart). Every requested id appears in exactly one list.JobGrepGroup, fromjobs().grep():trial_id,task_name(string or null),match_count(exact),events(the first five matches).TrialFile, fromtrials().files():path,size_bytes.TraceEvent:seq,type,data. Ausageevent whosedata.update.sourceisgatewayis the platform’s meter and the only usage line that carries tokens and money;gatewayUsageOf(event)reads it. On a terminal trial these follow the last harness event withseqfrom 1000000000 (GATEWAY_TRACE_SEQ_BASE).SkillUpload:id,name,digest,size_bytes,description,ref(theupload:<id>string),created_at.Agent:name,source(install_scriptortarball),run_command,env,created_at,updated_at.AuthStatus:user_id,email,key({ id, label, created_at, last_used_at };last_used_atis always null today).Organization:org_id,slug,display_name,personal,role(ownerormember),created_at.OrganizationDetailaddsmember_count,quotaandusage; see auth and orgs.JobDeleteResult:job_id,trials_deleted,analyses_deleted.DatasetPreflight, fromdatasets().preflight():importer_version,checks(the guards that ran),deferred({ name, reads }[], the guards atask.tomlalone cannot decide),manifest({ ok, name, short_name, version, task_count, reason } \| null),tasks(per taskname,ok,task_key,schema_version,providers,notes,reason),tasks_total,tasks_ok,tasks_refused.

