An agent is the frozen configuration a call runs against: pipeline, prompt, language, limits and webhook. Sessions record the agent version they ran, so editing an agent never rewrites history. Its tests (typed chats with checks, run on your own AI account, no call placed) live under it too.
Every example below runs as written once these are exported:
bash
export DVAARIK_API_KEY="dvk_..."# project API key, server side only
export DVAARIK_TOKEN="<account access token>"# console session, from POST /console/auth/login
export AGENT_ID="<uuid>"
export NAME="crm"
export PROJECT_ID="<uuid>"
export RUN_ID="<uuid>"
export TEST_ID="<uuid>"
A <value> inside a JSON body is a value you supply. Responses are JSON; every error body is { "detail": … }. Each schema is expanded once per page, where it first appears.
default false; Whether the agent may hand the call to another agent of this project on its hand-off list (the built-in hand_off_to_agent tool), on phone, browser and test calls. Off by default, and it needs at least one destination. Cascade agents only. It stays one call: no new dial and one bill. From the next reply the receiving agent's prompt, tools, knowledge, language model and voice take over, and it sees the conversation so far. Listening stays the call's, so both agents must speak the same language. The call's own settings (duration limit, recording, transcript, analysis, completed-call webhook) stay this agent's. At most 5 hand-offs per call.
can_send_dtmf
boolean
yes
can_transfer
boolean
no
default false; Whether the agent may hand a phone call to a person on its transfer list. Off by default, and it needs at least one destination. Offered on Twilio and Plivo phone calls only. The transfer is blind: the caller is put through and the agent leaves the call. Billing stops at the transfer: this call's per-minute charge ends there, and the new leg is billed by your own carrier account.
created_at
date-time
yes
dead_air_seconds
integer or null
yes
display_name
string or null
yes
fallback_status
string or null
no
Whether a call could use the saved llm_fallback right now: ready, or why not (account_not_found, account_unavailable, model_unavailable, model_retired, invalid). A call never waits on it: an unusable fallback is left out and the call runs on llm alone. Null when the agent has no fallback, and in a list. Keys that no longer decrypt are only found by a call.
greeting
string or null
yes
handoff_destinations
HandoffDestinationInfo[]
no
Who the agent may hand the call to: up to 10 agents of this project, each picked by its unique name. Each must be an active cascade agent that speaks this agent's language, never this agent itself, and its provider accounts must be ready.
has_webhook_secret
boolean
no
default false
id
uuid
yes
idle_hangup_seconds
integer or null
yes
idle_warn_seconds
integer or null
yes
insight_config
InsightConfigBody or null
no
is_active
boolean
yes
knowledge_base_ids
uuid[]
no
knowledge_mode
"none" or "inline" or "search" or null
no
language
string
yes
max_chars_per_min
integer or null
yes
max_duration_seconds
integer or null
yes
mcp_servers
McpServerInfo[]
no
Your MCP servers whose tools this agent may use on its calls, at most 3, reached over the Streamable HTTP transport. A call lists each server's tools when it starts (waiting at most 1.5 seconds per server, and remembering a list for 5 minutes); a server that does not answer in time is left out of that call, never failing it. The agent sees each tool as <server name>__<tool name>. At most 30 MCP tools reach the agent, within the same prompt budget as its own tools.
name
string
yes
pipeline_config
object
yes
The provider accounts and models this agent runs on, all your own. Cascade: stt {account_id, model}, llm {account_id, model} and tts {account_id, model, voice}, plus optionally llm_fallback {account_id, model}: a second language model (another provider or another model than llm) that answers when llm fails before saying anything (an error, or no first output within 4 seconds). The call then stays on it, and call.completed carries fallbackUsed. Realtime: realtime {account_id, model, voice}; it has no llm_fallback.
pipeline_mode
string
yes
project_id
uuid
yes
prompt
string
yes
record_calls
boolean
yes
retention_days
integer or null
yes
store_transcript
boolean
yes
tool_webhook_url
string or null
yes
tools
any[]
yes
transfer_destinations
TransferDestination[]
no
Who the agent may transfer to: up to 10 destinations, each picked by its unique name. Numbers must be E.164 and may not be paid-rate or satellite ranges, one of this agent's own numbers, or outside your account's allowed countries.
The agent that takes over: an active cascade agent of this project that speaks the same language, never this agent itself. Each agent may be listed once.
agent_name
string or null
no
The receiving agent's own name. Single-agent reads only; null in a list.
description
string
yes
When to hand over to it, up to 200 characters. The agent reads it to decide.
greeting
string or null
no
Optional line, up to 200 characters, that the receiving agent says in its own voice as it takes over, such as "Hi, this is Sam from sales." Left out, it simply carries on the conversation.
name
string
yes
What the agent calls this destination: 1 to 40 letters, digits, spaces, hyphens or underscores, unique within the agent (ignoring case).
status
string or null
no
Whether a call could hand over to it now: ready, or why not (agent_not_found, agent_deleted, not_cascade, language_mismatch, self). Provider accounts are checked when you save and when a call hands over. Single-agent reads only; null in a list.
A person the agent may hand the call to. The agent picks one by name; it never sees or dials any other number.
Field
Type
Required
Notes
description
string
no
default ""; When the agent should choose this destination, up to 200 characters. The agent reads it.
name
string
yes
What the agent calls this destination: 1 to 40 letters, digits, spaces, hyphens or underscores, unique within the agent (ignoring case).
number
string
yes
The phone number to ring, in international E.164 format such as +14155550100. The agent never sees it. The person sees your own number on this call (the line the caller rang, or the line the agent called from) as the caller ID.
say
string or null
no
Optional line, up to 200 characters, said to the caller before the transfer starts, such as "Connecting you to our sales team now."
Post-call analysis for one agent, on the developer's own LLM account.
Field
Type
Required
Notes
enabled
boolean
no
default true
fields
InsightFieldSpec[]
no
max 25 item(s); Ordered. The order is the column order of the console table and of a CSV export.
model
string
yes
max length 120; An LLM model this provider offers, from the provider catalogue.
provider_account_id
uuid
yes
A verified, LLM-capable provider account in THIS project. May differ from the account the agent converses on — a cheap model for analysis is the normal choice.
system_prompt
string
no
default ""; max length 4000; The developer's own analysis instructions. Prepended to the platform's JSON output contract.
default false; Whether the agent may hand the call to another agent of this project on its hand-off list (the built-in hand_off_to_agent tool), on phone, browser and test calls. Off by default, and it needs at least one destination. Cascade agents only. It stays one call: no new dial and one bill. From the next reply the receiving agent's prompt, tools, knowledge, language model and voice take over, and it sees the conversation so far. Listening stays the call's, so both agents must speak the same language. The call's own settings (duration limit, recording, transcript, analysis, completed-call webhook) stay this agent's. At most 5 hand-offs per call.
can_send_dtmf
boolean
no
default false
can_transfer
boolean
no
default false; Whether the agent may hand a phone call to a person on its transfer list. Off by default, and it needs at least one destination. Offered on Twilio and Plivo phone calls only. The transfer is blind: the caller is put through and the agent leaves the call. Billing stops at the transfer: this call's per-minute charge ends there, and the new leg is billed by your own carrier account.
dead_air_seconds
integer or null
no
display_name
string or null
no
greeting
string or null
no
handoff_destinations
HandoffDestination[]
no
max 10 item(s); Who the agent may hand the call to: up to 10 agents of this project, each picked by its unique name. Each must be an active cascade agent that speaks this agent's language, never this agent itself, and its provider accounts must be ready.
idle_hangup_seconds
integer or null
no
idle_warn_seconds
integer or null
no
insight_config
InsightConfigBody or null
no
knowledge_base_ids
uuid[]
no
max 3 item(s)
language
string
no
default "en-IN"
max_chars_per_min
integer or null
no
max_duration_seconds
integer or null
no
mcp_servers
McpServer[]
no
max 3 item(s); Your MCP servers whose tools this agent may use on its calls, at most 3, reached over the Streamable HTTP transport. A call lists each server's tools when it starts (waiting at most 1.5 seconds per server, and remembering a list for 5 minutes); a server that does not answer in time is left out of that call, never failing it. The agent sees each tool as <server name>__<tool name>. At most 30 MCP tools reach the agent, within the same prompt budget as its own tools.
name
string
yes
pipeline_config
object
yes
The provider accounts and models this agent runs on, all your own. Cascade: stt {account_id, model}, llm {account_id, model} and tts {account_id, model, voice}, plus optionally llm_fallback {account_id, model}: a second language model (another provider or another model than llm) that answers when llm fails before saying anything (an error, or no first output within 4 seconds). The call then stays on it, and call.completed carries fallbackUsed. Realtime: realtime {account_id, model, voice}; it has no llm_fallback.
pipeline_mode
string
yes
prompt
string
yes
record_calls
boolean
no
default false
retention_days
integer or null
no
store_transcript
boolean
no
default false
tool_webhook_url
string or null
no
tools
object[]
no
transfer_destinations
TransferDestination[]
no
max 10 item(s); Who the agent may transfer to: up to 10 destinations, each picked by its unique name. Numbers must be E.164 and may not be paid-rate or satellite ranges, one of this agent's own numbers, or outside your account's allowed countries.
Another agent of this project the agent may hand the call to. The agent picks one by name; it never sees the agent id.
Field
Type
Required
Notes
agent_id
uuid
yes
The agent that takes over: an active cascade agent of this project that speaks the same language, never this agent itself. Each agent may be listed once.
description
string
yes
When to hand over to it, up to 200 characters. The agent reads it to decide.
greeting
string or null
no
Optional line, up to 200 characters, that the receiving agent says in its own voice as it takes over, such as "Hi, this is Sam from sales." Left out, it simply carries on the conversation.
name
string
yes
What the agent calls this destination: 1 to 40 letters, digits, spaces, hyphens or underscores, unique within the agent (ignoring case).
The server's tools the agent may use, by their names on the server, at most 30. Empty means all.
header_hints
object<string> or null
no
Read-only. Accepted so an agent you read can be sent back, and ignored.
headers
object<string> or null
no
Optional HTTP headers sent with every request to this server, such as Authorization. Stored encrypted and never shown again: reads show header_hints instead. Up to 10. Leave out to keep the saved ones (only while name and url are unchanged); send {} to remove them.
name
string
yes
Up to 40 lowercase letters, digits, hyphens or underscores, starting with a letter, with no two hyphens or underscores in a row and none at the end. Unique within the agent: the agent sees this server's tools as <name>__<tool>.
timeout_seconds
integer
no
default 6; How long one tool call on this server may take, 1 to 10 seconds. Default 6.
url
string
yes
The server's Streamable HTTP endpoint: https on a public host, up to 500 characters.
Whether the agent may hand the call to another agent of this project on its hand-off list (the built-in hand_off_to_agent tool), on phone, browser and test calls. Off by default, and it needs at least one destination. Cascade agents only. It stays one call: no new dial and one bill. From the next reply the receiving agent's prompt, tools, knowledge, language model and voice take over, and it sees the conversation so far. Listening stays the call's, so both agents must speak the same language. The call's own settings (duration limit, recording, transcript, analysis, completed-call webhook) stay this agent's. At most 5 hand-offs per call.
can_send_dtmf
boolean or null
no
can_transfer
boolean or null
no
Whether the agent may hand a phone call to a person on its transfer list. Off by default, and it needs at least one destination. Offered on Twilio and Plivo phone calls only. The transfer is blind: the caller is put through and the agent leaves the call. Billing stops at the transfer: this call's per-minute charge ends there, and the new leg is billed by your own carrier account.
dead_air_seconds
integer or null
no
display_name
string or null
no
greeting
string or null
no
handoff_destinations
HandoffDestination[] or null
no
Who the agent may hand the call to: up to 10 agents of this project, each picked by its unique name. Each must be an active cascade agent that speaks this agent's language, never this agent itself, and its provider accounts must be ready. Sending a list replaces the whole list; an empty list removes them all.
idle_hangup_seconds
integer or null
no
idle_warn_seconds
integer or null
no
insight_config
InsightConfigBody or null
no
is_active
boolean or null
no
knowledge_base_ids
uuid[] or null
no
language
string or null
no
max_chars_per_min
integer or null
no
max_duration_seconds
integer or null
no
mcp_servers
McpServer[] or null
no
Your MCP servers whose tools this agent may use on its calls, at most 3, reached over the Streamable HTTP transport. A call lists each server's tools when it starts (waiting at most 1.5 seconds per server, and remembering a list for 5 minutes); a server that does not answer in time is left out of that call, never failing it. The agent sees each tool as <server name>__<tool name>. At most 30 MCP tools reach the agent, within the same prompt budget as its own tools. Sending a list replaces the whole list; an empty list or null removes them all. Leave a server's headers out to keep the saved ones: that works only while the server keeps its name and url.
name
string or null
no
pipeline_config
object or null
no
The provider accounts and models this agent runs on, all your own. Cascade: stt {account_id, model}, llm {account_id, model} and tts {account_id, model, voice}, plus optionally llm_fallback {account_id, model}: a second language model (another provider or another model than llm) that answers when llm fails before saying anything (an error, or no first output within 4 seconds). The call then stays on it, and call.completed carries fallbackUsed. Realtime: realtime {account_id, model, voice}; it has no llm_fallback. An update REPLACES the whole pipeline_config, llm_fallback included: send the current llm_fallback again to keep it; leaving it out removes the fallback.
pipeline_mode
string or null
no
prompt
string or null
no
record_calls
boolean or null
no
retention_days
integer or null
no
store_transcript
boolean or null
no
tool_webhook_url
string or null
no
tools
object[] or null
no
transfer_destinations
TransferDestination[] or null
no
Who the agent may transfer to: up to 10 destinations, each picked by its unique name. Numbers must be E.164 and may not be paid-rate or satellite ranges, one of this agent's own numbers, or outside your account's allowed countries. Sending a list replaces the whole list; an empty list removes them all.
variables
object[] or null
no
webhook_include_recording_url
boolean or null
no
webhook_include_transcript
boolean or null
no
webhook_url
string or null
no
Error
When
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the machine-door errors above. Full list on the errors page.
bash
curl -sS -X PATCH "https://api.developers.dvaarik.com/v2/agents/$AGENT_ID" \
-H "X-Api-Key: $DVAARIK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"greeting": "Hello, this is support. How can I help?",
"is_active": true
}'
POST /v2/agents/{agent_id}/mcp-servers/{name}/check#
Check one saved MCP server: list its tools now with its saved headers and answer with the tools the agent will be offered, the ones dropped and why, or why the server could not be used, in a sentence. Calls no tool.
What one of the agent's MCP servers answered when its tools were listed just now.
Field
Type
Required
Notes
dropped_tools
McpDroppedTool[]
no
Tools the server listed that the agent can never be offered.
error
string or null
no
Why the server could not be used, in a sentence.
latency_ms
integer or null
no
missing_allowed_tools
string[]
no
Names in allowed_tools that the server did not list.
name
string
yes
ok
boolean
yes
Whether the server answered with its tool list.
status
string
yes
A stable code for the outcome, to branch on (error is the sentence to show): ok, or why the server could not be used: headers_unavailable (the saved headers could not be opened; save them again), refused (not https on a public host), unresolved, dns_slow, dns_busy, connect_error, timeout, redirect (save the final address), encoded (a compressed answer), oversized, http_<status> (the server's HTTP status, for example http_401), protocol_error (not an MCP server over Streamable HTTP), input_required, sdk_unsupported (on our side) or error. New codes may be added: treat an unknown one like error.
tools
McpToolInfo[]
no
warning
string or null
no
Something a call would do differently from this check, in a sentence.
A tool the server listed that the agent can never be offered, and why.
Field
Type
Required
Notes
name
string
yes
The tool's name on your server.
reason
string
yes
schema (its input schema cannot be read), ref (a $ref that is not a local #/$defs or #/definitions entry), ref_depth ($ref nested more than 4 deep, or recursive), too_deep (objects or arrays nested more than 6 deep), too_large (its schema is too large to send on every turn), listing_too_large (the tools listed before it already used all the work one listing may take: name the tools you need in allowed_tools), name (an unusable tool name) or conversion.
The saved agent version the run played. Unsaved overrides never change it; overrides_used says whether any were tested on top of it.
cancel_requested_at
date-time or null
no
When you asked this run to stop (POST .../test-runs/{run_id}/cancel). A running run with this set is stopping: it ends cancelled with ended_by: stopped before its next model request, keeping the transcript so far. A run that finishes before it reaches one keeps its result.
created_at
date-time
yes
ended_by
"agent_hung_up" or "caller_hung_up" or "turns_ran_out" or "transferred" or "error" or "stopped" or null
no
How the run ended: agent_hung_up (the agent ended the call), caller_hung_up (the simulated caller hung up), turns_ran_out (the test's max_turns were used up), transferred (the agent handed the call to a person), error (the run could not finish; error says why) or stopped (you cancelled it). Null while the run is queued or running, and on runs made before 7 November 2026.
error
string or null
yes
finished_at
date-time or null
yes
id
uuid
yes
input_tokens
integer
yes
output_tokens
integer
yes
overrides_used
boolean
yes
passed_checks
integer
yes
started_at
date-time or null
yes
status
"queued" or "running" or "passed" or "failed" or "error" or "cancelled"
yes
test_id
uuid
yes
total_checks
integer
yes
Error
When
401
No API key was sent in X-Api-Key, or it is invalid or revoked.
403
The API key lacks the scope this route needs, or its account or project is unavailable.
404
The addressed resource does not exist in this key's project. One in another project is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
429
The project's requests-per-minute limit is reached; Retry-After says when to try again.
Plus the machine-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/v2/agents/$AGENT_ID/test-runs?limit=20" \
-H "X-Api-Key: $DVAARIK_API_KEY"
The saved agent version the run played. Unsaved overrides never change it; overrides_used says whether any were tested on top of it.
cancel_requested_at
date-time or null
no
When you asked this run to stop (POST .../test-runs/{run_id}/cancel). A running run with this set is stopping: it ends cancelled with ended_by: stopped before its next model request, keeping the transcript so far. A run that finishes before it reaches one keeps its result.
check_results
AgentTestCheckResult[]
yes
created_at
date-time
yes
ended_by
"agent_hung_up" or "caller_hung_up" or "turns_ran_out" or "transferred" or "error" or "stopped" or null
no
How the run ended: agent_hung_up (the agent ended the call), caller_hung_up (the simulated caller hung up), turns_ran_out (the test's max_turns were used up), transferred (the agent handed the call to a person), error (the run could not finish; error says why) or stopped (you cancelled it). Null while the run is queued or running, and on runs made before 7 November 2026.
error
string or null
yes
finished_at
date-time or null
yes
force_primary_failure
boolean
yes
Whether this run rehearsed the agent's fallback language model (it was queued with force_primary_failure): the main model was never asked. provider and model still name the main one.
id
uuid
yes
input_tokens
integer
yes
model
string or null
yes
output_tokens
integer
yes
overrides_used
boolean
yes
passed_checks
integer
yes
provider
string or null
yes
retention_note
string or null
no
started_at
date-time or null
yes
status
"queued" or "running" or "passed" or "failed" or "error" or "cancelled"
yes
test_id
uuid
yes
total_checks
integer
yes
transcript
AgentTestTranscriptEntry[]
yes
zero_retention
boolean
no
default false; True when this run stored no conversation because its project has zero retention on: transcript is empty and a judge check's reason is not kept (its verdict is).
One line of a run: an agent or caller turn, or a tool call the agent made.
Field
Type
Required
Notes
agent
string or null
no
Agent turns of an agent that can hand calls to other agents: the name of the agent that said it (a turn that crossed a hand-off is one line per agent). Null on every other run.
arguments
object or null
no
fallback
boolean
no
default false; Agent turns: answered by the agent's fallback language model (pipeline_config.llm_fallback), because the main model failed or the run rehearsed the fallback (force_primary_failure).
name
string or null
no
reason
string or null
no
Tool entries answered by your tool webhook that failed: why, as a stable code (the agent hears one sentence for several of these). refused (not https on a public host), unresolved, redirect (redirects are not followed), timeout, unreachable, http_<status> (your server's status, for example http_500), oversized (over 8 KB), encoded (a compressed answer: answer without compression, we ask for identity), bad_answer (not JSON), budget (the per-call limit of tool calls) or error (on our side). Absent when the call worked.
result
object or null
no
role
"agent" or "caller" or "tool"
yes
source
"canned" or "webhook" or "engine" or "refused" or "knowledge" or "mcp" or "handoff" or null
no
text
string or null
no
truncated
boolean
no
default false
turn
integer
yes
Error
When
401
No API key was sent in X-Api-Key, or it is invalid or revoked.
403
The API key lacks the scope this route needs, or its account or project is unavailable.
404
The addressed resource does not exist in this key's project. One in another project is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
429
The project's requests-per-minute limit is reached; Retry-After says when to try again.
Plus the machine-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/v2/agents/$AGENT_ID/test-runs/$RUN_ID" \
-H "X-Api-Key: $DVAARIK_API_KEY"
POST /v2/agents/{agent_id}/test-runs/{run_id}/cancel#
Stop a test run. A queued run is cancelled at once (status: cancelled, ended_by: stopped). A running run is asked to stop: the answer still says running, with cancel_requested_at set, and the run ends cancelled before its next model request, keeping the transcript so far (asking again changes nothing). A run that already finished is a 409.
Detail
Value
Door
Project API key — X-Api-Key: $DVAARIK_API_KEY
Operation
cancelAgentTestRun
Success
200AgentTestRunInfo
Parameter
In
Type
Required
Notes
agent_id
path
uuid
yes
run_id
path
uuid
yes
Error
When
401
No API key was sent in X-Api-Key, or it is invalid or revoked.
403
The API key lacks the scope this route needs, or its account or project is unavailable.
404
The addressed resource does not exist in this key's project. One in another project is deliberately indistinguishable from one that never existed.
409
A limit or the resource's state refuses this change; the sentence says which.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
429
The project's requests-per-minute limit is reached; Retry-After says when to try again.
Plus the machine-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/v2/agents/$AGENT_ID/test-runs/$RUN_ID/cancel" \
-H "X-Api-Key: $DVAARIK_API_KEY"
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents?limit=20" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents" \
-H "Authorization: Bearer $DVAARIK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "support",
"pipeline_config": {
"stt": {
"account_id": "<provider account uuid>",
"model": "<model id from the catalogue>"
},
"llm": {
"account_id": "<provider account uuid>",
"model": "<model id from the catalogue>"
},
"tts": {
"account_id": "<provider account uuid>",
"model": "<model id from the catalogue>",
"voice": "<provider voice id>"
}
},
"pipeline_mode": "cascade",
"prompt": "You are the receptionist for {{company}}. Answer questions and book visits.",
"greeting": "Hello, this is support.",
"language": "en-IN"
}'
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X PATCH "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID" \
-H "Authorization: Bearer $DVAARIK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"greeting": "Hello, this is support. How can I help?",
"is_active": true
}'
POST /console/v2/projects/{project_id}/agents/{agent_id}/mcp-servers/{name}/check#
Check one saved MCP server: list its tools now with its saved headers and answer with the tools the agent will be offered, the ones dropped and why, or why the server could not be used, in a sentence. Calls no tool.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/mcp-servers/$NAME/check" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
POST /console/v2/projects/{project_id}/agents/{agent_id}/rotate-secret#
Issue a new webhook signing secret for this agent and return it once.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/rotate-secret" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
GET /console/v2/projects/{project_id}/agents/{agent_id}/test-runs#
List runs newest first, optionally of one test_id. Runs are kept 30 days.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/test-runs?limit=20" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
GET /console/v2/projects/{project_id}/agents/{agent_id}/test-runs/{run_id}#
Read one run: status, the transcript, each check's result, tokens used and the model. Ask again until the status is passed, failed or error.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/test-runs/$RUN_ID" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
POST /console/v2/projects/{project_id}/agents/{agent_id}/test-runs/{run_id}/cancel#
Stop a test run. A queued run is cancelled at once (status: cancelled, ended_by: stopped). A running run is asked to stop: the answer still says running, with cancel_requested_at set, and the run ends cancelled before its next model request, keeping the transcript so far (asking again changes nothing). A run that already finished is a 409.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/test-runs/$RUN_ID/cancel" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
GET /console/v2/projects/{project_id}/agents/{agent_id}/tests#
List the agent's saved tests, each with its newest run.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/tests" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
POST /console/v2/projects/{project_id}/agents/{agent_id}/tests#
Save a test: the caller to play, values, canned tool answers and checks. Up to 50 per agent. Nothing runs until you run it.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/tests" \
-H "Authorization: Bearer $DVAARIK_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"caller_persona": "Ravi, a regular. He wants to move Saturday 4 PM to Monday morning.",
"name": "Moves a booking",
"checks": [
{
"type": "calls_tool",
"tool": "book_slot"
},
{
"type": "judge",
"question": "Did the agent read the new time back?"
}
],
"max_turns": 6
}'
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X GET "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/tests/$TEST_ID" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/tests/$TEST_ID/run" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
POST /console/v2/projects/{project_id}/agents/{agent_id}/tests/run-all#
Queue a run of every test when the agent has at most 6, or of up to 6 named in test_ids. Takes the same overrides as a single run.
No account session was presented, or it is invalid or expired.
403
The account is suspended or its email is not verified.
404
The project or the addressed resource does not exist for this owner. A resource owned by another developer is deliberately indistinguishable from one that never existed.
409
The project or resource is in a state that refuses this change.
422
The request body or query is not valid. detail is an array of {loc, msg, type} and loc names the offending field.
Plus the account-door errors above. Full list on the errors page.
bash
curl -sS -X POST "https://api.developers.dvaarik.com/console/v2/projects/$PROJECT_ID/agents/$AGENT_ID/tests/run-all" \
-H "Authorization: Bearer $DVAARIK_TOKEN"
Try it without a key in the browser
The playground opens a real voice session with your account session, so a project key never reaches a browser. Machine calls belong on your own server.