Skip to main content
The Duvo Developer Platform API lets you drive Duvo from your own code, scripts, and pipelines. Use it to automate core team workflows and integrate Duvo with the systems your team already runs on. With the API, you can:
  • Start Jobs
  • Manage Assignments
  • Review Cases
  • Move Files in and out of Duvo
  • Manage Connections

Authentication

The API authenticates requests with an API key.
  1. Generate a key in the Duvo dashboard at Team Settings → API Keys.
  2. Send the key as a bearer token on every request:
    Authorization: Bearer <your-api-key>
    
API keys are scoped to a single team and inherit the permissions of the user who generated them.

Base URL and versioning

The current version of the API is v2. All endpoints are served under:
https://api.duvo.ai/v2
The paths in the tables below are shown relative to that prefix. Team-scoped endpoints include your team ID in the path (/teams/{teamId}/...); list the teams your key can act on with GET /teams. Endpoints exposed as MCP tools are listed in Available MCP Tools.
v1 is deprecated and will be sunset on 15 June 2026 — new integrations should target /v2.

Endpoints

Assignments

MethodPathDescription
GET/teams/{teamId}/agentsList Assignments for your team
POST/teams/{teamId}/agentsCreate a new Assignment
GET/agents/{agent_id}Get an Assignment by ID
PATCH/agents/{agent_id}Update an Assignment
DELETE/agents/{agent_id}Delete an Assignment
GET/teams/{teamId}/agent-foldersList Assignment folders
POST/teams/{teamId}/agent-foldersCreate a folder
PATCH/agent-folders/{folder_id}Rename or move a folder
DELETE/agent-folders/{folder_id}Delete a folder
POST/teams/{teamId}/agent-folders/move-agentsMove Assignments into a folder

Setups

MethodPathDescription
GET/agents/{agent_id}/revisionsList Setups for an Assignment
POST/agents/{agent_id}/revisionsCreate a new Setup
GET/agents/{agent_id}/revisions/{build_id}Get a Setup by ID
PATCH/revisions/{build_id}Update a Setup
POST/revisions/{build_id}/promotePromote a Setup to live

Jobs

MethodPathDescription
GET/teams/{teamId}/runsList Jobs for your team
POST/teams/{teamId}/runsStart a new Job
GET/runs/{run_id}Get a Job’s status
GET/runs/{run_id}/messagesList messages from a Job
POST/runs/{run_id}/messagesSend a message to an active Job
POST/runs/{run_id}/human-requests/{request_id}/respondRespond to a human-in-the-loop request
POST/runs/{run_id}/stopStop an active Job

Files

MethodPathDescription
GET/teams/{teamId}/filesList Files for your team
POST/teams/{teamId}/files/create-upload-urlGenerate a signed upload URL
GET/teams/{teamId}/files/content/{path}Get a file’s text content
PUT/teams/{teamId}/files/content/{path}Update a file’s text content
GET/teams/{teamId}/files/download-url/{path}Generate a signed download URL
PATCH/teams/{teamId}/filesRename a file
DELETE/teams/{teamId}/files/{path}Delete a file

Cases and Queues

MethodPathDescription
GET/teams/{teamId}/queuesList case queues
POST/teams/{teamId}/queuesCreate a queue
GET/queues/{queue_id}Get a queue
PATCH/queues/{queue_id}Update a queue
DELETE/queues/{queue_id}Delete a queue
GET/queues/{queue_id}/agentsList Assignments bound to a queue
GET/queues/{queue_id}/casesList cases in a queue
POST/queues/{queue_id}/cases/searchSearch cases
POST/queues/{queue_id}/casesCreate cases
DELETE/queues/{queue_id}/casesDelete every case in a queue (destructive)
POST/queues/{queue_id}/cases/bulk-retryRetry failed cases
POST/queues/{queue_id}/cases/bulk-delegateDelegate cases to an Assignment
POST/queues/{queue_id}/cases/bulk-update-statusUpdate the status of multiple cases
POST/queues/{queue_id}/cases/bulk-deleteDelete a batch of cases
GET/cases/{case_id}Get a case
DELETE/cases/{case_id}Delete a case
GET/cases/{case_id}/runsList Jobs for a case
GET/cases/{case_id}/runs/{run_id}/recent-messagesGet recent messages from a case Job

Case Labels

