Incantory
Sign in

Evals API

19 operations. Authentication, errors and pagination work as described in the REST API overview.

Compare two runs of one prompt, case by case

GET/api/v1/evals/compareToken optional

compareEvalRuns parameters
NameTypeDescription
a queryrequiredstring
b queryrequiredstring

Responses: 200 OK400, 404, 429

Response fields
compareEvalRuns response fields
NameTypeDescription
arequiredobject
brequiredobject
rowsrequiredobject[]
truncatedrequiredboolean
Example
curl 'https://incantory.ai/api/v1/evals/compare' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

A prompt's eval datasets

GET/api/v1/evals/datasetsToken optional

Public datasets for everyone; every dataset for the prompt owner.

listEvalDatasets parameters
NameTypeDescription
prompt queryrequiredstringowner/slug

Responses: 200 OK304, 400, 404, 429

Response fields
listEvalDatasets response fields
NameTypeDescription
itemsrequiredobject[]
canManagerequiredboolean
Example
curl 'https://incantory.ai/api/v1/evals/datasets' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Create a dataset on your prompt

POST/api/v1/evals/datasetsToken required · scope evals:write

Request body

createEvalDataset body fields
NameTypeDescription
promptrequiredstringowner/slug of the prompt the dataset belongs to
namerequiredstring
descriptionstring
visibility"public" | "unlisted" | "private"Default public

Responses: 201 OK400, 401, 403, 404, 409, 410, 429

Response fields
createEvalDataset response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
namerequiredstring
descriptionrequiredstring
visibilityrequired"public" | "unlisted" | "private"
caseCountrequirednumber
createdAtrequiredstring
updatedAtrequiredstring
Example
curl -X POST 'https://incantory.ai/api/v1/evals/datasets' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"alice/haiku","name":"name"}'

Get a dataset

GET/api/v1/evals/datasets/{id}Token optional

getEvalDataset parameters
NameTypeDescription
id pathrequiredstring

Responses: 200 OK400, 404, 429

Response fields
getEvalDataset response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
namerequiredstring
descriptionrequiredstring
visibilityrequired"public" | "unlisted" | "private"
caseCountrequirednumber
createdAtrequiredstring
updatedAtrequiredstring
canManagerequiredboolean
Example
curl 'https://incantory.ai/api/v1/evals/datasets/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Rename / describe / change visibility

PATCH/api/v1/evals/datasets/{id}Token required · scope evals:write

updateEvalDataset parameters
NameTypeDescription
id pathrequiredstring

Request body

updateEvalDataset body fields
NameTypeDescription
namestring
descriptionstring
visibility"public" | "unlisted" | "private"

Responses: 200 OK400, 401, 403, 404, 409, 429

Response fields
updateEvalDataset response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
namerequiredstring
descriptionrequiredstring
visibilityrequired"public" | "unlisted" | "private"
caseCountrequirednumber
createdAtrequiredstring
updatedAtrequiredstring
Example
curl -X PATCH 'https://incantory.ai/api/v1/evals/datasets/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'

Delete a dataset (soft)

DELETE/api/v1/evals/datasets/{id}Token required · scope evals:write

deleteEvalDataset parameters
NameTypeDescription
id pathrequiredstring

Responses: 204 OK400, 401, 403, 404, 429

Example
curl -X DELETE 'https://incantory.ai/api/v1/evals/datasets/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

List a dataset's cases

GET/api/v1/evals/datasets/{id}/casesToken optional

listEvalCases parameters
NameTypeDescription
id pathrequiredstring
cursor querystring
limit queryinteger (1–500)

Responses: 200 OK304, 400, 404, 429

Response fields
listEvalCases response fields
NameTypeDescription
itemsrequiredobject[]
nextCursorrequiredstring | null
Example
curl 'https://incantory.ai/api/v1/evals/datasets/{id}/cases' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Add cases (batch)

POST/api/v1/evals/datasets/{id}/casesToken required · scope evals:write

replace: true deletes the existing cases first. A dataset holds at most 10,000 cases.

addEvalCases parameters
NameTypeDescription
id pathrequiredstring

Request body

addEvalCases body fields
NameTypeDescription
casesrequiredobject[]
replacebooleanDelete the existing cases first

