curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=100&document_packet_created_after=2026-07-17T00:00:00Z&document_packet_created_before=2026-07-18T00:00:00Z' \
-H 'Authorization: Bearer YOUR_API_KEY'
# July 17 in Europe/Madrid = 2026-07-16T22:00:00Z .. 2026-07-17T22:00:00Z
curl --get 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/' \
--data-urlencode 'limit=100' \
--data-urlencode 'document_packet_created_after=2026-07-17T00:00:00+02:00' \
--data-urlencode 'document_packet_created_before=2026-07-18T00:00:00+02:00' \
-H 'Authorization: Bearer YOUR_API_KEY'
import requests
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
url = f"https://api.anyformat.ai/v3/workflows/{workflow_id}/runs/"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# All runs uploaded on 2026-07-17, paged.
# The cursor encodes pagination position only, NOT the filter. Keep
# `document_packet_created_{after,before}` on every page, or the next page
# returns runs from other upload days. Mutating the same `params` dict and
# adding `cursor` carries the filters along automatically.
params = {
"limit": 100,
"document_packet_created_after": "2026-07-17T00:00:00",
"document_packet_created_before": "2026-07-18T00:00:00",
}
while True:
page = requests.get(url, headers=headers, params=params).json()
for run in page["items"]:
print(run["id"], run["status"])
if not page["next_cursor"]:
break
params["cursor"] = page["next_cursor"]
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "processed",
"created_at": "2026-07-02T09:00:00.000Z",
"updated_at": "2026-07-02T09:02:30.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "error",
"created_at": "2026-07-01T12:00:00.000Z",
"updated_at": "2026-07-01T12:01:10.000Z"
}
],
"next_cursor": null
}
List Workflow Runs
List a workflow’s runs, newest first
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=100&document_packet_created_after=2026-07-17T00:00:00Z&document_packet_created_before=2026-07-18T00:00:00Z' \
-H 'Authorization: Bearer YOUR_API_KEY'
# July 17 in Europe/Madrid = 2026-07-16T22:00:00Z .. 2026-07-17T22:00:00Z
curl --get 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/' \
--data-urlencode 'limit=100' \
--data-urlencode 'document_packet_created_after=2026-07-17T00:00:00+02:00' \
--data-urlencode 'document_packet_created_before=2026-07-18T00:00:00+02:00' \
-H 'Authorization: Bearer YOUR_API_KEY'
import requests
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
url = f"https://api.anyformat.ai/v3/workflows/{workflow_id}/runs/"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# All runs uploaded on 2026-07-17, paged.
# The cursor encodes pagination position only, NOT the filter. Keep
# `document_packet_created_{after,before}` on every page, or the next page
# returns runs from other upload days. Mutating the same `params` dict and
# adding `cursor` carries the filters along automatically.
params = {
"limit": 100,
"document_packet_created_after": "2026-07-17T00:00:00",
"document_packet_created_before": "2026-07-18T00:00:00",
}
while True:
page = requests.get(url, headers=headers, params=params).json()
for run in page["items"]:
print(run["id"], run["status"])
if not page["next_cursor"]:
break
params["cursor"] = page["next_cursor"]
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "processed",
"created_at": "2026-07-02T09:00:00.000Z",
"updated_at": "2026-07-02T09:02:30.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "error",
"created_at": "2026-07-01T12:00:00.000Z",
"updated_at": "2026-07-01T12:01:10.000Z"
}
],
"next_cursor": null
}
next_cursor until it is null. See Pagination.
Each item is slim: id, document_packet_id, status and timestamps. For the results envelope, fetch GET /v3/runs/{run_id}/.
Filter by upload day
Two optional ISO 8601 datetime query params narrow the page to runs whose document packet was created inside the half-open interval[after, before):
document_packet_created_afteris the inclusive lower bound.document_packet_created_beforeis the exclusive upper bound.
after=2026-07-17T00:00:00 & before=2026-07-18T00:00:00 returns exactly July 17. That is the shape a daily-batch workflow wants: upload on day N, let cron enqueue the runs, fetch the results on day N+1.
Timezones. Both bounds accept any ISO 8601 offset, such as Z, +02:00 or -05:00. A value with no offset counts as UTC. Use your local offset when “one day” means a day in your timezone. The examples below cover UTC and Madrid summer time.
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=20' \
-H 'Authorization: Bearer YOUR_API_KEY'
curl -X GET 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/?limit=100&document_packet_created_after=2026-07-17T00:00:00Z&document_packet_created_before=2026-07-18T00:00:00Z' \
-H 'Authorization: Bearer YOUR_API_KEY'
# July 17 in Europe/Madrid = 2026-07-16T22:00:00Z .. 2026-07-17T22:00:00Z
curl --get 'https://api.anyformat.ai/v3/workflows/0686bb97-8c30-70f0-8000-97669e000eb8/runs/' \
--data-urlencode 'limit=100' \
--data-urlencode 'document_packet_created_after=2026-07-17T00:00:00+02:00' \
--data-urlencode 'document_packet_created_before=2026-07-18T00:00:00+02:00' \
-H 'Authorization: Bearer YOUR_API_KEY'
import requests
workflow_id = "0686bb97-8c30-70f0-8000-97669e000eb8"
url = f"https://api.anyformat.ai/v3/workflows/{workflow_id}/runs/"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# All runs uploaded on 2026-07-17, paged.
# The cursor encodes pagination position only, NOT the filter. Keep
# `document_packet_created_{after,before}` on every page, or the next page
# returns runs from other upload days. Mutating the same `params` dict and
# adding `cursor` carries the filters along automatically.
params = {
"limit": 100,
"document_packet_created_after": "2026-07-17T00:00:00",
"document_packet_created_before": "2026-07-18T00:00:00",
}
while True:
page = requests.get(url, headers=headers, params=params).json()
for run in page["items"]:
print(run["id"], run["status"])
if not page["next_cursor"]:
break
params["cursor"] = page["next_cursor"]
{
"items": [
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4fa",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "processed",
"created_at": "2026-07-02T09:00:00.000Z",
"updated_at": "2026-07-02T09:02:30.000Z"
},
{
"id": "069dcc2c-e14c-7606-8000-2ee4fb17b4f9",
"document_packet_id": "069dcc2c-e14c-7606-8000-2ee4fb17b4e1",
"status": "error",
"created_at": "2026-07-01T12:00:00.000Z",
"updated_at": "2026-07-01T12:01:10.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.
1 <= x <= 100Opaque token from a previous response's next_cursor.
Include only runs whose document packet was created at or after this ISO 8601 datetime (inclusive lower bound). Combine with document_packet_created_before to fetch one day's uploads.
Include only runs whose document packet was created before this ISO 8601 datetime (exclusive upper bound). Adjacent day-buckets tile without overlap: after=2026-07-17T00:00:00 & before=2026-07-18T00:00:00 is exactly July 17.
Response
Successful Response
One keyset page of runs.
Fixed (-created_at, -id) order. No totals or page numbers —
iterate by following next_cursor until it is null.