MethodPathDescription
GET/queues/{queue_id}/labelsList labels in a queue
POST/queues/{queue_id}/labelsCreate a label
PATCH/queues/{queue_id}/labels/{label_id}Update a label
DELETE/queues/{queue_id}/labels/{label_id}Delete a label
GET/queues/{queue_id}/cases/{case_id}/labelsList labels on a case
POST/queues/{queue_id}/cases/{case_id}/labelsAssign labels to a case
POST/queues/{queue_id}/cases/{case_id}/labels/unlinkRemove labels from a case

Case Triggers

MethodPathDescription
GET/agents/{agent_id}/case-triggersList case triggers
POST/agents/{agent_id}/case-triggersCreate a case trigger
GET/agents/{agent_id}/case-triggers/{trigger_id}Get a case trigger
PATCH/agents/{agent_id}/case-triggers/{trigger_id}Update a case trigger
DELETE/agents/{agent_id}/case-triggers/{trigger_id}Delete a case trigger
GET/agents/{agent_id}/case-triggers/conflict-previewPreview trigger conflicts

Connections

MethodPathDescription
GET/teams/{teamId}/integrationsList available connection types
POST/teams/{teamId}/integrations/customRegister a custom MCP server
DELETE/integrations/custom/{custom_integration_id}Remove a custom MCP server
GET/teams/{teamId}/connectionsList authorized Connections
POST/teams/{teamId}/connectionsCreate a Connection
GET/connections/{connection_id}Get a Connection
PATCH/connections/{connection_id}Update a Connection
DELETE/connections/{connection_id}Remove a Connection
GET/connections/{connection_id}/credentialsGet the header keys configured for a Connection
POST/teams/{teamId}/connections/mcp/probeTest connectivity to an MCP server URL
POST/teams/{teamId}/connections/composio/startStart a Composio OAuth flow
POST/teams/{teamId}/connections/composio/finalizeFinalize a Composio Connection after OAuth
POST/teams/{teamId}/connections/oauth/native/{provider}/startStart a native OAuth flow (Gmail, Google Sheets, Outlook, etc.)
POST/teams/{teamId}/connections/oauth/mcp/startStart an OAuth flow for a remote MCP server
POST/connections/oauth/mcp/checkCheck whether an MCP server supports OAuth Dynamic Client Registration

Skills

MethodPathDescription
GET/teams/{teamId}/skillsList Skills for your team
GET/skills/systemList system-wide Skills
POST/teams/{teamId}/skillsCreate or update a Skill from JSON
POST/teams/{teamId}/skills/uploadCreate or update a Skill by uploading a SKILL.md file or ZIP archive
GET/skills/{skill_id}/filesList files in a Skill
GET/skills/{skill_id}/files/{path}Get a Skill file’s content
PUT/skills/{skill_id}/files/{path}Update a Skill file
GET/skills/{skill_id}/downloadDownload a Skill archive
DELETE/skills/{skill_id}Delete a Skill
GET/skills/{skill_id}/assignmentsList Assignments using a Skill

Secrets and Logins

MethodPathDescription
GET/teams/{teamId}/credentialsList stored secrets
POST/teams/{teamId}/credentialsCreate a secret
GET/credentials/{id}Get a secret
PATCH/credentials/{id}Update a secret
DELETE/credentials/{id}Delete a secret
GET/teams/{teamId}/browser-agent/credentials/{userId}List stored Logins
POST/teams/{teamId}/browser-agent/credentials/{userId}Create a Login
GET/teams/{teamId}/browser-agent/credentials/{userId}/{id}Get a Login
PATCH/teams/{teamId}/browser-agent/credentials/{userId}/{id}Update a Login
DELETE/teams/{teamId}/browser-agent/credentials/{userId}/{id}Delete a Login

Schedules

MethodPathDescription
GET/agents/{agent_id}/schedulesList schedules configured for an Assignment
POST/agents/{agent_id}/schedulesCreate a schedule for an Assignment
PATCH/agents/{agent_id}/schedules/{schedule_id}Update a schedule
DELETE/agents/{agent_id}/schedules/{schedule_id}Delete a schedule

Memory

MethodPathDescription
GET/agents/{agent_id}/memory/filesList an Assignment’s memory files
GET/agents/{agent_id}/memory/files/{path}Get a single memory file’s content

Sandboxes

