curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/evals/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
from anyformat.sdk import Client
client = Client(api_key="YOUR_API_KEY")
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
# iter_evals follows next_cursor across pages for you.
for an_eval in client.iter_evals(workflow_id):
print(an_eval.run_number, an_eval.status, an_eval.accuracy)
interface EvalSummary {
id: string;
run_number: number;
version_id: string;
status: 'in_progress' | 'processed' | 'error';
accuracy: number | null;
matched: number | null;
mismatched: number | null;
ungraded: number | null;
file_count: number;
failed_count: number;
created_at: string | null;
}
interface EvalPage {
items: EvalSummary[];
next_cursor: string | null;
}
const workflowId = '0686bb97-8c30-70f0-8000-97669e000eb8';
const base = `https://api.anyformat.ai/v3/workflows/${workflowId}/evals/`;
const headers = { 'Authorization': 'Bearer YOUR_API_KEY' };
let cursor: string | null = null;
do {
const url = cursor ? `${base}?cursor=${cursor}` : base;
const response = await fetch(url, { headers });
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
const page: EvalPage = await response.json();
for (const e of page.items) {
console.log(e.run_number, e.status, e.accuracy);
}
cursor = page.next_cursor;
} while (cursor);
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"run_number": 4,
"version_id": "abcdef1234",
"status": "in_progress",
"accuracy": null,
"matched": null,
"mismatched": null,
"ungraded": null,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-06T09:00:00.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"run_number": 3,
"version_id": "abcdef1234",
"status": "processed",
"accuracy": 0.94,
"matched": 47,
"mismatched": 3,
"ungraded": 1,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-05T10:00:00.000Z"
}
],
"next_cursor": null
}
Evals
List Evals
List a workflow’s evals, newest first
GET
/
v3
/
workflows
/
{workflow_id}
/
evals
/
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/evals/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
from anyformat.sdk import Client
client = Client(api_key="YOUR_API_KEY")
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
# iter_evals follows next_cursor across pages for you.
for an_eval in client.iter_evals(workflow_id):
print(an_eval.run_number, an_eval.status, an_eval.accuracy)
interface EvalSummary {
id: string;
run_number: number;
version_id: string;
status: 'in_progress' | 'processed' | 'error';
accuracy: number | null;
matched: number | null;
mismatched: number | null;
ungraded: number | null;
file_count: number;
failed_count: number;
created_at: string | null;
}
interface EvalPage {
items: EvalSummary[];
next_cursor: string | null;
}
const workflowId = '0686bb97-8c30-70f0-8000-97669e000eb8';
const base = `https://api.anyformat.ai/v3/workflows/${workflowId}/evals/`;
const headers = { 'Authorization': 'Bearer YOUR_API_KEY' };
let cursor: string | null = null;
do {
const url = cursor ? `${base}?cursor=${cursor}` : base;
const response = await fetch(url, { headers });
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
const page: EvalPage = await response.json();
for (const e of page.items) {
console.log(e.run_number, e.status, e.accuracy);
}
cursor = page.next_cursor;
} while (cursor);
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"run_number": 4,
"version_id": "abcdef1234",
"status": "in_progress",
"accuracy": null,
"matched": null,
"mismatched": null,
"ungraded": null,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-06T09:00:00.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"run_number": 3,
"version_id": "abcdef1234",
"status": "processed",
"accuracy": 0.94,
"matched": 47,
"mismatched": 3,
"ungraded": 1,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-05T10:00:00.000Z"
}
],
"next_cursor": null
}
Rate limit tier: general, 600 requests/min. See Rate limits.
Returns one keyset page of a workflow’s evals, newest first. Follow
next_cursor until it is null. See Pagination.
Each item is the same headline GET /v3/workflows/{workflow_id}/evals/{eval_id}/ returns: run_number, grading status, accuracy with its matched, mismatched and ungraded tallies, file_count, and failed_count. The headline fields are null on any item still in_progress, so one page can mix graded and running evals. See its status model.
An unknown workflow returns 404, as does one in another organization.
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/evals/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
from anyformat.sdk import Client
client = Client(api_key="YOUR_API_KEY")
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
# iter_evals follows next_cursor across pages for you.
for an_eval in client.iter_evals(workflow_id):
print(an_eval.run_number, an_eval.status, an_eval.accuracy)
interface EvalSummary {
id: string;
run_number: number;
version_id: string;
status: 'in_progress' | 'processed' | 'error';
accuracy: number | null;
matched: number | null;
mismatched: number | null;
ungraded: number | null;
file_count: number;
failed_count: number;
created_at: string | null;
}
interface EvalPage {
items: EvalSummary[];
next_cursor: string | null;
}
const workflowId = '0686bb97-8c30-70f0-8000-97669e000eb8';
const base = `https://api.anyformat.ai/v3/workflows/${workflowId}/evals/`;
const headers = { 'Authorization': 'Bearer YOUR_API_KEY' };
let cursor: string | null = null;
do {
const url = cursor ? `${base}?cursor=${cursor}` : base;
const response = await fetch(url, { headers });
if (!response.ok) {
throw new Error(`API error: ${response.status}`);
}
const page: EvalPage = await response.json();
for (const e of page.items) {
console.log(e.run_number, e.status, e.accuracy);
}
cursor = page.next_cursor;
} while (cursor);
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"run_number": 4,
"version_id": "abcdef1234",
"status": "in_progress",
"accuracy": null,
"matched": null,
"mismatched": null,
"ungraded": null,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-06T09:00:00.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"run_number": 3,
"version_id": "abcdef1234",
"status": "processed",
"accuracy": 0.94,
"matched": 47,
"mismatched": 3,
"ungraded": 1,
"file_count": 42,
"failed_count": 0,
"created_at": "2026-07-05T10:00:00.000Z"
}
],
"next_cursor": null
}
Authorizations
API key issued from app.anyformat.ai/api-key. Send as Authorization: Bearer <key>.
Path Parameters
Query Parameters
Page size, capped at 100.
Required range:
1 <= x <= 100Opaque token from a previous response's next_cursor.
Response
Successful Response
One keyset page of evals.
Fixed (-created_at, -id) order. No totals or page numbers — iterate by
following next_cursor until it is null.

