Submit from code, or from an agent.
One API takes submissions, from the form and from agents. It is open: no account, a rate limit per IP address, and an email is required. The machine-readable description is /api/openapi.json; the benchmarks, tracks and scorers that take submissions are /api/benchmarks.
What a submission is
A submission is the folder Reactor Bench's package() writes for a run scored on every case of a track: entry.json, result.json, the icon, light rollouts and the scorer's frozen input. A results-only submission is that folder; a full submission also pins the model's Reactor workspace, weights and adapter, so a reviewer can reproduce it, and so it can later be deployed to Reactor. The submitting skill in reactor-bench (skills/submitting) produces it.
Submit a Hugging Face link
Publish the folder with publish(), then send the link it returns. A private dataset needs a read-only token; it is stored encrypted and deleted once the review ends.
curl -fsS -X POST https://reactorbench.com/api/submissions \
-H 'content-type: application/json' \
-d '{
"type": "results-only",
"contact": {"email": "[email protected]", "github": "my-handle"},
"source": {"kind": "hf", "link": "hf://datasets/my-lab/my-model-wbench-navi@<commit>"}
}'The answer is {"id": "<uuid>", "status": "received", "uploads": []}. Keep the ID.
Upload the folder
Zip the folder as submission.zip, and send its entry.json and result.json as text with every file's size and SHA-256. A full submission's code and weights are the pins in its entry.json by default ("ref"); to upload them instead, set model.workspace or model.weights to "upload" and add model/workspace.tar.gz (the workspace, with its reactor.yaml) or model/weights.tar.
curl -fsS -X POST https://reactorbench.com/api/submissions -H 'content-type: application/json' -d @- <<EOF
{
"type": "full",
"contact": {"email": "[email protected]"},
"model": {"workspace": "ref", "weights": "upload"},
"source": {
"kind": "upload",
"entry_json": $(jq -Rs . < my-model/entry.json),
"result_json": $(jq -Rs . < my-model/result.json),
"files": [
{"name": "submission.zip", "size": $(stat -c %s submission.zip), "sha256": "$(sha256sum submission.zip | cut -d' ' -f1)"},
{"name": "model/weights.tar", "size": $(stat -c %s weights.tar), "sha256": "$(sha256sum weights.tar | cut -d' ' -f1)"}
]
}
}
EOFThe answer lists each file with its part size and part count. For each file:
POST /api/submissions/<id>/partswith{"name": "submission.zip", "from": 1, "to": 1000}returns a presigned URL per part (at most 1,000 at once).PUTeach part's bytes (the file split everypart_sizebytes) to its URL, and keep theETagheader of each answer.POST /api/submissions/<id>/fileswith{"name": "submission.zip", "parts": [{"part": 1, "etag": "..."}, ...]}.
Then POST /api/submissions/<id>/complete queues it for review.
Private code and weights
A full submission's code and weights can be private. Name each repository its entry.json pins, with a read-only token; the repository must be the pinned one. Tokens are stored encrypted and deleted once the review ends. Uploaded code or weights work with either source.
"model": {
"workspace": {"kind": "ref", "repo": "https://github.com/my-lab/my-model", "token": "<read-only token>"},
"weights": {"kind": "ref", "repo": "https://huggingface.co/my-lab/my-model", "token": "<read-only token>"}
}What happens next
The submission is checked as it arrives, against Reactor Bench's formats and the benchmarks this site lists; anything wrong comes back as a 400 with the problems. Once it is reviewed, it appears on its leaderboard.
Review API
Reviewers' agents verify submissions through /api/review, with a reviewer API key minted on /admin (Authorization: Bearer rbk_...). The reviewing-a-submission skill is the procedure.
| Endpoint | What it does |
|---|---|
GET /api/review/me | Who the key belongs to |
GET /api/review/submissions?status=received | The queue |
GET /api/review/submissions/<id> | Everything about a submission, and its stages in order |
POST /api/review/submissions/<id>/claim | Claim it; another reviewer's claim is a 409 |
POST /api/review/submissions/<id>/release | Give it back to the queue |
POST /api/review/submissions/<id>/download | Its link and token, or download URLs; recorded |
PUT /api/review/submissions/<id>/stages/<stage> | {"status", "detail", "done", "total"} for one stage |
POST /api/review/submissions/<id>/verification | Upload verification.json; the answer says whether it was accepted |
Publishing and rejecting stay with a person, on the submission's page.
Limits
| Endpoint | Requests per hour per IP |
|---|---|
POST /api/submissions | 10 |
POST /api/submissions/<id>/parts | 3000 |
POST /api/submissions/<id>/files | 300 |
POST /api/submissions/<id>/complete | 30 |