MethodPathDescription
POST/sandboxesCreate a new sandbox environment
POST/sandboxes/{sandbox_id}/upload-urlsGenerate a signed URL to upload files into a sandbox
GET/sandboxes/{sandbox_id}/filesList files in a sandbox directory
POST/sandboxes/{sandbox_id}/filesUpload a file directly to a sandbox

Setup Configuration

These endpoints attach Connections, Logins, and Secrets to a specific Setup (revision).
MethodPathDescription
GET/agents/{agent_id}/revisions/{build_id}/integrationsList Connections attached to a Setup
POST/agents/{agent_id}/revisions/{build_id}/integrationsAttach one or more Connections to a Setup
DELETE/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}Remove a Connection from a Setup
GET/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}/connectionsList Connection instances for a Connection slot
POST/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}/connectionsPin a specific Connection to a Connection slot
DELETE/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}/connections/{connection_id}Unpin a Connection from a Connection slot
GET/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}/queuesList queues for a Connection slot
PUT/agents/{agent_id}/revisions/{build_id}/integrations/{integration_id}/queuesReplace the queues for a Connection slot
GET/agents/{agentId}/revisions/{buildId}/loginsList Logins attached to a Setup
POST/agents/{agentId}/revisions/{buildId}/loginsAttach a Login to a Setup
DELETE/agents/{agentId}/revisions/{buildId}/logins/{exposedCredentialId}Remove a Login from a Setup
GET/agents/{agentId}/revisions/{buildId}/credentialsList Secrets attached to a Setup
POST/agents/{agentId}/revisions/{buildId}/credentialsAttach a Secret to a Setup
DELETE/agents/{agentId}/revisions/{buildId}/credentials/{credentialId}Remove a Secret from a Setup

Plugins

MethodPathDescription
GET/plugins/catalogList built-in plugins that can be referenced in a Setup

Team

MethodPathDescription
GET/teamsList teams your API key can act on
GET/teams/{teamId}Get your team’s details
GET/teams/{teamId}/membersList team members
GET/profileGet your user profile

Process Intelligence

MethodPathDescription
GET/teams/{teamId}/clarity-v2/processesList process captures for your team
GET/clarity-v2/processes/{process_id}Get a process capture by ID
POST/clarity-v2/processes/{process_id}/current-processGenerate the current process analysis from captures
GET/clarity-v2/processes/{process_id}/current-process/{current_process_id}Get a current process snapshot
DELETE/clarity-v2/processes/{process_id}/current-process/{current_process_id}Archive a current process snapshot
POST/clarity-v2/processes/{process_id}/current-process/{current_process_id}/promotePromote a current process snapshot to live
POST/clarity-v2/processes/{process_id}/transformation-proposalGenerate an automation proposal for a process
POST/clarity-v2/processes/{process_id}/transformation-proposal/stopStop a running transformation proposal generation
GET/clarity-v2/processes/{process_id}/transformation-proposal/{transformation_proposal_id}Get a transformation proposal snapshot
DELETE/clarity-v2/processes/{process_id}/transformation-proposal/{transformation_proposal_id}Archive a transformation proposal snapshot
POST/clarity-v2/processes/{process_id}/transformation-proposal/{transformation_proposal_id}/promotePromote a transformation proposal snapshot to live
POST/clarity-v2/processes/{process_id}/automationBuild an Assignment from a transformation proposal
POST/clarity-v2/processes/{process_id}/postprocessRe-run postprocessing on an existing snapshot
POST/clarity-v2/processes/{process_id}/invite-linkCreate or regenerate an interview invite link
POST/clarity-v2/processes/{process_id}/artifact-imports/create-upload-urlCreate a signed upload URL for an artifact import
POST/clarity-v2/processes/{process_id}/artifact-imports/{capture_id}/completeComplete an artifact import
POST/clarity-v2/processes/{process_id}/artifact-chat/messagesSend an artifact-chat message and start a turn
PUT/clarity-v2/processes/{process_id}/artifact-chat/messages/{message_id}Accept or decline an artifact-chat patch proposal
GET/clarity-v2/processes/{process_id}/transformation-proposals/{transformation_proposal_id}/extra-capture-requestsList pending extra capture requests for a process
PATCH/clarity-v2/processes/{process_id}/transformation-proposals/{transformation_proposal_id}/extra-capture-requests/{request_id}/assignAssign an extra capture request