Eval API
The API reference lists every endpoint with its request and response schema, rendered from the OpenAPI document; this page explains how the calls behave. Eval is in early access and switched on per workspace.
Runs
An independent MT and LLM bake-off. Give a source (and an optional human reference), then either paste candidate translations or let the server generate them with the engines you pick. The scoreboard ranks candidates by quality and, with prices, by value. Base path /eval/v1.
An engine code is a named engine from the catalog below, di:<model_id> for a DeepInfra model or p:<provider>/<model> for any provider this build supports, so a new model never waits for a release.
POST /eval/v1/runs
Create and run a bake-off (eval:write). Returns a runId right away; poll the run until it is finalized, or subscribe a webhook to eval.finalized to be told when it is.
Generate mode spends money, so it is capped per workspace: at most 2 generate runs at once and 20 a day. Over either cap the call is a 429 that names the cap it reached. Scoring candidates you send is not capped.
Paste your own candidates
curl -X POST https://app.stillneedsahuman.com/eval/v1/runs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Retail TR product blurbs",
"target_lang": "tr",
"source": ["Add to cart", "Free returns"],
"reference": ["Sepete ekle", "Ucretsiz iade"],
"candidates": [
{"name": "Engine A", "targets": ["Sepete ekle", "Bedava iade"], "cost_per_1m": 2},
{"name": "Engine B", "targets": ["Sepete koy", "Ucretsiz iade"], "cost_per_1m": 5}
]
}'
Generate with engines
curl -X POST https://app.stillneedsahuman.com/eval/v1/runs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Engine bake-off",
"target_lang": "tr",
"source": ["Add to cart", "Free returns"],
"reference": ["Sepete ekle", "Ucretsiz iade"],
"generate": true,
"engines": ["gemini_flash", "deepseek_v4", "qwen_2_5_72b"],
"budget_per_1m": 5
}'
{ "runId": "ev_5b2c...", "status": "queued" }
GET /eval/v1/runs/{id}
Poll the run (eval:read): each engine with its scores, cost and latency. Once finalized, rollup holds the ranked candidates and recommendation names the best quality and best value picks. A run of another workspace is a 404.
curl https://app.stillneedsahuman.com/eval/v1/runs/ev_5b2c... \
-H "Authorization: Bearer YOUR_TOKEN"
{
"runId": "ev_5b2c...",
"status": "finalized",
"rollup": [
{"rank": 1, "name": "Gemini 3.1 Flash", "quality": 94.2, "chrfpp": 71.0,
"ter": 28.4, "integrity": "pass", "cost_per_1m": 0.10, "latency_ms": 880},
{"rank": 2, "name": "DeepSeek V4", "quality": 92.5, "cost_per_1m": 0.50}
],
"recommendation": {
"best_quality": "Gemini 3.1 Flash", "best_quality_score": 94.2,
"best_value": "Gemini 3.1 Flash", "best_value_score": 94.2, "best_value_cost": 0.10
}
}
Each rollup row names the engine (name), its rank, quality (the score the ranking uses), verdict, integrity, findings, cost_per_1m and latency_ms; when the run has a reference it also has chrfpp and ter. ter is the share of words a post-editor would change to reach your reference, as a percentage, lower is better; present only when the run has a reference and never for the human baseline. It counts the fewest word insertions, deletions, substitutions and moves of a word group that turn the candidate into the reference, over the reference's word count, summed across the segments. Words are split on spaces, case is ignored and punctuation stays on its word, so 0 is identical to the reference and a long candidate can go over 100. It is evidence beside quality and never changes the ranking.
| Field | Notes |
|---|---|
source | Array of strings, or objects with a source field. Required. |
reference | Optional human translation; enables the chrF++ reference-match score and TER. |
candidates or generate+engines | Paste candidates, or generate them server-side with the listed engines. |
cost_per_1m / budget_per_1m | USD per 1M tokens. Drives the best-value pick. Generated runs use indicative list prices. |
template, account | Optional. Resolve the scoring template (quality bar, severities) by id or by account. |
target_lang, source_lang, locale | The language pair, and a locale where the target needs one. target_lang is required. |
name, division, profile, content_type | Optional. The run's title and where it belongs. |
dropbox_path | Optional. Take the source sample from a file in the workspace's Dropbox. |
gemba_mqm, gemba_samples | Optional. Score with an MQM-style AI judge, and how many samples it reads. |
List past runs with GET /eval/v1/runs?limit=&offset= (limit 50 when left out) and download a finalized run as Excel with GET /eval/v1/runs/{id}/export.xlsx (Summary, Scoreboard and Comparison sheets; the Scoreboard has a TER column after chrF++, empty where there was no reference).
Every finalized run of a date range comes as one CSV with GET /eval/v1/export.csv?from=&to= (eval:read; the dates as YYYY-MM-DD on the day a run was finalized, the last 12 months when left out). One row per candidate: run_id, name, created_at, finalized_at, status, account, content_type, source_lang, target_lang, template_id, template_version, engine, rank, quality, verdict, chrfpp, ter, integrity, findings, words, latency_ms, is_baseline and error. The file has the byte order mark and the UTC times of the LQA CSV and counts against the same export rate.
GET /eval/v1/runs/{id}/comparison
The reviewer's view of a run: every source segment beside every engine's output, with the integrity check and the MQM findings of each cell.
The catalog and the metrics
What a run can be built from and judged by. All need eval:read.
| Endpoint | Returns |
|---|---|
GET /eval/v1/engines | The engines available in this build. |
GET /eval/v1/models | The model catalog by vendor. A help for a picker, not a list of what is allowed: an engine code outside it still runs. |
GET /eval/v1/metrics | The metric registry, and whether the neural metrics are available here. |
GET /eval/v1/analytics | How each engine did across your finalized runs: average quality, win rate, runs counted, average cost and latency. avg_ter is the average TER over its candidates scored against a reference (null when none was). |
POST /eval/v1/source/upload | A multipart file (XLIFF, Excel, CSV, a TMS export) turned into a source sample. For Excel and CSV the answer carries the columns and a preview, so the caller can say which column is source and which target. |
POST /eval/v1/calibrate | How a metric's scores per segment follow human MQM scores. Body: {"metric_scores": [...], "human_scores": [...]}. It makes no run and spends nothing. |
GET /eval/v1/dropbox/list | The workspace's Dropbox folders, to pick a sample from. Limited to your own workspace's folder. |
GET /eval/v1/health | Liveness, with no key. |