Overview
The Duvo Public API enables programmatic access to run Agents from your own applications, scripts, or automation pipelines. Instead of triggering runs through the Duvo web interface, you can integrate Agents directly into your workflows.Finding Your Agent ID
Each Agent has a unique ID you pass in every API request. The easiest way to find it is in the agent builder: open your agent, go to the Setup tab, scroll to the Triggers section, and expand the API Trigger card. It shows a ready-to-runcurl example with your agent’s ID already filled in, so you can copy and paste it straight into a terminal or script. You can also create an API key from the link in that card.
Key Concepts
Agents: Agents are configured through the Duvo web interface with a specific AOP, connections, and capabilities. The Public API allows you to start Runs for them programmatically. To create and manage Agents via API, see Creating Agents via API. Revisions: A Revision is a versioned Setup snapshot for an Agent. Every time an Agent is published, a new Revision is created. Runs always execute against an Agent’s latest Revision. You can also create Revisions via the API to deploy Setup changes programmatically. Runs: A run represents a single execution of an Agent. When you start a run, the Agent begins working on its configured task. Runs are asynchronous—the API returns immediately with run information, and you poll for status updates. Sandboxes: Sandboxes are isolated file environments where you can upload files before starting a run. If your Agent needs to process files (CSVs, documents, images, etc.), you first upload them to a sandbox, then reference that sandbox when starting the run. Human-in-the-Loop (HITL): Some Agents may require human input during execution. When this happens, the run enters a “waiting” status. You can provide a webhook URL when starting a run to receive notifications when human input is needed, then respond via the API.Base URL
All API endpoints are available at:Rate Limiting
The API enforces rate limits per API key (300 requests per minute). Rate limit information is included in response headers:| Header | Description |
|---|---|
x-ratelimit-limit | Maximum requests allowed in the window |
x-ratelimit-remaining | Requests remaining in current window |
x-ratelimit-reset | Unix timestamp when the window resets |
retry-after | Seconds to wait before retrying (when rate limited) |
429 Too Many Requests response.
Authentication
All Public API requests require authentication using an API key. API keys are scoped to a team and inherit the permissions of the user who created them.API Key Format
API keys follow the formatdv_<random> (e.g., dv_abc123xyz789...). They are approximately 35 characters long.
Using Your API Key
Include your API key in theAuthorization header as a Bearer token:
Creating API Keys in the UI
- Navigate to Team Settings → API Keys in the Duvo web interface
- Click Create API Key
- Enter a descriptive name for the key (e.g., “Production Pipeline”, “CI/CD Integration”)
- Click Create
- Copy the key immediately — it will only be shown once and cannot be retrieved later
⚠️ Important: Store your API key securely. Treat it like a password. If you lose it, you’ll need to create a new one.
Managing API Keys
From the API Keys settings page, you can:- View all keys for your team, including who created them and when they were last used
- Delete keys that are no longer needed or may have been compromised
Key Security
- Keys are hashed before storage — Duvo cannot retrieve your full key
- Keys can be revoked at any time by deleting them
- The
last_used_attimestamp helps you identify unused keys - Optional expiration can be set when creating keys programmatically
Endpoints
For Agent and Revision CRUD endpoints, see Creating Agents via API.
Runs
Start a Run
API: POST /teams/{teamId}/runs — see the API Reference for full details.
Get Run Status
API: GET /runs/{run_id} — see the API Reference for full details.
Get Run Messages
API: GET /runs/{run_id}/messages — see the API Reference for full details.
Post a Message to a Run
API: POST /runs/{run_id}/messages — see the API Reference for full details.
Respond to Human Request
API: POST /runs/{run_id}/human-requests/{request_id}/respond — see the API Reference for full details.
Stop a Run
API: POST /runs/{run_id}/stop — see the API Reference for full details.
Sandboxes
Create a Sandbox
API: POST /sandboxes — see the API Reference for full details.
Get Upload URLs for a Sandbox
API: POST /sandboxes/{sandbox_id}/upload-urls — see the API Reference for full details.
Get Files in a Sandbox
API: GET /sandboxes/{sandbox_id}/files — see the API Reference for full details.
Upload Files to a Sandbox
API: POST /sandboxes/{sandbox_id}/files — see the API Reference for full details.
Error Handling
All errors follow a consistent format:| Code | Description |
|---|---|
| 400 | Bad Request — Invalid parameters |
| 401 | Unauthorized — Missing or invalid API key |
| 403 | Forbidden — API key doesn’t have access to this resource |
| 404 | Not Found — Resource doesn’t exist |
| 413 | Payload Too Large — File exceeds size limit |
| 429 | Too Many Requests — Rate limit exceeded |
| 500 | Internal Server Error — Something went wrong on our end |
| 502 | Bad Gateway — Upstream service unavailable |
Webhooks
Human-in-the-Loop Webhook
When you provide ahuman_request_webhook_url when starting a run, Duvo will POST to that URL whenever the Agent needs human input.
Webhook Payload