Skip to main content
GET
List Org Runs

Authorizations

Authorization
string
header
required

API key authentication. Get your API key from the Duvo dashboard.

Path Parameters

orgId
string<uuid>
required

The organization's unique identifier

Query Parameters

limit
integer
default:20

Number of runs per page (1-500, default 20). The cap is higher than the team runs endpoint's because this route serves bulk export: at 100 requests a minute per key, page size is what bounds how fast a month of runs can be pulled.

Required range: 1 <= x <= 500
cursor
string

Resume after the run a previous page ended on: pass the next_cursor that page returned, with the same filters and sort_order. Runs created or resolved in between cannot shift a boundary you have already passed, so a sweep sees every run exactly once, and a sweep that started under the default 7-day window keeps that window on every page. This list has no offset parameter: skipping rows costs the database every skipped row, and a run created between two requests shifts every later offset by one, so an offset sweep can repeat or miss a run. 400 when the value is not a cursor this endpoint issued.

Minimum string length: 1
sort_order
enum<string>
default:desc

Sort direction on created_at (default desc)

Available options:
asc,
desc
status
enum<string>

Filter to runs with this status. needs_attention is the monitoring status: runs that are waiting on a human or failed, plus runs whose latest evaluation flagged a critical issue — a run can finish as completed and still have accomplished nothing.

Available options:
not_started,
pending,
starting,
running,
waiting,
completed,
failed,
interrupted,
stopped,
needs_attention
team_id
string<uuid>

Filter to runs on this team

agent_id
string<uuid>

Filter to runs for this agent

source
string

Filter to runs created from this source (e.g. api, scheduling)

has_issues
enum<string>

Filter on the run's latest successful evaluation: true returns only runs it flagged, false only runs it did not. Only the latest evaluation counts — an older flag does not match — and a run whose latest evaluation errored, or that has none, counts as unflagged. Omit to return both.

Available options:
true,
false
issue_severity
enum<string>

Only runs whose latest successful evaluation has at least one failing rubric at this severity (critical | medium | low). Implies has_issues.

Available options:
critical,
medium,
low
created_after
string<date-time>

Return runs created at or after this ISO-8601 timestamp. Every run has a creation time, so this is the window that returns all runs in a period whatever state they reached — unlike the started and completed windows below, which exclude runs that never started and runs still in flight respectively. When the request carries no lower time bound (created_after, started_after, completed_after or since), this defaults to 7 days ago and default_window_applied is true in the response: an organization's run history is unbounded, and a monitor wants what is recent. An upper bound alone keeps the default floor. Pass any lower bound to replace it.

created_before
string<date-time>

Return runs created before this ISO-8601 timestamp (exclusive). Pair with created_after for a period. A closed creation window is also the stable one to paginate: results are ordered by creation time, so runs arriving mid-sweep cannot shift a closed window's pages.

started_after
string<date-time>

Return runs that started at or after this ISO-8601 timestamp. Runs that never started are excluded. Pair with started_before to bound a stuck-run query to a window — without a lower bound, status=running also counts every run left running months ago.

started_before
string<date-time>

Return runs that started before this ISO-8601 timestamp. Combine with status=running to find stuck runs — since/until filter on completion, so they never match a run that is still going.

completed_after
string<date-time>

Return runs completed at or after this ISO-8601 timestamp. Runs that have not completed are excluded, including every stuck one — reach for started_after/started_before to bound those. Alias of since; pass one or the other, not both.

completed_before
string<date-time>

Return runs completed before this ISO-8601 timestamp (exclusive). Runs that have not completed are excluded. Alias of until; pass one or the other, not both.

since
string<date-time>

Alias of completed_after, kept because it is the name the public team runs endpoint ships. Prefer completed_after: this endpoint carries a creation and a start window too, and only the column-named pair says which one this is.

until
string<date-time>

Alias of completed_before, kept because it is the name the public team runs endpoint ships. Prefer completed_before.

count_only
enum<string>
default:false

Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.

Available options:
true,
false
include_total
enum<string>
default:false

Return total, the count of every matching run ignoring pagination. Off by default: counting walks every match where the page stops at limit, so on a large organization it costs orders of magnitude more than the rows themselves. Ask for it when you are driving a pager, not when you are polling. Implied by count_only.

Available options:
true,
false

Response

Default Response

runs
object[]
required
total
number | null
required

Total runs matching the filters, ignoring pagination. Null unless include_total=true or count_only=true — null means not requested, distinct from a count of 0.

limit
number
required

The limit that was applied

has_more
boolean
required

Whether another page exists past this one, determined by looking one row ahead rather than inferred from a full page. False on a count_only response.

next_cursor
string | null
required

Pass as cursor (same filters, same sort_order) to fetch the next page. Null when has_more is false. Exact continuation from the last run on this page, unaffected by runs created or resolved in the meantime.

created_after
string | null
required

The creation lower bound the query ran with, as ISO 8601: the caller's created_after, or 7 days ago when the request carried no time bound at all. Null when the caller bounded the query on another timestamp only.

default_window_applied
boolean
required

True when the request carried no time bound and the 7-day creation window was applied for it. A caller that meant "everything" should pass an explicit created_after.