Responses: 201 OK400, 401, 403, 404, 413, 422, 429

Response fields
addEvalCases response fields
NameTypeDescription
addedrequirednumber
caseCountrequirednumber
Example
curl -X POST 'https://incantory.ai/api/v1/evals/datasets/{id}/cases' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"cases":[{"input":{}}]}'

Edit a case

PATCH/api/v1/evals/datasets/{id}/cases/{caseId}Token required · scope evals:write

updateEvalCase parameters
NameTypeDescription
id pathrequiredstring
caseId pathrequiredstring

Request body

updateEvalCase body fields
NameTypeDescription
inputobject
expectedany
tagsstring[]

Responses: 200 OK400, 401, 403, 404, 429

Response fields
updateEvalCase response fields
NameTypeDescription
idrequiredstring
inputrequiredobject
expectedrequiredany
tagsrequiredstring[]
positionrequirednumber
Example
curl -X PATCH 'https://incantory.ai/api/v1/evals/datasets/{id}/cases/{caseId}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'

Delete a case

DELETE/api/v1/evals/datasets/{id}/cases/{caseId}Token required · scope evals:write

deleteEvalCase parameters
NameTypeDescription
id pathrequiredstring
caseId pathrequiredstring

Responses: 204 OK400, 401, 403, 404, 429

Example
curl -X DELETE 'https://incantory.ai/api/v1/evals/datasets/{id}/cases/{caseId}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Import cases from CSV or JSONL

POST/api/v1/evals/datasets/{id}/importToken required · scope evals:write

CSV: header row of variable names plus optional expected and tags (;-separated) columns. JSONL: {input, expected?, tags?} or a flat object of variables per line. 422 invalid_import names the line.

importEvalCases parameters
NameTypeDescription
id pathrequiredstring

Request body

importEvalCases body fields
NameTypeDescription
formatrequired"csv" | "jsonl"
textrequiredstring
replaceboolean

Responses: 201 OK400, 401, 403, 404, 413, 422, 429

Response fields
importEvalCases response fields
NameTypeDescription
addedrequirednumber
caseCountrequirednumber
Example
curl -X POST 'https://incantory.ai/api/v1/evals/datasets/{id}/import' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"format":"csv","text":"text"}'

Runs reported for a prompt (optionally one version or dataset)

GET/api/v1/evals/runsToken optional

listEvalRuns parameters
NameTypeDescription
prompt queryrequiredstringowner/slug
version queryinteger (…–9007199254740991)
datasetId querystring
cursor querystring
limit queryinteger (1–100)

Responses: 200 OK304, 400, 404, 429

Response fields
listEvalRuns response fields
NameTypeDescription
itemsrequiredobject[]
nextCursorrequiredstring | null
Example
curl 'https://incantory.ai/api/v1/evals/runs' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Create a run for a prompt version

POST/api/v1/evals/runsToken required · scope evals:write

Only the prompt owner (or an admin) may report runs: a passing run opens requirePassingEval labels. The version defaults to the label, else the latest. model is a catalog slug (unknown names are kept as free text). Errors use prompt_not_found / version_not_found / dataset_not_found.

Request body

createEvalRun body fields
NameTypeDescription
promptrequiredstringowner/slug
versioninteger (…–9007199254740991)Version number; default: the label, else the latest version
labelstring
modelstringModel slug from GET /api/v1/models; unknown names are kept as free text
datasetIdstring
metadataobject
runner"ci" | "sdk" | "manual"Default: ci for API tokens, manual for the web UI
passThresholdnumber (0–1)Pass rate the run needs to pass (default 1.0)
commitShastring
externalUrlstring (uri)Link to the CI job

Responses: 201 OK400, 401, 403, 404, 410, 429

Response fields
createEvalRun response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
versionrequirednumber
datasetrequiredobject | null
modelrequiredobject | null
modelTextrequiredstring | null
runnerrequired"ci" | "sdk" | "manual"
statusrequired"running" | "completed" | "failed"
passedrequiredboolean | null
summaryrequiredobject
startedAtrequiredstring
finishedAtrequiredstring | null
commitSharequiredstring | null
externalUrlrequiredstring | null
createdByrequiredstring | null
Example
curl -X POST 'https://incantory.ai/api/v1/evals/runs' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"prompt":"alice/haiku"}'

