Cases

Create, list, and manage cases and their labels within queues

get

List cases in a queue. Supports status, date-range, and free-text filters via query params. For label filters, use POST /v1/queues/:queue_id/cases/search.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Query parameters
limitinteger · min: 1 · max: 100Optional

Number of cases per page (1-100, default 20).

Default: 20
offsetinteger · max: 9007199254740991Optional

Zero-based offset for pagination.

statusstringOptional

Filter by one or more case statuses (comma-separated). Values: pending, claimed, completed, failed, needs_input, postponed.

searchstringOptional

Full-text search across case title and data.

created_at_fromstringOptional

Return only cases created on or after this ISO-8601 timestamp.

updated_at_fromstringOptional

Return only cases updated on or after this ISO-8601 timestamp.

sort_bystring · enumOptional

Field to sort by. Default: created_at.

Default: created_atPossible values:
sort_orderstring · enumOptional

Sort direction. Default: desc.

Default: descPossible values:
Responses
200

Default Response

application/json
totalnumberRequired
limitinteger · min: -9007199254740991 · max: 9007199254740991Required
offsetinteger · min: -9007199254740991 · max: 9007199254740991Required
get
/v1/queues/{queue_id}/cases
post

Create one or more cases in a queue. Provide either a single case object or a cases array (1-100); providing both returns 400. Each case accepts a title (max 500 chars), optional free-form data, and optional labels that will be assigned to the case on creation (missing labels are created on the queue).

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
Responses
post
/v1/queues/{queue_id}/cases
delete

Delete every case in a queue. Interrupts any associated running jobs first. Destructive — not exposed via MCP.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Responses
200

Default Response

application/json
successbooleanRequired
deletedCountnumberRequired
interruptedRunIdsstring · uuid[]Required
delete
/v1/queues/{queue_id}/cases
post

Search cases in a queue with rich filters (multi-status, date ranges, label-based filters). Use this when the simple query-string filters on GET /v1/queues/:queue_id/cases aren't enough.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
limitinteger · min: 1 · max: 100OptionalDefault: 25
offsetinteger · max: 9007199254740991OptionalDefault: 0
sort_bystring · enumOptionalDefault: created_atPossible values:
sort_orderstring · enumOptionalDefault: descPossible values:
searchstringOptional
Responses
200

Default Response

application/json
totalnumberRequired
limitinteger · min: -9007199254740991 · max: 9007199254740991Required
offsetinteger · min: -9007199254740991 · max: 9007199254740991Required
post
/v1/queues/{queue_id}/cases/search
get

Get a case by ID. Returns the case and its event history.

Authorizations
AuthorizationstringRequired

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

Path parameters
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Responses
200

Default Response

application/json
get
/v1/cases/{case_id}
delete

Delete a case. Interrupts any associated running jobs first.

Authorizations
AuthorizationstringRequired

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

Path parameters
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Responses
200

Default Response

application/json
successbooleanRequired
interruptedRunIdsstring · uuid[]Required
delete
/v1/cases/{case_id}
get

List Jobs (agent runs) that have claimed or received handover of a case, newest first. Capped at 50 ownership events.

Authorizations
AuthorizationstringRequired

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

Path parameters
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Responses
200

Default Response

application/json
get
/v1/cases/{case_id}/runs
get

Return the latest qualifying messages (assistant text + tool calls) for a Job on a case, newest last. Used to populate the live body of a running Job card in the case Activity timeline.

Authorizations
AuthorizationstringRequired

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

Path parameters
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
run_idstring · uuidRequired

The agent run's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Query parameters
limitinteger · min: 1 · max: 10Optional

Maximum number of qualifying messages to return. Defaults to 3, must be between 1 and 10.

Responses
200

Default Response

application/json
get
/v1/cases/{case_id}/runs/{run_id}/recent-messages
post

