Server definition
- Hash
- sha256:cefa4e558d52f5709bed604af08096069c3792d20127abb19b1f247c938dda42
- What it is
- What a remote MCP server returned when asked what it offers: 390 tools
The blob, as servednamed by its sha256
{
"instructions": "Duvo terminology — UI labels and API/tool names refer to the same concepts:\n- \"Agent\" (UI) = \"agent\" / agent_id (a configured AI worker).\n- \"Run\" (UI) = \"run\" / agent_run_id (a single execution of an Agent).\n- \"Connections\" (UI) = \"integrations\".\n- \"Files\" (UI) = \"knowledge base\".\n- \"AOP\" (UI) = an Agent's instructions.\n- \"Start Work\" (UI) = creating a run.\nTool names and parameters use the API terms; user-facing language uses the UI terms.\n\nTeam context — most tools act on a single team and take a `team_id`:\n- Pass `team_id` explicitly. A user can belong to several teams and can have\n more than one open at once, so the right team is the one this request is\n about — not whichever one happened to be used last.\n- Take it from what the user asked for, or from the context you were invoked\n in. Act on another team only when the request points there; do not survey\n the user's teams and act on them speculatively.\n- Use `listMyTeams` to look up an id once you know which team you need.\n- Name the team your answer covers, so the user can see which one it came\n from.\n\nDuvo skills — guidance for the recurring jobs on this API ships with this\nserver as MCP resources under `duvo://skills/` (bundled; nothing to\nfetch or set up). Before authoring or editing an Agent's AOP, debugging a\nfailed Run, improving an Agent or a Queue, or diagnosing a Connection, read\nthe matching skill with resources/read and follow it. Each skill's entry\npoint is `duvo://skills/<skill>/SKILL.md`; the reference files it\ncites sit beside it under `references/`, and resources/list shows them all.\nThe skills also say which capabilities exist at run time versus\nmanagement-only.\n- aop-writer (duvo://skills/aop-writer/SKILL.md) — Draft, rewrite, or critique a Duvo Agent AOP.\n- code-step-author (duvo://skills/code-step-author/SKILL.md) — Answer questions about writing the Python program of a Duvo code step and the `duvo` SDK it calls.\n- connection-doctor (duvo://skills/connection-doctor/SKILL.md) — Diagnose and health-check the Connections and credentials a Duvo Agent relies on.\n- improve-agent (duvo://skills/improve-agent/SKILL.md) — Run the guided, end-to-end loop that makes one Duvo Agent better.\n- improve-queue (duvo://skills/improve-queue/SKILL.md) — Run the guided, end-to-end loop that makes one Duvo Queue — and the producer→consumer workflow around it — better.\n- run-debugger (duvo://skills/run-debugger/SKILL.md) — Investigate why a Duvo Run failed or produced the wrong outcome.\n- workflow-debugger (duvo://skills/workflow-debugger/SKILL.md) — Audit a Duvo Agent — or a multi-Agent workflow connected by a Queue — across many Runs to find systemic inefficiencies and quality issues, then recommend concrete AOP and architecture changes.",
"tools": [
{
"description": "Accept a pending Process Landscape capture suggestion and create the durable capture request (manager+).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"suggestionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"nodeId",
"suggestionId"
],
"type": "object"
},
"name": "acceptClarityCaptureSuggestion",
"outputSchema": null
},
{
"description": "Accept a proposed area folder into the active process landscape, so it stops being a proposal and becomes part of the real structure (organization admin+). Only area folders can be accepted; a proposed process becomes real through assignClarityLandscapeNodeTeam instead. Re-accepting an already-active area is a no-op.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"description": "The proposed area folder to accept.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "acceptClarityLandscapeNode",
"outputSchema": null
},
{
"description": "Accept a clarity interview invite link and gain process access.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"token": {
"type": "string"
}
},
"required": [
"token"
],
"type": "object"
},
"name": "acceptClarityProcessJoin",
"outputSchema": null
},
{
"description": "Accept a pending Process Landscape team-assignment suggestion and durably assign the suggested team (manager+).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"suggestionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"nodeId",
"suggestionId"
],
"type": "object"
},
"name": "acceptClarityTeamAssignmentSuggestion",
"outputSchema": null
},
{
"description": "Accept the reviewed generated configuration and complete the builder run. The saved draft is not activated.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"build_id": {
"description": "The revision identifier.",
"format": "uuid",
"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})$",
"type": "string"
},
"builder_run_id": {
"description": "The builder run returned by generation or status, belonging to this revision.",
"format": "uuid",
"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})$",
"type": "string"
},
"expected_started_at": {
"anyOf": [
{
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Copy started_at from the status being reviewed. Each prompt has its own builder run ID; stale review identities return 409."
}
},
"required": [
"build_id",
"builder_run_id",
"expected_started_at"
],
"type": "object"
},
"name": "acceptRevisionGeneration",
"outputSchema": null
},
{
"description": "Activate a revision — promote a draft to live, or roll back to a historic one. Reconciles build/queue/trigger state to the new active revision and, when requested, re-pins the automation's pending unclaimed cases onto it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"description": {
"anyOf": [
{
"maxLength": 2000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Revision description recorded on activation (null clears; omit to keep current)"
},
"name": {
"description": "Revision name recorded on activation (omit to keep the current one)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"repin_pending_cases": {
"description": "Re-pin the automation's pending, unclaimed cases onto the newly activated revision",
"type": "boolean"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id"
],
"type": "object"
},
"name": "activateAutomationRevision",
"outputSchema": null
},
{
"description": "Add an agent to an automation on a team that is on the Automations workspace, with or without revisions — membership is not versioned. The agent must not already belong to another automation; on a team that changes its automations by revision it cannot be moved between them at all, because the revisions binding it are immutable. Adding an agent that is already a member succeeds unchanged.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"agent_id"
],
"type": "object"
},
"name": "addAutomationAgent",
"outputSchema": null
},
{
"description": "Add a queue to an automation on a team that is on the Automations workspace, with or without revisions — membership is not versioned. The queue must not already belong to another automation; on a team that changes its automations by revision it cannot be moved between them at all, because the revisions binding it are immutable. Adding a queue that is already a member succeeds unchanged.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"case_queue_id"
],
"type": "object"
},
"name": "addAutomationQueue",
"outputSchema": null
},
{
"description": "Add a person involved in the process behind a process landscape node. Name only records a placeholder; supplying an email also gives that person access to the process and emails them an invitation, so only pass an email the user asked you to invite.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"email": {
"anyOf": [
{
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"nodeId": {
"description": "A process landscape node that is linked to a real process.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
},
"teamRole": {
"anyOf": [
{
"enum": [
"team:owner",
"team:superadmin",
"team:admin",
"team:manager",
"team:builder",
"team:member",
"team:clarity-member"
],
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "addClarityLandscapeNodePerson",
"outputSchema": null
},
{
"description": "Add a Policy question to this automation. Its key is `custom_` plus the label in snake_case, with `_2`, `_3` and so on appended when the key is taken, and it is placed at the end of its section. A module template reinstall never changes a field added here.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "The automation's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"bindings": {
"default": [
"context"
],
"description": "How the value reaches the automation (context, tool)",
"items": {
"enum": [
"context",
"tool"
],
"type": "string"
},
"minItems": 1,
"type": "array"
},
"columns": {
"description": "Required for table, refused otherwise",
"items": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"fill_mode": {
"default": "interview",
"description": "How the field is filled (interview, setup)",
"enum": [
"interview",
"setup"
],
"type": "string"
},
"label": {
"description": "Short name for the field, shown as its row heading",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"options": {
"description": "Required for select and multiSelect, refused otherwise",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"question": {
"description": "The setup question asked for this field",
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
"required": {
"default": false,
"description": "Whether the field must be filled",
"type": "boolean"
},
"section": {
"anyOf": [
{
"description": "Section the field is grouped under",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Section to add the field to, or null for none"
},
"type": {
"description": "Value type; compound and sourcePointer are template-only",
"enum": [
"freeText",
"identifier",
"number",
"select",
"multiSelect",
"list",
"orderedList",
"personList",
"table"
],
"type": "string"
}
},
"required": [
"automation_id",
"label",
"question",
"type"
],
"type": "object"
},
"name": "addConfigField",
"outputSchema": null
},
{
"description": "Answer a pending question the Duvo Pulse agent asked and resume the paused run (creator or team editors). Use the toolCallId from the dashboard's message transcript.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"answers": {
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"toolCallId": {
"minLength": 1,
"type": "string"
}
},
"required": [
"artifactId",
"toolCallId",
"answers"
],
"type": "object"
},
"name": "answerPulseDashboardQuestion",
"outputSchema": null
},
{
"description": "Assign one or more labels to a case. Creates the labels on the queue if they don't already exist.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"labels": {
"items": {
"properties": {
"key": {
"default": "",
"type": "string"
},
"value": {
"minLength": 1,
"type": "string"
}
},
"required": [
"value"
],
"type": "object"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id",
"labels"
],
"type": "object"
},
"name": "assignCaseLabels",
"outputSchema": null
},
{
"description": "Assign (or unassign, with `user_id: null`) a team member to fulfil an extra-capture request. Restricted to Lead Builders and above.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"request_id": {
"description": "The extra-capture-request id",
"format": "uuid",
"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})$",
"type": "string"
},
"transformation_proposal_id": {
"description": "The automation proposal id",
"format": "uuid",
"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})$",
"type": "string"
},
"user_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Team member to assign, or null to unassign"
}
},
"required": [
"process_id",
"transformation_proposal_id",
"request_id",
"user_id"
],
"type": "object"
},
"name": "assignClarityExtraCaptureRequest",
"outputSchema": null
},
{
"description": "Assign an open Process Landscape capture request to a team member, or unassign it by sending userId: null (manager+).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"requestId": {
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"nodeId",
"requestId",
"userId"
],
"type": "object"
},
"name": "assignClarityLandscapeCaptureRequest",
"outputSchema": null
},
{
"description": "Set the owning team of a process in the process landscape (organization admin+). On a proposed process this accepts the proposal and creates the real process for that team; on an existing process it moves the process, its captures and its brief to another team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"intent": {
"description": "Pass \"accept-proposal\" when the node is expected to still be a proposed process; the call then fails if someone already accepted it, instead of silently moving a real process.",
"enum": [
"assign",
"accept-proposal"
],
"type": "string"
},
"nodeId": {
"description": "The process node whose owning team changes.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"teamId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The team that owns the process from now on. A process always belongs to a team, so null is rejected."
}
},
"required": [
"orgId",
"nodeId",
"teamId"
],
"type": "object"
},
"name": "assignClarityLandscapeNodeTeam",
"outputSchema": null
},
{
"description": "Assign process tags to a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"labelIds": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
},
"labels": {
"items": {
"properties": {
"colorHue": {
"default": 215,
"maximum": 360,
"minimum": 0,
"type": "integer"
},
"value": {
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"value"
],
"type": "object"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "assignClarityProcessLabels",
"outputSchema": null
},
{
"description": "Attach one of your connections (data sources) to a Duvo Pulse dashboard so the agent can use its tools (requires edit access).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"connection_id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"connection_id"
],
"type": "object"
},
"name": "attachPulseDashboardConnection",
"outputSchema": null
},
{
"description": "Put a queue on an existing Case schema, so both queues share one document and a later change moves them together. The queue must not already have a schema.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"family_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"family_id"
],
"type": "object"
},
"name": "attachQueueJsonSchema",
"outputSchema": null
},
{
"description": "Attach one or more integrations to an agent revision. To pin specific connections after attachment, use pinRevisionIntegrationConnection. IMPORTANT for the case-queue-producer and case-queue-consumer integrations: attaching the integration alone is NOT enough — the slot points at no queue and will fail at runtime until you link at least one queue with replaceRevisionIntegrationQueues. After wiring up, call getRevisionCaseQueueSetup to confirm every case-queue slot has linked_queue_count > 0 before starting work.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_ids": {
"description": "Integration IDs (or custom integration IDs) to attach to the revision",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"agent_id",
"build_id",
"integration_ids"
],
"type": "object"
},
"name": "attachRevisionIntegrations",
"outputSchema": null
},
{
"description": "Attach a login to a revision so the agent can use it during Runs spawned from that revision. Personal logins can only be attached by their owner; team-shared logins require builder permissions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
},
"exposedCredentialId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId",
"exposedCredentialId"
],
"type": "object"
},
"name": "attachRevisionLogin",
"outputSchema": null
},
{
"description": "Attach an env-var secret to a revision so its keys are injected into Runs spawned from that revision. Personal secrets can only be attached by their owner; team-shared secrets require builder permissions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
},
"credentialId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId",
"credentialId"
],
"type": "object"
},
"name": "attachRevisionSecret",
"outputSchema": null
},
{
"description": "Start an OAuth-based connection with a remote MCP server using Dynamic Client Registration. Returns an authorization URL the user must open in a browser; once they grant consent, Duvo creates the matching connection and redirects the browser to the optional `returnUrl`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"custom_integration_id": {
"description": "Optional ID of a custom integration this connection should be associated with.",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_type": {
"description": "Optional catalog integration type (e.g. `netsuite`, `asana`). When it names a known MCP OAuth catalog integration and `mcp_server_url` matches that integration's registered server, the connection is treated as a catalog connection; otherwise it requires the custom MCP servers capability.",
"type": "string"
},
"mcp_server_url": {
"description": "URL of the MCP server requiring OAuth.",
"format": "uri",
"type": "string"
},
"name": {
"description": "Human-readable name to display for the connection.",
"minLength": 1,
"type": "string"
},
"oauth_client_id": {
"description": "OAuth client ID of a client the user registered on the authorization server themselves (e.g. a NetSuite Integration record). Takes precedence over preregistered credentials and Dynamic Client Registration. Cannot be combined with custom_integration_id. On reconnect, omit to reuse the connection's stored credentials, or provide to replace (rotate) them.",
"minLength": 1,
"type": "string"
},
"oauth_client_secret": {
"description": "Client secret for `oauth_client_id`. Omit for public clients (PKCE-only).",
"minLength": 1,
"type": "string"
},
"reconnect_instance_id": {
"description": "When set, the OAuth flow will update the existing connection in place rather than creating a new one.",
"format": "uuid",
"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})$",
"type": "string"
},
"return_url": {
"description": "Where to send the user's browser after consent completes. Accepts an absolute URL on a domain Duvo allows, or a path relative to the Duvo frontend (e.g. `/integrations/slack`).",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"mcp_server_url",
"name"
],
"type": "object"
},
"name": "authorizeMcpOAuth",
"outputSchema": null
},
{
"description": "Add one or more people to multiple Process Landscape nodes in a bounded batch. Email entries can create invitations; each node-person outcome reports success, conflict, or delivery failure.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeIds": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"people": {
"items": {
"additionalProperties": false,
"properties": {
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"processRole": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"teamRole": {
"enum": [
"team:owner",
"team:superadmin",
"team:admin",
"team:manager",
"team:builder",
"team:member",
"team:clarity-member"
],
"type": "string"
}
},
"required": [
"name",
"email",
"processRole",
"teamRole"
],
"type": "object"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
}
},
"required": [
"orgId",
"nodeIds",
"people"
],
"type": "object"
},
"name": "batchAddClarityLandscapeNodePeople",
"outputSchema": null
},
{
"description": "Hand an automation proposal for a v2 clarity process off to the workflow-builder pipeline. Builds from `transformation_proposal_id` when supplied, otherwise from the process's live proposal. The proposal id is the durable idempotency key, so retries return the same run and a different proposal starts a new run. Returns 202 while the LLM run completes asynchronously, or 409 when the resolved proposal is still being written.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"transformation_proposal_id": {
"description": "Automation-proposal snapshot to build the automation from. Defaults to the process's live proposal.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id"
],
"type": "object"
},
"name": "buildClarityAutomation",
"outputSchema": null
},
{
"description": "Invite several people to a team in one call, emailing each invitation immediately. Returns per-batch counts: `succeeded` were invited, `skipped` were already on the team, already had a pending invitation, or were a duplicate of an earlier entry in the same batch, `failed` could not be emailed (those invitations are rolled back). The accept link is always built from the server-configured app origin.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"frontendUrl": {
"description": "Deprecated. Accepted for backward compatibility and IGNORED: the accept link is always built from the server-configured app origin, so a caller cannot point invitation emails at another host.",
"format": "uri",
"type": "string"
},
"members": {
"description": "People to invite, at most 50 per request. An email already on the team, or already holding a pending invitation, is skipped rather than failing the batch.",
"items": {
"properties": {
"email": {
"description": "Email address of the person to invite.",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"role": {
"description": "Team role to grant. One of: team:owner, team:superadmin, team:admin (deprecated), team:manager, team:builder, team:member, team:clarity-member. You cannot grant a role above your own.",
"type": "string"
}
},
"required": [
"email",
"role"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"members"
],
"type": "object"
},
"name": "bulkCreateTeamInvites",
"outputSchema": null
},
{
"description": "Re-process multiple cases on a chosen agent. 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) and not belong to a different automation than the queue.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent that should run on the selected cases. Must be a consumer of this queue and not belong to a different automation.",
"format": "uuid",
"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})$",
"type": "string"
},
"all_matching": {
"description": "When true, act on every case matching the provided filters/search instead of an explicit id list.",
"type": "boolean"
},
"case_ids": {
"description": "Explicit case IDs to act on (1-100). Provide this or set all_matching.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"filters": {
"description": "Filters selecting the cases when all_matching is true.",
"properties": {
"awaiting_my_approval": {
"type": "boolean"
},
"created_at_from": {
"type": "string"
},
"created_at_to": {
"type": "string"
},
"issue_severity": {
"items": {
"enum": [
"critical",
"medium"
],
"type": "string"
},
"type": "array"
},
"json_data": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"labels": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"priority": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"type": "array"
},
"status": {
"items": {
"enum": [
"all",
"pending",
"processing",
"needs_input",
"postponed",
"needs_review",
"resolved",
"canceled",
"claimed",
"completed",
"failed"
],
"type": "string"
},
"type": "array"
},
"updated_at_from": {
"type": "string"
},
"updated_at_to": {
"type": "string"
}
},
"type": "object"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Free-text search selecting the cases when all_matching is true.",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "bulkReprocessCases",
"outputSchema": null
},
{
"description": "Set the priority of multiple cases. Priority only affects the order pending cases are picked up in: due postponed cases are handled first, then higher priority. It never interrupts runs or changes case status. Set `none` to clear priority back to the default.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"all_matching": {
"description": "When true, act on every case matching the provided filters/search instead of an explicit id list.",
"type": "boolean"
},
"case_ids": {
"description": "Explicit case IDs to act on (1-100). Provide this or set all_matching.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"filters": {
"description": "Filters selecting the cases when all_matching is true.",
"properties": {
"awaiting_my_approval": {
"type": "boolean"
},
"created_at_from": {
"type": "string"
},
"created_at_to": {
"type": "string"
},
"issue_severity": {
"items": {
"enum": [
"critical",
"medium"
],
"type": "string"
},
"type": "array"
},
"json_data": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"labels": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"priority": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"type": "array"
},
"status": {
"items": {
"enum": [
"all",
"pending",
"processing",
"needs_input",
"postponed",
"needs_review",
"resolved",
"canceled",
"claimed",
"completed",
"failed"
],
"type": "string"
},
"type": "array"
},
"updated_at_from": {
"type": "string"
},
"updated_at_to": {
"type": "string"
}
},
"type": "object"
},
"priority": {
"description": "Target priority for each case. `medium`/`high` raise it above the default; `none` clears it.",
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Free-text search selecting the cases when all_matching is true.",
"type": "string"
}
},
"required": [
"queue_id",
"priority"
],
"type": "object"
},
"name": "bulkUpdateCasePriority",
"outputSchema": null
},
{
"description": "Update the status of multiple cases to pending, completed, failed, or canceled. Interrupts any active runs and releases their case ownership, but never cancels their human-in-the-loop state — pending requests and open approval batches stay answerable/resolvable from the run view. Settling a case archives the pending requests on every run attached to it, both the runs this call interrupted and any that were already terminal, so they leave the activity inbox instead of outliving the case there. Resetting to pending archives nothing and re-dispatches cases to the queue's trigger consumer.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"all_matching": {
"description": "When true, act on every case matching the provided filters/search instead of an explicit id list.",
"type": "boolean"
},
"case_ids": {
"description": "Explicit case IDs to act on (1-100). Provide this or set all_matching.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"filters": {
"description": "Filters selecting the cases when all_matching is true.",
"properties": {
"awaiting_my_approval": {
"type": "boolean"
},
"created_at_from": {
"type": "string"
},
"created_at_to": {
"type": "string"
},
"issue_severity": {
"items": {
"enum": [
"critical",
"medium"
],
"type": "string"
},
"type": "array"
},
"json_data": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"labels": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"priority": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"type": "array"
},
"status": {
"items": {
"enum": [
"all",
"pending",
"processing",
"needs_input",
"postponed",
"needs_review",
"resolved",
"canceled",
"claimed",
"completed",
"failed"
],
"type": "string"
},
"type": "array"
},
"updated_at_from": {
"type": "string"
},
"updated_at_to": {
"type": "string"
}
},
"type": "object"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Free-text search selecting the cases when all_matching is true.",
"type": "string"
},
"status": {
"description": "Target status for each case. `completed`, `failed`, and `canceled` are terminal — `canceled` records a deliberate human stop, distinct from a system `failed`. `pending` resets the case (the queue's trigger consumer, if any, will re-claim it). `success` is not settable: it means an evaluation passed.",
"enum": [
"pending",
"completed",
"failed",
"canceled"
],
"type": "string"
}
},
"required": [
"queue_id",
"status"
],
"type": "object"
},
"name": "bulkUpdateCaseStatus",
"outputSchema": null
},
{
"description": "Cancel a running builder run and pause its sandbox",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"builder_run_id": {
"description": "The builder run identifier.",
"format": "uuid",
"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})$",
"type": "string"
},
"status": {
"const": "cancelled",
"description": "Cancel an in-progress generation; review-pending changes must be declined instead.",
"type": "string"
}
},
"required": [
"builder_run_id",
"status"
],
"type": "object"
},
"name": "cancelBuilderRun",
"outputSchema": null
},
{
"description": "Probe an MCP server URL to discover whether it supports OAuth Dynamic Client Registration. Returns the authorization endpoint and required scopes when supported. Useful as a precursor to `/v2/teams/:team_id/connections/oauth/mcp/start` or `/v2/teams/:team_id/connections`. Performs no writes.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"mcp_server_url": {
"description": "URL of the MCP server to probe for OAuth support.",
"format": "uri",
"type": "string"
}
},
"required": [
"mcp_server_url"
],
"type": "object"
},
"name": "checkMcpOAuth",
"outputSchema": null
},
{
"description": "Complete a Miro artifact import after uploading to the signed URL. The uploaded bytes are validated before the import becomes a usable Clarity capture.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"capture_id": {
"description": "The pending capture id returned by the upload-url endpoint",
"format": "uuid",
"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})$",
"type": "string"
},
"content_type": {
"description": "MIME type of the uploaded Miro export file",
"enum": [
"image/svg+xml",
"application/xml",
"text/xml",
"image/png",
"image/jpeg"
],
"type": "string"
},
"file_name": {
"description": "Name of the Miro export file. Supported extensions: .svg, .xml, .png, .jpg, .jpeg",
"minLength": 1,
"pattern": "^.*\\.(?:[sS][vV][gG]|[xX][mM][lL]|[pP][nN][gG]|[jJ][pP][eE]?[gG])$",
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"capture_id",
"file_name",
"content_type"
],
"type": "object"
},
"name": "completeClarityArtifactImport",
"outputSchema": null
},
{
"description": "Complete a document capture after uploading to GCS via signed URL",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"captureId": {
"description": "The capture ID",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the uploaded document file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"captureId",
"fileName"
],
"type": "object"
},
"name": "completeClarityDocumentUpload",
"outputSchema": null
},
{
"description": "Complete an image capture after uploading it to GCS via a signed URL",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"captureId": {
"description": "The capture ID",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the uploaded image file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"captureId",
"fileName"
],
"type": "object"
},
"name": "completeClarityImageUpload",
"outputSchema": null
},
{
"description": "Complete an organization document capture after uploading to GCS; extracts text and stores it as a transcript so it feeds Process Landscape generation",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fileName": {
"description": "Name of the uploaded document file",
"minLength": 1,
"type": "string"
},
"interviewId": {
"description": "The organization interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"interviewId",
"fileName"
],
"type": "object"
},
"name": "completeClarityOrganizationDocumentUpload",
"outputSchema": null
},
{
"description": "Complete a team document capture after uploading to GCS; extracts text and stores it as a transcript so it feeds Process Landscape generation",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fileName": {
"description": "Name of the uploaded document file",
"minLength": 1,
"type": "string"
},
"interviewId": {
"description": "The team interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"interviewId",
"fileName"
],
"type": "object"
},
"name": "completeClarityTeamDocumentUpload",
"outputSchema": null
},
{
"description": "Complete a video capture after uploading to GCS via signed URL",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"captureId": {
"description": "The capture ID",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the uploaded video file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"captureId",
"fileName"
],
"type": "object"
},
"name": "completeClarityVideoUpload",
"outputSchema": null
},
{
"description": "Connect an authorized same-team queue to a team-created Pulse before sampling it. Idempotent. This bounds dashboard data access; it never grants Process membership or case-action authority. Requires both edit permission and ordinary team source access.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifact_id": {
"description": "Current Pulse artifact ID, supplied by the builder or viewer context.",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifact_id",
"queue_id"
],
"type": "object"
},
"name": "connectPulseDataSource",
"outputSchema": null
},
{
"description": "Apply a suggestion: stage its change into the Agent's draft revision, then auto-clear any pending suggestions it makes moot.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"create_new_draft": {
"type": "boolean"
},
"id": {
"description": "The suggestion's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"id"
],
"type": "object"
},
"name": "consumeAgentSuggestion",
"outputSchema": null
},
{
"description": "Create a new agent. Optionally include a build configuration to create the first build in the same request.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation this agent belongs to. If omitted on a team using the automations model, a new automation named after the agent is created automatically."
},
"build": {
"description": "Optional inline build. When present, a first build is created alongside the agent. Only valid for an agent step.",
"properties": {
"config": {
"description": "Build configuration (latest schema version only; legacy v1 configs are not accepted). Agent steps only — a code step's first build is created via `POST /v2/agents/{agent_id}/revisions`, which accepts a code-step config.",
"properties": {
"data": {
"description": "Agent configuration payload",
"properties": {
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Team files that should be available to the agent, each given as the relative file path returned in the `path` field of `GET /v2/teams/{teamId}/files` (for example `report.md` or `folder/doc.md`) — not the `id` field, which is a GCS object identifier."
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"properties": {
"content": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"anyOf": [
{
"properties": {
"text": {
"type": "string"
},
"type": {
"const": "input_text",
"type": "string"
}
},
"required": [
"type",
"text"
],
"type": "object"
},
{
"properties": {
"detail": {
"anyOf": [
{
"enum": [
"low",
"high",
"auto"
],
"type": "string"
},
{
"type": "null"
}
]
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"const": "input_image",
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"file_id": {
"type": "string"
},
"type": {
"const": "input_file",
"type": "string"
}
},
"required": [
"type",
"file_id"
],
"type": "object"
}
]
},
"type": "array"
}
]
},
"role": {
"enum": [
"system",
"user",
"assistant"
],
"type": "string"
},
"type": {
"anyOf": [
{
"const": "message",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"role",
"content"
],
"type": "object"
},
"type": "array"
}
],
"description": "Initial agent instructions — either a single system prompt string or a list of structured messages"
},
"models": {
"description": "Model configuration for each capability the agent uses",
"properties": {
"agent": {
"description": "Primary agent model configuration",
"properties": {
"model": {
"description": "Model identifier used for the primary agent loop (Claude, or an OSS model when the team's oss_models flag — or oss_models_public for the public subset — is enabled)",
"enum": [
"claude-haiku-4-5-20251001",
"claude-sonnet-5",
"claude-sonnet-5[1m]",
"claude-sonnet-5-5",
"claude-sonnet-5-5[1m]",
"claude-opus-5",
"claude-opus-5[1m]",
"claude-opus-5-5",
"claude-opus-5-5[1m]",
"kimi-k3",
"kimi-k3-duvo",
"glm-5.3-flash",
"deepseek-v4-flash",
"minimax-m3",
"qwen3.8-max",
"d1-max",
"duvo-1-max",
"duvo-1-max-sonnet-1m",
"duvo-1-max-sonnet-4.5",
"duvo-1-max-sonnet-4.5-1m",
"duvo-1-max-opus",
"duvo-1-max-opus-4.5",
"gpt-4.1",
"gpt-4o",
"gpt-4o-mini",
"gpt-5",
"gpt-5.1",
"claude-sonnet-4-20250514",
"claude-sonnet-4-20250514[1m]",
"claude-sonnet-4-5-20250929",
"claude-sonnet-4-5-20250929[1m]",
"claude-sonnet-4-6",
"claude-sonnet-4-6[1m]",
"claude-opus-4-1-20250805",
"claude-opus-4-5-20251101",
"claude-opus-4-6",
"claude-opus-4-6[1m]",
"claude-opus-4-7",
"claude-opus-4-7[1m]",
"claude-opus-4-8",
"claude-opus-4-8[1m]",
"glm-5.2",
"qwen3.6-27b"
],
"type": "string",
"x-extensible-enum": [
"claude-haiku-4-5-20251001",
"claude-sonnet-5",
"claude-sonnet-5[1m]",
"claude-sonnet-5-5",
"claude-sonnet-5-5[1m]",
"claude-opus-5",
"claude-opus-5[1m]",
"claude-opus-5-5",
"claude-opus-5-5[1m]",
"kimi-k3",
"kimi-k3-duvo",
"glm-5.3-flash",
"deepseek-v4-flash",
"minimax-m3",
"qwen3.8-max",
"d1-max",
"duvo-1-max",
"duvo-1-max-sonnet-1m",
"duvo-1-max-sonnet-4.5",
"duvo-1-max-sonnet-4.5-1m",
"duvo-1-max-opus",
"duvo-1-max-opus-4.5",
"gpt-4.1",
"gpt-4o",
"gpt-4o-mini",
"gpt-5",
"gpt-5.1",
"claude-sonnet-4-20250514",
"claude-sonnet-4-20250514[1m]",
"claude-sonnet-4-5-20250929",
"claude-sonnet-4-5-20250929[1m]",
"claude-sonnet-4-6",
"claude-sonnet-4-6[1m]",
"claude-opus-4-1-20250805",
"claude-opus-4-5-20251101",
"claude-opus-4-6",
"claude-opus-4-6[1m]",
"claude-opus-4-7",
"claude-opus-4-7[1m]",
"claude-opus-4-8",
"claude-opus-4-8[1m]",
"glm-5.2",
"qwen3.6-27b"
]
}
},
"required": [
"model"
],
"type": "object"
},
"browsing": {
"description": "Browsing/computer-use model configuration",
"properties": {
"model": {
"description": "Model identifier for the browsing provider",
"enum": [
"gemini-2.5-pro",
"gemini-2.5-flash",
"gemini-3-pro-preview",
"claude-haiku-4-5",
"claude-sonnet-4-5",
"claude-opus-4-1"
],
"type": "string"
},
"provider": {
"description": "Provider backing the browsing/computer-use model",
"enum": [
"google",
"anthropic"
],
"type": "string"
}
},
"required": [
"provider",
"model"
],
"type": "object"
}
},
"required": [
"agent",
"browsing"
],
"type": "object"
},
"options": {
"additionalProperties": {},
"description": "Optional runtime options controlling how the agent executes",
"properties": {
"benchmarkExpectedOutcomes": {
"description": "Expected outcomes used when running benchmark scenarios",
"items": {
"properties": {
"criteria": {
"description": "Pass/fail criteria used to evaluate the outcome",
"type": "string"
},
"description": {
"description": "Human-readable description of the expected outcome",
"type": "string"
}
},
"required": [
"description",
"criteria"
],
"type": "object"
},
"type": "array"
},
"browserProvider": {
"description": "Browser infrastructure provider",
"enum": [
"browserbase",
"browser-use"
],
"type": "string"
},
"evaluationSchemaId": {
"description": "ID of the evaluation schema to apply to runs of this agent",
"type": "string"
},
"supervisedMode": {
"description": "Run the agent under Duvo's permission classifier: every tool call is classified as allow/deny/ask, with 'ask' routed to human-in-the-loop approval. Mutually exclusive with browsing and computer-use connections.",
"type": "boolean"
}
},
"type": "object"
},
"plugins": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Plugins to load — either a built-in plugin name (e.g. \"code-review\") or a GitHub URL (e.g. \"https://github.com/owner/repo\")"
},
"skills": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "IDs of skills (team or system) that should be available to the agent"
},
"subAgents": {
"anyOf": [
{
"items": {
"format": "uuid",
"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)$",
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Retired — Sub-Assignments was removed. Accepted for backwards compatibility and ignored."
}
},
"required": [
"models",
"input"
],
"type": "object"
},
"version": {
"const": "v2",
"description": "Schema version discriminator — must be \"v2\" for the current schema",
"type": "string"
}
},
"required": [
"version",
"data"
],
"type": "object"
},
"name": {
"description": "Build name",
"minLength": 1,
"type": "string"
}
},
"required": [
"name",
"config"
],
"type": "object"
},
"name": {
"description": "Human-readable agent name",
"minLength": 1,
"type": "string"
},
"source_build_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Build ID whose case-queue-consumer setup should be copied to the new agent. When `automation_id` is omitted, the new agent also joins the automation of the agent this build belongs to."
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"thread_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Existing thread ID to associate with the agent"
},
"type": {
"default": "agent",
"description": "Flavour of the step to create. Fixed at creation — it selects the config family every build of this step must use, and the two cannot be mixed.",
"enum": [
"agent",
"code"
],
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createAgent",
"outputSchema": null
},
{
"description": "Create a case trigger for an agent. An agent may have at most one case trigger; this returns 409 if one already exists.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue whose new cases should trigger this agent",
"format": "uuid",
"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})$",
"type": "string"
},
"concurrency": {
"anyOf": [
{
"const": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Concurrency cap for the target queue. The cap is queue-wide, so this affects every Agent working the queue, not just this trigger. Only 1 (run cases one at a time) or null (reset the whole queue's cap to the platform default) can be set here; higher caps are configured per-queue via PATCH /v2/admin/case-queues/{queueId}/concurrency. Omit to leave the queue's current cap unchanged."
},
"enabled": {
"description": "Whether the trigger is active. Disabled triggers do not dispatch runs.",
"type": "boolean"
}
},
"required": [
"agent_id",
"case_queue_id",
"enabled"
],
"type": "object"
},
"name": "createAgentCaseTrigger",
"outputSchema": null
},
{
"description": "Create a new agent folder.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"description": "Human-readable folder name",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"parent_folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Parent folder ID for nested folders. Omit or null to create at the root level."
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createAgentFolder",
"outputSchema": null
},
{
"description": "Create a Slack channel trigger on an agent (Agent in the Duvo UI): the agent starts a Run whenever a matching message is posted in the channel. An agent can carry one trigger per channel, so call this once per channel. The Slack workspace must be installed for the team AND bound to the agent's live build first (see the Slack bound-workspaces endpoint) — otherwise this returns 400.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"channel_id": {
"description": "Slack channel ID to watch, e.g. `C0123ABCD`.",
"minLength": 1,
"type": "string"
},
"channel_name": {
"description": "Slack channel name shown in Duvo, without the leading `#`, e.g. `support-inbox`.",
"minLength": 1,
"type": "string"
},
"integration_instance_id": {
"description": "Specific bound Slack connection to run the trigger off. Omit to use your own connection, or pass one returned by the bound-workspaces endpoint.",
"format": "uuid",
"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})$",
"type": "string"
},
"is_private": {
"description": "Whether the channel is private. Defaults to false. Private channels require the Duvo Slack app to be invited to the channel.",
"type": "boolean"
},
"match_rule": {
"description": "Which channel messages fire the trigger: `{\"kind\":\"all\"}` for every message, or `{\"kind\":\"contains\",\"values\":[\"invoice\"]}` to match keywords.",
"oneOf": [
{
"description": "Fire on every message posted in the channel.",
"properties": {
"kind": {
"const": "all",
"type": "string"
}
},
"required": [
"kind"
],
"type": "object"
},
{
"description": "Fire only on messages containing one of the keywords.",
"properties": {
"kind": {
"const": "contains",
"type": "string"
},
"values": {
"description": "Case-insensitive keywords; a message fires the trigger when it contains any of them. Duplicates are deduplicated.",
"items": {
"maxLength": 500,
"minLength": 1,
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"kind",
"values"
],
"type": "object"
}
]
},
"slack_team_id": {
"description": "Slack workspace (team) ID the channel belongs to, e.g. `T0123ABCD`. Defaults to the team's default installed workspace. Discover the workspaces an agent can use with the bound-workspaces endpoint.",
"minLength": 1,
"type": "string"
},
"trigger_type": {
"const": "slack_channel_message",
"description": "Trigger type. Only `slack_channel_message` (a message posted in a Slack channel) is supported here.",
"type": "string"
}
},
"required": [
"agent_id",
"trigger_type",
"channel_id",
"channel_name",
"match_rule"
],
"type": "object"
},
"name": "createAgentSlackTrigger",
"outputSchema": null
},
{
"description": "Create a new automation. Its first agent is created alongside it so the caller lands on something editable. On a team on revision semantics the automation holds a single draft revision and no live revision, with the agent's default build bound into that draft, and the first activation makes the draft revision 1; on any other team the automation is a bare container and the build stands on its own.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"description": "Human-readable automation name.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createAutomation",
"outputSchema": null
},
{
"description": "Create a draft revision branched from a base revision (defaults to the active revision), copying its agent, queue, and trigger bindings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"base_revision_id": {
"description": "Revision to branch from (defaults to the active revision)",
"format": "uuid",
"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})$",
"type": "string"
},
"description": {
"description": "Optional draft description",
"maxLength": 2000,
"type": "string"
},
"name": {
"description": "Optional draft name",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "createAutomationRevision",
"outputSchema": null
},
{
"description": "Issue a signed URL for uploading a file to a case. The client must PUT the bytes to the returned URL with the returned Content-Type, then call the finalize endpoint so the attachment becomes visible on the case.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"filename": {
"maxLength": 255,
"minLength": 1,
"type": "string"
},
"mime_type": {
"maxLength": 127,
"minLength": 1,
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"size_bytes": {
"exclusiveMinimum": 0,
"maximum": 52428800,
"type": "integer"
}
},
"required": [
"queue_id",
"case_id",
"filename",
"mime_type",
"size_bytes"
],
"type": "object"
},
"name": "createCaseAttachmentUploadUrl",
"outputSchema": null
},
{
"description": "Add one case-level evaluation rubric to a queue's current rubric set. Case-level rubrics judge the whole case (across every Run that touched it) as a Pass/Fail question at settlement. The rubric is added to the queue's current version (build-set) — the set new cases are judged against; a queue only gets one after its first Agent-processed case settles, so this fails with 409 before then, and once the version holds 12 rubrics.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"queue_id",
"title",
"description"
],
"type": "object"
},
"name": "createCaseQueueEvalRubric",
"outputSchema": null
},
{
"description": "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 takes a title (max 500 chars), optional labels that will be assigned to the case on creation (missing labels are created on the queue), and an optional priority (`none`, `medium`, or `high`; `medium`/`high` raise it above the default in the queue, `none` is the default; priority only affects the order pending cases are picked up in: due postponed cases are handled first, then higher priority). For the case payload, send free-form `data` OR a structured `json_data` object, never both, and a single request must be all free-text or all structured. `json_data` is validated against the queue's Case schema and requires the queue to have one; a schema-guarded queue accepts only `json_data`, while a queue without the guard also accepts free-text `data`. A guarded queue that has no schema yet accepts free-text `data` only when typed Case schemas are off for that queue — the team has them turned off AND the queue is not inside an automation (there is then no way to declare a schema, so the guard cannot apply). A queue inside an automation always has them on, so a guarded one refuses free-text `data` until its schema is declared.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case": {
"properties": {
"data": {
"description": "Additional data for the case. Free-form text or JSON; Agents receive this on claim.",
"type": "string"
},
"json_data": {
"additionalProperties": {},
"description": "Structured payload for a queue that has a Case schema. Validated against that schema and mutually exclusive with `data` — send this instead of free-text `data` on a schema-guarded queue. Within one request, either every case is structured or every case is free-text.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"labels": {
"description": "Optional labels to assign to the case at creation. Labels are created on the queue if they don't already exist.",
"items": {
"properties": {
"key": {
"default": "",
"description": "Label key (omit for a simple tag).",
"type": "string"
},
"value": {
"description": "Label value (required).",
"minLength": 1,
"type": "string"
}
},
"required": [
"value"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"priority": {
"description": "Case priority. `medium` or `high` raise the case above the default in the queue; omit (or `none`) for normal priority. Only set this when the AOP or the user explicitly instructs prioritization — do not infer it on your own.",
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"title": {
"description": "Short title for the case (max 500 characters). Put long context in `data`.",
"maxLength": 500,
"minLength": 1,
"type": "string"
}
},
"required": [
"title"
],
"type": "object"
},
"cases": {
"items": {
"properties": {
"data": {
"description": "Additional data for the case. Free-form text or JSON; Agents receive this on claim.",
"type": "string"
},
"json_data": {
"additionalProperties": {},
"description": "Structured payload for a queue that has a Case schema. Validated against that schema and mutually exclusive with `data` — send this instead of free-text `data` on a schema-guarded queue. Within one request, either every case is structured or every case is free-text.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"labels": {
"description": "Optional labels to assign to the case at creation. Labels are created on the queue if they don't already exist.",
"items": {
"properties": {
"key": {
"default": "",
"description": "Label key (omit for a simple tag).",
"type": "string"
},
"value": {
"description": "Label value (required).",
"minLength": 1,
"type": "string"
}
},
"required": [
"value"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
},
"priority": {
"description": "Case priority. `medium` or `high` raise the case above the default in the queue; omit (or `none`) for normal priority. Only set this when the AOP or the user explicitly instructs prioritization — do not infer it on your own.",
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"title": {
"description": "Short title for the case (max 500 characters). Put long context in `data`.",
"maxLength": 500,
"minLength": 1,
"type": "string"
}
},
"required": [
"title"
],
"type": "object"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "createCases",
"outputSchema": null
},
{
"description": "Create a signed upload URL for importing a Miro export into a Clarity v2 process. Supports SVG, XML, PNG, and JPEG exports. The caller must upload the file to the returned URL, then complete the import.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content_type": {
"description": "MIME type of the Miro export file",
"enum": [
"image/svg+xml",
"application/xml",
"text/xml",
"image/png",
"image/jpeg"
],
"type": "string"
},
"extra_capture_request_id": {
"description": "Optional extra-capture-request id to bind this import to",
"format": "uuid",
"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})$",
"type": "string"
},
"file_name": {
"description": "Name of the Miro export file. Supported extensions: .svg, .xml, .png, .jpg, .jpeg",
"minLength": 1,
"pattern": "^.*\\.(?:[sS][vV][gG]|[xX][mM][lL]|[pP][nN][gG]|[jJ][pP][eE]?[gG])$",
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"file_name",
"content_type"
],
"type": "object"
},
"name": "createClarityArtifactImportUploadUrl",
"outputSchema": null
},
{
"description": "Create a signed URL for uploading a PDF, TXT, Markdown, BPMN, XLSX, or CSV document directly to GCS",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the document",
"enum": [
"application/pdf",
"text/plain",
"text/markdown",
"application/xml",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"text/csv",
"application/vnd.ms-excel"
],
"type": "string"
},
"extraCaptureRequestId": {
"description": "Extra-capture-request id to bind this capture to",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the document file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"fileName",
"contentType"
],
"type": "object"
},
"name": "createClarityDocumentUploadUrl",
"outputSchema": null
},
{
"description": "Create a process folder",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"description": "Name of the folder to create.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createClarityFolder",
"outputSchema": null
},
{
"description": "Create a new automation guidance message for a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content": {
"description": "Automation guidance to add to the process.",
"maxLength": 5000,
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"content"
],
"type": "object"
},
"name": "createClarityGuidance",
"outputSchema": null
},
{
"description": "Create a signed URL for uploading a PNG, JPEG, WebP, or SVG image directly to GCS",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the image",
"enum": [
"image/png",
"image/jpeg",
"image/webp",
"image/svg+xml"
],
"type": "string"
},
"extraCaptureRequestId": {
"description": "Extra-capture-request id to bind this capture to",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the image file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"fileName",
"contentType"
],
"type": "object"
},
"name": "createClarityImageUploadUrl",
"outputSchema": null
},
{
"description": "Create or regenerate a process-scoped Clarity interview invite link. Only the process creator or team managers can create invite links; creating a new link invalidates any prior active link for the process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id"
],
"type": "object"
},
"name": "createClarityInviteLink",
"outputSchema": null
},
{
"description": "Create an area folder in the process tree. An active area (the default) requires organization admin+; a \"proposal\" area may be added by any organization member.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"creationMode": {
"description": "Use \"proposal\" to add an area for review instead of asserting it exists. A proposal is idempotent: an equivalent live area under the same parent is returned untouched rather than duplicated. Defaults to \"active\" — except in a landscape-onboarding chat, which may only propose, and so defaults to \"proposal\".",
"enum": [
"active",
"proposal"
],
"type": "string"
},
"description": {
"anyOf": [
{
"maxLength": 2000,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "One or two sentences saying what family of work this area groups. Persisted as the area's summary."
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"ownerLabel": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"parentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"orgId",
"name"
],
"type": "object"
},
"name": "createClarityLandscapeNode",
"outputSchema": null
},
{
"description": "Create a signed URL for uploading a PDF, TXT, Markdown, or BPMN document as an organization-level Clarity capture",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the document",
"enum": [
"application/pdf",
"text/plain",
"text/markdown",
"application/xml"
],
"type": "string"
},
"fileName": {
"description": "Name of the document file",
"minLength": 1,
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"fileName",
"contentType"
],
"type": "object"
},
"name": "createClarityOrganizationDocumentUploadUrl",
"outputSchema": null
},
{
"description": "Create a new Clarity v2 process for the current team (Builder+). Optional `name` defaults server-side when omitted. Response uses camelCase `createdAt` to match existing FE clients.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"description": "Optional process name; server default applies when omitted",
"maxLength": 255,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "createClarityProcess",
"outputSchema": null
},
{
"description": "Create process tags for an organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"colorHue": {
"default": 215,
"maximum": 360,
"minimum": 0,
"type": "integer"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"value": {
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"orgId",
"value"
],
"type": "object"
},
"name": "createClarityProcessLabel",
"outputSchema": null
},
{
"description": "Create a process-to-process link in the organization's Clarity landscape when the caller can manage both endpoint teams. If the same live source, target, and type already exists, the existing link is returned.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"confidence": {
"anyOf": [
{
"maximum": 1,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"description": "Optional confidence score from 0 to 1"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"source_node_id": {
"description": "Hierarchy node id for the source process",
"format": "uuid",
"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})$",
"type": "string"
},
"state": {
"default": "confirmed",
"description": "Whether the link is suggested by Duvo or confirmed by a user",
"enum": [
"suggested",
"confirmed"
],
"type": "string"
},
"target_node_id": {
"description": "Hierarchy node id for the target process",
"format": "uuid",
"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})$",
"type": "string"
},
"type": {
"description": "Relationship type between the source process node and target process node",
"enum": [
"hands_off_to",
"shares_step_with",
"variant_of"
],
"type": "string"
}
},
"required": [
"orgId",
"source_node_id",
"target_node_id",
"type"
],
"type": "object"
},
"name": "createClarityProcessLink",
"outputSchema": null
},
{
"description": "File an existing Clarity process into an area of the process landscape (team manager or organization admin+). Use this for a process that already exists but sits in Unsorted; use proposeClarityLandscapeProcess to create a brand-new one.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"parentId": {
"description": "The area folder the process is filed under.",
"format": "uuid",
"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})$",
"type": "string"
},
"processId": {
"description": "An existing Clarity process to file into the landscape. Unsorted processes are listed as `unlinkedProcesses` by getClarityProcessLandscape.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"processId",
"parentId"
],
"type": "object"
},
"name": "createClarityProcessNode",
"outputSchema": null
},
{
"description": "Create a signed URL for uploading a PDF, TXT, Markdown, or BPMN document as a team-level Clarity capture",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the document",
"enum": [
"application/pdf",
"text/plain",
"text/markdown",
"application/xml"
],
"type": "string"
},
"fileName": {
"description": "Name of the document file",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"fileName",
"contentType"
],
"type": "object"
},
"name": "createClarityTeamDocumentUploadUrl",
"outputSchema": null
},
{
"description": "Create a signed URL for uploading a video file directly to GCS",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the video",
"enum": [
"video/mp4",
"video/mov",
"video/webm",
"video/mpeg",
"video/mpg",
"video/avi",
"video/x-flv",
"video/wmv",
"video/3gpp"
],
"type": "string"
},
"extraCaptureRequestId": {
"description": "Extra-capture-request id to bind this capture to",
"format": "uuid",
"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})$",
"type": "string"
},
"fileName": {
"description": "Name of the video file",
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"fileName",
"contentType"
],
"type": "object"
},
"name": "createClarityVideoUploadUrl",
"outputSchema": null
},
{
"description": "Create a new user-provided connection (custom MCP server) for the current team. OAuth-based integrations (native) require an interactive browser flow — start them with the dedicated OAuth endpoints (`/v2/teams/:team_id/connections/oauth/native/:provider/start` or `/v2/teams/:team_id/connections/oauth/mcp/start`) instead of calling this endpoint directly.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"auth_method": {
"enum": [
"url",
"apikey",
"headers",
"oauth"
],
"type": "string"
},
"custom_integration_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"headers": {
"properties": {
"plaintext": {
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"secret": {
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
},
"name": {
"minLength": 1,
"type": "string"
},
"provider": {
"const": "user",
"type": "string"
},
"server_url": {
"format": "uri",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"default": "custom_mcp",
"type": "string"
}
},
"required": [
"name",
"provider",
"auth_method"
],
"type": "object"
},
"name": "createConnection",
"outputSchema": null
},
{
"description": "Create a login. At least one of `password` or `otp_secret` must be provided. Personal by default; pass `shared: true` to create a team-shared login (requires lead builder role).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"domain": {
"minLength": 1,
"type": "string"
},
"otp_secret": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"password": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"shared": {
"type": "boolean"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"format": "uuid",
"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})$",
"type": "string"
},
"username": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"userId",
"domain"
],
"type": "object"
},
"name": "createCredential",
"outputSchema": null
},
{
"description": "Create a custom integration type (team-level catalog entry) that users can then connect as user-provided MCP connections. Requires manager-or-above role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"auth_method": {
"enum": [
"url",
"apikey",
"headers",
"oauth"
],
"type": "string"
},
"name": {
"minLength": 1,
"type": "string"
},
"oauth_client_id": {
"minLength": 1,
"type": "string"
},
"oauth_client_secret": {
"minLength": 1,
"type": "string"
},
"server_url": {
"format": "uri",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name",
"auth_method",
"server_url"
],
"type": "object"
},
"name": "createCustomIntegration",
"outputSchema": null
},
{
"description": "Add one Agent-specific evaluation rubric to a build. A build may hold at most 5 custom rubrics; this fails with 409 once that ceiling is reached. Defaults to the Agent's live build; pass build_id to target a specific revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Add the rubric to this build (revision). Defaults to the agent's live build when omitted.",
"format": "uuid",
"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})$",
"type": "string"
},
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"agentId",
"title",
"description"
],
"type": "object"
},
"name": "createEvalRubric",
"outputSchema": null
},
{
"description": "Generate a signed URL for uploading a file directly to GCS.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contentType": {
"description": "MIME type of the file",
"minLength": 1,
"type": "string"
},
"fileName": {
"description": "Name of the file to upload",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"fileName",
"contentType"
],
"type": "object"
},
"name": "createFileUploadUrl",
"outputSchema": null
},
{
"description": "Create a new team under an organization you administer. Requires an organization Admin, Executive, or Owner role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"minLength": 1,
"type": "string"
},
"orgId": {
"description": "Organization ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"name"
],
"type": "object"
},
"name": "createOrgTeam",
"outputSchema": null
},
{
"description": "Create a new Duvo Pulse dashboard from a natural-language prompt (e.g. 'open cases by queue this week') and dispatch the first generation turn. Generation is asynchronous — poll GET /artifacts/{artifactId} until status is completed. The dashboard is private to you unless you set visibility to 'team', which shares it with your whole team straight away — with permission 'view' (teammates see the dashboard) or 'edit' (teammates can also iterate on it).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"connection_ids": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 10,
"type": "array"
},
"message": {
"maxLength": 15000,
"minLength": 1,
"type": "string"
},
"permission": {
"enum": [
"view",
"edit"
],
"type": "string"
},
"visibility": {
"enum": [
"private",
"team"
],
"type": "string"
}
},
"required": [
"message"
],
"type": "object"
},
"name": "createPulseDashboard",
"outputSchema": null
},
{
"description": "Issue a presigned upload URL for a file to attach to a Duvo Pulse dashboard message (e.g. an HTML dashboard to copy, or a screenshot to match). POST the file bytes to the returned upload_url as multipart form data under the field name 'file', then pass the returned attachment_id in the attachments array of POST /artifacts/{artifactId}/messages. The agent reads the file directly from its sandbox. Files live as long as the dashboard's sandbox (about 12 hours), so upload shortly before sending.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"filename": {
"description": "Name of the file being attached, without any path segments",
"maxLength": 255,
"minLength": 1,
"type": "string"
},
"mime_type": {
"description": "MIME type of the file, e.g. text/html or image/png",
"maxLength": 127,
"minLength": 1,
"type": "string"
},
"size_bytes": {
"description": "Size of the file in bytes (max 25MB)",
"maximum": 26214400,
"minimum": 0,
"type": "integer"
}
},
"required": [
"artifactId",
"filename",
"mime_type",
"size_bytes"
],
"type": "object"
},
"name": "createPulseDashboardAttachmentUploadUrl",
"outputSchema": null
},
{
"description": "Start a comment thread on a Duvo Pulse dashboard (requires view access). Pass `element` — captured from the dashboard canvas — to pin the thread to one element; omit it for a comment on the dashboard as a whole.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"body": {
"maxLength": 5000,
"minLength": 1,
"type": "string"
},
"element": {
"properties": {
"label": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"openui_node": {
"properties": {
"component": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"source": {
"maxLength": 2000,
"type": "string"
},
"statement": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"statement",
"component"
],
"type": "object"
},
"outer_html": {
"maxLength": 4000,
"minLength": 1,
"type": "string"
},
"point": {
"properties": {
"x_ratio": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"y_ratio": {
"maximum": 1,
"minimum": 0,
"type": "number"
}
},
"required": [
"x_ratio",
"y_ratio"
],
"type": "object"
},
"selector": {
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
"tag_name": {
"maxLength": 50,
"minLength": 1,
"type": "string"
},
"text": {
"maxLength": 500,
"type": "string"
}
},
"required": [
"selector",
"label",
"tag_name",
"outer_html"
],
"type": "object"
},
"revision_id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"body"
],
"type": "object"
},
"name": "createPulseDashboardComment",
"outputSchema": null
},
{
"description": "Reply to a comment thread on a Duvo Pulse dashboard (requires view access). `commentId` must be a thread root; threads are one level deep. A thread already marked complete still accepts replies and stays complete.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"body": {
"maxLength": 5000,
"minLength": 1,
"type": "string"
},
"commentId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"commentId",
"body"
],
"type": "object"
},
"name": "createPulseDashboardCommentReply",
"outputSchema": null
},
{
"description": "Create a new queue.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation this queue belongs to. Optional for teams not yet migrated to Automations; required once a team has migrated."
},
"description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional human-readable description."
},
"folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional folder to nest the queue under."
},
"name": {
"description": "Queue name. A standalone queue must be uniquely named within the team. A queue created inside an automation instead has to be uniquely named within a revision, which is checked when that revision is activated.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"name": "createQueue",
"outputSchema": null
},
{
"description": "Create an immutable aggregation definition on a queue.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"definition": {
"additionalProperties": false,
"properties": {
"caseFilters": {
"additionalProperties": false,
"properties": {
"createdAtFrom": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"createdAtTo": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"labelIds": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"priorities": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"maxItems": 3,
"minItems": 1,
"type": "array"
},
"statuses": {
"items": {
"enum": [
"pending",
"in_progress",
"needs_input",
"postponed",
"evaluating",
"success",
"issues",
"completed",
"failed",
"canceled"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
}
},
"type": "object"
},
"dimensions": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"path"
],
"type": "object"
},
"maxItems": 4,
"type": "array"
},
"filters": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"measures": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"operation": {
"enum": [
"count",
"sum",
"avg",
"min",
"max",
"count_distinct",
"p50",
"p90",
"p95",
"p99"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"operation"
],
"type": "object"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
},
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"order": {
"items": {
"additionalProperties": false,
"properties": {
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
},
"field": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
}
},
"required": [
"field",
"direction"
],
"type": "object"
},
"maxItems": 8,
"type": "array"
},
"timeDimension": {
"additionalProperties": false,
"properties": {
"granularity": {
"enum": [
"hour",
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string"
},
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"path",
"granularity"
],
"type": "object"
}
},
"required": [
"name",
"measures"
],
"type": "object"
},
"maximum_stale_age_seconds": {
"maximum": 604800,
"minimum": 1,
"type": "integer"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"definition"
],
"type": "object"
},
"name": "createQueueAggregation",
"outputSchema": null
},
{
"description": "Declare a queue's first Case schema by hand, so a person can type a queue up front instead of waiting for its producing agent to declare the shape. Fails if the queue already has a schema — replace an existing one with PUT.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"schema": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"required": [
"queue_id",
"name",
"schema"
],
"type": "object"
},
"name": "createQueueJsonSchema",
"outputSchema": null
},
{
"description": "Create a label on a queue without assigning it to a case.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"color_hue": {
"maximum": 360,
"minimum": 0,
"type": "integer"
},
"key": {
"default": "",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"value": {
"minLength": 1,
"type": "string"
}
},
"required": [
"queue_id",
"value"
],
"type": "object"
},
"name": "createQueueLabel",
"outputSchema": null
},
{
"description": "Create a new revision for an existing agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"config": {
"anyOf": [
{
"properties": {
"data": {
"description": "Agent configuration payload",
"properties": {
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Team files that should be available to the agent, each given as the relative file path returned in the `path` field of `GET /v2/teams/{teamId}/files` (for example `report.md` or `folder/doc.md`) — not the `id` field, which is a GCS object identifier."
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"properties": {
"content": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"anyOf": [
{
"properties": {
"text": {
"type": "string"
},
"type": {
"const": "input_text",
"type": "string"
}
},
"required": [
"type",
"text"
],
"type": "object"
},
{
"properties": {
"detail": {
"anyOf": [
{
"enum": [
"low",
"high",
"auto"
],
"type": "string"
},
{
"type": "null"
}
]
},
"file_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"type": {
"const": "input_image",
"type": "string"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"file_id": {
"type": "string"
},
"type": {
"const": "input_file",
"type": "string"
}
},
"required": [
"type",
"file_id"
],
"type": "object"
}
]
},
"type": "array"
}
]
},
"role": {
"enum": [
"system",
"user",
"assistant"
],
"type": "string"
},
"type": {
"anyOf": [
{
"const": "message",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"role",
"content"
],
"type": "object"
},
"type": "array"
}
],
"description": "Initial agent instructions — either a single system prompt string or a list of structured messages"
},
"models": {
"description": "Model configuration for each capability the agent uses",
"properties": {
"agent": {
"description": "Primary agent model configuration",
"properties": {
"model": {
"description": "Model identifier used for the primary agent loop (Claude, or an OSS model when the team's oss_models flag — or oss_models_public for the public subset — is enabled)",
"enum": [
"claude-haiku-4-5-20251001",
"claude-sonnet-5",
"claude-sonnet-5[1m]",
"claude-sonnet-5-5",
"claude-sonnet-5-5[1m]",
"claude-opus-5",
"claude-opus-5[1m]",
"claude-opus-5-5",
"claude-opus-5-5[1m]",
"kimi-k3",
"kimi-k3-duvo",
"glm-5.3-flash",
"deepseek-v4-flash",
"minimax-m3",
"qwen3.8-max",
"d1-max",
"duvo-1-max",
"duvo-1-max-sonnet-1m",
"duvo-1-max-sonnet-4.5",
"duvo-1-max-sonnet-4.5-1m",
"duvo-1-max-opus",
"duvo-1-max-opus-4.5",
"gpt-4.1",
"gpt-4o",
"gpt-4o-mini",
"gpt-5",
"gpt-5.1",
"claude-sonnet-4-20250514",
"claude-sonnet-4-20250514[1m]",
"claude-sonnet-4-5-20250929",
"claude-sonnet-4-5-20250929[1m]",
"claude-sonnet-4-6",
"claude-sonnet-4-6[1m]",
"claude-opus-4-1-20250805",
"claude-opus-4-5-20251101",
"claude-opus-4-6",
"claude-opus-4-6[1m]",
"claude-opus-4-7",
"claude-opus-4-7[1m]",
"claude-opus-4-8",
"claude-opus-4-8[1m]",
"glm-5.2",
"qwen3.6-27b"
],
"type": "string",
"x-extensible-enum": [
"claude-haiku-4-5-20251001",
"claude-sonnet-5",
"claude-sonnet-5[1m]",
"claude-sonnet-5-5",
"claude-sonnet-5-5[1m]",
"claude-opus-5",
"claude-opus-5[1m]",
"claude-opus-5-5",
"claude-opus-5-5[1m]",
"kimi-k3",
"kimi-k3-duvo",
"glm-5.3-flash",
"deepseek-v4-flash",
"minimax-m3",
"qwen3.8-max",
"d1-max",
"duvo-1-max",
"duvo-1-max-sonnet-1m",
"duvo-1-max-sonnet-4.5",
"duvo-1-max-sonnet-4.5-1m",
"duvo-1-max-opus",
"duvo-1-max-opus-4.5",
"gpt-4.1",
"gpt-4o",
"gpt-4o-mini",
"gpt-5",
"gpt-5.1",
"claude-sonnet-4-20250514",
"claude-sonnet-4-20250514[1m]",
"claude-sonnet-4-5-20250929",
"claude-sonnet-4-5-20250929[1m]",
"claude-sonnet-4-6",
"claude-sonnet-4-6[1m]",
"claude-opus-4-1-20250805",
"claude-opus-4-5-20251101",
"claude-opus-4-6",
"claude-opus-4-6[1m]",
"claude-opus-4-7",
"claude-opus-4-7[1m]",
"claude-opus-4-8",
"claude-opus-4-8[1m]",
"glm-5.2",
"qwen3.6-27b"
]
}
},
"required": [
"model"
],
"type": "object"
},
"browsing": {
"description": "Browsing/computer-use model configuration",
"properties": {
"model": {
"description": "Model identifier for the browsing provider",
"enum": [
"gemini-2.5-pro",
"gemini-2.5-flash",
"gemini-3-pro-preview",
"claude-haiku-4-5",
"claude-sonnet-4-5",
"claude-opus-4-1"
],
"type": "string"
},
"provider": {
"description": "Provider backing the browsing/computer-use model",
"enum": [
"google",
"anthropic"
],
"type": "string"
}
},
"required": [
"provider",
"model"
],
"type": "object"
}
},
"required": [
"agent",
"browsing"
],
"type": "object"
},
"options": {
"additionalProperties": {},
"description": "Optional runtime options controlling how the agent executes",
"properties": {
"benchmarkExpectedOutcomes": {
"description": "Expected outcomes used when running benchmark scenarios",
"items": {
"properties": {
"criteria": {
"description": "Pass/fail criteria used to evaluate the outcome",
"type": "string"
},
"description": {
"description": "Human-readable description of the expected outcome",
"type": "string"
}
},
"required": [
"description",
"criteria"
],
"type": "object"
},
"type": "array"
},
"browserProvider": {
"description": "Browser infrastructure provider",
"enum": [
"browserbase",
"browser-use"
],
"type": "string"
},
"evaluationSchemaId": {
"description": "ID of the evaluation schema to apply to runs of this agent",
"type": "string"
},
"supervisedMode": {
"description": "Run the agent under Duvo's permission classifier: every tool call is classified as allow/deny/ask, with 'ask' routed to human-in-the-loop approval. Mutually exclusive with browsing and computer-use connections.",
"type": "boolean"
}
},
"type": "object"
},
"plugins": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Plugins to load — either a built-in plugin name (e.g. \"code-review\") or a GitHub URL (e.g. \"https://github.com/owner/repo\")"
},
"skills": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "IDs of skills (team or system) that should be available to the agent"
},
"subAgents": {
"anyOf": [
{
"items": {
"format": "uuid",
"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)$",
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Retired — Sub-Assignments was removed. Accepted for backwards compatibility and ignored."
}
},
"required": [
"models",
"input"
],
"type": "object"
},
"version": {
"const": "v2",
"description": "Schema version discriminator — must be \"v2\" for the current schema",
"type": "string"
}
},
"required": [
"version",
"data"
],
"type": "object"
},
{
"properties": {
"data": {
"description": "Code step configuration payload",
"properties": {
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": [],
"description": "Team file paths this step can read at run time"
},
"handoverRequired": {
"default": false,
"description": "When the step declares handover options, whether a run that exits cleanly without requesting one fails. Ignored when the step declares no options.",
"type": "boolean"
},
"language": {
"description": "Language the step's program is written in",
"enum": [
"python"
],
"type": "string"
},
"source": {
"description": "Where the step's program comes from",
"oneOf": [
{
"properties": {
"code": {
"description": "Program held in the build config. Written to `main.py` and run with `python main.py`.",
"minLength": 1,
"type": "string"
},
"kind": {
"const": "inline",
"type": "string"
}
},
"required": [
"kind",
"code"
],
"type": "object"
},
{
"properties": {
"bundle": {
"description": "The program's files, as a content-addressed manifest",
"properties": {
"bucket": {
"description": "GCS bucket the bundle's blobs are stored in",
"minLength": 1,
"type": "string"
},
"files": {
"description": "The program's files, one manifest entry each",
"items": {
"properties": {
"path": {
"description": "Path the file is materialised at, relative to the work dir",
"minLength": 1,
"type": "string"
},
"sha256": {
"description": "Digest of the file's bytes, and the key its blob is stored at",
"maxLength": 64,
"minLength": 64,
"pattern": "^[0-9a-f]{64}$",
"type": "string"
},
"sizeBytes": {
"description": "UTF-8 byte length of the file's contents",
"maximum": 131072,
"minimum": 0,
"type": "integer"
}
},
"required": [
"path",
"sha256",
"sizeBytes"
],
"type": "object"
},
"maxItems": 200,
"type": "array"
}
},
"required": [
"bucket",
"files"
],
"type": "object"
},
"kind": {
"const": "files",
"type": "string"
},
"startCommand": {
"description": "Command run from the root of the step's file system, e.g. \"python main.py\".",
"maxLength": 2000,
"minLength": 1,
"type": "string"
}
},
"required": [
"kind",
"startCommand"
],
"type": "object"
}
]
},
"timeoutMs": {
"default": 600000,
"description": "Wall-clock budget for one execution of the step",
"exclusiveMinimum": 0,
"maximum": 3600000,
"type": "integer"
}
},
"required": [
"language",
"source"
],
"type": "object"
},
"version": {
"const": "v1",
"description": "Schema version discriminator — must be \"v1\" for the current code-step schema",
"type": "string"
}
},
"required": [
"version",
"data"
],
"type": "object"
}
],
"description": "Build configuration. An agent step takes the latest agent schema (legacy v1 agent configs are not accepted); a code step takes a code-step config. Omit it to get the step family's default first build."
},
"handover_options": {
"anyOf": [
{
"properties": {
"required": {
"description": "When true, a run that exits cleanly without requesting a handover fails",
"type": "boolean"
},
"target_agent_ids": {
"description": "Steps in the same automation this code step's program may request",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"target_agent_ids",
"required"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Code steps only. The targets the program may request, and whether it must. Null clears them; omit to inherit the source build's. Mutually exclusive with handover_to."
},
"handover_target_ids": {
"description": "Agent IDs that this agent can hand work off to",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"type": "array"
},
"handover_to": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The single agent or code step to run after this one completes (\"Handover to\"). Mutually exclusive with handover_target_ids."
},
"name": {
"description": "Build name",
"minLength": 1,
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
},
"source_build_id": {
"description": "Build ID to copy integrations and queue links from",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agent_id",
"name"
],
"type": "object"
},
"name": "createRevision",
"outputSchema": null
},
{
"description": "Create a new sandbox for file uploads. The returned sandbox_id can be passed to POST /v2/teams/:team_id/runs to stage data for a run.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "createSandbox",
"outputSchema": null
},
{
"description": "Get a presigned URL for uploading a file into a sandbox. Use for files larger than 10MB; smaller files can be uploaded directly via POST /v2/sandboxes/:sandbox_id/files.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Path where the file will be uploaded (e.g. /workspace/data.csv)",
"minLength": 1,
"type": "string"
},
"sandbox_id": {
"description": "The sandbox's unique identifier",
"minLength": 1,
"type": "string"
}
},
"required": [
"sandbox_id",
"path"
],
"type": "object"
},
"name": "createSandboxUploadUrl",
"outputSchema": null
},
{
"description": "Create a schedule for an agent. The schedule fires against the agent's live build. The authenticated user owns the schedule.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"cron": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"day": {
"anyOf": [
{
"enum": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday"
],
"type": "string"
},
{
"type": "null"
}
]
},
"day_of_month": {
"anyOf": [
{
"maximum": 31,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
]
},
"enabled": {
"type": "boolean"
},
"frequency": {
"enum": [
"every_5_minutes",
"every_15_minutes",
"hourly",
"daily",
"workday",
"weekly",
"monthly",
"custom"
],
"type": "string"
},
"recurring": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"time": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"timezone": {
"type": "string"
}
},
"required": [
"agent_id",
"enabled",
"frequency",
"timezone"
],
"type": "object"
},
"name": "createSchedule",
"outputSchema": null
},
{
"description": "Create an env-var secret. Personal by default; pass `shared: true` to create a team-shared secret (requires lead builder role).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"service_slug": {
"anyOf": [
{
"maxLength": 64,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"shared": {
"default": false,
"type": "boolean"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"values": {
"additionalProperties": {
"maxLength": 65536,
"minLength": 1,
"type": "string"
},
"propertyNames": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"type": "object"
}
},
"required": [
"name",
"values"
],
"type": "object"
},
"name": "createSecret",
"outputSchema": null
},
{
"description": "Create or update a skill from a JSON body. The server constructs SKILL.md from the provided fields and stores it. If a skill with the same name already exists in the team, it is updated.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"allowed-tools": {
"description": "Optional (experimental): space-delimited list of pre-approved tools.",
"type": "string"
},
"compatibility": {
"description": "Optional: 1-500 chars describing environment requirements.",
"maxLength": 500,
"type": "string"
},
"content": {
"description": "Markdown body of SKILL.md without YAML frontmatter. The server prepends the frontmatter from the other fields.",
"type": "string"
},
"description": {
"description": "1-1024 chars describing what the skill does and when to invoke it.",
"maxLength": 1024,
"minLength": 1,
"type": "string"
},
"license": {
"description": "Optional: license name or reference to a bundled license file.",
"type": "string"
},
"metadata": {
"additionalProperties": {},
"description": "Optional: arbitrary key-value metadata.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"name": {
"description": "Skill name. 1-64 lowercase alphanumeric chars and hyphens; no leading/trailing or consecutive hyphens.",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"name",
"description",
"content"
],
"type": "object"
},
"name": "createSkill",
"outputSchema": null
},
{
"description": "Open a draft revision of a skill, copying its files from the active revision (or from `source_revision_id`). Edit the draft with updateSkillRevisionFile and deleteSkillRevisionFile, then activate it with promoteSkillRevision — the previously active revision stays intact and can be re-activated later. A skill has at most one open draft: if one already exists this returns it with `created: false`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
},
"source_revision_id": {
"description": "Revision to fork the new draft from. Defaults to the live revision (or the skill's current files if there is no live revision yet).",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "createSkillRevision",
"outputSchema": null
},
{
"description": "Invite one person to a team. Pass `processId` to invite them to a specific Clarity process instead of the whole team (that requires the `team:clarity-member` role). Creating the invitation does NOT email anyone — call sendTeamInviteEmail with the returned id to deliver it, or use bulkCreateTeamInvites, which creates and emails in one step.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"email": {
"description": "Email address of the person to invite.",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"processId": {
"description": "Invite the person to this Clarity process rather than the whole team. Requires the team:clarity-member role.",
"format": "uuid",
"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})$",
"type": "string"
},
"process_role_id": {
"description": "Configured Process role to assign alongside the Clarity invitation. Requires processId; the role must belong to that Process.",
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"description": "Team role to grant. One of: team:owner, team:superadmin, team:admin (deprecated), team:manager, team:builder, team:member, team:clarity-member. You cannot grant a role above your own. Process invitations must use team:clarity-member.",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"email",
"role"
],
"type": "object"
},
"name": "createTeamInvite",
"outputSchema": null
},
{
"description": "Create or regenerate the team's shareable invite link — the one URL anyone can use to join the team. Regenerating invalidates the previous link, so anyone still holding the old URL can no longer join. Requires the Manager role or above.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"frontendUrl": {
"description": "Deprecated and ignored. The link is built from the server's configured frontend URL so a caller can't choose the host in a Duvo-branded email.",
"format": "uri",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "createTeamInviteLink",
"outputSchema": null
},
{
"description": "Reject a proposed process landscape node while it is still a proposal, removing it and any proposed descendants. Real processes nested underneath survive and move back to Unsorted. Only proposals can be declined — an accepted node is removed with deleteClarityLandscapeNode.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"description": "The proposed node to reject.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "declineClarityLandscapeNode",
"outputSchema": null
},
{
"description": "Discard generated changes by restoring checkpoint_config and completing the builder run. The saved draft is not activated.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"build_id": {
"description": "The revision identifier.",
"format": "uuid",
"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})$",
"type": "string"
},
"builder_run_id": {
"description": "The builder run returned by generation or status, belonging to this revision.",
"format": "uuid",
"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})$",
"type": "string"
},
"expected_started_at": {
"anyOf": [
{
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Copy started_at from the status being reviewed. Each prompt has its own builder run ID; stale review identities return 409."
}
},
"required": [
"build_id",
"builder_run_id",
"expected_started_at"
],
"type": "object"
},
"name": "declineRevisionGeneration",
"outputSchema": null
},
{
"description": "Delete an agent and cascade-clean its schedules, case triggers, builder runs, and handover targets. Any active jobs are interrupted and their sandboxes paused.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "deleteAgent",
"outputSchema": null
},
{
"description": "Delete a case trigger. Only the trigger creator or a builder/admin can delete it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"trigger_id": {
"description": "The case trigger's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"trigger_id"
],
"type": "object"
},
"name": "deleteAgentCaseTrigger",
"outputSchema": null
},
{
"description": "Delete an agent folder. If the folder contains assignments or subfolders, pass `force=true` to delete it and move the contained assignments to the root level.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folder_id": {
"description": "The folder's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"force": {
"description": "Pass 'true' to delete a folder that still contains assignments or subfolders. Any contained assignments will be moved to the root level.",
"type": "string"
}
},
"required": [
"folder_id"
],
"type": "object"
},
"name": "deleteAgentFolder",
"outputSchema": null
},
{
"description": "Permanently delete one of your own event triggers on an agent. The agent stops starting Runs for that event and the trigger's filter config is lost. To keep the trigger but stop it firing, upsert it with `enabled: false` instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"triggerId": {
"description": "The trigger to delete",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agentId",
"triggerId"
],
"type": "object"
},
"name": "deleteAgentTrigger",
"outputSchema": null
},
{
"description": "Soft-delete all notifications for the authenticated user's current team, read or unread. Returns the count of notifications that were deleted. Destructive — only call on explicit user request, never bulk-delete unprompted. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "deleteAllNotifications",
"outputSchema": null
},
{
"description": "Soft-delete an automation. Its member agents and queues stop dispatching and disappear from listings, but their underlying rows and run history are preserved (not erased) so the automation can be restored.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "deleteAutomation",
"outputSchema": null
},
{
"description": "Discard a draft revision and its bindings. Only drafts can be discarded; live and historic revisions are immutable history.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id"
],
"type": "object"
},
"name": "deleteAutomationRevision",
"outputSchema": null
},
{
"description": "Delete a case. Interrupts any associated active runs first.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"case_id"
],
"type": "object"
},
"name": "deleteCase",
"outputSchema": null
},
{
"description": "Remove a file from a case. The row is soft-deleted; deletion of the stored object is attempted best-effort.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"attachment_id": {
"description": "The attachment's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id",
"attachment_id"
],
"type": "object"
},
"name": "deleteCaseAttachment",
"outputSchema": null
},
{
"description": "Remove a single case-level evaluation rubric. Cases settled after this are no longer judged against it; already-judged cases keep their original verdicts. Removing the queue's last remaining rubric is refused with 409 — whole-case evaluation regenerates rubrics for an empty set at the next settlement, so the removal would not stay removed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"rubric_id": {
"description": "The case-level rubric's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"rubric_id"
],
"type": "object"
},
"name": "deleteCaseQueueEvalRubric",
"outputSchema": null
},
{
"description": "Soft-delete an open or running artifact-chat conversation for the current user.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"conversation_id": {
"description": "The artifact-chat conversation id",
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"description": "The Clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"conversation_id"
],
"type": "object"
},
"name": "deleteClarityArtifactChatConversation",
"outputSchema": null
},
{
"description": "Delete a capture from a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"captureId": {
"description": "The capture ID to delete",
"format": "uuid",
"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})$",
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"captureId"
],
"type": "object"
},
"name": "deleteClarityCapture",
"outputSchema": null
},
{
"description": "Delete a process folder. Contained processes fall back to Unfiled.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folderId": {
"description": "Folder to delete.",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"folderId"
],
"type": "object"
},
"name": "deleteClarityFolder",
"outputSchema": null
},
{
"description": "Soft-delete a tree node and its descendants. Organization admins may delete any subtree; team managers may delete a childless process node owned by their team. The targeted node's linked clarity process and captures are deleted, while nested processes detach to the Unsorted bag.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "deleteClarityLandscapeNode",
"outputSchema": null
},
{
"description": "Delete an organization-scoped folder interview",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The folder interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"nodeId": {
"description": "The clarity process folder node ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"description": "The organization ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId",
"interviewId"
],
"type": "object"
},
"name": "deleteClarityLandscapeNodeInterview",
"outputSchema": null
},
{
"description": "Delete an organization-level Clarity interview",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The organization interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"interviewId"
],
"type": "object"
},
"name": "deleteClarityOrganizationInterview",
"outputSchema": null
},
{
"description": "Delete a Clarity process. The creator or a team admin can delete it unless capture analysis is still in progress, or an automation still runs it — an automation holds the process's setup answers and Policy context notes, so it has to be removed first.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "deleteClarityProcess",
"outputSchema": null
},
{
"description": "Delete the active interview invite link for a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "deleteClarityProcessInviteLink",
"outputSchema": null
},
{
"description": "Delete process tags from an organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"labelId": {
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"labelId"
],
"type": "object"
},
"name": "deleteClarityProcessLabel",
"outputSchema": null
},
{
"description": "Delete a process-to-process link from the organization's Clarity landscape when the caller can manage both endpoint teams.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"process_link_id": {
"description": "Unique process-link identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"process_link_id"
],
"type": "object"
},
"name": "deleteClarityProcessLink",
"outputSchema": null
},
{
"description": "Delete a team-level Clarity interview",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The team interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"interviewId"
],
"type": "object"
},
"name": "deleteClarityTeamInterview",
"outputSchema": null
},
{
"description": "Delete a connection (disconnects the user's connection and removes any triggers bound to it).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"connection_id": {
"description": "Connection ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"connection_id"
],
"type": "object"
},
"name": "deleteConnection",
"outputSchema": null
},
{
"description": "Delete a login by id. Deleting a team-shared login requires lead builder role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"userId",
"id"
],
"type": "object"
},
"name": "deleteCredential",
"outputSchema": null
},
{
"description": "Delete a custom integration type (team-level catalog entry) and cascade-remove related connections. Requires manager-or-above role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"custom_integration_id": {
"description": "Custom integration type ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"custom_integration_id"
],
"type": "object"
},
"name": "deleteCustomIntegration",
"outputSchema": null
},
{
"description": "Remove a single Agent-specific evaluation rubric. Future Runs on the build are no longer scored against it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"rubricId": {
"description": "The custom rubric's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"agentId",
"rubricId"
],
"type": "object"
},
"name": "deleteEvalRubric",
"outputSchema": null
},
{
"description": "Delete a file from team storage.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Path of the file to delete relative to the team's storage root",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"name": "deleteFile",
"outputSchema": null
},
{
"description": "Delete a Duvo Pulse dashboard. Only the creator can delete it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "deletePulseDashboard",
"outputSchema": null
},
{
"description": "Delete a comment or reply on a Duvo Pulse dashboard. Allowed for the comment's author and for the dashboard's creator. Deleting a thread root keeps its replies, rendered under a deleted opening comment.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"commentId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"commentId"
],
"type": "object"
},
"name": "deletePulseDashboardComment",
"outputSchema": null
},
{
"description": "Delete a queue. Interrupts all associated active runs first and returns the number of deleted cases plus the IDs of runs that were stopped.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "deleteQueue",
"outputSchema": null
},
{
"description": "Soft-delete an aggregation definition.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"definition_id": {
"description": "The aggregation definition's identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"definition_id"
],
"type": "object"
},
"name": "deleteQueueAggregation",
"outputSchema": null
},
{
"description": "Delete a label from a queue. Cascade-deletes all assignments of this label on existing cases.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"label_id": {
"description": "The label's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"label_id"
],
"type": "object"
},
"name": "deleteQueueLabel",
"outputSchema": null
},
{
"description": "Soft-delete all read notifications for the authenticated user's current team. Returns the count of notifications that were deleted. Destructive — only call on explicit user request. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "deleteReadNotifications",
"outputSchema": null
},
{
"description": "Delete a schedule. Owners may delete their own schedules; team superadmins may delete any schedule on agents in the current team. A schedule that migration folded into an automation revision is refused with 409: the declaration it produced keeps firing independently of this row, so deleting it would report a stop that did not happen — remove it on the automation's revision instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"schedule_id": {
"description": "The schedule's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"schedule_id"
],
"type": "object"
},
"name": "deleteSchedule",
"outputSchema": null
},
{
"description": "Soft-delete an env-var secret. Deleting a team-shared secret requires lead builder role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "deleteSecret",
"outputSchema": null
},
{
"description": "Delete a skill for the current team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "deleteSkill",
"outputSchema": null
},
{
"description": "Delete a draft or historic skill revision and its files. The active revision can't be deleted — activate another revision first.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id"
],
"type": "object"
},
"name": "deleteSkillRevision",
"outputSchema": null
},
{
"description": "Delete a file from a skill revision. Deleting from a draft leaves the active revision untouched until the draft is promoted; deleting from the active revision changes what the skill runs immediately. SKILL.md can't be deleted. Historic revisions are read-only: create a draft from one to edit it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Relative path to the file inside the revision, e.g. scripts/helper.py.",
"minLength": 1,
"type": "string"
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id",
"path"
],
"type": "object"
},
"name": "deleteSkillRevisionFile",
"outputSchema": null
},
{
"description": "Permanently delete a Slack channel trigger you own. The agent stops starting Runs for that channel. To keep the trigger but stop it firing, update it with `enabled: false` instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"trigger_id": {
"description": "The Slack channel trigger's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"trigger_id"
],
"type": "object"
},
"name": "deleteSlackTrigger",
"outputSchema": null
},
{
"description": "Revoke a pending invitation so its link and email can no longer be used. Accepts either a team invitation (requires Superadmin or above on the invitation's team) or a Clarity process invitation (requires the process creator or a team admin). Revoking one side also revokes its linked counterpart when a process invitation created both. An invitation already accepted or declined is refused with 409, including one accepted a moment before, and process access the invitee already holds through an earlier acceptance is kept, so revoking never undoes an acceptance.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "ID of the invitation to revoke. Accepts either a team invitation or a Clarity process invitation.",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "deleteTeamInvite",
"outputSchema": null
},
{
"description": "Delete the team's shareable invite link so the URL stops working. Per-person invitations are unaffected. Requires the Manager role or above.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "deleteTeamInviteLink",
"outputSchema": null
},
{
"description": "Detach a connection (data source) from a Duvo Pulse dashboard (requires edit access).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"connectionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"connectionId"
],
"type": "object"
},
"name": "detachPulseDashboardConnection",
"outputSchema": null
},
{
"description": "Stop validating new cases on a queue. Typed cases already written keep their payload and their pinned schema version.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "detachQueueJsonSchema",
"outputSchema": null
},
{
"description": "Detach a login from a revision. Personal logins can only be detached by their owner; team-shared logins require builder permissions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
},
"exposedCredentialId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId",
"exposedCredentialId"
],
"type": "object"
},
"name": "detachRevisionLogin",
"outputSchema": null
},
{
"description": "Detach an env-var secret from a revision. Personal secrets can only be detached by their owner; team-shared secrets require builder permissions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
},
"credentialId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId",
"credentialId"
],
"type": "object"
},
"name": "detachRevisionSecret",
"outputSchema": null
},
{
"description": "Disconnect a source from a team-created dashboard. Subsequent dashboard reads and writes immediately lose access. Idempotent; does not delete the queue or cases.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifact_id": {
"description": "Current Pulse artifact ID, supplied by the builder or viewer context.",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifact_id",
"queue_id"
],
"type": "object"
},
"name": "disconnectPulseDataSource",
"outputSchema": null
},
{
"description": "Dismiss a pending Process Landscape capture suggestion without creating a capture request (manager+).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"suggestionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"nodeId",
"suggestionId"
],
"type": "object"
},
"name": "dismissClarityCaptureSuggestion",
"outputSchema": null
},
{
"description": "Dismiss a pending Process Landscape team-assignment suggestion without changing the node's owner (manager+).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"suggestionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"nodeId",
"suggestionId"
],
"type": "object"
},
"name": "dismissClarityTeamAssignmentSuggestion",
"outputSchema": null
},
{
"description": "Dismiss an important notification for the authenticated user. A row pinned to their Important section is unpinned and the card stays, because the connection is still broken; a row that is not pinned for them — one they cannot reconnect themselves — is removed from their feed instead, matching what the card's Dismiss button does. Only important notifications (currently: connection_broken) can be dismissed. Idempotent. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The notification's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "dismissNotification",
"outputSchema": null
},
{
"description": "Download a custom skill as a ZIP archive. Only custom (team-owned) skills can be downloaded.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "downloadSkill",
"outputSchema": null
},
{
"description": "Duplicate an existing agent into a new agent named \"Copy of <name>\", carrying over its configuration. Use the include_* flags in the (optional) body to control what is copied; all default on except memory. Requires the Lead Builder team role or above.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The ID of the agent to duplicate",
"format": "uuid",
"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})$",
"type": "string"
},
"include_aop": {
"description": "Copy the agent's operating procedure (AOP) and its handover targets. Defaults to true.",
"type": "boolean"
},
"include_connections": {
"description": "Copy connected accounts (Connections) and their selected tools. Defaults to true.",
"type": "boolean"
},
"include_logins_secrets": {
"description": "Copy saved Logins and Secrets. Defaults to true.",
"type": "boolean"
},
"include_memory": {
"description": "Copy what the agent has learned so far (its Memory). Defaults to false. Memory can only be copied from the Duvo app — requesting it here returns an error.",
"type": "boolean"
},
"include_plugins": {
"description": "Copy installed plugins. Defaults to true.",
"type": "boolean"
},
"include_queue": {
"description": "Copy the assigned Queue. Defaults to true.",
"type": "boolean"
},
"include_skills_files": {
"description": "Copy attached Skills and Files. Defaults to true.",
"type": "boolean"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "duplicateAgent",
"outputSchema": null
},
{
"description": "Duplicate a Clarity process with its analysis, captures, message history, and, for v2 processes, its live current map and automation proposal. Requires a team manager role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Source Clarity process id",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "duplicateClarityProcess",
"outputSchema": null
},
{
"description": "Duplicate a Duvo Pulse dashboard, producing an idle clone of the current rendered dashboard. The conversation history, shares, and connections are not copied.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "duplicatePulseDashboard",
"outputSchema": null
},
{
"description": "Evaluate an aggregation definition against the current data without persisting it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"definition": {
"additionalProperties": false,
"properties": {
"caseFilters": {
"additionalProperties": false,
"properties": {
"createdAtFrom": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"createdAtTo": {
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"labelIds": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"priorities": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"maxItems": 3,
"minItems": 1,
"type": "array"
},
"statuses": {
"items": {
"enum": [
"pending",
"in_progress",
"needs_input",
"postponed",
"evaluating",
"success",
"issues",
"completed",
"failed",
"canceled"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"type": "array"
}
},
"type": "object"
},
"dimensions": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"path"
],
"type": "object"
},
"maxItems": 4,
"type": "array"
},
"filters": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"limit": {
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"measures": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"operation": {
"enum": [
"count",
"sum",
"avg",
"min",
"max",
"count_distinct",
"p50",
"p90",
"p95",
"p99"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"operation"
],
"type": "object"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
},
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"order": {
"items": {
"additionalProperties": false,
"properties": {
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
},
"field": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
}
},
"required": [
"field",
"direction"
],
"type": "object"
},
"maxItems": 8,
"type": "array"
},
"timeDimension": {
"additionalProperties": false,
"properties": {
"granularity": {
"enum": [
"hour",
"day",
"week",
"month",
"quarter",
"year"
],
"type": "string"
},
"name": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,63}$",
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
}
},
"required": [
"name",
"path",
"granularity"
],
"type": "object"
}
},
"required": [
"name",
"measures"
],
"type": "object"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"definition"
],
"type": "object"
},
"name": "evaluateQueueAggregation",
"outputSchema": null
},
{
"description": "Export a queue's cases, respecting the same status, severity, approval, priority, label, date-range, json_data field, and free-text filters as the list view. Set awaiting_my_approval to export only the cases holding an unanswered approval row assigned to you; like the list view it resolves to the authenticated caller, so a credential with no user behind it is rejected rather than exporting an empty file. `format: \"json\"` (default) returns a re-importable JSON payload; `format: \"csv\"` returns a text/csv file with the columns id, title, status, priority, labels, created_at, updated_at, completed_at, postponed_to, data.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"filters": {
"default": {},
"properties": {
"awaiting_my_approval": {
"type": "boolean"
},
"created_at_from": {
"type": "string"
},
"created_at_to": {
"type": "string"
},
"issue_severity": {
"items": {
"enum": [
"critical",
"medium"
],
"type": "string"
},
"type": "array"
},
"json_data": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"labels": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"priority": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"type": "array"
},
"status": {
"items": {
"enum": [
"all",
"pending",
"processing",
"needs_input",
"postponed",
"needs_review",
"resolved",
"canceled",
"claimed",
"completed",
"failed"
],
"type": "string"
},
"type": "array"
},
"updated_at_from": {
"type": "string"
},
"updated_at_to": {
"type": "string"
}
},
"type": "object"
},
"format": {
"default": "json",
"enum": [
"json",
"csv"
],
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"type": "string"
},
"sort_by": {
"default": "created_at",
"enum": [
"created_at",
"updated_at",
"postponed_to"
],
"type": "string"
},
"sort_order": {
"default": "asc",
"enum": [
"asc",
"desc"
],
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "exportCases",
"outputSchema": null
},
{
"description": "Render a Duvo Pulse dashboard to a self-contained static HTML snapshot (text/html, data baked in). 404 until the first generation turn has produced HTML; 409 for an openui dashboard, whose substrate this exporter cannot render.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"theme": {
"default": "light",
"enum": [
"light",
"dark"
],
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "exportPulseDashboardHtml",
"outputSchema": null
},
{
"description": "File every unfiled process the viewer can see into its suggested folder",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "fileSuggestedClarityProcesses",
"outputSchema": null
},
{
"description": "Confirm an uploaded case attachment against storage. Answers with the attachment in its settled state — `ready` when the bytes are present, `failed` (with a reason) when the upload never completed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"attachment_id": {
"description": "The attachment's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id",
"attachment_id"
],
"type": "object"
},
"name": "finalizeCaseAttachment",
"outputSchema": null
},
{
"description": "Manually mark an in-progress organization interview as complete without requiring final media uploads",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The organization interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"interviewId"
],
"type": "object"
},
"name": "finalizeClarityOrganizationInterview",
"outputSchema": null
},
{
"description": "Generate portfolio intelligence from all completed clarity processes. Returns 202 Accepted immediately and processes in background.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "generateClarityPortfolioIntelligence",
"outputSchema": null
},
{
"description": "Start a process-landscape generation run for the organization from its eligible Clarity captures (organization executives and owners)",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "generateClarityProcessLandscape",
"outputSchema": null
},
{
"description": "Trigger a snapshot generation pipeline for a v2 clarity process, selected by kind. `current_process` runs the generateCurrentProcess pipeline (body fields are proposal-only and rejected); `transformation_proposal` runs the generate or regenerate proposal pipeline. Returns 202 immediately and finalises asynchronously via the cc-server webhook stream.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"custom_guidance": {
"description": "Automation proposals only: optional freeform guidance for this generation. Used as high-priority design guidance, not source-of-truth evidence.",
"maxLength": 2000,
"type": "string"
},
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"regenerate_from": {
"description": "Automation proposals only: id of a prior proposal snapshot to refine. When supplied, runs the regenerate pipeline using that proposal's current-process snapshot as the anchor and the extra captures collected since.",
"format": "uuid",
"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})$",
"type": "string"
},
"source_snapshot_id": {
"description": "Automation proposals only: id of the current-process snapshot to anchor the new proposal to. Defaults to the latest snapshot for the process.",
"format": "uuid",
"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})$",
"type": "string"
},
"transformation_aggressiveness": {
"default": "aggressive",
"description": "Transformation proposals only: the transformation appetite. `aggressive`, `conservative`, and `none` redesign around Duvo automation with decreasing freedom to change the process; `optimize` standardizes and streamlines the process while every step stays performed by people.",
"enum": [
"none",
"conservative",
"aggressive",
"optimize"
],
"type": "string"
}
},
"required": [
"process_id",
"kind"
],
"type": "object"
},
"name": "generateClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Generate agent instructions or code into a saved draft. Poll the returned builder run, answer questions if requested, then accept or decline the reviewed checkpoint. This never activates the revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"build_id": {
"description": "Source revision to generate or refine.",
"format": "uuid",
"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})$",
"type": "string"
},
"conversation": {
"description": "Optional voice conversation transcript",
"items": {
"properties": {
"message": {
"type": "string"
},
"source": {
"enum": [
"ai",
"user"
],
"type": "string"
}
},
"required": [
"source",
"message"
],
"type": "object"
},
"type": "array"
},
"insight_index": {
"description": "Optional insight index for context",
"minimum": 0,
"type": "number"
},
"previous_build_id": {
"description": "Previous build ID for sandbox reuse",
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"description": "Optional process ID for context",
"format": "uuid",
"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})$",
"type": "string"
},
"prompt": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
}
],
"description": "Instructions for generating or refining this agent or code step."
},
"run_id": {
"description": "Optional run ID for context",
"format": "uuid",
"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})$",
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"build_id",
"prompt"
],
"type": "object"
},
"name": "generateRevision",
"outputSchema": null
},
{
"description": "Get an agent by ID.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "getAgent",
"outputSchema": null
},
{
"description": "Retrieve a single case trigger by id.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"trigger_id": {
"description": "The case trigger's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"trigger_id"
],
"type": "object"
},
"name": "getAgentCaseTrigger",
"outputSchema": null
},
{
"description": "Get the contents of a single memory file for an agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"path": {
"description": "Relative path to the memory file, e.g. notes.md or context/customer.md",
"minLength": 1,
"type": "string"
}
},
"required": [
"agent_id",
"path"
],
"type": "object"
},
"name": "getAgentMemoryFile",
"outputSchema": null
},
{
"description": "Fetch a single suggestion. Poll this after a 202 from consume: an AOP apply in flight reports payload.apply.state (running/failed); once consumed, applied_revision_id carries the draft revision the change was staged onto.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The suggestion's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getAgentSuggestion",
"outputSchema": null
},
{
"description": "Get a single automation with its agent and queue counts, and the tab arrangement its detail view navigates by.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "getAutomation",
"outputSchema": null
},
{
"description": "Get what the automation is set up to do right now: its member agents with the builds that are live, its queues' routing, and the triggers and schedules firing for it. The revision-less counterpart of the revision detail — an automation without revisions is read here.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "getAutomationCurrent",
"outputSchema": null
},
{
"description": "Get the automation's flow graph as it stands right now: the agents and queues it currently wires together, plus the producer, consumer, and handover edges between them. The revision-less counterpart of the revision flow.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "getAutomationCurrentFlow",
"outputSchema": null
},
{
"description": "Get the automation detail view's tab arrangement, plus metadata for the Pulse dashboards pinned into it. Pinned dashboards are filtered to the ones the calling identity may see.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "getAutomationTabs",
"outputSchema": null
},
{
"description": "Get case status counts for many Queues in ONE call. Use this after listQueues whenever you need per-Queue counts — cases waiting on a human, needing review, pending, failed — instead of calling listCases or searchCases once per Queue. Results are keyed by Queue ID and include zero counts for Queues with no matching cases; Queue IDs from other teams are silently dropped. For a count on a single Queue with richer filters, listCases with count_only=true is the alternative.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"created_at_from": {
"description": "Inclusive case creation lower bound. Use an ISO 8601 timestamp or a relative duration such as 7d or 12h. Omit it for no lower bound.",
"type": "string"
},
"created_at_to": {
"description": "Exclusive case creation upper bound. Use an ISO 8601 timestamp or a relative duration such as 7d or 12h. Omit it for no upper bound.",
"type": "string"
},
"queue_ids": {
"description": "Comma-separated Queue IDs to aggregate. Include 1 to 100 IDs from the team in the URL.",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"queue_ids"
],
"type": "object"
},
"name": "getBatchQueueStats",
"outputSchema": null
},
{
"description": "Get the status of a builder run",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"builder_run_id": {
"description": "The builder run identifier.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"builder_run_id"
],
"type": "object"
},
"name": "getBuilderRun",
"outputSchema": null
},
{
"description": "Get a case by ID. Returns the case, its event history, and every case-approval batch ever created on the case (newest first).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"case_id"
],
"type": "object"
},
"name": "getCase",
"outputSchema": null
},
{
"description": "Mint a short-lived signed URL for one case attachment. `disposition=inline` serves the file for the in-app viewer; `attachment` forces a download.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"attachment_id": {
"description": "The attachment's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"disposition": {
"default": "attachment",
"enum": [
"inline",
"attachment"
],
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id",
"attachment_id"
],
"type": "object"
},
"name": "getCaseAttachmentDownloadUrl",
"outputSchema": null
},
{
"description": "List a queue's active case-level evaluation rubrics — the Pass/Fail questions a whole case is judged against at settlement. Shows the queue's current version's set (auto-generated from the connected Assignments' AOPs, plus any manually-authored rubrics).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "getCaseQueueEvalRubrics",
"outputSchema": null
},
{
"description": "Load the latest artifact-chat messages for one active conversation, returned oldest-first.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"conversation_id": {
"description": "The artifact-chat conversation id",
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"description": "The Clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"conversation_id"
],
"type": "object"
},
"name": "getClarityArtifactChatMessages",
"outputSchema": null
},
{
"description": "Get a single Clarity v2 capture including full transcript and video transcript. Use this when the process was loaded with captures=lite, or when only one capture's transcript is needed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"capture_id": {
"description": "The capture id",
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"capture_id"
],
"type": "object"
},
"name": "getClarityCapture",
"outputSchema": null
},
{
"description": "Get a Clarity export run by ID",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getClarityExport",
"outputSchema": null
},
{
"description": "List the people attached to every authorized linked process node in the organization's Process Landscape. Returns a flat list where each person carries `nodeId` and `processId`, plus their role, invite status, and capture count. Narrow it with `rootId` (one subtree), `ownerTeamId` (one owning team), and `userId` or `search` (one person) — an unfiltered organization roster is large enough to be refused by response-size caps. To find the processes where one person has not captured yet, filter to that person and read `captureCount` per row. `truncated` is true when the node subtree or any single process roster was capped.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"ownerTeamId": {
"description": "Only return rosters for processes owned by this team. 404s when the team has no readable Process Landscape",
"format": "uuid",
"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})$",
"type": "string"
},
"rootId": {
"description": "Only return rosters for nodes in the subtree under this node",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Only return rows whose person name or email contains this text, case-insensitively",
"maxLength": 200,
"type": "string"
},
"userId": {
"description": "Only return rows for this platform user, matched on the same resolved identity the roster reports (an email-only row resolves through its organization profile)",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "getClarityHierarchyPeople",
"outputSchema": null
},
{
"description": "Load a single organization Clarity interview with transcript",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The organization interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"interviewId"
],
"type": "object"
},
"name": "getClarityOrganizationInterview",
"outputSchema": null
},
{
"description": "Get portfolio intelligence for the current team",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "getClarityPortfolioIntelligence",
"outputSchema": null
},
{
"description": "Get the v2 read model for a clarity process: the process row (with operational fields like generation_error, generation_progress, generation_started_at, generation_last_activity_at, custom_prompt), its captures, and the lightweight version arrays for both snapshot tabs. The full payload of any specific snapshot is fetched lazily via the unified per-snapshot detail endpoint (`GET .../snapshots/:kind/:id`); this read model deliberately doesn't carry it so the response stays small.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"captures": {
"default": "full",
"description": "Capture payload mode. `full` (default) embeds each capture's transcript content. `lite` omits `transcript`/`videoTranscript` (returned as null) and relies on the `hasTranscript`/`hasVideoTranscript` flags; fetch content on demand via `GET .../captures/:capture_id`.",
"enum": [
"full",
"lite"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id"
],
"type": "object"
},
"name": "getClarityProcess",
"outputSchema": null
},
{
"description": "Get the active interview invite link for a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getClarityProcessInviteLink",
"outputSchema": null
},
{
"description": "Get information about a clarity interview invite link (public).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"token": {
"type": "string"
}
},
"required": [
"token"
],
"type": "object"
},
"name": "getClarityProcessJoinInfo",
"outputSchema": null
},
{
"description": "Fetch the organization's full process landscape with process summaries, team assignments, and page-level stats",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"rootId": {
"format": "uuid",
"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})$",
"type": "string"
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "getClarityProcessLandscape",
"outputSchema": null
},
{
"description": "Get the sharing status for a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Clarity process ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getClarityProcessSharing",
"outputSchema": null
},
{
"description": "Fetch the full payload for a Clarity v2 process snapshot of either kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"snapshot_id": {
"description": "Snapshot id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"kind",
"snapshot_id"
],
"type": "object"
},
"name": "getClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Fetch the organization's process tree, or the subtree under rootId. Narrow a large organization with `rootId` (one subtree) or `ownerTeamId` (one team's processes) — a whole-organization tree is large enough to be refused by response-size caps",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"ownerTeamId": {
"description": "Only return process nodes owned by this team, plus the folder nodes that carry them. 404s when the team has no readable Process Landscape",
"format": "uuid",
"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})$",
"type": "string"
},
"rootId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "getClarityProcessTree",
"outputSchema": null
},
{
"description": "Get clarity team settings for financial calculations",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "getClarityTeamSettings",
"outputSchema": null
},
{
"description": "Get one of your connections by ID.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"connection_id": {
"description": "Connection ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"connection_id"
],
"type": "object"
},
"name": "getConnection",
"outputSchema": null
},
{
"description": "Get the header keys configured for a connection. Sensitive values (api keys, tokens, passwords) are returned as empty strings — the response only reveals which credential fields are set, never their values.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"connection_id": {
"description": "Connection ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"connection_id"
],
"type": "object"
},
"name": "getConnectionCredentials",
"outputSchema": null
},
{
"description": "Get a login by id. Returns the encrypted password/otp_secret blobs — only the owner or team members can access it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"userId",
"id"
],
"type": "object"
},
"name": "getCredential",
"outputSchema": null
},
{
"description": "List the evaluation rubrics a Run is scored against: the platform default rubrics plus the Agent-specific rubrics for a build. Defaults to the Agent's live build; pass build_id to target the revision a specific Run ran against.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Return rubrics for this specific build (the revision a Run ran against). Defaults to the agent's live build when omitted.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agentId"
],
"type": "object"
},
"name": "getEvalRubrics",
"outputSchema": null
},
{
"description": "Aggregate evaluation counts and flag distribution for an Assignment's Jobs since the given timestamp.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"description": "Target a specific Assignment revision instead of the live revision. Only honoured when scope='custom' — non-custom scopes aggregate across all revisions. Defaults to the live revision when omitted.",
"format": "uuid",
"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})$",
"type": "string"
},
"scope": {
"description": "When 'custom', only counts Jobs scored against the target revision's custom rubrics, and only `custom__*` rubric flags. Defaults to 'all' (platform + custom rubrics).",
"enum": [
"all",
"custom"
],
"type": "string"
},
"since": {
"description": "ISO 8601 timestamp; only Jobs evaluated after this are counted",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
}
},
"required": [
"agentId",
"since"
],
"type": "object"
},
"name": "getEvalScores",
"outputSchema": null
},
{
"description": "Get the content of a text file.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Path of the file relative to the team's storage root",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"name": "getFileContent",
"outputSchema": null
},
{
"description": "Generate a signed download URL for a file.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Path of the file relative to the team's storage root",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"name": "getFileDownloadUrl",
"outputSchema": null
},
{
"description": "Get a legacy v1 Clarity process with process metadata, generated analysis, automation guidance, generation progress, and captures. Use this for rows from listClarityProcesses where version=1; v2 rows should use getClarityProcess and snapshot detail tools.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getLegacyClarityProcess",
"outputSchema": null
},
{
"description": "Get a single notification by id for the authenticated user. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The notification's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getNotification",
"outputSchema": null
},
{
"description": "Get a single notification batch by id for the authenticated user, with per-type live-member counts, unread count, and worst severity. Serves cold deep links and sidebar retention for batches the caller can no longer see in the feed. Counts every live member by default; the optional type/severity/minSeverity filters narrow them to matching members only, exactly as the feed narrows a batch row it returns under the same filters. Requires the Notification Center feature; returns 404 when it is not enabled for the team, the batch does not exist, it belongs to another recipient/team, or no live member matches the given filters.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agents": {
"const": "mine",
"description": "When 'mine', 404 unless the batch's agent is one the authenticated user created. Pass it alongside the feed's My agents filter so a retained batch cannot come back narrowed on type and severity but not on ownership.",
"type": "string"
},
"id": {
"description": "The notification batch's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"minSeverity": {
"description": "Count only live members at or above this urgency. Least to most urgent: success < info < warning < critical. Mutually exclusive with severity.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"severity": {
"description": "Count only live members with exactly this severity. Mutually exclusive with minSeverity. One of: info, warning, critical, success.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"description": "Count only live members of this type. Omit to count every live member.",
"enum": [
"connection_broken",
"case_failed",
"critical_case_issue",
"case_issue",
"critical_eval_issue",
"eval_issue",
"job_issue",
"job_done",
"background_job",
"schedule_issue",
"config_proposal"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getNotificationBatch",
"outputSchema": null
},
{
"description": "Per-type notification counts for the authenticated user's current team. Narrow with `unread`, `important`, and with either `severity` (counts only that exact severity) or `minSeverity` (counts that urgency and above) — the two are mutually exclusive and a request carrying both is rejected with 400. Pass the same filters the feed is showing, so the counts describe the list the reader would land on. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agents": {
"const": "mine",
"description": "When 'mine', only count notifications for agents the authenticated user created (plus connection_broken, which is always counted), so the counts match a feed filtered the same way.",
"type": "string"
},
"important": {
"description": "If true, only count notifications pinned to Important for you: unresolved, undismissed connection_broken rows you can reconnect yourself. Use it to size the sidebar alert without paging the list.",
"enum": [
"true",
"false"
],
"type": "string"
},
"minSeverity": {
"description": "Only count notifications at or above this urgency, so the counts match a feed filtered the same way. Least to most urgent: success < info < warning < critical. Mutually exclusive with severity.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"severity": {
"description": "Only count notifications with exactly this severity, so the counts match a feed filtered the same way. Mutually exclusive with minSeverity.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"unread": {
"description": "If true, only count unread notifications.",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"type": "object"
},
"name": "getNotificationCounts",
"outputSchema": null
},
{
"description": "List the notification feed for the authenticated user's current team, most recent activity first. Each item is either an individual notification or a notification batch (a per-agent group of job_issue/eval_issue/job_done/schedule_issue notifications). Filter with type, unread, and either severity (exact match) or minSeverity (threshold; the two are mutually exclusive); paginate with limit/cursor. Either severity filter also narrows a surfaced batch's counts to its qualifying members, and hides a batch with no qualifying live member. The feed is eventually consistent — a batch's counts can lag a concurrent write by one page fetch. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agents": {
"const": "mine",
"description": "When 'mine', only return notifications for agents the authenticated user created. connection_broken notifications are always returned regardless, because they are not about an agent: a broken connection is only notified to the people who can act on it or escalate it, so filtering by agent authorship would hide it from the reader it was addressed to.",
"type": "string"
},
"cursor": {
"type": "string"
},
"limit": {
"default": 30,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"minSeverity": {
"description": "Only return individual notifications at or above this urgency, and batches with at least one live member at or above it. A batch's counts and worst severity then describe only its members at or above the threshold. Least to most urgent: success < info < warning < critical. Mutually exclusive with severity.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"severity": {
"description": "Only return individual notifications with exactly this severity, and batches with at least one live member of it. A batch's counts then describe only those members. Mutually exclusive with minSeverity. One of: info, warning, critical, success.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"description": "Only return individual notifications of this type and batches with at least one live member of it.",
"enum": [
"connection_broken",
"case_failed",
"critical_case_issue",
"case_issue",
"critical_eval_issue",
"eval_issue",
"job_issue",
"job_done",
"background_job",
"schedule_issue",
"config_proposal"
],
"type": "string"
},
"unread": {
"description": "If true, only return unread individual notifications and batches with at least one unread live member.",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"type": "object"
},
"name": "getNotificationFeed",
"outputSchema": null
},
{
"description": "Get org-wide headline insight KPIs (run totals, success rate, distinct active agents and users) aggregated across every team in the organization. Requires an organization Admin, Executive, or Owner role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"endDate": {
"description": "End of the aggregation window (ISO 8601 datetime, exclusive). Defaults to now; clamped to now.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"orgId": {
"description": "The organization's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"startDate": {
"description": "Start of the aggregation window (ISO 8601 datetime). Defaults to 30 days ago; clamped to at most 365 days ago.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "getOrgInsightsHeadline",
"outputSchema": null
},
{
"description": "Get org-level insights metrics (runs, assignments, schedules) broken down per team across the organization. Requires an organization Admin, Executive, or Owner role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"endDate": {
"description": "End of the aggregation window (ISO 8601 datetime). Defaults to now; clamped to now.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"orgId": {
"description": "The organization's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"startDate": {
"description": "Start of the aggregation window (ISO 8601 datetime). Defaults to 7 days ago; clamped to at most 365 days ago.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "getOrgInsightsMetrics",
"outputSchema": null
},
{
"description": "Get org-level run-volume buckets (scheduled vs on-demand) at day/week/month granularity across the organization. Requires an organization Admin, Executive, or Owner role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"endDate": {
"description": "End of the chart window (ISO 8601 datetime). Clamped to now.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"granularity": {
"description": "Bucket size: day, week, or month",
"enum": [
"day",
"week",
"month"
],
"type": "string"
},
"orgId": {
"description": "The organization's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"startDate": {
"description": "Start of the chart window (ISO 8601 datetime). Clamped to at most 365 days ago.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"timezone": {
"description": "IANA timezone for bucket boundaries (e.g. America/New_York). Defaults to UTC.",
"maxLength": 64,
"pattern": "^[A-Za-z_]+(?:\\/[A-Za-z_\\-+0-9]+){0,2}$",
"type": "string"
}
},
"required": [
"orgId",
"startDate",
"endDate",
"granularity"
],
"type": "object"
},
"name": "getOrgInsightsUsageChart",
"outputSchema": null
},
{
"description": "Get the profile of the authenticated user (the owner of the API key).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "getProfile",
"outputSchema": null
},
{
"description": "Get a Duvo Pulse dashboard's metadata and generation status. When status is completed and html_code_present is true, fetch the rendered HTML from GET /artifacts/{artifactId}/render; the conversation is served by GET /artifacts/{artifactId}/messages.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "getPulseDashboard",
"outputSchema": null
},
{
"description": "Mint a short-lived presigned URL to download or preview a file attached to a Duvo Pulse dashboard message. Returns 404 once the dashboard's sandbox has expired and the file is gone (about 12 hours).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"attachmentId": {
"description": "The attachment to mint a download URL for",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"attachmentId"
],
"type": "object"
},
"name": "getPulseDashboardAttachmentDownloadUrl",
"outputSchema": null
},
{
"description": "Serve a Duvo Pulse dashboard's rendered HTML document (text/html, not JSON). 404 until the first generation turn has produced HTML.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "getPulseDashboardHtml",
"outputSchema": null
},
{
"description": "Render a Duvo Pulse dashboard to a PDF document (application/pdf, not JSON). 404 until the first generation turn has produced HTML; 409 for an openui dashboard, whose substrate this exporter cannot render.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"theme": {
"default": "light",
"enum": [
"light",
"dark"
],
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "getPulseDashboardPdf",
"outputSchema": null
},
{
"description": "Serve a specific version's rendered HTML document for a Duvo Pulse dashboard (text/html, requires edit access).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"revisionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"revisionId"
],
"type": "object"
},
"name": "getPulseDashboardVersionHtml",
"outputSchema": null
},
{
"description": "Get a queue by ID.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "getQueue",
"outputSchema": null
},
{
"description": "Read an aggregation definition's cached result.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"definition_id": {
"description": "The aggregation definition's identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"definition_id"
],
"type": "object"
},
"name": "getQueueAggregationResult",
"outputSchema": null
},
{
"description": "Get a queue's Case schema settings: whether it requires typed cases, and the schema it validates them against.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "getQueueJsonSchema",
"outputSchema": null
},
{
"description": "Get a revision by ID.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "The build's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id"
],
"type": "object"
},
"name": "getRevision",
"outputSchema": null
},
{
"description": "Check that this build's case-queue integration slots are wired up correctly. Returns, per case-queue-producer/consumer slot, how many queues are linked, plus whether any queue is available to bind (scoped to the agent's automation on a migrated team, team-wide otherwise). A slot with linked_queue_count of 0 is attached but points at no queue and will fail at runtime — link a queue with replaceRevisionIntegrationQueues before starting work.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id"
],
"type": "object"
},
"name": "getRevisionCaseQueueSetup",
"outputSchema": null
},
{
"description": "Get information about an agent run. Can be polled to check status.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"run_id": {
"description": "The run's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"run_id"
],
"type": "object"
},
"name": "getRun",
"outputSchema": null
},
{
"description": "Get the latest evaluation analysis for a specific agent run (Run).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Agent ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"runId": {
"description": "The run's unique identifier (Run ID)",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agentId",
"runId"
],
"type": "object"
},
"name": "getRunEvaluation",
"outputSchema": null
},
{
"description": "Get an env-var secret by id. Returns metadata and env var keys; secret values are never exposed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "getSecret",
"outputSchema": null
},
{
"description": "Get the content of a file in a skill.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Relative path to the file inside the skill, e.g. SKILL.md.",
"minLength": 1,
"type": "string"
},
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id",
"path"
],
"type": "object"
},
"name": "getSkillFileContent",
"outputSchema": null
},
{
"description": "Get the content of a text file in a skill revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"description": "Relative path to the file inside the revision, e.g. SKILL.md.",
"minLength": 1,
"type": "string"
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id",
"path"
],
"type": "object"
},
"name": "getSkillRevisionFileContent",
"outputSchema": null
},
{
"description": "Get a team by ID. The caller must be scoped to the requested team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"type": "object"
},
"name": "getTeam",
"outputSchema": null
},
{
"description": "Get the team's shareable invite link — the one URL anyone can use to join the team, as opposed to a per-person invitation. Returns `hasLink: false` when no link has been created. Requires the Manager role or above.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"frontendUrl": {
"description": "Deprecated and ignored. The link is built from the server's configured frontend URL so a caller can't choose the host in a Duvo-branded email.",
"format": "uri",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "getTeamInviteLink",
"outputSchema": null
},
{
"description": "Get the unread notification count for the authenticated user's current team. Each notification batch with unread members counts as 1, regardless of its member count. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "getUnreadNotificationCount",
"outputSchema": null
},
{
"description": "Hide a Policy question from the Policy screen, interviews and every agent's context. Nothing is deleted: the answer and its history stay, and the restore operation shows it again. Returns the agents whose live version still reads the field; hiding is never refused because of them. A module template reinstall keeps the field hidden.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "The automation's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"field_id": {
"description": "The config field's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"field_id"
],
"type": "object"
},
"name": "hideConfigField",
"outputSchema": null
},
{
"description": "Invite the in-meeting notetaker bot (Recall.ai) to a live meeting; the recording lands as a 'meeting' capture on the process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"extraCaptureRequestId": {
"format": "uuid",
"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})$",
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
},
"meetingUrl": {
"format": "uri",
"maxLength": 2048,
"type": "string"
}
},
"required": [
"id",
"meetingUrl"
],
"type": "object"
},
"name": "inviteClarityMeetingNotetaker",
"outputSchema": null
},
{
"description": "Invite the in-meeting notetaker bot (Recall.ai) to a live meeting; the recording lands as an organization Clarity interview",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"extraCaptureRequestId": {
"format": "uuid",
"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})$",
"type": "string"
},
"meetingUrl": {
"format": "uri",
"maxLength": 2048,
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"title": {
"maxLength": 160,
"minLength": 1,
"type": "string"
}
},
"required": [
"orgId",
"meetingUrl"
],
"type": "object"
},
"name": "inviteClarityOrganizationNotetaker",
"outputSchema": null
},
{
"description": "Invite a person to an organization you administer, optionally assigning them to a team in that organization. Requires an organization Admin, Executive, or Owner role. You cannot grant a role higher than your own.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"email": {
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"frontendUrl": {
"description": "Deprecated. Use `sendEmail` instead. Kept because its presence is the legacy opt-in for sending the invitation email; the value never sets the link host, which is always the server's configured frontend URL.",
"format": "uri",
"type": "string"
},
"orgId": {
"description": "Organization ID",
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"enum": [
"organization:executive",
"organization:owner",
"organization:admin",
"organization:member"
],
"type": "string"
},
"sendEmail": {
"description": "Email the invitation to the recipient. `false` always suppresses the email. When omitted, the legacy opt-in applies instead: the email is sent only if the deprecated `frontendUrl` is present. Omit both to create the invitation without notifying anyone.",
"type": "boolean"
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"email",
"role"
],
"type": "object"
},
"name": "inviteOrgMember",
"outputSchema": null
},
{
"description": "List active (queued or running) Clarity export jobs for the current user",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listActiveClarityExports",
"outputSchema": null
},
{
"description": "List the case triggers configured for an agent. Each trigger automatically dispatches the agent to run cases added to a queue.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentCaseTriggers",
"outputSchema": null
},
{
"description": "List all agent folders for the authenticated team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listAgentFolders",
"outputSchema": null
},
{
"description": "List the memory files stored for an agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentMemoryFiles",
"outputSchema": null
},
{
"description": "List revisions for an agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of revisions per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of revisions to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentRevisions",
"outputSchema": null
},
{
"description": "List the schedules you own on an agent. Returns only your own schedules, whoever you are. Callers with an elevated team role can read every member's schedules on the agent, including who created each one, via `GET /agents/{agent_id}/schedules/all`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentSchedules",
"outputSchema": null
},
{
"description": "List the Slack workspaces bound to an agent build that you can create channel triggers for. Creating a Slack channel trigger for any other workspace is rejected, so start here to pick a valid `slack_team_id` and `integration_instance_id`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "The agent build (revision) whose bound connections to list",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id"
],
"type": "object"
},
"name": "listAgentSlackBoundWorkspaces",
"outputSchema": null
},
{
"description": "List the Slack channel triggers you own on an agent (Agent in the Duvo UI), oldest first. Each trigger's `filter_config` carries the watched `channelId`, `channelName`, Slack `workspaceId`, and `matchRule`. Capped at 100 triggers per agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentSlackTriggers",
"outputSchema": null
},
{
"description": "List an Agent's suggestions. status=pending is the inbox; status=history is consumed/dismissed/auto-cleared. Reads lazily auto-clear stale pending items.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The Agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 100,
"maximum": 250,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"status": {
"default": "pending",
"enum": [
"pending",
"history"
],
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAgentSuggestions",
"outputSchema": null
},
{
"description": "List the trigger types available for an agent, grouped by integration. Use the returned `integration_slug` and `trigger_type` values when creating a trigger.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agentId"
],
"type": "object"
},
"name": "listAgentTriggerTypes",
"outputSchema": null
},
{
"description": "List the trigger definitions the authenticated user owns on an agent (Agent in the Duvo UI). Triggers start a Run automatically when an external event fires (e.g. an email arrives or a Linear issue is created).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agentId"
],
"type": "object"
},
"name": "listAgentTriggers",
"outputSchema": null
},
{
"description": "List agents for your team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Only return agents belonging to this automation.",
"format": "uuid",
"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})$",
"type": "string"
},
"include_schedules": {
"default": "false",
"description": "Include the authenticated user's schedules for each agent in the response. Schedules are per-user, so this only returns schedules the current user owns.",
"enum": [
"true",
"false"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of agents per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of agents to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listAgents",
"outputSchema": null
},
{
"description": "List every team member's schedules on an agent, including who created each one. Requires an elevated team role; callers without one receive 403 and should use `GET /agents/{agent_id}/schedules`, which returns only the schedules they own.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "listAllAgentSchedules",
"outputSchema": null
},
{
"description": "List the team's automations, each with its live agent and queue counts. An automation is the workspace container an agent or queue belongs to on a team that has moved to Automations — its id is what `POST /queues` and `POST /agents` need as `automation_id`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 250,
"description": "Number of automations per page (1-250, default 250)",
"maximum": 250,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of automations to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listAutomations",
"outputSchema": null
},
{
"description": "List process tags available for a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"search": {
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "listAvailableClarityProcessLabels",
"outputSchema": null
},
{
"description": "List the files attached to a case, oldest first. Includes attachments whose upload failed, so a missing source document is visible rather than silent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id"
],
"type": "object"
},
"name": "listCaseAttachments",
"outputSchema": null
},
{
"description": "List all labels assigned to a case.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 1000,
"description": "Number of labels per page (1-1000, default 1000).",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Zero-based offset for pagination.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id"
],
"type": "object"
},
"name": "listCaseLabels",
"outputSchema": null
},
{
"description": "Return the latest qualifying messages (assistant text + tool calls) for a Run on a case, newest last. Used to populate the live body of an active Run card in the case Activity timeline.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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)$",
"type": "string"
},
"limit": {
"description": "Maximum number of qualifying messages to return. Defaults to 3, must be between 1 and 10.",
"maximum": 10,
"minimum": 1,
"type": "integer"
},
"run_id": {
"description": "The agent run's unique identifier",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"case_id",
"run_id"
],
"type": "object"
},
"name": "listCaseRunRecentMessages",
"outputSchema": null
},
{
"description": "List Runs (agent runs) that have claimed or received handover of a case, newest first. Capped at 50 ownership events.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"case_id"
],
"type": "object"
},
"name": "listCaseRuns",
"outputSchema": null
},
{
"description": "List cases in a queue. Supports status, date-range, free-text, and json_data field filters via query params. Set count_only=true to skip Case row selection and transformation. The normal response shape is returned with cases: [] and the matching total. For label filters, use POST /v2/queues/:queue_id/cases/search.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"awaiting_my_approval": {
"description": "Return only cases holding an unanswered approval row assigned to you, on the case's own run. Resolved from the authenticated caller, so it names no user: an API key filters as the user who owns it, and a credential with no user behind it is rejected rather than served an empty list. Narrows within needs_input, so it returns nothing alongside a terminal status bucket.",
"enum": [
"true",
"false"
],
"type": "string"
},
"count_only": {
"default": "false",
"description": "Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.",
"enum": [
"true",
"false"
],
"type": "string"
},
"created_at_from": {
"description": "Return only cases created at or after an ISO-8601 timestamp or a lookback such as 24h or 7d.",
"type": "string"
},
"created_at_to": {
"description": "Return only cases created before this ISO-8601 timestamp. The upper bound is exclusive.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
},
"field": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
}
],
"description": "Filter on a field of a typed queue's json_data, as <path>:<operator>[:<value>] (e.g. $.invoice.amount:gte:5000). Repeat the param to require several; all must match, so two comparisons on one path express a range. Operators: equals, notEquals, in, notIn, gt, gte, lt, lte, contains, isSet, isNotSet. in/notIn take a comma-separated list; isSet/isNotSet take no value. A value is typed by shape (5000 is a number, true a boolean, 00123 a string so a leading zero survives). A path the queue's Case schema does not declare is rejected rather than ignored."
},
"issue_severity": {
"description": "Filter by highest failing rubric severity (comma-separated). Values: critical, medium. Severity is a facet within the issues outcome, so it returns nothing when combined with a status bucket that excludes issues. `low` is not selectable: an all-low verdict is stored as success, so no case carries it.",
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of cases per page (1-100, default 20).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Zero-based offset for pagination.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"priority": {
"description": "Filter by one or more priority levels (comma-separated). Values: none, medium, high.",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Full-text search across case title and data.",
"type": "string"
},
"sort_by": {
"default": "created_at",
"description": "Field to sort by. Default: created_at.",
"enum": [
"created_at",
"updated_at",
"postponed_to"
],
"type": "string"
},
"sort_order": {
"default": "desc",
"description": "Sort direction. Default: desc.",
"enum": [
"asc",
"desc"
],
"type": "string"
},
"status": {
"description": "Filter by one or more status buckets (comma-separated). Values: all, pending, processing, needs_input, postponed, needs_review, resolved, canceled. `processing` covers both a case actively being worked and one waiting on its evaluation.",
"type": "string"
},
"updated_at_from": {
"description": "Return only cases updated at or after an ISO-8601 timestamp or a lookback such as 24h or 7d.",
"type": "string"
},
"updated_at_to": {
"description": "Return only cases updated before this ISO-8601 timestamp. The upper bound is exclusive.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "listCases",
"outputSchema": null
},
{
"description": "List the current user's recent non-deleted artifact-chat conversations for a Clarity v2 process and snapshot kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"process_id": {
"description": "The Clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"snapshot_kind": {
"description": "Artifact kind to list conversations for",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
}
},
"required": [
"process_id",
"snapshot_kind"
],
"type": "object"
},
"name": "listClarityArtifactChatConversations",
"outputSchema": null
},
{
"description": "List active extra-capture requests for a given automation proposal of a Clarity v2 process. The caller is expected to know the proposal id from the V2 read model and skip the call when no proposal exists yet.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 20,
"description": "Number of results per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of results to skip (default 0)",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"transformation_proposal_id": {
"description": "The automation proposal id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"transformation_proposal_id"
],
"type": "object"
},
"name": "listClarityExtraCaptureRequests",
"outputSchema": null
},
{
"description": "List the team's process folders with process and suggestion counts",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listClarityFolders",
"outputSchema": null
},
{
"description": "List the organization's Process Landscape captures. By default, only captures eligible to seed new process proposals are returned; excluded captures can be included for inspection.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"includeTranscripts": {
"default": "false",
"description": "Include full capture transcripts (large); off by default. Pass the literal string 'true' or 'false' (z.coerce.boolean treats any non-empty value, including 'false', as true).",
"enum": [
"true",
"false"
],
"type": "string"
},
"include_excluded": {
"default": "false",
"description": "Include captures excluded from Process Landscape analysis",
"enum": [
"true",
"false"
],
"type": "string"
},
"limit": {
"default": 100,
"description": "Number of captures to return (1-200, default 100)",
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listClarityLandscapeCaptures",
"outputSchema": null
},
{
"description": "List Clarity interviews linked to a process folder",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"description": "Number of interviews per page (1-100, default 50)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nodeId": {
"description": "The clarity process folder node ID",
"format": "uuid",
"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})$",
"type": "string"
},
"offset": {
"description": "Number of interviews to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"orgId": {
"description": "The organization ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "listClarityLandscapeNodeInterviews",
"outputSchema": null
},
{
"description": "List the people involved in the process behind one process landscape node. To read the people across the whole landscape in one request, use getClarityHierarchyPeople instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"description": "A process landscape node that is linked to a real process.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "listClarityLandscapeNodePeople",
"outputSchema": null
},
{
"description": "List Clarity interviews across an organization",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"scope": {
"enum": [
"team",
"organization"
],
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listClarityOrganizationInterviews",
"outputSchema": null
},
{
"description": "List process tags on a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "listClarityProcessAssignedLabels",
"outputSchema": null
},
{
"description": "List process tags available in an organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listClarityProcessLabels",
"outputSchema": null
},
{
"description": "List process-to-process links in the organization's Clarity landscape that are visible within the caller's team access scope. Use `node_id` to find links touching a specific process node.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 100,
"description": "Number of links per page (1-500, default 100)",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"node_id": {
"description": "Only return links that touch this hierarchy process node",
"format": "uuid",
"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})$",
"type": "string"
},
"offset": {
"description": "Number of links to skip (default 0)",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listClarityProcessLinks",
"outputSchema": null
},
{
"description": "List users with accepted access to a clarity process, the people invited who have not accepted yet, and anyone else who has recorded a capture on it",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"contributorsAfter": {
"description": "Cursor from contributorsNextCursor; returns the next page of contributors.",
"format": "uuid",
"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})$",
"type": "string"
},
"id": {
"description": "Clarity process ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "listClarityProcessMembers",
"outputSchema": null
},
{
"description": "List lightweight Clarity v2 process snapshots for one kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"kind"
],
"type": "object"
},
"name": "listClarityProcessSnapshots",
"outputSchema": null
},
{
"description": "Cross-process portfolio digest for every completed Clarity process on the team: per-process summary, SWOT, projected impact, and a step skeleton (role, system, and flow edges) — without step prose or source excerpts. Paginated (default 5, max 10). Use this to answer portfolio-wide questions in one pass; fetch a single process's full detail via getClarityProcessSnapshot only for the few that matter.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"detail": {
"default": "skeleton",
"description": "skeleton = + per-step role/system/flow edges (default); summary = summary+SWOT+impact only (cheaper, for pure ranking).",
"enum": [
"skeleton",
"summary"
],
"type": "string"
},
"include_current_steps": {
"default": "false",
"description": "Include the as-is (current) step skeleton too. Default false = proposed (to-be) steps only. Pass the literal string 'true' or 'false' (z.coerce.boolean treats any non-empty value, including 'false', as true).",
"enum": [
"true",
"false"
],
"type": "string"
},
"limit": {
"default": 5,
"description": "Processes per page (1-10, default 5). Keeps the response under the MCP output cap.",
"maximum": 10,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Processes to skip (default 0).",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listClarityProcessSummaries",
"outputSchema": null
},
{
"description": "List Clarity processes for the current team, most recently updated first. Returns lightweight metadata (capture counts, contributors, status) suitable for building a picker; the per-process read model is available via `GET /v2/teams/:team_id/clarity-v2/processes/:process_id` for v2 rows and `GET /v2/teams/:team_id/clarity/processes/:id` for legacy v1 rows. Both v1 (legacy) and v2 processes are returned by default; use `search`, `status`, and `version` to narrow discovery. Capped at 100 per page.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"description": "Number of processes per page (1-100, default 50)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of processes to skip (default 0)",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"search": {
"description": "Case-insensitive search across process names",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"status": {
"description": "Filter by process lifecycle status",
"enum": [
"draft",
"collecting",
"generating",
"generating-current-process",
"generating-transformation-proposal",
"review",
"complete",
"generation_failed"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"version": {
"description": "Filter by Clarity process schema version: 1 legacy, 2 v2",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"type": "object"
},
"name": "listClarityProcesses",
"outputSchema": null
},
{
"description": "Return one representative screenshare frame for each current-process step. Explicit frame evidence wins. Otherwise, a timestamped screenshare transcript source selects the closest persisted frame at or after that timestamp, with the closest earlier frame as fallback. Pass `window` (1-5) to also receive that many neighbouring frames on each side as candidates, for recovering when the selected frame does not show the step. Pass `size=thumb` for 768px copies that are cheaper to download and inspect. Signed URLs are short-lived and can be null when signing is unavailable.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"size": {
"default": "full",
"description": "full: the persisted screenshot (1920px wide). thumb: a 768px-wide copy, cheaper to download and to inspect visually; use it to check whether a frame shows the step, then fetch full for the document.",
"enum": [
"full",
"thumb"
],
"type": "string"
},
"snapshot_id": {
"description": "The current-process snapshot id",
"format": "uuid",
"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})$",
"type": "string"
},
"step_ids": {
"description": "Optional comma-separated step ids to resolve, for example `task-a,task-b` (maximum 100). Omit to resolve every step.",
"type": "string"
},
"window": {
"default": 0,
"description": "Number of neighbouring persisted frames to return on each side of the selected frame as `candidates` (0-5, default 0). Use to recover when the selected frame does not show the step.",
"maximum": 5,
"minimum": 0,
"type": "integer"
}
},
"required": [
"process_id",
"snapshot_id"
],
"type": "object"
},
"name": "listClarityStepFrames",
"outputSchema": null
},
{
"description": "List team-level Clarity interviews",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"description": "Number of interviews per page (1-100, default 50)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of interviews to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listClarityTeamInterviews",
"outputSchema": null
},
{
"description": "Read an automation's module config fields (its Policy), grouped by section in catalog order, with each field's current value, default, and fill provenance.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "The automation's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"include_hidden": {
"description": "Also return the questions a person hid, marked active: false, in their sections. Questions the module template retired are never returned. The counts still cover the visible questions only. Defaults to false.",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "listConfigFields",
"outputSchema": null
},
{
"description": "List the authenticated user's connections (connected integration instances) for the current team. Includes team-shared instances visible to the caller, and instances another team has granted to this one, when the org-level Connections sharing setting is on. Filter by integration type with the `type` query parameter.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 100,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"name": "listConnections",
"outputSchema": null
},
{
"description": "List browser-login credentials visible to the caller for the current team — team-shared (user_id IS NULL) plus the caller's own personal logins. Optionally filter by `domain`. Passwords and OTP secrets are never returned; only metadata flags indicating whether they are set.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"domain": {
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"userId"
],
"type": "object"
},
"name": "listCredentials",
"outputSchema": null
},
{
"description": "List files for the current team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listFiles",
"outputSchema": null
},
{
"description": "List the team's integration catalog: built-in integration types plus the custom connection types this team owns or has been granted by another team in its organization. OAuth authorization flows are browser-based and cannot be performed via this API; use the Duvo dashboard to complete OAuth-based connections.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 100,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"name": "listIntegrations",
"outputSchema": null
},
{
"description": "List the organizations the current user belongs to, with their role (organization:member, organization:admin, organization:owner, or organization:executive) and member count in each. Use this to check whether the user has an admin-or-above role before calling organization-scoped endpoints, which reject lower roles with 403.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "listMyOrganizations",
"outputSchema": null
},
{
"description": "List teams the authenticated caller can act on. Team-scoped API keys see only the key's team; managed Ask Duvo keys stay within their origin boundary; human user-scoped API keys and OAuth callers see every team they're a member of.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "listMyTeams",
"outputSchema": null
},
{
"description": "List notifications for the authenticated user's current team, most recent first. Filter with type, unread, severity or minSeverity (mutually exclusive), important, agentRunId, or processId; paginate with limit/cursor. Pass batchId to list only the live members of a notification batch, optionally ordered by sort=importance (only valid together with batchId). Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentRunId": {
"description": "Only return notifications about this agent run.",
"format": "uuid",
"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})$",
"type": "string"
},
"batchId": {
"description": "Only return live members of this notification batch.",
"format": "uuid",
"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})$",
"type": "string"
},
"cursor": {
"description": "Opaque cursor from the previous page's nextCursor. Omit for the first page.",
"type": "string"
},
"important": {
"description": "If true, only return important notifications: unresolved connection_broken rows pinned until reconnected, removed, or dismissed.",
"enum": [
"true",
"false"
],
"type": "string"
},
"limit": {
"default": 30,
"description": "Number of notifications per page (1-100, default 30).",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"minSeverity": {
"description": "Only return notifications at or above this urgency. Least to most urgent: success < info < warning < critical. Mutually exclusive with severity.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"processId": {
"description": "Only return notifications about this Clarity process.",
"minLength": 1,
"type": "string"
},
"severity": {
"description": "Only return notifications with this severity. One of: info, warning, critical, success.",
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"sort": {
"default": "recency",
"description": "importance orders by type importance then severity (only valid together with batchId); default recency.",
"enum": [
"recency",
"importance"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"type": {
"description": "Only return notifications of this type. One of: connection_broken, case_failed, critical_case_issue, case_issue, critical_eval_issue, eval_issue, job_issue, job_done, background_job, schedule_issue, config_proposal.",
"enum": [
"connection_broken",
"case_failed",
"critical_case_issue",
"case_issue",
"critical_eval_issue",
"eval_issue",
"job_issue",
"job_done",
"background_job",
"schedule_issue",
"config_proposal"
],
"type": "string"
},
"unread": {
"description": "If true, only return unread notifications.",
"enum": [
"true",
"false"
],
"type": "string"
}
},
"type": "object"
},
"name": "listNotifications",
"outputSchema": null
},
{
"description": "List every agent across all teams in an organization, with the team it belongs to, the state of its most recent run and the state of its schedules. Intended for external monitoring: it answers 'which agents have gone silent' and 'which agents were switched off' without a request per team or per agent. Requires an organization Admin, Executive, or Owner role, and an API key scoped to all teams you can access — a key pinned to a single team is rejected, because this endpoint spans every team in the organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"auto_disabled": {
"description": "If true, only agents whose schedule was switched off automatically (e.g. after repeated missing-connection failures); if false, only agents with no auto-disabled schedule",
"enum": [
"true",
"false"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of agents per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of agents to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"orgId": {
"description": "The organization's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"schedule_enabled": {
"description": "If true, only agents with at least one enabled schedule; if false, only agents with none (including agents that are never scheduled)",
"enum": [
"true",
"false"
],
"type": "string"
},
"team_id": {
"description": "Filter to agents on this team",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listOrgAgents",
"outputSchema": null
},
{
"description": "List runs across every team in an organization, filtered by status, agent, team, source, evaluation issues and time. Intended for external monitoring: one call covers the whole org instead of one per team. Requires an organization Admin, Executive, or Owner role, and an API key scoped to all teams you can access — a key pinned to a single team is rejected, because this endpoint spans every team in the organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Filter to runs for this agent",
"format": "uuid",
"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})$",
"type": "string"
},
"completed_after": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"completed_before": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"count_only": {
"default": "false",
"description": "Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.",
"enum": [
"true",
"false"
],
"type": "string"
},
"created_after": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"created_before": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"cursor": {
"description": "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.",
"minLength": 1,
"type": "string"
},
"has_issues": {
"description": "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.",
"enum": [
"true",
"false"
],
"type": "string"
},
"include_total": {
"default": "false",
"description": "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`.",
"enum": [
"true",
"false"
],
"type": "string"
},
"issue_severity": {
"description": "Only runs whose latest successful evaluation has at least one failing rubric at this severity (critical | medium | low). Implies has_issues.",
"enum": [
"critical",
"medium",
"low"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "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.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"orgId": {
"description": "The organization's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"since": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"sort_order": {
"default": "desc",
"description": "Sort direction on created_at (default desc)",
"enum": [
"asc",
"desc"
],
"type": "string"
},
"source": {
"description": "Filter to runs created from this source (e.g. api, scheduling)",
"type": "string"
},
"started_after": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"started_before": {
"description": "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.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
},
"status": {
"description": "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.",
"enum": [
"not_started",
"pending",
"starting",
"running",
"waiting",
"completed",
"failed",
"interrupted",
"stopped",
"needs_attention"
],
"type": "string"
},
"team_id": {
"description": "Filter to runs on this team",
"format": "uuid",
"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})$",
"type": "string"
},
"until": {
"description": "Alias of `completed_before`, kept because it is the name the public team runs endpoint ships. Prefer `completed_before`.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listOrgRuns",
"outputSchema": null
},
{
"description": "List teams belonging to an organization you are a member of, including your membership and role in each.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"description": "Number of teams per page (1-100, default 50)",
"maximum": 100,
"minimum": 1,
"type": "number"
},
"offset": {
"description": "Number of teams to skip",
"minimum": 0,
"type": "number"
},
"orgId": {
"description": "Organization ID",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"description": "Filter teams by name (case-insensitive substring match)",
"maxLength": 200,
"type": "string"
},
"sortBy": {
"default": "createdAt",
"description": "Sort order: createdAt (newest first, default) or name (alphabetical)",
"enum": [
"createdAt",
"name"
],
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "listOrgTeams",
"outputSchema": null
},
{
"description": "List plugins that can be referenced by name in a build's plugins array. Builds may also reference any public GitHub repository URL (https://github.com/owner/repo) as a plugin; those are not enumerated here.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "listPluginCatalog",
"outputSchema": null
},
{
"description": "List the comment threads on a Duvo Pulse dashboard (requires view access). Each thread carries its author, the dashboard element it is pinned to, its replies oldest-first, and whether it has been marked complete.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"description": "Maximum number of comment threads to return (1-200, default 50).",
"exclusiveMinimum": 0,
"maximum": 200,
"type": "integer"
},
"offset": {
"description": "Number of comment threads to skip, for paging.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"status": {
"description": "Return only threads in this state: `open` for threads not yet marked complete, `complete` for those that are. Omit for both. `total` and `open_total` always count the whole set, so a filtered page still reports how many threads exist.",
"enum": [
"open",
"complete"
],
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "listPulseDashboardComments",
"outputSchema": null
},
{
"description": "List the connections (data sources) attached to a Duvo Pulse dashboard (requires edit access).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "listPulseDashboardConnections",
"outputSchema": null
},
{
"description": "List the chat transcript of a Duvo Pulse dashboard's live version (requires edit access). Returns the most recent page by default, oldest first within the page; pass `before` (a message id from a previous page) to walk back through older messages. Messages from other version branches are not included.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"before": {
"description": "Message id cursor: return the page of messages immediately older than this message. Omit for the most recent page.",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"description": "Maximum number of messages to return (1-500, default 50).",
"exclusiveMinimum": 0,
"maximum": 500,
"type": "integer"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "listPulseDashboardMessages",
"outputSchema": null
},
{
"description": "List the version history of a Duvo Pulse dashboard, newest first (requires edit access). Use the version id with the restore and version-render endpoints.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "listPulseDashboardVersions",
"outputSchema": null
},
{
"description": "List your Duvo Pulse dashboards (live, agent-generated visualizations of your Duvo data). Ordered most recently updated first, except scope=automation, which is ordered by creation time (then id) so the whole scope can be read with the after_id cursor without a concurrent change shifting a page boundary.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"after_id": {
"description": "Keyset cursor for reading the whole 'automation' scope: the id of the last dashboard you received; returns the page after it in (created_at, id) order. Use this instead of 'offset' when reading every page, so a dashboard created, updated or deleted between requests cannot shift a page boundary you have already passed. 400 when the id no longer names a dashboard (restart from the first page). Only valid with scope=automation.",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of results per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "Number of results to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"scope": {
"default": "created",
"description": "Which dashboards to return: 'created' (yours, the default), 'team' (published to your whole team by a teammate), 'shared' (shared with you individually by a teammate), or 'automation' (owned by one of your team's automations, each carrying its automation's name).",
"enum": [
"created",
"shared",
"team",
"automation"
],
"type": "string"
}
},
"type": "object"
},
"name": "listPulseDashboards",
"outputSchema": null
},
{
"description": "Discover queues the current editor may connect to this team-created Pulse before sampling data. Requires live dashboard edit permission and ordinary team data access. Module sources are installed with the Module. A queue ID in generated code does not grant access.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifact_id": {
"description": "Current Pulse artifact ID, supplied by the builder or viewer context.",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
}
},
"required": [
"artifact_id"
],
"type": "object"
},
"name": "listPulseDataSources",
"outputSchema": null
},
{
"description": "List agents bound to a queue as producers (agents that push cases into the queue) or consumers (agents triggered by cases in the queue).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "listQueueAgents",
"outputSchema": null
},
{
"description": "List a queue's aggregation definitions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "listQueueAggregations",
"outputSchema": null
},
{
"description": "List every label defined on a queue along with the count of cases each label is assigned to.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 1000,
"description": "Number of labels per page (1-1000, default 1000).",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Zero-based offset for pagination.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "listQueueLabels",
"outputSchema": null
},
{
"description": "List queues for your team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Only return queues belonging to this automation.",
"format": "uuid",
"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})$",
"type": "string"
},
"limit": {
"default": 250,
"description": "Number of queues per page (1-250, default 250)",
"maximum": 250,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of queues to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listQueues",
"outputSchema": null
},
{
"description": "List the connections you have pinned to this build's integration slot. Multi-pin is supported: you can pin multiple connections to the same slot.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID (catalog integration ID or slot ID from the list response)",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id",
"integration_id"
],
"type": "object"
},
"name": "listRevisionIntegrationConnections",
"outputSchema": null
},
{
"description": "List the queues linked to this build's case-queue integration slot. Only meaningful for case-queue-producer and case-queue-consumer integrations.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id",
"integration_id"
],
"type": "object"
},
"name": "listRevisionIntegrationQueues",
"outputSchema": null
},
{
"description": "List integrations attached to an agent revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id"
],
"type": "object"
},
"name": "listRevisionIntegrations",
"outputSchema": null
},
{
"description": "List logins attached to a specific revision (build) of an assignment. Returns metadata only — passwords and OTP secrets are never exposed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId"
],
"type": "object"
},
"name": "listRevisionLogins",
"outputSchema": null
},
{
"description": "List env-var secrets attached to a specific revision (build) of an assignment. Returns metadata and env-var keys only — secret values are never exposed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"format": "uuid",
"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)$",
"type": "string"
},
"buildId": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agentId",
"buildId"
],
"type": "object"
},
"name": "listRevisionSecrets",
"outputSchema": null
},
{
"description": "Get paginated messages for an agent run. Messages are returned in chronological order.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 20,
"description": "Number of messages per page (1-50, default 20)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of messages to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"run_id": {
"description": "The run's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"run_id"
],
"type": "object"
},
"name": "listRunMessages",
"outputSchema": null
},
{
"description": "List runs for the current team. Supports filtering by agent, user, queue, status, etc. Messages, evaluation data, and queue metadata are included where available. Set count_only=true to skip Run row selection and enrichment. The normal response shape is returned with data: [] and the matching total. To sweep a whole team, follow `next_cursor` rather than raising `offset`.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Filter to runs for this agent",
"format": "uuid",
"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})$",
"type": "string"
},
"automation_id": {
"description": "Filter to runs that ran under this automation. A run keeps the automation it was created under, even after its agent moves to another automation",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Filter to runs associated with this queue",
"format": "uuid",
"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})$",
"type": "string"
},
"count_only": {
"default": "false",
"description": "Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.",
"enum": [
"true",
"false"
],
"type": "string"
},
"cursor": {
"description": "Resume after the run a previous page ended on: pass the `next_cursor` that page returned, with the same filters and sort_order. Unlike offset, a cursor page does not re-read the runs before it, so a sweep does not slow down as it goes deeper; send `include_total=false` on the first page to skip the full count too. Runs created in between cannot shift a boundary already passed, so pages do not repeat or skip runs the way offset pages do. A run created or completed while a sweep is in progress can still be missed by that sweep, so to export runs continuously, poll with `since` and a short overlap and deduplicate on run id. Cannot be combined with `offset`. 400 when the value is not a valid runs cursor.",
"minLength": 1,
"type": "string"
},
"digest_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"has_issues": {
"description": "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.",
"enum": [
"true",
"false"
],
"type": "string"
},
"include_total": {
"description": "Whether to return `total`, the count of every matching run. Counting walks every match, so it costs far more than the page itself on a large team. Defaults to true on a first page and false on a `cursor` page, where `total` is null unless this is true. Implied by `count_only`.",
"enum": [
"true",
"false"
],
"type": "string"
},
"issue_severity": {
"description": "If set, only return runs whose latest successful evaluation has at least one failing rubric with this severity (critical | medium | low). Implies has_issues; legacy evaluations without severity companion fields do not match this filter.",
"enum": [
"critical",
"medium",
"low"
],
"type": "string"
},
"limit": {
"default": 20,
"description": "Number of runs per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "number"
},
"offset": {
"description": "Number of runs to skip. Every skipped run is still read by the database, so deep offsets get slower page by page; to walk a whole team's history, page with `cursor` instead.",
"minimum": 0,
"type": "number"
},
"search": {
"description": "Full-text search across run titles and case titles",
"type": "string"
},
"since": {
"description": "Return runs completed at or after this ISO-8601 timestamp. Runs that have not completed are excluded.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
},
"sort_by": {
"default": "created_at",
"description": "Field to sort by (default created_at)",
"enum": [
"created_at"
],
"type": "string"
},
"sort_order": {
"default": "desc",
"description": "Sort direction (default desc)",
"enum": [
"asc",
"desc"
],
"type": "string"
},
"source": {
"description": "Filter to runs created from this source (e.g. api, schedule)",
"type": "string"
},
"status": {
"description": "Filter to runs with this status",
"enum": [
"not_started",
"pending",
"starting",
"running",
"waiting",
"completed",
"failed",
"interrupted",
"stopped",
"needs_attention"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"until": {
"description": "Return runs completed before this ISO-8601 timestamp. The upper bound is exclusive. Runs that have not completed are excluded.",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"type": "string"
},
"user_id": {
"description": "Filter to runs owned by this user; non-superadmin callers are scoped to themselves regardless of this value",
"format": "uuid",
"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})$",
"type": "string"
}
},
"type": "object"
},
"name": "listRuns",
"outputSchema": null
},
{
"description": "List files in a sandbox directory.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"default": "/workspace",
"description": "Directory to list files from (defaults to /workspace)",
"type": "string"
},
"sandbox_id": {
"description": "The sandbox's unique identifier",
"minLength": 1,
"type": "string"
}
},
"required": [
"sandbox_id"
],
"type": "object"
},
"name": "listSandboxFiles",
"outputSchema": null
},
{
"description": "List env-var secrets the caller can reach in this team — team-shared (user_id IS NULL), the caller's own personal entries, and secrets another team in the organization has granted to this team. Returns metadata and env-var keys only; secret values are never exposed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listSecrets",
"outputSchema": null
},
{
"description": "List the agents in the current team whose live build references the given skill. Used to warn users that editing a skill will affect every agent that uses it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "listSkillAssignments",
"outputSchema": null
},
{
"description": "List all files in a skill.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "listSkillFiles",
"outputSchema": null
},
{
"description": "List the files in a skill revision, one page at a time. When `has_more` is true, pass `next_cursor` back as `cursor` to fetch the next page.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cursor": {
"description": "Opaque continuation token from a previous response's `next_cursor`. Omit for the first page.",
"minLength": 1,
"type": "string"
},
"limit": {
"default": 100,
"description": "Maximum number of files to return per page (1-1000, default 100)",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id"
],
"type": "object"
},
"name": "listSkillRevisionFiles",
"outputSchema": null
},
{
"description": "List a skill's version history. Each revision is a snapshot of the skill's files; at most one is active (live) at a time, plus at most one open draft.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 20,
"description": "Number of revisions per page (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of revisions to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id"
],
"type": "object"
},
"name": "listSkillRevisions",
"outputSchema": null
},
{
"description": "List all skills for the current team, including system skills.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "listSkills",
"outputSchema": null
},
{
"description": "List all system skills (skills available to all teams).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"type": "object"
},
"name": "listSystemSkills",
"outputSchema": null
},
{
"description": "List a team's pending invitations — everyone invited who has not yet accepted or declined. Pass `processId` to list the pending invitations for a single Clarity process instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"processId": {
"description": "List the pending invitations for this Clarity process instead of the team's own invitations. Requires the process creator or a team admin.",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"type": "object"
},
"name": "listTeamInvites",
"outputSchema": null
},
{
"description": "List members of a team. The authenticated session or API key must be scoped to the requested team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"default": 50,
"description": "Number of members per page (1-100, default 50)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Number of members to skip",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"search": {
"description": "Optional case-insensitive name or email search",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"type": "object"
},
"name": "listTeamMembers",
"outputSchema": null
},
{
"description": "Mark all notifications as read for the authenticated user's current team. Returns the count of notifications that were updated. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "markAllNotificationsRead",
"outputSchema": null
},
{
"description": "Mark every unread live member of a notification batch as read for the authenticated user. Pass `types` to narrow the mark-read to those member types, and `severity` (exact) or `minSeverity` (threshold, mutually exclusive with `severity`) to narrow it by urgency — e.g. the page's active filters; omit them to mark every live member. Narrowing matters when the batch card was rendered under a filter: the rows marked read should be the rows the card counted. Pass `openedFrom` to record which channel the reader came through, on every member this call marks read. Returns the count of members that were updated. Requires the Notification Center feature; returns 404 when it is not enabled for the team or the batch does not exist or belongs to another recipient/team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The notification batch's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"minSeverity": {
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"openedFrom": {
"enum": [
"in_app",
"email",
"slack",
"teams"
],
"type": "string"
},
"severity": {
"enum": [
"info",
"warning",
"critical",
"success"
],
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"types": {
"items": {
"enum": [
"connection_broken",
"case_failed",
"critical_case_issue",
"case_issue",
"critical_eval_issue",
"eval_issue",
"job_issue",
"job_done",
"background_job",
"schedule_issue",
"config_proposal"
],
"type": "string"
},
"maxItems": 11,
"minItems": 1,
"type": "array"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "markNotificationBatchRead",
"outputSchema": null
},
{
"description": "Mark a notification as read for the authenticated user. Idempotent — calling it again on an already-read notification still returns success. Pass `openedFrom` to record which channel the reader came through (`in_app` when they were already in Duvo, or `email`/`slack`/`teams` from the `notificationSource` param on an external link); omit it when the read is not somebody opening the notification. Requires the Notification Center feature; returns 404 when it is not enabled for the team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The notification's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"openedFrom": {
"enum": [
"in_app",
"email",
"slack",
"teams"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "markNotificationRead",
"outputSchema": null
},
{
"description": "Move an agent (and its connected workspace) to a different team. Pass dry_run=true to preview the closure without applying changes.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The ID of the agent to move.",
"format": "uuid",
"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})$",
"type": "string"
},
"bypass_standalone_gate": {
"default": false,
"description": "When true, move the agent together with every connected queue, trigger, and handover peer instead of rejecting a non-standalone agent. Defaults to false.",
"type": "boolean"
},
"dry_run": {
"anyOf": [
{
"type": "boolean"
},
{
"const": "true",
"type": "string"
},
{
"const": "false",
"type": "string"
}
],
"description": "When true, preview the closure and warnings without applying any changes."
},
"target_team_id": {
"description": "The ID of the team to move the agent into.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"target_team_id"
],
"type": "object"
},
"name": "moveAgent",
"outputSchema": null
},
{
"description": "Move one or more agents (assignments) into a folder, or to the root level.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_ids": {
"description": "IDs of the agents (assignments) to move. Must be unique.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Destination folder ID. Pass null to move the agents to the root level."
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"agent_ids",
"folder_id"
],
"type": "object"
},
"name": "moveAgentsToFolder",
"outputSchema": null
},
{
"description": "Move one or more automations into an agent folder, or to the root level.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_ids": {
"description": "IDs of the automations to move. Must be unique.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Destination folder ID. Pass null to move the automations to the root level."
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"automation_ids",
"folder_id"
],
"type": "object"
},
"name": "moveAutomationsToFolder",
"outputSchema": null
},
{
"description": "Move processes into a folder (or back to Unfiled)",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folderId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Destination folder ID, or null to move back to Unfiled."
},
"processIds": {
"description": "Clarity process IDs to move.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"processIds",
"folderId"
],
"type": "object"
},
"name": "moveClarityProcessesToFolder",
"outputSchema": null
},
{
"description": "Move a Pulse dashboard from the team in the URL to another team, keeping only its latest revision (chat history and older revisions are deleted). The caller must be a Manager or above on both teams. Pass dryRun=true to preview which Connections reconnect vs drop without applying changes.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"dryRun": {
"anyOf": [
{
"type": "boolean"
},
{
"const": "true",
"type": "string"
},
{
"const": "false",
"type": "string"
}
],
"description": "When true, only previews the move: reports which Connections would reconnect vs drop without changing anything."
},
"targetTeamId": {
"description": "ID of the destination team the dashboard moves to.",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"targetTeamId"
],
"type": "object"
},
"name": "movePulseDashboard",
"outputSchema": null
},
{
"description": "Start an asynchronous organization pass over the organization's unfiled processes, placing them into the Process Landscape where possible (organization admin+). Results appear progressively; started is false when there is nothing to organize.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"instructions": {
"description": "Deprecated: ignored. The organize pass takes no instructions.",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId"
],
"type": "object"
},
"name": "organizeClarityProcessLandscape",
"outputSchema": null
},
{
"description": "Pin one of your connections (from GET /v2/teams/:team_id/connections) to this build's integration slot. Multi-pin is supported: a single user can pin multiple connections to the same slot.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"connection_id": {
"description": "ID of one of your connections (from GET /v2/teams/:team_id/connections) to pin to this slot",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID (catalog integration ID or slot ID from the list response)",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id",
"integration_id",
"connection_id"
],
"type": "object"
},
"name": "pinRevisionIntegrationConnection",
"outputSchema": null
},
{
"description": "Post a message to an agent run. This will persist the message and resume the agent execution if the run is in a resumable state (waiting, completed, or interrupted).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"message": {
"description": "The message content to send to the agent",
"minLength": 1,
"type": "string"
},
"run_id": {
"description": "The run's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"run_id",
"message"
],
"type": "object"
},
"name": "postRunMessage",
"outputSchema": null
},
{
"description": "Re-run postprocessing agents on an existing v2 clarity snapshot. Targets either the current-process snapshot or the automation proposal snapshot, identified by id in the body. Flips the process status to `generating` and returns 202 immediately; agents run asynchronously and flip the status back to `review` once they settle.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"current_process_id": {
"description": "Required when type is `current_process`.",
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"transformation_proposal_id": {
"description": "Required when type is `transformation_proposal`.",
"format": "uuid",
"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})$",
"type": "string"
},
"type": {
"description": "The snapshot kind to post-process.",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
}
},
"required": [
"process_id",
"type"
],
"type": "object"
},
"name": "postprocessClaritySnapshot",
"outputSchema": null
},
{
"description": "Preview which other agents would conflict with this agent's case trigger if it pointed at the given queue. Does not modify the trigger.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "The queue to check for conflicts against",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"case_queue_id"
],
"type": "object"
},
"name": "previewAgentCaseTriggerConflicts",
"outputSchema": null
},
{
"description": "Probe an MCP server URL and list the tools it exposes. Useful as a dry-run before creating a connection — verifies the URL is reachable, that authentication headers (if any) are correct, and surfaces the tool catalog. Performs no writes; sits alongside `/v2/teams/:team_id/connections/oauth/mcp/check` (which probes the same URL for OAuth support).",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"headers": {
"additionalProperties": {
"type": "string"
},
"description": "Optional HTTP headers for authentication (raw server_url mode only)",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"integration_slug": {
"description": "Catalog integration slug. The backend resolves the MCP server URL and dummy auth headers server-side — no server_url or headers needed.",
"enum": [
"googlecalendar",
"google-calendar",
"gmail",
"slack",
"googledocs",
"googlesheets",
"googledrive",
"firecrawl",
"exa",
"exa-search",
"exa-company-search",
"exa-people-search",
"deep-research",
"system",
"browser-agent",
"browser-agent-devtools",
"notion",
"linear",
"confluence",
"custom_mcp",
"user_mcp",
"snowflake",
"sharepoint",
"teams",
"onedrive",
"bigquery",
"databricks",
"netsuite",
"outlook",
"microsoft-calendar",
"excel",
"word",
"saps4hana",
"md365",
"businesscentral",
"oraclefusion",
"workday",
"coupa",
"signavio",
"sap-ecc",
"msteams",
"human-in-the-loop",
"email-attachments-reader",
"document-processor",
"google-docs",
"google-sheets",
"google-drive",
"outbound-call",
"case-queue-producer",
"case-queue-consumer",
"handover",
"shopify",
"hubspot",
"zendesk",
"intercom",
"powerbi",
"salesforce",
"pipedrive",
"tableau",
"image-generation",
"forecasting",
"supabase",
"attio",
"amplitude",
"websets",
"firecrawl-platform",
"duvo-computer-use",
"duvo-computer-use-rdp",
"eu-commodity-prices",
"asana",
"jira",
"ssh",
"scheduling",
"github",
"linear-native",
"notion-native",
"granola",
"apify",
"bamboohr",
"edi",
"maersk",
"infor-nexus",
"dhl",
"fedex",
"ups",
"dsv",
"trinity-logistics",
"ontrac",
"dachser",
"hellmann",
"omni-logistics",
"ceva-logistics",
"dpd",
"canada-post",
"o9",
"manhattan",
"blue-yonder"
],
"type": "string"
},
"server_url": {
"description": "Raw MCP server URL to probe (for custom MCP servers)",
"format": "uri",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "probeMcpServer",
"outputSchema": null
},
{
"description": "Promote a draft or historic Clarity v2 snapshot to live for its kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"snapshot_id": {
"description": "Snapshot id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"kind",
"snapshot_id"
],
"type": "object"
},
"name": "promoteClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Promote a draft or historic revision to the live version. The live revision is the one used by triggers and new runs. Fails if the revision is already live, or if a draft revision still has an active builder run.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"build_id": {
"description": "The build's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional description for the promoted revision. Pass null to clear an existing description."
},
"revision_name": {
"description": "Optional display name to set on the promoted revision.",
"maxLength": 80,
"minLength": 1,
"type": "string"
}
},
"required": [
"build_id"
],
"type": "object"
},
"name": "promoteRevision",
"outputSchema": null
},
{
"description": "Make a skill revision the active (live) one. The previously active revision becomes historic and can be re-activated later. Idempotent: promoting the already-active revision succeeds rather than erroring, and still applies any revision_name / revision_description supplied in the body.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"revision_description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional description for the promoted revision. Pass null to clear an existing description."
},
"revision_name": {
"description": "Optional display name to set on the promoted revision.",
"maxLength": 80,
"minLength": 1,
"type": "string"
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id"
],
"type": "object"
},
"name": "promoteSkillRevision",
"outputSchema": null
},
{
"description": "Create a manual process in the organization's Process Landscape, either as an unassigned proposal or atomically assigned to an eligible team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"description": {
"anyOf": [
{
"maxLength": 5000,
"type": "string"
},
{
"type": "null"
}
],
"description": "One short paragraph (1-3 sentences) saying why this process belongs in the landscape. Use only what you saw in the captures. Say what the process is (don't just repeat the name), show proof it really happens, and name where you heard it - be as specific as the captures allow, like \"a warehouse lead said so in their interview\" or \"it came up in two returns recordings\". Use only facts from the captures: never make up sources, people, dates, quotes, or numbers, and don't stretch what was said. If you have no real proof the process happens, don't propose it."
},
"materializationMode": {
"description": "Use \"proposal\" to record a process the organization plausibly needs, owned by `teamId` for review, WITHOUT creating a real process record. `teamId` is then required. Chat-scoped discovery agents may use proposal mode for their pinned team; direct human and API callers require Manager-or-above authority for that team. A proposal is idempotent: an equivalent live proposal under the same parent is returned untouched rather than duplicated. Defaults to \"auto\", which materializes a real process when `teamId` is set — except in a landscape-onboarding chat, which may only propose, and so defaults to \"proposal\".",
"enum": [
"auto",
"proposal"
],
"type": "string"
},
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"parentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"teamId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"required": [
"orgId",
"name"
],
"type": "object"
},
"name": "proposeClarityLandscapeProcess",
"outputSchema": null
},
{
"description": "Publish (share) a Duvo Pulse dashboard to your whole team or your whole organization, or revert it to private (creator only). When publishing, set permission to 'view' (teammates see the dashboard) or 'edit' (teammates can also iterate on it); organization-wide viewers outside the team always get view-only access.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"permission": {
"enum": [
"view",
"edit"
],
"type": "string"
},
"visibility": {
"enum": [
"private",
"team",
"organization"
],
"type": "string"
}
},
"required": [
"artifactId",
"visibility"
],
"type": "object"
},
"name": "publishPulseDashboard",
"outputSchema": null
},
{
"description": "Trigger an on-demand data refresh of a Duvo Pulse dashboard. The dashboard regenerates its connection-sourced values in the background — poll GET /artifacts/{artifactId} for status.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "refreshPulseDashboard",
"outputSchema": null
},
{
"description": "Force a fresh recompute of an aggregation definition.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"definition_id": {
"description": "The aggregation definition's identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"definition_id"
],
"type": "object"
},
"name": "refreshQueueAggregation",
"outputSchema": null
},
{
"description": "Dismiss a pending suggestion.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "The suggestion's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "rejectAgentSuggestion",
"outputSchema": null
},
{
"description": "Remove an agent from an automation on a team that is on the Automations workspace, with or without revisions — membership is not versioned. Deleting the agent interrupts its active runs and pauses their sandboxes, exactly as a standalone agent delete does. On a team that changes its automations by revision, an agent the active revision binds is refused: activate a revision that omits it first.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"agent_id"
],
"type": "object"
},
"name": "removeAutomationAgent",
"outputSchema": null
},
{
"description": "Remove a queue from an automation, deleting the queue. Its cases are cleared and the runs working them interrupted, exactly as a standalone queue delete does. Queue membership is not versioned, so this behaves the same whether or not the team changes its automations by revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"case_queue_id"
],
"type": "object"
},
"name": "removeAutomationQueue",
"outputSchema": null
},
{
"description": "Remove an agent from a draft revision (forward-only removal). Any queue routing to the agent in the draft is unrouted as part of the same change. Live and historic revisions are immutable.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id",
"agent_id"
],
"type": "object"
},
"name": "removeAutomationRevisionAgent",
"outputSchema": null
},
{
"description": "Remove a queue's routing from a draft revision (forward-only removal). Live and historic revisions are immutable.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue ID",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id",
"case_queue_id"
],
"type": "object"
},
"name": "removeAutomationRevisionQueue",
"outputSchema": null
},
{
"description": "Remove a person from the process behind a process landscape node, and revoke the process access they were granted when they were added.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"description": "A process landscape node that is linked to a real process.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"pendingOnly": {
"description": "Pass 'true' to cancel a pending invitation only. If the person has already accepted, nothing is removed and the request fails with 409.",
"type": "string"
},
"personId": {
"description": "The person entry to change, as returned by listClarityLandscapeNodePeople.",
"format": "uuid",
"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})$",
"type": "string"
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId",
"personId"
],
"type": "object"
},
"name": "removeClarityLandscapeNodePerson",
"outputSchema": null
},
{
"description": "Remove accepted access to a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "Clarity process ID.",
"format": "uuid",
"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})$",
"type": "string"
},
"invitationId": {
"description": "Accepted process invitation to remove.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"invitationId"
],
"type": "object"
},
"name": "removeClarityProcessMember",
"outputSchema": null
},
{
"description": "Remove an integration from an agent revision. Removes the slot for everyone on the revision, including all per-user connection pins. Requires edit permission on the agent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID (catalog integration ID or slot ID from the list response)",
"format": "uuid",
"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})$",
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"agent_id",
"build_id",
"integration_id"
],
"type": "object"
},
"name": "removeRevisionIntegration",
"outputSchema": null
},
{
"description": "Remove a member from a team. Removing another member requires the Superadmin role or above; any member may remove themselves (leaving the team). The last remaining Owner cannot be removed, and a member whose Owner role is inherited from the organization can only leave voluntarily.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"memberId": {
"description": "Member (user) ID",
"format": "uuid",
"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})$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"memberId"
],
"type": "object"
},
"name": "removeTeamMember",
"outputSchema": null
},
{
"description": "Rename a file in team storage.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"newFilenameOnly": {
"description": "New file name (no extension; the existing extension is preserved)",
"minLength": 1,
"type": "string"
},
"relativePath": {
"description": "Current path of the file relative to the team's storage root",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"relativePath",
"newFilenameOnly"
],
"type": "object"
},
"name": "renameFile",
"outputSchema": null
},
{
"description": "Reorder the team's process folders to match the given id order. The payload must name every folder exactly once.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folderIds": {
"description": "Every team folder ID, in the desired display order.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 500,
"minItems": 1,
"type": "array"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"folderIds"
],
"type": "object"
},
"name": "reorderClarityFolders",
"outputSchema": null
},
{
"description": "Reorder a sibling group of the organization's process landscape area folders left-to-right — the top-level areas by default, or the folder children of parentId (organization admin+). This changes display order only; use setClarityLandscapeNodePlacement to move a node to a different parent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orderedAreaIds": {
"description": "Every area folder in the sibling group, exactly once, in the order you want them displayed left-to-right. Read the current siblings first (getClarityProcessTree); a partial list is rejected with 400.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"parentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The parent area whose folder children are being reordered. Omit or pass null to reorder the top-level areas."
}
},
"required": [
"orgId",
"orderedAreaIds"
],
"type": "object"
},
"name": "reorderClarityLandscapeAreas",
"outputSchema": null
},
{
"description": "Replace the entire case-level evaluation rubric set on a queue's current version (1 to 12 rubrics). Existing rubrics are removed and the supplied list becomes the new set. An empty list is refused — whole-case evaluation regenerates rubrics for an empty set at the next settlement, so a cleared set would not stay cleared; remove individual rubrics instead. Targets the queue's current version (build-set), which exists once its first Agent-processed case settles — this fails with 409 before then. Cases already judged keep their original verdicts.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"rubrics": {
"description": "The complete case-level rubric set for the queue's current version (at least 1 rubric). Replaces every existing rubric.",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"title",
"description"
],
"type": "object"
},
"maxItems": 12,
"minItems": 1,
"type": "array"
}
},
"required": [
"queue_id",
"rubrics"
],
"type": "object"
},
"name": "replaceCaseQueueEvalRubrics",
"outputSchema": null
},
{
"description": "Replace a build's entire Agent-specific evaluation rubric set in one call (at most 5 rubrics). Existing custom rubrics are removed and the supplied list becomes the new set; pass an empty array to clear them. Defaults to the Agent's live build; pass build_id to target a specific revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Replace the custom rubrics on this build (revision). Defaults to the agent's live build when omitted.",
"format": "uuid",
"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})$",
"type": "string"
},
"rubrics": {
"description": "The complete custom rubric set for the build. Replaces every existing custom rubric; pass an empty array to clear them.",
"items": {
"additionalProperties": false,
"properties": {
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"title",
"description"
],
"type": "object"
},
"maxItems": 5,
"type": "array"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"agentId",
"rubrics"
],
"type": "object"
},
"name": "replaceEvalRubrics",
"outputSchema": null
},
{
"description": "Replace a queue's Case schema with a new version. Every declared field is frozen against automated change, so this is the only way one can be edited.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"change_summary": {
"maxLength": 500,
"minLength": 1,
"type": "string"
},
"expected_schema_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"schema": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"required": [
"queue_id",
"schema",
"change_summary"
],
"type": "object"
},
"name": "replaceQueueJsonSchema",
"outputSchema": null
},
{
"description": "Replace the set of queues linked to this build's case-queue integration slot. Send the full desired queue list — any queues not in the list will be unlinked. Requires edit permission on the agent. After linking, call getRevisionCaseQueueSetup to confirm the slot now reports linked_queue_count > 0.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_ids": {
"description": "Full set of queue IDs to link to this slot. Replaces any existing links.",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"type": "array"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"agent_id",
"build_id",
"integration_id",
"queue_ids"
],
"type": "object"
},
"name": "replaceRevisionIntegrationQueues",
"outputSchema": null
},
{
"description": "Respond to a human-in-the-loop request. Use 'approved' (true/false) for approval-type requests, or 'answers' ({question: answer}) for question-type requests. Only works when the run is in 'waiting' status.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"answers": {
"additionalProperties": {
"type": "string"
},
"description": "For question-type requests: a map of question text to answer. Multi-select answers should be comma-separated.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"approved": {
"description": "For approval-type requests: true to approve, false to deny",
"type": "boolean"
},
"request_id": {
"description": "The human request's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"run_id": {
"description": "The run's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"run_id",
"request_id"
],
"type": "object"
},
"name": "respondToHumanRequest",
"outputSchema": null
},
{
"description": "Show a hidden Policy question again, with the answer it had.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "The automation's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"field_id": {
"description": "The config field's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"field_id"
],
"type": "object"
},
"name": "restoreConfigField",
"outputSchema": null
},
{
"description": "Restore a previous version of a Duvo Pulse dashboard, making it live again (requires edit access). Non-destructive — it moves the head pointer to the chosen version.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"revisionId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"artifactId",
"revisionId"
],
"type": "object"
},
"name": "restorePulseDashboardVersion",
"outputSchema": null
},
{
"description": "Resume a builder run that is waiting for user input",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"answers": {
"additionalProperties": {
"type": "string"
},
"description": "Answers keyed by the exact question text in pending_user_questions.questions.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"builder_run_id": {
"description": "The builder run waiting for answers.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"builder_run_id",
"answers"
],
"type": "object"
},
"name": "resumeBuilderRun",
"outputSchema": null
},
{
"description": "Archive a Clarity v2 snapshot of either kind. If the live row is archived, the repository auto-promotes the latest historic row of the same kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"snapshot_id": {
"description": "Snapshot id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"kind",
"snapshot_id"
],
"type": "object"
},
"name": "revertClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Save user edits as the live Clarity v2 snapshot for the selected kind.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"baselineSnapshotId": {
"format": "uuid",
"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})$",
"type": "string"
},
"clarityCurrentProcessId": {
"format": "uuid",
"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})$",
"type": "string"
},
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"projectedImpact": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Answer-first, MECE-structured business case. 4-8 sentences of prose + one markdown assumptions table. Null when team context is insufficient to produce any quantitative or qualitative assessment."
},
"steps": {
"items": {
"anyOf": [
{
"oneOf": [
{
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Always null on events; included for shape compatibility across variants."
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional prose describing what happens at this event. May be null for structural markers."
},
"exceptions": {
"description": "Distinct failure modes for this step in display order. Use an empty array when none are documented. Preserve each id when the same exception is edited or regenerated.",
"items": {
"properties": {
"exception": {
"description": "A distinct failure mode that can happen at this step.",
"minLength": 1,
"type": "string"
},
"frequency": {
"anyOf": [
{
"enum": [
"rare",
"occasional",
"frequent"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Observed frequency. Null unless evidence explicitly supports rare, occasional, or frequent."
},
"handling": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "How the team responds to this exception. Null when the response was not documented."
},
"id": {
"description": "Stable identifier for this exception. Preserve it when the same exception is edited or regenerated. Example: \"exception-po-mismatch\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"exception",
"handling",
"frequency"
],
"type": "object"
},
"type": "array"
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN event subtype. \"start\" (entry trigger), \"end\" (terminal state), \"timer\" (time-based wait), \"message\" (external communication), \"escalation\" (route to higher authority).",
"enum": [
"start",
"end",
"timer",
"message",
"escalation"
],
"type": "string"
},
"nodeType": {
"const": "event",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional reason for the event's existence. May be null for structural markers."
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting this event. Empty array allowed (structural markers carry no evidence); non-empty values must follow the source schema.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exceptions",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
},
{
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional precondition that gates this task. Null when the task is unconditional. Example: \"Only when invoice total exceeds $10,000\""
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"description": "Full prose paragraph describing what happens in this step in natural language. Used for documentation reconstruction. Example: \"Finance reviews the invoice in NetSuite, checking line item accuracy and matching against the purchase order before flagging for approval.\"",
"minLength": 1,
"type": "string"
},
"exceptions": {
"description": "Distinct failure modes for this step in display order. Use an empty array when none are documented. Preserve each id when the same exception is edited or regenerated.",
"items": {
"properties": {
"exception": {
"description": "A distinct failure mode that can happen at this step.",
"minLength": 1,
"type": "string"
},
"frequency": {
"anyOf": [
{
"enum": [
"rare",
"occasional",
"frequent"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Observed frequency. Null unless evidence explicitly supports rare, occasional, or frequent."
},
"handling": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "How the team responds to this exception. Null when the response was not documented."
},
"id": {
"description": "Stable identifier for this exception. Preserve it when the same exception is edited or regenerated. Example: \"exception-po-mismatch\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"exception",
"handling",
"frequency"
],
"type": "object"
},
"type": "array"
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN task subtype. \"user\" (human work), \"service\" (automated/API call), \"send\"/\"receive\" (messaging), \"manual\" (offline physical work), \"businessRule\" (rule engine), \"script\" (code execution).",
"enum": [
"user",
"service",
"send",
"receive",
"manual",
"businessRule",
"script"
],
"type": "string"
},
"nodeType": {
"const": "task",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"description": "Why this step exists in the process — its purpose or business reason. Used by downstream agents to assess whether the step is essential or removable. Example: \"Catches mispriced line items before they reach the customer and prevents downstream credit notes.\"",
"minLength": 1,
"type": "string"
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting this step's existence and details. At least one source is required — every step must trace back to something in the captures.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exceptions",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
},
{
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"description": "Decision criteria evaluated at this gateway. BPMN requires this on every branching gateway. Existing rows persisted with null/empty values parse as \"unknown\" via a read-side preprocess; producers should write a real condition string going forward.",
"minLength": 1,
"type": "string"
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"description": "Full prose describing the decision logic at this gateway.",
"minLength": 1,
"type": "string"
},
"exceptions": {
"description": "Distinct failure modes for this step in display order. Use an empty array when none are documented. Preserve each id when the same exception is edited or regenerated.",
"items": {
"properties": {
"exception": {
"description": "A distinct failure mode that can happen at this step.",
"minLength": 1,
"type": "string"
},
"frequency": {
"anyOf": [
{
"enum": [
"rare",
"occasional",
"frequent"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Observed frequency. Null unless evidence explicitly supports rare, occasional, or frequent."
},
"handling": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "How the team responds to this exception. Null when the response was not documented."
},
"id": {
"description": "Stable identifier for this exception. Preserve it when the same exception is edited or regenerated. Example: \"exception-po-mismatch\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"exception",
"handling",
"frequency"
],
"type": "object"
},
"type": "array"
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN gateway subtype. \"exclusive\" (XOR — exactly one branch taken), \"parallel\" (AND — all branches taken), \"inclusive\" (OR — one or more branches taken).",
"enum": [
"exclusive",
"parallel",
"inclusive"
],
"type": "string"
},
"nodeType": {
"const": "gateway",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"description": "Why this branching decision exists in the process.",
"minLength": 1,
"type": "string"
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting the decision criteria.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exceptions",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
}
]
},
{
"oneOf": [
{
"additionalProperties": false,
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Always null on events; included for shape compatibility across variants."
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional prose describing what happens at this event. May be null for structural markers."
},
"exception": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Known exceptions, errors, or failure modes observed in the captures for this step. Null when none were mentioned. Example: \"Customer disputes line items or PO number does not match\""
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"handling": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "How exceptions or escalations are handled — escalation path, fallback action, or retry strategy. Null when no exception or no handling described. Example: \"Escalate to AP manager via email and pause processing until resolved\""
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN event subtype. \"start\" (entry trigger), \"end\" (terminal state), \"timer\" (time-based wait), \"message\" (external communication), \"escalation\" (route to higher authority).",
"enum": [
"start",
"end",
"timer",
"message",
"escalation"
],
"type": "string"
},
"nodeType": {
"const": "event",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional reason for the event's existence. May be null for structural markers."
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting this event. Empty array allowed (structural markers carry no evidence); non-empty values must follow the source schema.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exception",
"handling",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional precondition that gates this task. Null when the task is unconditional. Example: \"Only when invoice total exceeds $10,000\""
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"description": "Full prose paragraph describing what happens in this step in natural language. Used for documentation reconstruction. Example: \"Finance reviews the invoice in NetSuite, checking line item accuracy and matching against the purchase order before flagging for approval.\"",
"minLength": 1,
"type": "string"
},
"exception": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Known exceptions, errors, or failure modes observed in the captures for this step. Null when none were mentioned. Example: \"Customer disputes line items or PO number does not match\""
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"handling": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "How exceptions or escalations are handled — escalation path, fallback action, or retry strategy. Null when no exception or no handling described. Example: \"Escalate to AP manager via email and pause processing until resolved\""
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN task subtype. \"user\" (human work), \"service\" (automated/API call), \"send\"/\"receive\" (messaging), \"manual\" (offline physical work), \"businessRule\" (rule engine), \"script\" (code execution).",
"enum": [
"user",
"service",
"send",
"receive",
"manual",
"businessRule",
"script"
],
"type": "string"
},
"nodeType": {
"const": "task",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"description": "Why this step exists in the process — its purpose or business reason. Used by downstream agents to assess whether the step is essential or removable. Example: \"Catches mispriced line items before they reach the customer and prevents downstream credit notes.\"",
"minLength": 1,
"type": "string"
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting this step's existence and details. At least one source is required — every step must trace back to something in the captures.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exception",
"handling",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"action": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Verb-led one-liner summarizing the concrete action performed. Example: \"Reviews invoice line items in NetSuite against the purchase order.\""
},
"assumptions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Assumptions the LLM made when extracting this step that were not directly stated in captures. Null if none. Used by verification agents to flag risky inferences. Example: [\"Invoices are reviewed within 24 hours of receipt\"]"
},
"condition": {
"description": "Decision criteria evaluated at this gateway. BPMN requires this on every branching gateway. Existing rows persisted with null/empty values parse as \"unknown\" via a read-side preprocess; producers should write a real condition string going forward.",
"minLength": 1,
"type": "string"
},
"confidence": {
"description": "Confidence in the accuracy of this step given evidence quality and completeness. \"high\" = directly stated by multiple sources, \"medium\" = stated by one source or inferred from strong signals, \"low\" = inferred with significant assumptions.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"description": {
"description": "Full prose describing the decision logic at this gateway.",
"minLength": 1,
"type": "string"
},
"exception": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Known exceptions, errors, or failure modes observed in the captures for this step. Null when none were mentioned. Example: \"Customer disputes line items or PO number does not match\""
},
"extraCaptureNeeded": {
"anyOf": [
{
"properties": {
"gap": {
"description": "Plain-language description of what about this step is unknown or under-specified, blocking automation. One short sentence. Example: \"We don't know which fields the AP analyst copies from the invoice into NetSuite.\"",
"minLength": 1,
"type": "string"
},
"id": {
"description": "Id of the `clarity_proposal_extra_capture_request` row this slot points at. Created server-side by the agent after the LLM call; the LLM never produces this value.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposal": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "What the new capture should include in order to resolve the gap — concrete actions, screens, or decisions the user should walk through. Optional: omit when no specific proposal can be inferred. Example: \"Walk through reviewing one invoice in NetSuite end-to-end while narrating each field you check.\""
}
},
"required": [
"id",
"gap"
],
"type": "object"
},
{
"type": "null"
}
]
},
"handling": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "How exceptions or escalations are handled — escalation path, fallback action, or retry strategy. Null when no exception or no handling described. Example: \"Escalate to AP manager via email and pause processing until resolved\""
},
"id": {
"description": "Stable identifier for the step. Referenced by targetSteps[].stepId and by postprocessing agents annotating specific steps. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
},
"input": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Information or artifacts required to start this step. Null on start events or steps with no preconditions. Example: \"Invoice PDF and matching purchase order number\""
},
"linkedAgentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Id of the Duvo Agent that performs this step. Set by a person in edit mode, never by a generating or postprocessing agent; the save route rejects an id that is not a live Agent on the process's team."
},
"nodeSubtype": {
"description": "BPMN gateway subtype. \"exclusive\" (XOR — exactly one branch taken), \"parallel\" (AND — all branches taken), \"inclusive\" (OR — one or more branches taken).",
"enum": [
"exclusive",
"parallel",
"inclusive"
],
"type": "string"
},
"nodeType": {
"const": "gateway",
"type": "string"
},
"openQuestions": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"description": "Specific gaps in understanding that a follow-up capture should address. Null if none. Drives the next interview or document request. Example: [\"Is there a backup approver when the AP manager is out of office?\"]"
},
"output": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What this step produces or updates. Null on pure waits or events that emit nothing. Example: \"Approved invoice record in NetSuite with reviewer signature\""
},
"rationale": {
"description": "Why this branching decision exists in the process.",
"minLength": 1,
"type": "string"
},
"readiness": {
"anyOf": [
{
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Automation-readiness rating for this step. \"high\" = fully automatable today, \"medium\" = partially automatable or needs minor changes, \"low\" = blocked by manual review, judgement, or missing data."
},
"readinessRationale": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "One-sentence justification for the readiness rating, citing the specific signals that drove the choice. Example: \"Requires human judgement on edge cases that are not documented in the captures.\""
},
"role": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Performer of this step — the specific job title, team, or system. Use \"Duvo\" for automated actions and \"System\" for system-triggered steps. Examples: \"Finance Analyst\", \"Sales Operations\", \"Duvo\", \"System\""
},
"sources": {
"description": "Evidence supporting the decision criteria.",
"items": {
"properties": {
"attribution": {
"description": "Human-readable source label identifying who or what the evidence comes from. Examples: \"Anna (sales interview)\", \"Onboarding SOP §3.2\", \"Slack #ops 2024-06-12\"",
"minLength": 1,
"type": "string"
},
"captureId": {
"description": "Durable clarity_capture id for this source. Use app-owned ids from the evidence index, never sandbox file paths.",
"minLength": 1,
"type": "string"
},
"evidenceId": {
"description": "Stable id of the evidence unit from /workspace/captures/evidence-index.json when generation used that index.",
"minLength": 1,
"type": "string"
},
"excerpt": {
"description": "Verbatim supporting text quoted from the capture, document, or transcript. Example: \"We always wait for finance to sign off before sending the invoice.\"",
"minLength": 1,
"type": "string"
},
"locator": {
"description": "Durable in-capture location for the excerpt. Missing means legacy free-text source; unresolved means a structured citation was attempted but could not be resolved.",
"oneOf": [
{
"properties": {
"messageIndex": {
"description": "Zero-based index into the capture transcript message array. This is the durable key; timestampMs is only supplemental.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"timestampMs": {
"description": "Optional epoch-millisecond timestamp for the transcript message when the capture supplied one.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "transcript_message",
"type": "string"
}
},
"required": [
"type",
"messageIndex"
],
"type": "object"
},
{
"properties": {
"endLine": {
"description": "Optional one-based line number where the cited text ends on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"endOffset": {
"description": "Exclusive character offset into the stored capture text. Must be greater than startOffset.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"pageNumber": {
"description": "Optional one-based PDF page number when the stored capture has page metadata.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startLine": {
"description": "Optional one-based line number where the cited text starts on pageNumber.",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"type": "integer"
},
"startOffset": {
"description": "Zero-based character offset into the stored capture text.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "document_text_range",
"type": "string"
}
},
"required": [
"type",
"startOffset",
"endOffset"
],
"type": "object"
},
{
"properties": {
"elementId": {
"description": "BPMN XML element id within an uploaded .bpmn document.",
"minLength": 1,
"type": "string"
},
"elementType": {
"description": "Optional BPMN element type as parsed from the XML, for example \"bpmn:UserTask\" or \"bpmn:ExclusiveGateway\".",
"minLength": 1,
"type": "string"
},
"name": {
"description": "Optional BPMN element name as parsed from the XML. The element id is the durable key.",
"minLength": 1,
"type": "string"
},
"type": {
"const": "bpmn_element",
"type": "string"
}
},
"required": [
"type",
"elementId"
],
"type": "object"
},
{
"properties": {
"timestampMs": {
"description": "Epoch-millisecond frame timestamp matching a screenshare frame filename.",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"type": {
"const": "screenshare_frame",
"type": "string"
}
},
"required": [
"type",
"timestampMs"
],
"type": "object"
},
{
"properties": {
"type": {
"const": "manual",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
{
"properties": {
"reason": {
"minLength": 1,
"type": "string"
},
"type": {
"const": "unresolved",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
}
]
},
"resolutionStatus": {
"description": "Resolution status for the structured source link. Legacy sources may omit this field.",
"enum": [
"resolved",
"unresolved",
"legacy",
"manual"
],
"type": "string"
},
"sourceConfidence": {
"description": "Confidence in this individual source citation. \"high\" = direct quote at the locator, \"medium\" = strong nearby evidence, \"low\" = weak or inferred support.",
"enum": [
"low",
"medium",
"high"
],
"type": "string"
}
},
"required": [
"attribution",
"excerpt"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"system": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "System, tool, or application used to perform this step. Null when the step is purely manual or is a decision/event with no associated tool. Examples: \"NetSuite\", \"Gmail\", \"Excel\", null"
},
"targetSteps": {
"description": "Outgoing BPMN edges from this step. Empty array only on end events. Exclusive and inclusive gateways must have ≥2 entries with exactly one isDefault: true.",
"items": {
"properties": {
"isDefault": {
"description": "True on exactly one outgoing edge of an exclusive or inclusive gateway, marking the fallback taken when no other condition matches. False on all other edges.",
"type": "boolean"
},
"label": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Human-readable label shown on the BPMN edge. For gateways, the outcome answer; for default flows, \"Otherwise\". Examples: \"Approved\", \"> $5k\", \"Otherwise\""
},
"stepId": {
"description": "Id of the step this edge points to. Must match an existing step.id in the same steps array. Example: \"step-review-invoice\"",
"minLength": 1,
"type": "string"
}
},
"required": [
"stepId",
"label",
"isDefault"
],
"type": "object"
},
"type": "array"
},
"title": {
"description": "Required node label used in lists and BPMN node labels. Structural markers use defaults such as \"Start\" and \"End\".",
"minLength": 1,
"type": "string"
}
},
"required": [
"id",
"targetSteps",
"title",
"action",
"role",
"system",
"input",
"output",
"exception",
"handling",
"assumptions",
"openQuestions",
"confidence",
"nodeType",
"nodeSubtype",
"description",
"rationale",
"sources",
"condition"
],
"type": "object"
}
]
}
]
},
"minItems": 1,
"type": "array"
},
"summary": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "One short paragraph (3-5 sentences) describing the captured process at a glance. Surfaced at the top of the current-process tab so reviewers can orient themselves before scanning the steps. Example: \"Customers order beer at the bar; the bartender greets them, picks an option matching their preference, pours and garnishes the glass, then rings the order through the POS before serving.\""
},
"swot": {
"anyOf": [
{
"properties": {
"opportunities": {
"description": "External openings the current process could exploit — adjacent automations, scale effects, or unmet needs surfaced by the captures. Example: \"POS data could feed dynamic pricing for slow hours.\"",
"items": {
"minLength": 1,
"type": "string"
},
"type": "array"
},
"strengths": {
"description": "Internal advantages of the current process — capabilities, resources, or design choices that work in its favour today. Phrase each as a short, evidence-backed statement. Example: \"Bartenders know regulars by name, which keeps service personal during peak hours.\"",
"items": {
"minLength": 1,
"type": "string"
},
"type": "array"
},
"threats": {
"description": "External risks that could degrade the current process — regulatory, operational, technological, or human factors visible in the captures. Example: \"New ID-check legislation will require staff to interrupt every order.\"",
"items": {
"minLength": 1,
"type": "string"
},
"type": "array"
},
"weaknesses": {
"description": "Internal limitations of the current process — gaps, inefficiencies, or fragile assumptions visible in how it runs today. Phrase each as a short, evidence-backed statement. Example: \"Manual pour times balloon during rushes because there is only one tap.\"",
"items": {
"minLength": 1,
"type": "string"
},
"type": "array"
}
},
"required": [
"strengths",
"weaknesses",
"opportunities",
"threats"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "SWOT analysis produced by the swot-analysis postprocessing agent. `undefined` = agent has not yet run; `null` = agent ran and produced no analysis."
}
},
"required": [
"process_id",
"kind",
"steps",
"baselineSnapshotId"
],
"type": "object"
},
"name": "saveClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Search cases in a queue with rich filters (multi-status, date ranges, label-based filters, and field-value filters over a typed queue's json_data). Use this when the simple query-string filters on GET /v2/queues/:queue_id/cases aren't enough. Each json_data entry is {path, operator, value} where path is a declared scalar in JSONPath dotted form ($.invoice.amount); entries are ANDed, so two comparisons on one path express a range. A path the queue's Case schema does not declare is rejected rather than ignored, as is a value that does not match the field's declared type. The contains operator is case-sensitive (unlike the free-text search parameter). Set count_only=true to skip Case row selection, enrichment, and transformation. The normal response shape is returned with cases: [] and the matching total.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"count_only": {
"description": "Skip Case row selection, enrichment, and transformation. The normal response shape contains an empty cases array and the matching total.",
"type": "boolean"
},
"filters": {
"default": {},
"properties": {
"awaiting_my_approval": {
"type": "boolean"
},
"created_at_from": {
"type": "string"
},
"created_at_to": {
"type": "string"
},
"issue_severity": {
"items": {
"enum": [
"critical",
"medium"
],
"type": "string"
},
"type": "array"
},
"json_data": {
"items": {
"additionalProperties": false,
"properties": {
"operator": {
"enum": [
"equals",
"notEquals",
"in",
"notIn",
"gt",
"gte",
"lt",
"lte",
"contains",
"isSet",
"isNotSet"
],
"type": "string"
},
"path": {
"pattern": "^\\$(\\.[A-Za-z_][A-Za-z0-9_]{0,63})+$",
"type": "string"
},
"value": {
"anyOf": [
{
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
},
"maxItems": 100,
"minItems": 1,
"type": "array"
}
]
}
},
"required": [
"path",
"operator"
],
"type": "object"
},
"maxItems": 12,
"type": "array"
},
"labels": {
"additionalProperties": {
"items": {
"type": "string"
},
"type": "array"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"priority": {
"items": {
"enum": [
"none",
"medium",
"high"
],
"type": "string"
},
"type": "array"
},
"status": {
"items": {
"enum": [
"all",
"pending",
"processing",
"needs_input",
"postponed",
"needs_review",
"resolved",
"canceled",
"claimed",
"completed",
"failed"
],
"type": "string"
},
"type": "array"
},
"updated_at_from": {
"type": "string"
},
"updated_at_to": {
"type": "string"
}
},
"type": "object"
},
"limit": {
"default": 25,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"search": {
"type": "string"
},
"sort_by": {
"default": "created_at",
"enum": [
"created_at",
"updated_at",
"postponed_to"
],
"type": "string"
},
"sort_order": {
"default": "desc",
"enum": [
"asc",
"desc"
],
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "searchCases",
"outputSchema": null
},
{
"description": "Send an instruction to iterate on a Duvo Pulse dashboard (e.g. 'make it a bar chart', 'filter to last 14 days'). The creator can always iterate; teammates can too when the Pulse is published to the team with edit access. The agent regenerates asynchronously — poll GET /artifacts/{artifactId} for status.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"attachments": {
"description": "Attachments to hand the agent, uploaded beforehand via the upload-urls endpoint (max 5)",
"items": {
"properties": {
"attachment_id": {
"description": "An attachment_id returned by upload-urls",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"attachment_id"
],
"type": "object"
},
"maxItems": 5,
"type": "array"
},
"from_revision_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"message": {
"maxLength": 15000,
"minLength": 1,
"type": "string"
},
"selected_element": {
"properties": {
"label": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"openui_node": {
"properties": {
"component": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"source": {
"maxLength": 2000,
"type": "string"
},
"statement": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"statement",
"component"
],
"type": "object"
},
"outer_html": {
"maxLength": 4000,
"minLength": 1,
"type": "string"
},
"point": {
"properties": {
"x_ratio": {
"maximum": 1,
"minimum": 0,
"type": "number"
},
"y_ratio": {
"maximum": 1,
"minimum": 0,
"type": "number"
}
},
"required": [
"x_ratio",
"y_ratio"
],
"type": "object"
},
"selector": {
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
"tag_name": {
"maxLength": 50,
"minLength": 1,
"type": "string"
},
"text": {
"maxLength": 500,
"type": "string"
}
},
"required": [
"selector",
"label",
"tag_name",
"outer_html"
],
"type": "object"
}
},
"required": [
"artifactId",
"message"
],
"type": "object"
},
"name": "sendPulseDashboardMessage",
"outputSchema": null
},
{
"description": "Email an invitation to its recipient. Use this to deliver an invitation created by createTeamInvite (which never sends mail on its own), or to resend one the recipient never received. The accept link is always built from the server-configured app origin.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"frontendUrl": {
"description": "Deprecated. Accepted for backward compatibility and IGNORED: the accept link is always built from the server-configured app origin, so a caller cannot point invitation emails at another host.",
"format": "uri",
"type": "string"
},
"id": {
"description": "ID of the invitation to email.",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "sendTeamInviteEmail",
"outputSchema": null
},
{
"description": "Fold a build into a draft revision for one agent — adds the agent to the revision or replaces the build it references. Live and historic revisions are immutable.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent to bind in the revision",
"format": "uuid",
"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})$",
"type": "string"
},
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build to reference for the agent",
"format": "uuid",
"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})$",
"type": "string"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id",
"agent_id",
"build_id"
],
"type": "object"
},
"name": "setAutomationRevisionAgent",
"outputSchema": null
},
{
"description": "Set the per-revision routing for one queue in a draft revision — which agent it triggers, whether it is enabled, and per-revision name/description overrides. Partial update: only the fields you send are changed; omitted fields keep their current value (or take the default when the queue is first added). Live and historic revisions are immutable.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Agent the queue routes to (null clears routing; omit to keep current)"
},
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue to route in the revision",
"format": "uuid",
"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})$",
"type": "string"
},
"description": {
"anyOf": [
{
"maxLength": 2000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Per-revision description override (null clears; omit to keep current)"
},
"enabled": {
"description": "Whether routing is enabled (omit to keep current; default true when new)",
"type": "boolean"
},
"name": {
"anyOf": [
{
"maxLength": 200,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Per-revision name override (null clears; omit to keep current)"
},
"revision_id": {
"description": "Revision ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"automation_id",
"revision_id",
"case_queue_id"
],
"type": "object"
},
"name": "setAutomationRevisionQueue",
"outputSchema": null
},
{
"description": "Move a process landscape node (team manager or above for team processes; organization admin for areas)",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"parentId": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"orgId",
"nodeId",
"parentId"
],
"type": "object"
},
"name": "setClarityLandscapeNodePlacement",
"outputSchema": null
},
{
"description": "Set or clear heatmap priorities in one batch (team managers for their processes; organization admin+ across the organization)",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"org_id": {
"description": "Organization whose landscape is being assessed.",
"format": "uuid",
"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})$",
"type": "string"
},
"priorities": {
"description": "Process priority updates applied atomically.",
"items": {
"properties": {
"node_id": {
"description": "Process landscape node receiving the assessment.",
"format": "uuid",
"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})$",
"type": "string"
},
"priority": {
"anyOf": [
{
"enum": [
"high",
"medium",
"low"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Priority to set, or null to clear the assessment."
},
"reasoning": {
"anyOf": [
{
"maxLength": 2000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Brief rationale for the priority."
}
},
"required": [
"node_id",
"priority"
],
"type": "object"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
}
},
"required": [
"org_id",
"priorities"
],
"type": "object"
},
"name": "setClarityLandscapePriorities",
"outputSchema": null
},
{
"description": "Mark a Duvo Pulse dashboard comment thread complete, or reopen it (requires view access). Pass the target state in `resolved`; the call is idempotent, and the response carries the thread with `resolved_at` and `resolved_by` set or cleared.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"commentId": {
"format": "uuid",
"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})$",
"type": "string"
},
"resolved": {
"type": "boolean"
}
},
"required": [
"artifactId",
"commentId",
"resolved"
],
"type": "object"
},
"name": "setPulseDashboardCommentResolution",
"outputSchema": null
},
{
"description": "Create one linked folder per landscape group node containing this team's processes. Idempotent: groups that already have a linked folder are skipped.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "setupClarityFoldersFromLandscape",
"outputSchema": null
},
{
"description": "Start a Clarity → SAP Signavio export job",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"bpmnXml": {
"maxLength": 5000000,
"minLength": 1,
"type": "string"
},
"connectionInstanceId": {
"format": "uuid",
"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)$",
"type": "string"
},
"processApproverRef": {
"pattern": "^\\/glossary\\/[0-9a-zA-Z_-]+$",
"type": "string"
},
"processId": {
"format": "uuid",
"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)$",
"type": "string"
},
"processOwnerRef": {
"pattern": "^\\/glossary\\/[0-9a-zA-Z_-]+$",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"processId",
"connectionInstanceId",
"bpmnXml"
],
"type": "object"
},
"name": "startClarityExport",
"outputSchema": null
},
{
"description": "Start an OAuth-based connection with a native provider (Gmail, Google Sheets, Outlook, etc.). Returns an authorization URL that must be opened in a browser by a human end-user; once they grant consent, Duvo creates the matching connection and redirects the browser to the optional `return_url` (or the Duvo dashboard if none is provided). Poll `/v2/teams/:team_id/connections` to detect the new connection.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"provider": {
"description": "OAuth provider slug (e.g. 'google', 'gmail', 'googlesheets', 'outlook'). Must match a configured native OAuth provider.",
"type": "string"
},
"reconnect_instance_id": {
"description": "When set, the OAuth flow will update the existing connection in place rather than creating a new one.",
"format": "uuid",
"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})$",
"type": "string"
},
"return_url": {
"description": "Where to send the user's browser after OAuth completes.",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"provider"
],
"type": "object"
},
"name": "startNativeOAuth",
"outputSchema": null
},
{
"description": "Start a new agent run. Returns immediately with run info - does not wait for completion.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent ID to run",
"format": "uuid",
"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})$",
"type": "string"
},
"message": {
"description": "Optional initial message to start the run with (e.g. a trigger payload or user instruction)",
"type": "string"
},
"sandbox_id": {
"description": "Optional sandbox ID with pre-uploaded files",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
},
"webhook_url": {
"description": "Webhook URL to POST events to (human_request, run_completed, run_failed, run_interrupted)",
"format": "uri",
"type": "string"
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "startRun",
"outputSchema": null
},
{
"description": "Stop an in-flight artifact-chat turn. Flips the conversation back to `open` first so the interrupted run's late webhooks are dropped as stale, then best-effort interrupts the cc-server execution.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"conversation_id": {
"format": "uuid",
"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})$",
"type": "string"
},
"process_id": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"conversation_id"
],
"type": "object"
},
"name": "stopClarityArtifactChatConversation",
"outputSchema": null
},
{
"description": "Stop an in-flight snapshot generation for the selected kind. Reads the sandbox id from the process row, kills the sandbox, flips the process back to `review`, and clears the sandbox marker so any late webhook from the killed run is dropped as stale.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"kind": {
"description": "Snapshot kind to list",
"enum": [
"current_process",
"transformation_proposal"
],
"type": "string"
},
"process_id": {
"description": "The clarity process id",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"process_id",
"kind"
],
"type": "object"
},
"name": "stopClarityProcessSnapshot",
"outputSchema": null
},
{
"description": "Stop an in-flight Duvo Pulse generation turn. Requires edit access to the dashboard. Flips the dashboard to 'interrupted' and keeps any streamed-so-far reply; stopping when nothing is generating is a successful no-op.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"partial_text": {
"description": "The assistant text streamed so far, kept in the conversation as the partial reply. Omit when calling from an API client without streaming state.",
"type": "string"
}
},
"required": [
"artifactId"
],
"type": "object"
},
"name": "stopPulseDashboardMessage",
"outputSchema": null
},
{
"description": "Stop an agent run. No-op if the run is not currently running.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"run_id": {
"description": "The run's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"run_id"
],
"type": "object"
},
"name": "stopRun",
"outputSchema": null
},
{
"description": "Remove the given labels from a case.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"label_ids": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id",
"case_id",
"label_ids"
],
"type": "object"
},
"name": "unlinkCaseLabels",
"outputSchema": null
},
{
"description": "Remove process tags from a process.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"labelIds": {
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"id",
"labelIds"
],
"type": "object"
},
"name": "unlinkClarityProcessLabels",
"outputSchema": null
},
{
"description": "Unpin one of your connections from this build's integration slot. The connection itself is not deleted; only the binding to this slot is removed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "Agent ID",
"format": "uuid",
"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})$",
"type": "string"
},
"build_id": {
"description": "Build ID",
"format": "uuid",
"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})$",
"type": "string"
},
"connection_id": {
"description": "Connection ID to unpin",
"format": "uuid",
"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})$",
"type": "string"
},
"integration_id": {
"description": "Integration ID (catalog integration ID or slot ID from the list response)",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"build_id",
"integration_id",
"connection_id"
],
"type": "object"
},
"name": "unpinRevisionIntegrationConnection",
"outputSchema": null
},
{
"description": "Update an agent's display name or delivery settings.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"agentic_memory_enabled": {
"description": "Toggle agentic memory for the agent.",
"type": "boolean"
},
"computer_use_sandbox_template_id": {
"anyOf": [
{
"anyOf": [
{
"const": "standard",
"type": "string"
},
{
"format": "uuid",
"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})$",
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "\"standard\" to durably pin the standard Duvo desktop (immune to future team-default changes), a template UUID to pin that desktop, or null to follow the team default."
},
"computer_use_vpn_config_id": {
"anyOf": [
{
"anyOf": [
{
"const": "direct",
"type": "string"
},
{
"format": "uuid",
"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})$",
"type": "string"
}
]
},
{
"type": "null"
}
],
"description": "\"direct\" to durably pin direct internet (no VPN, immune to future team-default changes), a VPN config UUID to pin that network, or null to follow the team default."
},
"microsoft_teams_enabled": {
"description": "Whether the agent is reachable via Microsoft Teams.",
"type": "boolean"
},
"name": {
"description": "New agent display name.",
"type": "string"
},
"pinned": {
"description": "Pin the agent to the top of your agents list (true) or unpin it (false). Per-user — each viewer has their own pin. A team on Automations has no agents list for a pin to order, so a pin or unpin there is refused with a 409.",
"type": "boolean"
},
"slack_enabled": {
"description": "Whether the agent is reachable via Slack.",
"type": "boolean"
},
"thread_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Thread id to associate with the agent, or null to clear."
}
},
"required": [
"agent_id"
],
"type": "object"
},
"name": "updateAgent",
"outputSchema": null
},
{
"description": "Update fields on a case trigger. Only the trigger creator or a builder/admin can disable an enabled trigger or change its queue, and only a builder/admin can change queue concurrency.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"case_queue_id": {
"description": "Queue whose new cases should trigger this agent",
"format": "uuid",
"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})$",
"type": "string"
},
"concurrency": {
"anyOf": [
{
"const": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Concurrency cap for the trigger's queue. The cap is queue-wide, so this affects every Agent working the queue, not just this trigger. Only 1 (run cases one at a time) or null (reset the whole queue's cap to the platform default) can be set here; higher caps are configured per-queue via PATCH /v2/admin/case-queues/{queueId}/concurrency. Omit to leave the current value unchanged."
},
"enabled": {
"description": "Whether the trigger is active. Disabled triggers do not dispatch runs.",
"type": "boolean"
},
"trigger_id": {
"description": "The case trigger's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"agent_id",
"trigger_id"
],
"type": "object"
},
"name": "updateAgentCaseTrigger",
"outputSchema": null
},
{
"description": "Rename an agent folder or move it to a new parent.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folder_id": {
"description": "The folder's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"name": {
"description": "New folder name",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"parent_folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "New parent folder ID. Pass null to move the folder to the root level."
}
},
"required": [
"folder_id"
],
"type": "object"
},
"name": "updateAgentFolder",
"outputSchema": null
},
{
"description": "Update an automation, e.g. rename it. Only the fields present in the body are changed.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"name": {
"description": "New human-readable automation name.",
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"automation_id"
],
"type": "object"
},
"name": "updateAutomation",
"outputSchema": null
},
{
"description": "Replace the automation detail view's tab arrangement. Pinning, unpinning, reordering and hiding a tab are all expressed as a different arrangement.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"hidden": {
"description": "Native tab keys the user removed from the bar",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"order": {
"description": "Left-group tab keys in render order",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"automation_id",
"order",
"hidden"
],
"type": "object"
},
"name": "updateAutomationTabs",
"outputSchema": null
},
{
"description": "Edit a case's title and/or its data payload. Provide at least one field. For the payload, send free-form `data` OR a structured `json_data` object, never both. `json_data` is validated against the queue's Case schema and requires the queue to have one; a case that is already typed against a schema keeps its structured payload and rejects a free-text `data` write. Works on pending, in-progress, and settled cases. Other attributes (status, priority, labels) have their own dedicated endpoints. Returns the updated case with its event history and approval batches.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"case_id": {
"description": "The case's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"data": {
"description": "New free-form data payload handed to the agent when the case is claimed. Mutually exclusive with `json_data`.",
"type": "string"
},
"json_data": {
"additionalProperties": {},
"description": "New structured payload for a case on a queue that has a Case schema. Validated against that schema and mutually exclusive with `data`.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"title": {
"description": "New case title (1–500 characters).",
"maxLength": 500,
"minLength": 1,
"type": "string"
}
},
"required": [
"case_id"
],
"type": "object"
},
"name": "updateCase",
"outputSchema": null
},
{
"description": "Edit a single case-level evaluation rubric's title and/or description. The edit produces a NEW rubric (with a new id and slug) so previously judged cases stay attributed to the original criterion; the response contains the new rubric.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"rubric_id": {
"description": "The case-level rubric's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"queue_id",
"rubric_id"
],
"type": "object"
},
"name": "updateCaseQueueEvalRubric",
"outputSchema": null
},
{
"description": "Rename a process folder. Renaming a landscape-linked folder permanently stops landscape name-sync.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"folderId": {
"description": "Folder to rename.",
"format": "uuid",
"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})$",
"type": "string"
},
"name": {
"description": "New folder name.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"folderId",
"name"
],
"type": "object"
},
"name": "updateClarityFolder",
"outputSchema": null
},
{
"description": "Update the automation guidance message for a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content": {
"description": "Replacement automation guidance for the process.",
"maxLength": 5000,
"minLength": 1,
"type": "string"
},
"id": {
"description": "The clarity process ID",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"id",
"content"
],
"type": "object"
},
"name": "updateClarityGuidance",
"outputSchema": null
},
{
"description": "Rename a process landscape node or update its owner label (team manager or above for team processes; organization admin for areas)",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"nodeId": {
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"ownerLabel": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"orgId",
"nodeId"
],
"type": "object"
},
"name": "updateClarityLandscapeNode",
"outputSchema": null
},
{
"description": "Change the role a person plays in the process behind a process landscape node (for example \"Approver\"). Send role: null to clear it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"nodeId": {
"description": "A process landscape node that is linked to a real process.",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"personId": {
"description": "The person entry to change, as returned by listClarityLandscapeNodePeople.",
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"anyOf": [
{
"maxLength": 200,
"type": "string"
},
{
"type": "null"
}
]
},
"teamId": {
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"orgId",
"nodeId",
"personId"
],
"type": "object"
},
"name": "updateClarityLandscapeNodePerson",
"outputSchema": null
},
{
"description": "Rename an organization landscape Clarity capture",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"interviewId": {
"description": "The organization interview ID",
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"title": {
"maxLength": 160,
"minLength": 1,
"type": "string"
}
},
"required": [
"orgId",
"interviewId",
"title"
],
"type": "object"
},
"name": "updateClarityOrganizationInterview",
"outputSchema": null
},
{
"description": "Update a Clarity process name, guidance, interview independence, visibility, or completion status. Team Builders can edit names, guidance, and interview independence, only the creator or a team manager can change visibility, and completion requires a Lead Builder role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"customPrompt": {
"anyOf": [
{
"maxLength": 5000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Process-specific guidance, or null to clear it"
},
"id": {
"description": "Clarity process id",
"format": "uuid",
"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})$",
"type": "string"
},
"independentInterviews": {
"description": "Run each interview independently: no briefing from earlier interviews and a neutral opener",
"type": "boolean"
},
"name": {
"description": "New process name",
"maxLength": 255,
"minLength": 1,
"type": "string"
},
"status": {
"description": "Mark a review-stage process complete",
"enum": [
"complete"
],
"type": "string"
},
"visibility": {
"description": "Process visibility within the team",
"enum": [
"team",
"restricted"
],
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "updateClarityProcess",
"outputSchema": null
},
{
"description": "Update process tags for an organization.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"colorHue": {
"maximum": 360,
"minimum": 0,
"type": "integer"
},
"labelId": {
"format": "uuid",
"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})$",
"type": "string"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"value": {
"maxLength": 100,
"minLength": 1,
"type": "string"
}
},
"required": [
"orgId",
"labelId"
],
"type": "object"
},
"name": "updateClarityProcessLabel",
"outputSchema": null
},
{
"description": "Update a process-to-process link in the organization's Clarity landscape when the caller can manage both endpoint teams.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"confidence": {
"anyOf": [
{
"maximum": 1,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
],
"description": "Confidence score from 0 to 1, or null to clear it"
},
"orgId": {
"format": "uuid",
"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})$",
"type": "string"
},
"process_link_id": {
"description": "Unique process-link identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"source_node_id": {
"description": "Replacement hierarchy node id for the source process",
"format": "uuid",
"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})$",
"type": "string"
},
"state": {
"description": "Whether the link is suggested by Duvo or confirmed by a user",
"enum": [
"suggested",
"confirmed"
],
"type": "string"
},
"target_node_id": {
"description": "Replacement hierarchy node id for the target process",
"format": "uuid",
"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})$",
"type": "string"
},
"type": {
"description": "Relationship type between the source process node and target process node",
"enum": [
"hands_off_to",
"shares_step_with",
"variant_of"
],
"type": "string"
}
},
"required": [
"orgId",
"process_link_id"
],
"type": "object"
},
"name": "updateClarityProcessLink",
"outputSchema": null
},
{
"description": "Enable or disable sharing for a clarity process",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"enabled": {
"description": "Whether public process sharing is enabled.",
"type": "boolean"
},
"id": {
"description": "Clarity process ID.",
"format": "uuid",
"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})$",
"type": "string"
},
"proposalShareEnabled": {
"description": "Whether the automation proposal is included. Public sharing must already be enabled when only changing this setting.",
"type": "boolean"
}
},
"required": [
"id",
"enabled"
],
"type": "object"
},
"name": "updateClarityProcessSharing",
"outputSchema": null
},
{
"description": "Update clarity team settings for financial calculations",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"annualRevenue": {
"anyOf": [
{
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
]
},
"averageHourlyRate": {
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "number"
},
"companyName": {
"anyOf": [
{
"maxLength": 255,
"type": "string"
},
{
"type": "null"
}
]
},
"emailReportIncludeCaptures": {
"type": "boolean"
},
"emailReportIncludeSummary": {
"type": "boolean"
},
"emailReportsEnabled": {
"type": "boolean"
},
"industry": {
"anyOf": [
{
"maxLength": 255,
"type": "string"
},
{
"type": "null"
}
]
},
"language": {
"enum": [
"cs",
"de",
"en",
"en-GB",
"es",
"es-MX",
"fr",
"hu",
"pl",
"pt",
"pt-BR",
"sk",
"sl",
"uk"
],
"type": "string"
},
"teamSize": {
"exclusiveMinimum": 0,
"maximum": 10000,
"type": "integer"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"type": "object"
},
"name": "updateClarityTeamSettings",
"outputSchema": null
},
{
"description": "Set or clear a config field's value. A locked field stays editable here (locking only tells an agent not to reason around the value, it never blocks a human correction). `value: null` clears the field back to \"default\".",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"AutomationConfigJsonValue": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
},
{
"items": {
"$ref": "#/definitions/AutomationConfigJsonValue"
},
"type": "array"
},
{
"additionalProperties": {
"$ref": "#/definitions/AutomationConfigJsonValue"
},
"propertyNames": {
"type": "string"
},
"type": "object"
}
],
"id": "AutomationConfigJsonValue"
}
},
"properties": {
"automationId": {
"description": "Automation ID",
"format": "uuid",
"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})$",
"type": "string"
},
"fieldId": {
"description": "Config field ID",
"format": "uuid",
"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})$",
"type": "string"
},
"value": {
"anyOf": [
{
"$ref": "#/definitions/AutomationConfigJsonValue"
},
{
"type": "null"
}
]
}
},
"required": [
"automationId",
"fieldId",
"value"
],
"type": "object"
},
"name": "updateConfigField",
"outputSchema": null
},
{
"description": "Edit a Policy question: its label, question, section, whether it is required, and the options of a select field. A reworded question gets a new version, and a new section moves the field to that section's end. The type of a field added through the API can change while it has no answer; a field from the module template keeps its type. The answer is never changed, and a module template reinstall keeps the edit.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"automation_id": {
"description": "The automation's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"columns": {
"description": "Table fields only, while the field has no answer; replaces the whole list",
"items": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"field_id": {
"description": "The config field's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"label": {
"description": "Short name for the field, shown as its row heading",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"options": {
"description": "Select and multiSelect fields only; replaces the whole list",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"type": "array"
},
"question": {
"description": "New question; a reworded question gets a new version",
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
"required": {
"description": "Whether the field must be filled",
"type": "boolean"
},
"section": {
"anyOf": [
{
"description": "Section the field is grouped under",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Section to move the field to the end of, or null for none"
},
"type": {
"description": "New value type, only for a field added through the API that has no answer yet",
"enum": [
"freeText",
"identifier",
"number",
"select",
"multiSelect",
"list",
"orderedList",
"personList",
"table"
],
"type": "string"
}
},
"required": [
"automation_id",
"field_id"
],
"type": "object"
},
"name": "updateConfigFieldDefinition",
"outputSchema": null
},
{
"description": "Update an existing connection. For sensitive header values, sending an empty string keeps the existing value; send a new value to overwrite. Toggling `shared` moves the connection between personal and team-shared.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"auth_method": {
"enum": [
"url",
"oauth",
"apikey",
"headers"
],
"type": "string"
},
"connection_id": {
"description": "Connection ID",
"format": "uuid",
"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})$",
"type": "string"
},
"headers": {
"anyOf": [
{
"properties": {
"plaintext": {
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"secret": {
"additionalProperties": {
"type": "string"
},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
},
{
"type": "null"
}
]
},
"name": {
"minLength": 1,
"type": "string"
},
"server_url": {
"format": "uri",
"type": "string"
},
"shared": {
"type": "boolean"
}
},
"required": [
"connection_id"
],
"type": "object"
},
"name": "updateConnection",
"outputSchema": null
},
{
"description": "Update a login by id. At least one of password or otp_secret must remain set after the update. Editing a team-shared login or toggling sharing requires lead builder role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"domain": {
"minLength": 1,
"type": "string"
},
"id": {
"format": "uuid",
"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})$",
"type": "string"
},
"otp_secret": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"password": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"shared": {
"type": "boolean"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
},
"userId": {
"format": "uuid",
"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})$",
"type": "string"
},
"username": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"userId",
"id"
],
"type": "object"
},
"name": "updateCredential",
"outputSchema": null
},
{
"description": "Edit a single Agent-specific evaluation rubric's title and/or description. The edit produces a NEW rubric (with a new id and slug) so previously scored Runs stay attributed to the original criterion; the response contains the new rubric.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier (Assignment ID)",
"format": "uuid",
"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})$",
"type": "string"
},
"description": {
"description": "A 1-2 sentence Pass condition phrased as a question.",
"maxLength": 400,
"minLength": 20,
"type": "string"
},
"rubricId": {
"description": "The custom rubric's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
},
"title": {
"description": "Short, human-readable Pass/Fail rubric title.",
"maxLength": 80,
"minLength": 3,
"type": "string"
}
},
"required": [
"agentId",
"rubricId"
],
"type": "object"
},
"name": "updateEvalRubric",
"outputSchema": null
},
{
"description": "Update the content of a text file.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content": {
"description": "New UTF-8 text content for the file",
"type": "string"
},
"path": {
"description": "Path of the file relative to the team's storage root",
"minLength": 1,
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"path",
"content"
],
"type": "object"
},
"name": "updateFileContent",
"outputSchema": null
},
{
"description": "Update a Duvo Pulse dashboard's settings — rename it. Only the creator can update it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"artifactId": {
"format": "uuid",
"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})$",
"type": "string"
},
"title": {
"maxLength": 120,
"minLength": 1,
"type": "string"
}
},
"required": [
"artifactId",
"title"
],
"type": "object"
},
"name": "updatePulseDashboard",
"outputSchema": null
},
{
"description": "Update a queue.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "New description, or null to clear."
},
"folder_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "New folder id, or null to move to the root."
},
"name": {
"description": "New queue name. A standalone queue's name must be unique within the team, and a queue inside an automation's name must be unique within that automation. Queue names are not versioned, so this is the canonical name on any Automations workspace team, with or without revisions. A revision carrying a per-revision name override applies it over this one when that revision is activated.",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "updateQueue",
"outputSchema": null
},
{
"description": "Turn a queue's schema guard on or off, and freeze or unfreeze the schema document. A guarded queue with no schema yet asks its producing agent to declare one; a frozen schema refuses every change until it is unfrozen.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"frozen": {
"description": "Close the schema document to change. The queue must already have a schema.",
"type": "boolean"
},
"guarded": {
"description": "Require every new case on this queue to be typed. When on and the queue has no schema yet, the producing agent must declare one before it can add cases.",
"type": "boolean"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"queue_id"
],
"type": "object"
},
"name": "updateQueueJsonSchemaSettings",
"outputSchema": null
},
{
"description": "Update a label's key, value, or color. Renaming key/value affects every case assigned to this label.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"color_hue": {
"maximum": 360,
"minimum": 0,
"type": "integer"
},
"key": {
"type": "string"
},
"label_id": {
"description": "The label's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"queue_id": {
"description": "The queue's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"value": {
"minLength": 1,
"type": "string"
}
},
"required": [
"queue_id",
"label_id",
"value"
],
"type": "object"
},
"name": "updateQueueLabel",
"outputSchema": null
},
{
"description": "Update a revision's configuration, name, description, or handover targets. Returns the updated revision.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"build_id": {
"description": "The build's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"config": {
"additionalProperties": {},
"description": "Build configuration object",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"handoverOptions": {
"anyOf": [
{
"properties": {
"required": {
"description": "When true, a run that exits cleanly without requesting a handover fails",
"type": "boolean"
},
"targetAgentIds": {
"description": "Steps in the same automation this code step's program may request",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"minItems": 1,
"type": "array"
}
},
"required": [
"targetAgentIds",
"required"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "Code steps only. The targets the program may request, and whether it must. Null clears them; omit to leave unchanged. Mutually exclusive with handoverTo in one request."
},
"handoverTargetIds": {
"description": "Agent IDs that this agent can hand over work to",
"items": {
"format": "uuid",
"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})$",
"type": "string"
},
"type": "array"
},
"handoverTo": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The single agent or code step to run after this one completes (\"Handover to\"). Null clears it; omit to leave it unchanged. Mutually exclusive with @-mention handovers in the AOP."
},
"revision_description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional user-defined description for this revision. Pass null to clear."
},
"revision_name": {
"anyOf": [
{
"maxLength": 80,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional user-defined name for this revision. Pass null to clear."
},
"selected_automation_revision_id": {
"anyOf": [
{
"format": "uuid",
"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})$",
"type": "string"
},
{
"type": "null"
}
],
"description": "The automation revision this edit is being made at. Pass a draft and the edit is folded into that draft itself; pass the active revision and the edit lands on a draft branched from it. A historic revision is rejected — it cannot be activated from without an explicit rebase. A revision belonging to a different automation is ignored, and the edit targets the automation the addressed agent belongs to. Omit to target the automation's active revision."
}
},
"required": [
"build_id"
],
"type": "object"
},
"name": "updateRevision",
"outputSchema": null
},
{
"description": "Update fields on an existing schedule. Only supplied fields are changed; omitted fields retain their current values. Owners may update their own schedules; team superadmins may update any schedule on agents in the current team. A schedule that migration folded into an automation revision is refused with 409: it no longer fires from this row, so an edit here would save and never take effect — change it on the automation's revision instead.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agent_id": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"cron": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"day": {
"anyOf": [
{
"enum": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday"
],
"type": "string"
},
{
"type": "null"
}
]
},
"day_of_month": {
"anyOf": [
{
"maximum": 31,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
]
},
"enabled": {
"type": "boolean"
},
"frequency": {
"enum": [
"every_5_minutes",
"every_15_minutes",
"hourly",
"daily",
"workday",
"weekly",
"monthly",
"custom"
],
"type": "string"
},
"recurring": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"schedule_id": {
"description": "The schedule's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"time": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"timezone": {
"type": "string"
}
},
"required": [
"agent_id",
"schedule_id"
],
"type": "object"
},
"name": "updateSchedule",
"outputSchema": null
},
{
"description": "Update an env-var secret. Send `values` to replace all entries, or any of `rename_keys`, `remove_keys`, `add_values` for a non-destructive patch. Editing a team-shared secret or toggling sharing requires lead builder role.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"add_values": {
"additionalProperties": {
"maxLength": 65536,
"minLength": 1,
"type": "string"
},
"propertyNames": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"type": "object"
},
"id": {
"format": "uuid",
"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)$",
"type": "string"
},
"name": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"remove_keys": {
"items": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"minItems": 1,
"type": "array"
},
"rename_keys": {
"additionalProperties": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"propertyNames": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"type": "object"
},
"service_slug": {
"anyOf": [
{
"maxLength": 64,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
]
},
"shared": {
"type": "boolean"
},
"values": {
"additionalProperties": {
"maxLength": 65536,
"minLength": 1,
"type": "string"
},
"propertyNames": {
"maxLength": 128,
"minLength": 1,
"pattern": "^[A-Z_][A-Z0-9_]*$",
"type": "string"
},
"type": "object"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "updateSecret",
"outputSchema": null
},
{
"description": "Mark a team skill as available in Ask Duvo, or take it back off. Every NEW Ask Duvo chat in the team starts with the marked skills on disk. A chat that is already open keeps the set it started with until its sandbox is replaced, and picks up the current set from then on.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
},
"use_in_ask_duvo": {
"type": "boolean"
}
},
"required": [
"skill_id",
"use_in_ask_duvo"
],
"type": "object"
},
"name": "updateSkillAskDuvo",
"outputSchema": null
},
{
"description": "Update the content of a file in a skill, overwriting the active revision in place — the previous content is not recoverable. Prefer the non-destructive flow when you can: createSkillRevision to open a draft, updateSkillRevisionFile to edit it, promoteSkillRevision to activate it. Only team skills can be edited.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content": {
"description": "New UTF-8 text content for the file.",
"type": "string"
},
"path": {
"description": "Relative path to the file inside the skill, e.g. SKILL.md.",
"minLength": 1,
"type": "string"
},
"skill_id": {
"description": "Skill ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_id",
"path",
"content"
],
"type": "object"
},
"name": "updateSkillFile",
"outputSchema": null
},
{
"description": "Rename a skill revision or change its description. Works for drafts, the active revision, and historic revisions.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"revision_description": {
"anyOf": [
{
"maxLength": 500,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional user-defined description for this revision. Pass null to clear."
},
"revision_name": {
"anyOf": [
{
"maxLength": 80,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional user-defined name for this revision. Pass null to clear."
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id"
],
"type": "object"
},
"name": "updateSkillRevision",
"outputSchema": null
},
{
"description": "Write a text file into a skill revision. Writing into a draft leaves the active revision untouched until the draft is promoted; writing into the active revision changes what the skill runs immediately. Historic revisions are read-only: create a draft from one to edit it.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"content": {
"description": "New UTF-8 text content for the file.",
"type": "string"
},
"path": {
"description": "Relative path to the file inside the revision, e.g. SKILL.md.",
"minLength": 1,
"type": "string"
},
"skill_revision_id": {
"description": "Skill revision ID.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"skill_revision_id",
"path",
"content"
],
"type": "object"
},
"name": "updateSkillRevisionFile",
"outputSchema": null
},
{
"description": "Update a Slack channel trigger you own — repoint it at another channel, change which messages match, or pause and resume it with `enabled`. Only the supplied fields change. Resuming a paused trigger requires the Slack connection it runs off to still be available on the agent; changing the channel resets the trigger's seen-message state.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"channel_id": {
"description": "New Slack channel ID to watch. Omit to leave unchanged.",
"minLength": 1,
"type": "string"
},
"channel_name": {
"description": "New Slack channel name, without the leading `#`.",
"minLength": 1,
"type": "string"
},
"enabled": {
"description": "Set to false to pause the trigger without deleting it, or true to resume it. Resuming requires the connection the trigger uses to still be available on the agent.",
"type": "boolean"
},
"is_private": {
"description": "Whether the channel is private.",
"type": "boolean"
},
"match_rule": {
"description": "Which channel messages fire the trigger: `{\"kind\":\"all\"}` for every message, or `{\"kind\":\"contains\",\"values\":[\"invoice\"]}` to match keywords.",
"oneOf": [
{
"description": "Fire on every message posted in the channel.",
"properties": {
"kind": {
"const": "all",
"type": "string"
}
},
"required": [
"kind"
],
"type": "object"
},
{
"description": "Fire only on messages containing one of the keywords.",
"properties": {
"kind": {
"const": "contains",
"type": "string"
},
"values": {
"description": "Case-insensitive keywords; a message fires the trigger when it contains any of them. Duplicates are deduplicated.",
"items": {
"maxLength": 500,
"minLength": 1,
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"type": "array"
}
},
"required": [
"kind",
"values"
],
"type": "object"
}
]
},
"trigger_id": {
"description": "The Slack channel trigger's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"trigger_id"
],
"type": "object"
},
"name": "updateSlackTrigger",
"outputSchema": null
},
{
"description": "Change the role on a pending team invitation. Only pending invitations can be updated — one already accepted or declined is rejected. Requires the Manager role or above on the invitation's own team.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"description": "ID of the pending invitation to update.",
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"description": "New team role for the invitation. One of: team:owner, team:superadmin, team:admin (deprecated), team:manager, team:builder, team:member, team:clarity-member. You cannot assign a role above your own.",
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id",
"role"
],
"type": "object"
},
"name": "updateTeamInvite",
"outputSchema": null
},
{
"description": "Update an existing team member's role. Requires the Manager role or above; only an Owner may grant or remove the Owner role, and the last remaining Owner cannot be demoted. A member whose Owner role is inherited from the organization cannot be changed here.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"memberId": {
"description": "Member (user) ID",
"format": "uuid",
"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})$",
"type": "string"
},
"role": {
"type": "string"
},
"team_id": {
"description": "Duvo team UUID to operate on. API keys are pinned to a single team — omit this (it falls back to the key's team) or pass that same team; a different team is rejected. OAuth callers, who can span multiple teams, should pass the target team here.",
"format": "uuid",
"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})$",
"type": "string"
}
},
"required": [
"memberId",
"role"
],
"type": "object"
},
"name": "updateTeamMemberRole",
"outputSchema": null
},
{
"description": "Move a v1 clarity process into v2. Rows with generated analysis are reset in place and regenerated; rows without analysis migrate in place when not generating.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"format": "uuid",
"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)$",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "upgradeClarityProcess",
"outputSchema": null
},
{
"description": "Upload a file directly to the sandbox. Maximum file size is 10MB. For larger files, use POST /v2/sandboxes/:sandbox_id/upload-urls.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"sandbox_id": {
"description": "The sandbox's unique identifier",
"minLength": 1,
"type": "string"
}
},
"required": [
"sandbox_id"
],
"type": "object"
},
"name": "uploadSandboxFile",
"outputSchema": null
},
{
"description": "Create or update the authenticated user's trigger for an integration on an agent. The integration must already be connected to the agent (its OAuth connection set up in the Duvo dashboard). Set `enabled: false` to pause a trigger without deleting it. An agent holds one trigger per integration for a user, so a save with a different `trigger_type` replaces the existing one — except when that trigger is an @mention trigger, which is managed from the agent's mention setting and answers 409 (`mention_trigger_protected`) here. @mention triggers are best managed from that setting throughout: this route leaves an existing one's `filter_config` untouched, and refuses to create a `teams_mention` trigger without a `filter_config.tenantId` (400, `mention_trigger_workspace_required`) — a Slack mention trigger has no equivalent field to supply.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"agentId": {
"description": "The agent's unique identifier",
"format": "uuid",
"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})$",
"type": "string"
},
"enabled": {
"default": true,
"description": "Whether the trigger is active. Defaults to true.",
"type": "boolean"
},
"filter_config": {
"additionalProperties": {},
"default": {},
"description": "Integration-specific filter config (e.g. sender/subject filters). Shape comes from the integration's filter schema. Replaces the trigger's current config, so send the whole object — except on an @mention trigger, whose config is managed from the agent's mention setting and is left as it is.",
"propertyNames": {
"type": "string"
},
"type": "object"
},
"integration_slug": {
"description": "Integration slug the trigger fires for (e.g. `gmail`, `outlook`, `linear-native`, `google-drive`).",
"type": "string"
},
"trigger_type": {
"description": "Trigger type within the integration (e.g. `email_received`). Discover valid values via the trigger types endpoint. Integrations that enumerate their trigger types (Microsoft Teams, Google Drive, Google Sheets) reject anything else with 400 (`trigger_type_unsupported`), except a save that pauses a trigger already carrying that type.",
"type": "string"
}
},
"required": [
"agentId",
"integration_slug",
"trigger_type"
],
"type": "object"
},
"name": "upsertAgentTrigger",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:cefa4e558d52f5709bed604af08096069c3792d20127abb19b1f247c938dda42 | sha256sum