Skip to main content
The Duvo Public API lets you drive Duvo from your own code, scripts, and pipelines. This page is the orientation hub: what you can do, which endpoints to reach for, and how to put them together into real integrations. For request and response schemas, follow the links into the API Reference.

What you can do with the API


Authentication

All requests use an API key in the Authorization header:
Generate a key at Your Profile → API keys in the Duvo dashboard — scope it to a single team or to all teams you can access. Users with the Manager role or above can also create keys for a specific team at Team Settings → API keys. Keys inherit the permissions of the user who created them, use the format dv_<random>, and are shown once at creation, so store them immediately.
  • Base URL: https://api.duvo.ai/v2
  • Rate limit: 300 requests per minute per API key. Responses include x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset headers. On 429, honor the retry-after header.
  • Error model: errors return { "error": "...", "message": "..." } with a standard HTTP status code (400, 401, 403, 404, 413, 429, 5xx).
API keys are shown once at creation and inherit the permissions of the user who created them. Store them securely, treat them like a password, and stay under the 300 requests per minute per-key rate limit — on a 429, honor the retry-after header.
For the full auth, rate-limit, and error reference, see Running Agents via API.
Collection endpoints are team-scoped (/teams/\{teamId\}/...); endpoints that act on a specific resource are addressed directly by ID (/agents/\{agent_id\}, /runs/\{run_id\}).

Agents and Revisions

Agents are the units of work in Duvo. A Revision is a versioned snapshot of an Agent’s Setup — AOP, model settings, and attached skills. Runs always run against an Agent’s latest Revision. What you can do:
  • List, create, and update Agents
  • Create Revisions to deploy AOP changes programmatically
  • Organize Agents into folders
See the API Reference for request and response schemas, and Creating Agents via API for worked examples including folders and the full create flow. You can create an Agent and its first Revision in a single request — pass a build object in the body:
Organize Agents into folders:

Runs

A Run is a single execution of an Agent. Runs are asynchronous — the API returns immediately and you poll or use a webhook to track completion. What you can do:
  • Start a Run with optional file input, an initial message, and a webhook for event notifications
  • Poll for status (pending, running, waiting, completed, failed, stopped)
  • Read the conversation — everything the Agent did, step by step
  • Respond to human-in-the-loop requests programmatically
  • Stop a running Run
See the API Reference for schemas, and Running Agents via API for the full flow including file uploads and HITL webhooks. Starting a Run and polling for completion:

Skills

Skills package reusable knowledge — AOPs, rule books, taxonomies — into a zip that any Agent can use. Managing skills via the API lets you keep your AOPs in a Git repository and sync them to Duvo on every push, without anyone clicking through the UI. What you can do:
  • List team skills and system skills
  • Create a skill from text content
  • Upload a multi-file skill as a zip
  • Download a skill as a zip
  • Update individual skill files
  • Delete a skill
See the API Reference for schemas and Creating Custom Skills for how to structure your SKILL.md files. Creating a skill from text:
Uploading a multi-file skill as a zip: A zip must contain a SKILL.md at the root with name and description frontmatter. Supporting documents, templates, and examples can live in subfolders.
Syncing skills from a Git repository (CI example): This script pushes a directory of skill folders to Duvo on every deploy. It deletes stale skills by name and re-creates them from the latest source.

Queues and Cases

Queues hold individual work items — called Cases — that Agents process one at a time. You can push Cases into a queue from any external system, which makes it the standard pattern for high-volume integrations where events arrive faster than a single Agent can handle them. What you can do:
  • List and inspect queues
  • Push Cases into a queue (one at a time or in batch)
  • List and search Cases in a queue
  • Bulk-update, bulk-reprocess, or bulk-delete Cases
  • Track Case status through the processing lifecycle
See the API Reference for schemas. Case statuses: When listing Cases you can also filter by needs_input (Cases with an open human request) and postponed (Cases scheduled to retry later). These are derived from Case fields (pending_human_request_id, postponed_to) rather than stored status values. Pushing a Case from an external system. Wrap a single Case in a case object. The data field is free-form text or a JSON string — Agents receive it when they claim the Case:
Batch-pushing Cases for high-volume intake. Use a cases array instead:
The response returns the created Cases under added_cases, each with its id and status. Once Cases are in the queue, an Agent with a Case Trigger picks them up automatically — see Queue for how to configure the trigger. Validate queue wiring before you start work. Check that a Revision’s queue integration slots are linked to real queues. The response reports, per producer/consumer slot, how many queues are linked. A slot with linked_queue_count of 0 is attached but points at no queue and will fail at runtime — link a queue before starting Runs.

Schedules

You can create, list, update, and delete an Agent’s schedules via the API to run recurring Runs. See the API Reference for schedule fields and limits.

Connections

Connections link your Agents to external services. The API lets you list and inspect connections, create user-provided connections (custom MCP servers with an API key), and initiate OAuth flows. Probe by integration_slug (catalog connections — the backend resolves the server URL for you) or by a custom server_url. A response with success: false includes a code: listing_unavailable means there’s nothing to list yet (not an error — some connections only expose tools once connected), while probe_failed means the probe genuinely failed. See the API Reference for schemas and Creating Agents via API for the full OAuth flows.

Sandboxes and file uploads

When your Agent needs to process files — CSVs, PDFs, images — upload them to a Sandbox before starting the Run, then pass the sandbox_id when you start the run. See the API Reference for schemas and Running Agents via API for the complete file-upload pattern.

End-to-end example: order management integration

This example shows an order management system (OMS) pushing new orders into Duvo for processing whenever they arrive. Duvo validates each order, checks inventory, and posts the result back to the OMS. Architecture:
1

Configure Duvo

Create an Agent with a Queue trigger pointed at your order-processing queue. The Agent’s AOP instructs it to read Case data, validate the order, check inventory via your ERP connection, and post the result to your OMS webhook.
2

OMS integration code

3

Track results

List Cases to see their status and retrieve Agent output:

Next steps

Creating Agents via API

Agents, Revisions, Folders, Connections, Schedules

Running Agents via API

Runs, Sandboxes, HITL webhooks

Creating Custom Skills

How to structure skills for the API

Queue

Queue architecture and Case Trigger setup

API Reference

Full request and response schemas for every endpoint