curl -X GET https://api.60db.ai/judge/evaluations?limit=25&needs_review=true \
-H "Authorization: Bearer your-api-key"
const response = await fetch('https://api.60db.ai/judge/evaluations?limit=25&needs_review=true', {
method: 'GET',
headers: {
'Authorization': 'Bearer your-api-key',
},
});
const data = await response.json();
import requests
response = requests.get(
"https://api.60db.ai/judge/evaluations?limit=25&needs_review=true",
headers={
"Authorization": "Bearer your-api-key",
},
)
data = response.json()
{
"success": true,
"data": [
{
"id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"kind": "extract",
"rubric_id": null,
"label": null,
"model": "60db-jev-extract-v1",
"resolved_model": "a221b77a8baf4a613b8f8652661d41fa10a5641e",
"source_model": "60db-jev-extract",
"state_preview": "can you move my 10am appointment to friday",
"summary": {
"intent": "booking",
"entities": 2,
"operation": "reschedule"
},
"question_count": 0,
"input_tokens": 0,
"escalated_questions": 0,
"min_confidence": 0.61,
"latency_ms": 2,
"credits_charged": 5.6e-07,
"created_at": "2026-09-28T13:19:50.064Z"
},
{
"id": "b2c3d4e5-f6a7-4890-bcde-f01234567890",
"kind": "evaluate",
"rubric_id": null,
"label": "docs-sample",
"model": "jev-latest",
"resolved_model": "60db-decision-model-v1",
"source_model": "60db-jev-source",
"state_preview": "Agent: I cannot refund that, it is outside the window.\nCaller: This is the third time I have called about this.",
"summary": {
"tone": "dismissive",
"resolved": 0.275,
"satisfaction": 1.1592
},
"question_count": 3,
"input_tokens": 84,
"escalated_questions": 2,
"min_confidence": 0.4681,
"latency_ms": 4,
"credits_charged": 1.51e-06,
"created_at": "2026-09-28T13:19:50.017Z"
}
],
"pagination": {
"total": 37,
"limit": 2,
"offset": 0,
"has_more": true
}
}
Judge
List runs
Judge history, including the low-confidence review queue
GET
/
judge
/
evaluations
curl -X GET https://api.60db.ai/judge/evaluations?limit=25&needs_review=true \
-H "Authorization: Bearer your-api-key"
const response = await fetch('https://api.60db.ai/judge/evaluations?limit=25&needs_review=true', {
method: 'GET',
headers: {
'Authorization': 'Bearer your-api-key',
},
});
const data = await response.json();
import requests
response = requests.get(
"https://api.60db.ai/judge/evaluations?limit=25&needs_review=true",
headers={
"Authorization": "Bearer your-api-key",
},
)
data = response.json()
{
"success": true,
"data": [
{
"id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"kind": "extract",
"rubric_id": null,
"label": null,
"model": "60db-jev-extract-v1",
"resolved_model": "a221b77a8baf4a613b8f8652661d41fa10a5641e",
"source_model": "60db-jev-extract",
"state_preview": "can you move my 10am appointment to friday",
"summary": {
"intent": "booking",
"entities": 2,
"operation": "reschedule"
},
"question_count": 0,
"input_tokens": 0,
"escalated_questions": 0,
"min_confidence": 0.61,
"latency_ms": 2,
"credits_charged": 5.6e-07,
"created_at": "2026-09-28T13:19:50.064Z"
},
{
"id": "b2c3d4e5-f6a7-4890-bcde-f01234567890",
"kind": "evaluate",
"rubric_id": null,
"label": "docs-sample",
"model": "jev-latest",
"resolved_model": "60db-decision-model-v1",
"source_model": "60db-jev-source",
"state_preview": "Agent: I cannot refund that, it is outside the window.\nCaller: This is the third time I have called about this.",
"summary": {
"tone": "dismissive",
"resolved": 0.275,
"satisfaction": 1.1592
},
"question_count": 3,
"input_tokens": 84,
"escalated_questions": 2,
"min_confidence": 0.4681,
"latency_ms": 4,
"credits_charged": 1.51e-06,
"created_at": "2026-09-28T13:19:50.017Z"
}
],
"pagination": {
"total": 37,
"limit": 2,
"offset": 0,
"has_more": true
}
}
Saved runs, newest first.
The filter that earns its keep is
needs_review=true: it returns only runs where the judge’s lowest confidence fell below 0.85, the upstream’s own escalation line. That is the queue a person should actually work through, instead of re-reading everything the model was already sure about.
Request
Headers
string
required
Bearer token — your standard 60db API key (
sk_…), or a user JWT. There is no separate Judge credential.Query parameters
integer
default:"25"
1–100.
integer
default:"0"
string
evaluate or extract.string
Only runs of one saved rubric — the whole series for that rubric.
boolean
default:"false"
Only runs whose
min_confidence is below 0.85.number
Your own threshold (0–1). Overrides
needs_review.Response
array
Each row carries
id, kind, rubric_id, label, summary, state_preview, min_confidence, input_tokens, escalated_questions, latency_ms, credits_charged and created_at.Rows deliberately omit the full request and result payloads — each can be up to 32 KiB. Use Get run for those.object
total, limit, offset, has_more.Visibility
A run stores the content it judged, so history is not workspace-public. You see your own runs; workspace owners and admins see everyone’s.Example
curl -X GET https://api.60db.ai/judge/evaluations?limit=25&needs_review=true \
-H "Authorization: Bearer your-api-key"
const response = await fetch('https://api.60db.ai/judge/evaluations?limit=25&needs_review=true', {
method: 'GET',
headers: {
'Authorization': 'Bearer your-api-key',
},
});
const data = await response.json();
import requests
response = requests.get(
"https://api.60db.ai/judge/evaluations?limit=25&needs_review=true",
headers={
"Authorization": "Bearer your-api-key",
},
)
data = response.json()
{
"success": true,
"data": [
{
"id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"kind": "extract",
"rubric_id": null,
"label": null,
"model": "60db-jev-extract-v1",
"resolved_model": "a221b77a8baf4a613b8f8652661d41fa10a5641e",
"source_model": "60db-jev-extract",
"state_preview": "can you move my 10am appointment to friday",
"summary": {
"intent": "booking",
"entities": 2,
"operation": "reschedule"
},
"question_count": 0,
"input_tokens": 0,
"escalated_questions": 0,
"min_confidence": 0.61,
"latency_ms": 2,
"credits_charged": 5.6e-07,
"created_at": "2026-09-28T13:19:50.064Z"
},
{
"id": "b2c3d4e5-f6a7-4890-bcde-f01234567890",
"kind": "evaluate",
"rubric_id": null,
"label": "docs-sample",
"model": "jev-latest",
"resolved_model": "60db-decision-model-v1",
"source_model": "60db-jev-source",
"state_preview": "Agent: I cannot refund that, it is outside the window.\nCaller: This is the third time I have called about this.",
"summary": {
"tone": "dismissive",
"resolved": 0.275,
"satisfaction": 1.1592
},
"question_count": 3,
"input_tokens": 84,
"escalated_questions": 2,
"min_confidence": 0.4681,
"latency_ms": 4,
"credits_charged": 1.51e-06,
"created_at": "2026-09-28T13:19:50.017Z"
}
],
"pagination": {
"total": 37,
"limit": 2,
"offset": 0,
"has_more": true
}
}