Ingest a CLI run
const url = 'https://beta-api.plune.ai/v1/runs';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"schemaVersion":1,"plune_version":"0.6.0","started_at":"2026-08-30T09:12:04.000Z","finished_at":"2026-08-30T09:12:41.522Z","config_hash":"a3f1c9","summary":{"total":12,"passed":11,"failed":1,"errored":0,"cost_usd":0.0417,"duration_ms":37522},"evals":[]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://beta-api.plune.ai/v1/runs \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "schemaVersion": 1, "plune_version": "0.6.0", "started_at": "2026-08-30T09:12:04.000Z", "finished_at": "2026-08-30T09:12:41.522Z", "config_hash": "a3f1c9", "summary": { "total": 12, "passed": 11, "failed": 1, "errored": 0, "cost_usd": 0.0417, "duration_ms": 37522 }, "evals": [] }'The client is @plune-ai/cli (plune sync); the dashboard never calls this surface — it reads what has already arrived. That boundary is ADR 0010: Cairn writes files and knows nothing of the platform, the CLI uploads them, and one published package validates both sides of the contract.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”CLI run output (plune run --format json). The server validates the full contract.
object
object
object
object
object
object
object
object
object
Example
{ "schemaVersion": 1, "plune_version": "0.6.0", "started_at": "2026-08-30T09:12:04.000Z", "finished_at": "2026-08-30T09:12:41.522Z", "config_hash": "a3f1c9", "summary": { "total": 12, "passed": 11, "failed": 1, "errored": 0, "cost_usd": 0.0417, "duration_ms": 37522 }, "evals": []}Responses
Section titled “ Responses ”Recorded
The stored run, plus how many of its evals found a test case to attach to (ADR 0010). An unmatched eval is counted, never turned into a new case.
object
Evals whose id matched a case — one Result each.
Evals no case claims. Set evalId on a case to link.
Example generated
{ "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "linked": 1, "unlinked": 1}Invalid RunResult (field-level detail in error)
object
Example generated
{ "error": "example"}No / invalid token or session
Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.
object
Example generated
{ "error": "example"}Headers
Section titled “Headers ”Seconds until the window rolls over