Get a run (status, verdict, summary)

GET/api/v1/evals/runs/{id}Token optional

getEvalRun parameters
NameTypeDescription
id pathrequiredstring

Responses: 200 OK400, 404, 429

Response fields
getEvalRun response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
versionrequirednumber
datasetrequiredobject | null
modelrequiredobject | null
modelTextrequiredstring | null
runnerrequired"ci" | "sdk" | "manual"
statusrequired"running" | "completed" | "failed"
passedrequiredboolean | null
summaryrequiredobject
startedAtrequiredstring
finishedAtrequiredstring | null
commitSharequiredstring | null
externalUrlrequiredstring | null
createdByrequiredstring | null
resultCountrequirednumber
canManagerequiredboolean
Example
curl 'https://incantory.ai/api/v1/evals/runs/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Finish a run, pin or unpin its verdict

PATCH/api/v1/evals/runs/{id}Token required · scope evals:write

passed pins the verdict (audited); null unpins it. status: "failed" marks a crashed run (never passes).

updateEvalRun parameters
NameTypeDescription
id pathrequiredstring

Request body

updateEvalRun body fields
NameTypeDescription
status"running" | "completed" | "failed"
passedboolean | nullPin the verdict (null clears the pin; the server recomputes)
passThresholdnumber (0–1)
externalUrlstring (uri) | null

Responses: 200 OK400, 401, 403, 404, 429

Response fields
updateEvalRun response fields
NameTypeDescription
idrequiredstring
promptrequiredstring
versionrequirednumber
datasetrequiredobject | null
modelrequiredobject | null
modelTextrequiredstring | null
runnerrequired"ci" | "sdk" | "manual"
statusrequired"running" | "completed" | "failed"
passedrequiredboolean | null
summaryrequiredobject
startedAtrequiredstring
finishedAtrequiredstring | null
commitSharequiredstring | null
externalUrlrequiredstring | null
createdByrequiredstring | null
Example
curl -X PATCH 'https://incantory.ai/api/v1/evals/runs/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{}'

Delete a run (audited)

DELETE/api/v1/evals/runs/{id}Token required · scope evals:write

deleteEvalRun parameters
NameTypeDescription
id pathrequiredstring

Responses: 204 OK400, 401, 403, 404, 429

Example
curl -X DELETE 'https://incantory.ai/api/v1/evals/runs/{id}' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

A run's results in report order

GET/api/v1/evals/runs/{id}/resultsToken optional

listEvalResults parameters
NameTypeDescription
id pathrequiredstring
cursor querystring
limit queryinteger (1–500)

Responses: 200 OK304, 400, 404, 429

Response fields
listEvalResults response fields
NameTypeDescription
itemsrequiredobject[]
nextCursorrequiredstring | null
Example
curl 'https://incantory.ai/api/v1/evals/runs/{id}/results' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"

Append results (batch, ≤1000)

POST/api/v1/evals/runs/{id}/resultsToken required · scope evals:write

Each batch recomputes the run summary and verdict from all its results (verdict: passRate over results with a boolean passed ≥ the run's passThreshold, default 1.0) and marks the run completed. A pass on a catalog model adds a "verified on" row.

appendEvalResults parameters
NameTypeDescription
id pathrequiredstring

Request body

appendEvalResults body fields
NameTypeDescription
resultsrequiredobject[]

Responses: 200 OK400, 401, 403, 404, 413, 422, 429

Response fields
appendEvalResults response fields
NameTypeDescription
acceptedrequirednumber
runrequiredobject
Example
curl -X POST 'https://incantory.ai/api/v1/evals/runs/{id}/results' \
  -H "Authorization: Bearer $INCANTORY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"results":[{}]}'

Per-version score summary (latest run per model × dataset)

GET/api/v1/evals/scoresToken optional

getEvalScores parameters
NameTypeDescription
prompt queryrequiredstringowner/slug

Responses: 200 OK400, 404, 429

Response fields
getEvalScores response fields
NameTypeDescription
promptrequiredstring
versionsrequiredobject[]
Example
curl 'https://incantory.ai/api/v1/evals/scores' \
  -H "Authorization: Bearer $INCANTORY_TOKEN"