Delegate multiple cases to a chosen agent, overriding the queue's default consumer. Any active runs on the selected cases are interrupted first; the cases are then reset to pending and assigned to the chosen agent for the next dispatcher tick. The chosen agent must already be connected to the queue as a case-queue-consumer (with the trigger enabled or disabled).

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
case_idsstring · uuid[] · min: 1 · max: 100Required

Case IDs to delegate (1-100).

agent_idstring · uuidRequired

The agent that should run on the selected cases. Must be a consumer of this queue.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Responses
200

Default Response

application/json
delegatedCountnumberRequired
skippedCountnumberRequired
post
/v1/queues/{queue_id}/cases/bulk-delegate
post

Delete multiple cases from a queue. Any active runs are interrupted first.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
case_idsstring · uuid[] · min: 1 · max: 100Required

Case IDs to delete (1-100).

Responses
200

Default Response

application/json
deletedCountnumberRequired
interruptedRunIdsstring · uuid[]Required
post
/v1/queues/{queue_id}/cases/bulk-delete
post

Retry multiple cases by resetting them to pending. Any active runs are interrupted first. Cases already pending are skipped.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
case_idsstring · uuid[] · min: 1 · max: 100Required

Case IDs to retry (1-100).

Responses
200

Default Response

application/json
retriedCountnumberRequired
skippedCountnumberRequired
post
/v1/queues/{queue_id}/cases/bulk-retry
post

Update the status of multiple cases to completed or failed. Interrupts any active runs and cancels pending human requests.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
case_idsstring · uuid[] · min: 1 · max: 100Required

Case IDs to update (1-100).

statusstring · enumRequired

Terminal status to set on each case.

Possible values:
Responses
200

Default Response

application/json
updatedCountnumberRequired
skippedCountnumberRequired
interruptedRunIdsstring · uuid[]Required
post
/v1/queues/{queue_id}/cases/bulk-update-status
get

List all labels assigned to a case.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Query parameters
limitinteger · min: 1 · max: 1000Optional

Maximum number of labels to return.

Default: 1000
offsetinteger · max: 9007199254740991Optional

Zero-based offset for pagination.

Responses
200

Default Response

application/json
get
/v1/queues/{queue_id}/cases/{case_id}/labels
post

Assign one or more labels to a case. Creates the labels on the queue if they don't already exist.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
Responses
200

Default Response

application/json
post
/v1/queues/{queue_id}/cases/{case_id}/labels
get

List every label defined on a queue along with the count of cases each label is assigned to.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Query parameters
limitinteger · min: 1 · max: 1000Optional

Maximum number of labels to return.

Default: 1000
offsetinteger · max: 9007199254740991Optional

Zero-based offset for pagination.

Responses
200

Default Response

application/json
get
/v1/queues/{queue_id}/labels
post

Create a label on a queue without assigning it to a case.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
keystringOptionalDefault: ""
valuestring · min: 1Required
color_hueinteger · max: 360Optional
Responses
200

Default Response

application/json
post
/v1/queues/{queue_id}/labels
post

Remove the given labels from a case.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
case_idstring · uuidRequired

The case's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
label_idsstring · uuid[] · min: 1Required
Responses
200

Default Response

application/json
successbooleanRequired
post
/v1/queues/{queue_id}/cases/{case_id}/labels/unlink
delete

Delete a label from a queue. Cascade-deletes all assignments of this label on existing cases.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
label_idstring · uuidRequired

The label's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Responses
200

Default Response

application/json
successbooleanRequired
delete
/v1/queues/{queue_id}/labels/{label_id}
patch

Update a label's key, value, or color. Renaming key/value affects every case assigned to this label.

Authorizations
AuthorizationstringRequired

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

Path parameters
queue_idstring · uuidRequired

The queue's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
label_idstring · uuidRequired

The label's unique identifier

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
Body
keystringOptional
valuestring · min: 1Required
color_hueinteger · max: 360Optional
Responses
200

Default Response

application/json
patch
/v1/queues/{queue_id}/labels/{label_id}

Last updated