https://gateway.errorbar.ai/v1. Request bodies on this surface
are camelCase (promptCount, rewardBudgetUsd); responses are snake_case
like the rest of the management API.
Start a run
201 with {"trigger_run_id": "..."}; the run itself appears at the
top of GET /v1/grpo/runs immediately.
The reward is validated before anything spends: it must reference a
calibrated, non-drift-flagged judge, and an unvalidated judge is refused
with 400. A reward you can’t trust trains a model you can’t trust, so there
is no override. mode: "compositional" combines several judges
(criterionIds) and optional deterministic assertions into one reward.
Budgets are hard, server-side, and ledger-true:
rewardBudgetUsdcaps judge/reward spend. The reward server refuses the run’s next scoring call once the ledger crosses the ceiling; the run endsOVERBUDGET. The trainer never self-reports spend.gpuHourBudgetcaps wall clock on the training side.
List runs
{"runs": [...], "candidates_waiting": n, "auto_provision_available": bool},
newest first (max 50). candidates_waiting is the depth of the candidate
queue, the strongest signal for when a run is worth its cost.
Each run carries status (ACTIVE, COMPLETED, OVERBUDGET, STOPPED, or
FAILED: the trainer gave up, as opposed to STOPPED, an external
termination), plus three separate ledger-true meters: spent_usd (reward,
counted against the budget), gpu_spent_usd, and env_spent_usd (sandbox
execution). While a platform GPU is attached, gpu_rate_usd_per_hour is the
live burn rate.
Terminal runs include an outcome when the training box produced its
artifact: steps, the reward trend (first_half_mean_reward vs
second_half_mean_reward), stopped_by_tripwire (the reward-hacking
tripwire), and a bakeoff card with the held-out verdict, delta, and
delta_ci95. A missing outcome on a FAILED run is honest, not a bug.
Get, stop
ACTIVE runs can be stopped (anything else is 404).
Download the trained adapter
{"files": [{"name", "size_bytes", "url", "expires_at"}], "partial": ...}).
partial: true means the run didn’t complete cleanly and the files are a
checkpoint, not the finished adapter. An empty list comes with an
empty_reason; links expire, so re-request fresh ones. This is the same
own-your-weights story as SFT.
Agent tools: the consent surface
Agentic runs may only call tools you’ve declared:DELETE /v1/env/tools/{id} is
consent withdrawal. The list response also carries
egress_verification_secret, an HMAC key your endpoint can use to verify
that a call really came from a training run (signature over
"<timestamp>.<raw body>" in the X-Errorbar-Signature header).
RAFT rounds, read-only
GET /v1/raft/rounds lists the offline self-training rounds that feed the
candidate queue: per round, the judge used, winners kept, give-ups, the SFT
job a completed round produced (produced_job_id), and ledger-true spend
against its budget. Rounds start from the dashboard today; the API surface is
observability parity.
Run creation is rate-limited per workspace (default 20/min) as an abuse
guard; a
429 carries Retry-After. All endpoints here require an
owner/admin key, reads included.Mid-run anchor
Passanchor: { criterionId, promptCount?, everySteps? } when starting a run to attach an independent calibrated judge. Every everySteps optimizer steps the trainer generates one completion per frozen anchor prompt (carved from the run’s holdout, so set holdoutCount at least as large as promptCount) and the server scores them twice: with the run’s reward and with the anchor judge corrected for its measured error. If the gap between the reward’s read and the anchor’s read widens beyond its noise, or the anchor falls from its best beyond its noise, the run is held, never killed: the trainer pauses, pins the best anchor checkpoint, and waits for a resume. The hold names its state (grader_fooled, gamed, degrading). The same rule and thresholds as reward sessions; see Certified reward.