Skip to content

Ingest a CLI run

POST
/v1/runs
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.

Media type application/json

CLI run output (plune run --format json). The server validates the full contract.

object
schemaVersion
required
integer
Allowed values: 1
plune_version
required
string
started_at
required
string format: date-time
finished_at
required
string format: date-time
config_hash
required
string
summary
required
object
total
required
integer
passed
required
integer
failed
required
integer
errored
required
integer
cost_usd
required
number
duration_ms
required
number
evals
required
Array<object>
object
id
required
string
tags
required
Array<string>
rows
required
Array<object>
object
vars
required
object
key
additional properties
any
output
required
string
nullable
cached
required
boolean
usage
object
input_tokens
required
number
output_tokens
required
number
cost_usd
required
number
latency_ms
number
error
object
code
required
string
message
required
string
assertions
required
Array<object>
object
type
required
string
passed
required
boolean
score
number
reason
string
binaryVerdicts
Array<object>
object
question
required
string
passed
required
boolean
passed
required
boolean
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": []
}

Recorded

Media type application/json

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
id
required
string format: uuid
linked
required

Evals whose id matched a case — one Result each.

integer
unlinked
required

Evals no case claims. Set evalId on a case to link.

integer
Example generated
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"linked": 1,
"unlinked": 1
}

Invalid RunResult (field-level detail in error)

Media type application/json
object
error
required
string
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.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over