API keys
Use an API key to upload predictions and read your team's results from your own scripts or an external platform. API and website submissions share the same quota.
Loading…
Using the API
Upload predictions, follow scoring and read leaderboards from your scripts or platform. All examples below use the current environment.
Base URL: https://ve-staging-api.aristoteleo.com
Staging runs the Modal scorer through its own scoring app and upload storage. New submissions receive real scores; Agent predictions wait for the required evidence before scoring. Staging submissions do not affect production standings.
1. Get started
- Sign in, register your team and accept the current Challenge Rules and Terms of Use.
- Your captain creates a key on this page; EigenLab Yukon members each create their own personal keys. Copy the secret when it appears; it is only shown once.
- Set the environment variables below. Replace
YOUR_API_KEYwith your key. Store real keys in your environment or secret manager. - Send
Authorization: Bearer YOUR_API_KEYon authenticated requests. Public endpoints do not need a key.
export VE_API_BASE="https://ve-staging-api.aristoteleo.com"
export VE_CHALLENGE_API_KEY="YOUR_API_KEY"
# Check availability and accepted targets (no key needed).
curl --fail-with-body -sS "$VE_API_BASE/challenge/phase"
curl --fail-with-body -sS "$VE_API_BASE/challenge/boards"
# Check your team's quota.
curl --fail-with-body -sS "$VE_API_BASE/challenge/integration/quota" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"The commands use cURL and local files. Do not set Content-Type manually for an upload: cURL supplies the multipart boundary.
2. Available endpoints
Public · no authentication
| Endpoint | Returns |
|---|---|
GET /challenge/phase | Submission availability, score visibility and current split. |
GET /challenge/boards | Valid tasks, targets and board keys for the current phase. |
GET /challenge/documents | Current versions of the Challenge Rules and Terms of Use. |
GET /challenge/leaderboard | Public standings; filter by task, board and track. |
GET /challenge/overall | Aggregate team standings; optional task and track filters. |
Team API · Bearer key required
| Endpoint | Scope | Returns |
|---|---|---|
GET /challenge/data/manifest | data:read | Released training files and exact download keys. |
GET /challenge/data/link?key=… | data:read | A direct storage download URL, valid for at most 15 minutes. |
GET /challenge/me | quota:read | Registration, team, quota and stale document acceptance. |
GET /challenge/integration/quota | quota:read | Daily scoring/upload counts and final-phase board budgets. |
POST /challenge/submissions | submissions:write | Upload a prediction or run a format-only check. |
GET /challenge/submissions | submissions:read | Your team’s latest 200 submissions. |
GET /challenge/submissions/{id} | submissions:read | One submission’s status, permitted scores and team rank. |
GET /challenge/teams/evidence/{id} | evidence:read | Evidence files, accepted kinds and requirements for a submission. |
POST /challenge/teams/evidence/{id} | evidence:write | Attach one evidence file to an Agent Team submission. |
In evidence paths, {id} is the prediction’s submission ID. A key can only access its own team’s submissions. Keys include submission and quota scopes; Agent Team keys also include evidence scopes. Read-only partner keys omit upload permissions.
Create, list and revoke keys on this page. The management endpoints POST/GET /challenge/api-keys and POST /challenge/api-keys/{key_id}/revoke require your normal sign-in: captain access for ordinary teams, or personal access for EigenLab Yukon members. API keys cannot manage keys, teams, accounts or document acceptance.
Download data
Enable Allow data downloads when creating your key to grant data:read. Existing keys keep their original permissions. Your script or platform can list released training files and request a direct download link for you.
# Create a personal key with Allow data downloads enabled.
curl --fail-with-body -sS "$VE_API_BASE/challenge/data/manifest" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"
# Use an exact key returned by the manifest.
curl --fail-with-body -sS --get "$VE_API_BASE/challenge/data/link" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
--data-urlencode "key=T2/E6.75.h5ad"
# Open the returned url directly; do not send your API key to storage.The link response includes url, expires_in (at most 900 seconds), expires_at and file metadata. A normal browser link starts the download from VE storage; no VE browser sign-in is needed at that step. Request a fresh URL after expiry and keep signed URLs private.
Each request checks current membership and Rules/Terms acceptance. Downloads do not consume submission allowance. Leaving a team or losing eligibility blocks new links; a link already issued may work until it expires. Only released training inputs are available.
Platforms must use each participant's personal key, not a partner service credential. HTTP 409 means current agreements need acceptance in VE; HTTP 503 means the release or storage is unavailable. This download integration does not authorize redistribution or hosting copies of the data.
3. Check and upload a prediction
Send a multipart form to POST /challenge/submissions. The server chooses the phase’s validation or test split; query GET /challenge/boards for the targets currently available.
| Field | When used | Value |
|---|---|---|
task | Required | T1, T2 or T3. |
file | Required | A prediction .h5ad that meets the selected task’s format. |
model | Optional | A name for the prediction method, shown with your team. |
setting | T2 only | heart or embryo. |
mode | T2 only | heart: interp or extrap on validation, extrap on test; embryo: interp. Check /challenge/boards for current combinations. |
architecture | Optional | Your team’s architecture name; use it consistently across related entries. |
agent_framework | Agent Team | The framework that ran the agent, e.g. LangGraph or custom. |
agent_model | Agent Team | The actual model identifier used by the agent. |
format_only | Optional | true checks the file without creating an official submission; defaults to false. |
For Agent Teams, provide both agent declaration fields on official uploads. Human Teams do not need them. For T3, set task=T3 and use the task’s prediction file. See the task definitions for file contents and task-specific shapes.
First run a format check
Set format_only=true and omit Idempotency-Key. The response includes ok, problems and format_only. No submission is created and no official attempt is spent. Passing this preliminary check does not guarantee scorer acceptance.
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-F "task=T1" \
-F "format_only=true" \
-F "file=@prediction.h5ad"Then submit for scoring
# Change this ID for a new prediction; keep it unchanged for retries.
export VE_REQUEST_ID="prediction-001"
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-H "Idempotency-Key: $VE_REQUEST_ID" \
-F "task=T1" \
-F "model=My prediction method" \
-F "file=@prediction.h5ad"Save the returned id. The upload response also includes status, task, bundle_key, phase, bytes, sha256, problems and used_credit. A rejected prediction can still return HTTP 200: inspect status and problems, not only the HTTP code.
T2: specify the setting and mode
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-H "Idempotency-Key: heart-prediction-001" \
-F "task=T2" \
-F "setting=heart" \
-F "mode=extrap" \
-F "model=My prediction method" \
-F "file=@heart_prediction.h5ad"For the embryo interpolation target, use setting=embryo and mode=interp with its matching file. Official prediction uploads are capped at 1,200 MiB per file; format checks use the same file-size limit.
4. Follow status and read scores
# Replace this with the id returned by POST /challenge/submissions.
export VE_SUBMISSION_ID="SUBMISSION_ID"
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions/$VE_SUBMISSION_ID" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"Poll the detail endpoint every 15–30 seconds, with slower polling during outages. The response includes the following fields; this queued example is illustrative.
{
"id": "SUBMISSION_ID",
"task": "T1",
"status": "queued",
"bundle_key": "T1:val",
"sha256": "SERVER_COMPUTED_SHA256",
"headline": null,
"metrics": null,
"rank": null,
"board_size": null,
"reject_reason": null,
"scored_at": null,
"shows_scores": false
}cancelled- Terminated by withdrawal or eligibility changes. This submission cannot restart and its allowance is not refunded.
eligibility_review- Historical eligibility needs organiser review; not queued for scoring.
awaiting_evidence- Agent evidence is still required. Attach it to this submission ID.
queued- Accepted and waiting for the scoring worker.
scoring- The scoring worker is processing the prediction.
scored- Scoring finished. Read headline and metrics when shows_scores is true.
rejected- The prediction was refused. Read reject_reason (or problems in the upload response).
When scoring is finished and shows_scores=true, headline is the submission’s headline score and metrics contains its detailed metrics. rank and board_size describe your team’s standing on that board using its best score, rather than this file’s position among all uploads. These fields can be null before scoring or when scores are not published in the current phase.
The detail response includes sha256, the server-computed SHA-256 of the exact uploaded file bytes (64 lowercase hexadecimal characters). Partner submission details also include the stable member_id of the submitting member. The digest remains available after archival or re-scoring; it does not imply that a pending or rejected file has received a score.
History returns registered and submissions, with up to the latest 200 entries. Check reject_reason for rejections and reclaimed_at in history for prediction files that are no longer retained.
5. Read public leaderboards
Leaderboard requests need no key. Use task=T1, T2 or T3; optional board is a key from /challenge/boards, and track is human or agent. Keep task and board consistent.
# Public standings for T1.
curl --fail-with-body -sS --get "$VE_API_BASE/challenge/leaderboard" \
--data-urlencode "task=T1"
# One board, Agent Team track. Use a board key from /challenge/boards.
curl --fail-with-body -sS --get "$VE_API_BASE/challenge/leaderboard" \
--data-urlencode "task=T1" \
--data-urlencode "board=T1:val" \
--data-urlencode "track=agent"
# Aggregate standings across tasks for Human Teams.
curl --fail-with-body -sS --get "$VE_API_BASE/challenge/overall" \
--data-urlencode "track=human"Read rows for competing teams, reference for baselines and partners for partner reference teams. Partner entries have no official rank or prize eligibility. The response also reports phase and shows_scores. A phase that does not publish scores can return empty rows with counts or a note. Test teams and excluded teams do not appear in public competition standings.
/challenge/overall aggregates the best scores across task boards; it supports optional task and track filters. Use individual board leaderboards for board standings. In the example above, replace T1:val with the current board key when the competition moves to the test split.
6. Agent Team evidence
Human Teams do not upload Agent evidence. Agent Teams declare the framework and model, then attach evidence to each prediction’s submission ID. Keys created here for Agent Teams include the necessary permissions automatically.
curl --fail-with-body -sS "$VE_API_BASE/challenge/submissions" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-H "Idempotency-Key: agent-prediction-001" \
-F "task=T1" \
-F "model=My agent method" \
-F "agent_framework=custom" \
-F "agent_model=YOUR_MODEL_IDENTIFIER" \
-F "architecture=My agent architecture" \
-F "file=@prediction.h5ad"A valid Agent prediction starts as awaiting_evidence. Query its evidence endpoint first: required, kinds, min_kinds, required_kind, files, max_bytes and max_total_bytes describe the current requirements. missing lists recommended kinds not yet attached; it is not a requirement to upload every listed kind.
# Set VE_SUBMISSION_ID to the id returned by the agent upload.
curl --fail-with-body -sS "$VE_API_BASE/challenge/teams/evidence/$VE_SUBMISSION_ID" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"
curl --fail-with-body -sS "$VE_API_BASE/challenge/teams/evidence/$VE_SUBMISSION_ID" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-F "kind=trajectory" \
-F "note=Complete execution trace for this prediction" \
-F "file=@trajectory.json"
curl --fail-with-body -sS "$VE_API_BASE/challenge/teams/evidence/$VE_SUBMISSION_ID" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY" \
-F "kind=prompts" \
-F "file=@prompts.txt"Supported kinds are trajectory (execution trace), prompts, harness (orchestration code) and other. Send kind and file, with an optional note. The current gate requires at least two distinct kinds, including required_kind when it is non-empty; trajectory plus prompts is an example. Read the endpoint’s requirements rather than assuming they will never change.
Evidence uploads report kinds, needs_kinds, needs_kind, has_required_kind and queued. When the gate is satisfied, the retained prediction moves to queued. Evidence uploads are not deduplicated by Idempotency-Key: after a timeout, check the evidence list before resending. If the prediction was reclaimed, read the returned note and make a new prediction submission rather than continuing to poll the old one.
7. The same rules and quotas as the portal
- For ordinary teams, API and website uploads share one budget per team, task and UTC day. EigenLab Yukon instead uses a personal budget of 2 uploads per subtask per UTC day, with a separate allowance for each T2 subtask. Multiple keys or platforms do not create more attempts.
- For ordinary teams, /challenge/integration/quota returns daily.T1/T2/T3: used and limit for scoring, uploads and upload_limit for stored attempts. Rejected files count toward the upload limit but do not spend a scoring attempt. Format checks spend neither.
- quota_credit reports any organiser-granted recovery credits. Credits do not bypass the upload ceiling or the final-phase board budget.
- In the final phase, official_per_board reports a phase-wide allowance per board. It does not reset each day. Format checks remain available.
- The key issuer must have accepted the current Rules and Terms. Missing or outdated acceptance blocks a new upload with 409. Sign in to your account to accept them; a key cannot do this for you.
- Phase availability, team eligibility, file validation, Agent declarations/evidence and score visibility all follow the portal’s rules.
curl --fail-with-body -sS "$VE_API_BASE/challenge/me" \
-H "Authorization: Bearer $VE_CHALLENGE_API_KEY"
curl --fail-with-body -sS "$VE_API_BASE/challenge/documents"Check stale_consents in /challenge/me. Ordinary teams may have ten active keys per team; EigenLab Yukon members may each have ten personal keys. Keys expire after their chosen duration, no later than the submission deadline. Revocation or the issuer leaving invalidates the key. Captain changes also invalidate ordinary team keys; EigenLab personal keys stay with their issuing member.
8. Safe retries and error handling
Use a unique Idempotency-Key for each new official prediction. It accepts 1–128 letters, digits or ._:-. Keep the same header, file bytes, filename and form fields for every retry of that prediction.
An identical retry returns the original upload response and ID without creating a second job or spending another attempt, even after quota exhaustion. Rotating the API key does not reset this record. A different payload with the same request key returns 409. Use the detail endpoint for the current status; a replay returns the original upload response.
On timeouts or 5xx responses, back off between retries, for example 2, 4, then 8 seconds. Check the JSON detail field for HTTP errors. Do not automatically retry 4xx responses unchanged.
| Response | Meaning | Next step |
|---|---|---|
| 400 / 422 | Invalid fields, target combination or request format. | Correct the request before trying again. |
| 401 | Missing, invalid, expired or revoked credentials. | Check or replace your personal key, or ask your team captain. |
| 403 | The key lacks a scope, the action is unsupported, or the team is ineligible. | Check the key and team status in the portal. |
| 404 | The submission does not exist or does not belong to your team. | Use the ID returned by your own upload. |
| 409 | Rules/Terms need acceptance, submissions are closed, state changed, or a retry conflicts. | Read detail. Accept documents in the portal or resolve the stated conflict. |
| 413 | The file exceeds the upload limit. | Reduce the file size; check evidence limits when applicable. |
| 429 | A daily scoring/upload limit or final-phase board budget is exhausted. | Read your quota. Wait for the UTC reset for daily limits; final budgets do not reset daily. |
| 5xx / timeout | A service or transport failure. | Back off and retry the identical prediction with the same Idempotency-Key. |
Yukon service integration
Official-team participants can transfer to EigenLab Yukon through its invitation page. This is one-way: anyone who has joined Yukon cannot create or join an official team afterward. A last-member transfer archives the old team and removes it from rankings and prize eligibility while retaining historical scores. Captains with teammates must hand over first. Transfers require normal sign-in and explicit confirmation; API keys cannot perform them.
Download the complete staging integration guide — credentials, an example roster response, pagination, participant onboarding and eligibility-change tests.
Organisers issue a separate, team-scoped Bearer service credential for read-only roster and result verification. It cannot upload files, manage members or accept agreements. Uploads continue through each member's personal API key.
GET /challenge/integration/partner/members/by-github/{github_user_id}— match a member by their OAuth-verified numeric GitHub ID.GET /challenge/integration/partner/members/{member_id}— recheck one linked member. Both lookups return checked_at and a member record with github_user_id, membership, consent and material_access. A matched record can be ineligible; inspect material_access.allowed.GET /challenge/integration/partner/members?limit=100— stable member IDs, verified email (or null), membership, required-consent states andmaterial_accesswith allowed, reason and effective_at.GET /challenge/integration/partner/submissionsandGET /challenge/integration/partner/submissions/{id}— submission ID, member ID, server SHA-256, status, clearance, cancellation and result validity. Scores remain subject to phase visibility.
Member lookups use the same service credential and team scope. HTTP 404 means no match in that team, 409 means ambiguous identity, 422 means an invalid identifier, and 503 means a temporary lookup failure. Former members return 200 with ended membership and denied access. A failed check never establishes departure. Google-only members have no GitHub ID; use verified-email matching or manual review.
The roster is an immutable snapshot, including former members. Follow next_cursor until null, verify snapshot_id and total_count, and apply permissions only after the entire snapshot succeeds. A failed page is not a departure. Default page size 100, maximum 200; snapshots expire after 15 minutes (HTTP 410 means restart). Service credentials allow 120 requests per rolling minute; respect Retry-After on HTTP 429.
Initial pilot: Yukon may admit participants manually after verifying VE registration, active team membership and acceptance of the current required agreements. Match only verified emails on both systems; missing or ambiguous matches require separate review. Check eligibility at least daily, and remove hosted-material access promptly, no later than 24 hours after confirmed ineligibility or an explicit VE notice. This includes departure, removal, withdrawal of required consent and disqualification.
During a VE API outage, grant no new access. Existing permissions may remain based on the last verified status until checks resume; act on explicit removal notices even during an outage. There is no automatic 30-minute suspension. Coordinate prolonged outages with VE and reconcile a fresh, complete roster when service returns. Revocation stops future access to hosted materials, downloads and updates; local copies cannot be remotely erased.
Yukon manages repository permissions and records checks and removals. These pilot timings apply only to shared-material access: VE checks current membership and required consent on every personal-key submission. Leaving or losing eligibility blocks new submissions immediately, regardless of the last roster check.
Ordinary departure allows previously cleared submissions to finish but permanently cancels entries awaiting evidence. Withdrawing required consent or disqualification cancels unfinished entries. The service retains historical verification access. Check result_valid before using a completed result; cancellation never restores quota. Departure makes a member ineligible for hosted access; Yukon removes that access under the pilot policy above.