Il pacchetto Starter è gratuito: 0 € al mese, con 30 minuti per provarlo su chiamate reali.Il pacchetto Starter è gratuito. Inizia gratis

Riferimento API / Agent testing

Agent testing

Gli endpoint del gruppo Agent testing dell'API Voiceland AI, con parametri, schemi ed esempi curl.

Ultimo aggiornamento:

Le descrizioni degli endpoint e dei campi restano in inglese, esattamente come le pubblica l'API. È una scelta voluta: qui legge ciò che vedrà anche nelle risposte.

GET /v1/agents/{name}/test-runs#

List test runs. The agent's test runs, **newest first**, full transcripts included. A run's cost block (its model spend) is shown only when the run record says it used your own LLM provider key (BYOK), as totals alone (total_micros, llm_micros): no model or token counts. billed_seconds is unaffected.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.
limit query integer Rows, 1 to 100 (default 20). Larger values are capped rather than refused.

Risposte

Codice Descrizione
200 Success.
400 limit is not a positive whole number (bad_request).
401 Missing or invalid API key.
404 No agent with that name (agent_not_found).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl "https://api.voiceland.ai/v1/agents/{name}/test-runs" \
  -H "Authorization: Bearer VL_API_KEY"

Una risposta riuscita restituisce un AgentTestRunsResponse.

Esempio di risposta

{
  "items": [
    {
      "channel": "voice",
      "id": "00001754550000000000000",
      "pass": false,
      "scenario_name": "book then cancel",
      "status": "failed"
    }
  ]
}

POST /v1/agents/{name}/test-runs#

Run a test scenario (synchronous). Executes one scenario against the agent's stored spec over the text path, the agent's own system prompt, model and tool surface, no live call, and returns the stored run. Pass scenario_id to run a stored scenario, OR an inline scenario (same shape as authoring) for an ad-hoc run that stores only the run. **Tools run for real where real is safe.** The calendar builtins (check_availability, book_meeting, find_bookings, manage_booking, reassign_meeting) execute against your actual calendar service, the same booking path a live call uses, so a passing scenario proves the booking flow, not a mock of it (find_bookings defaults to the scenario's caller_phone, as a live call defaults to the caller ID). knowledge_search is recorded but answers a static empty result; custom webhook/flow tools are recorded but never dial out. **The call is synchronous** and bounded (turn count, per-turn tool-hop cap and timeout): the response is the finished run, the full transcript with each turn's reply, every tool call with its arguments and result, the per-turn failure list and pass/fail verdict, and the aggregate status (passed | failed, or error when the harness itself broke mid-run; an errored run is still stored, but asserts nothing about the agent). The cost block (the run's model spend) is shown only when the run used your own LLM provider key (BYOK), as totals alone (total_micros, llm_micros): no model or token counts. billed_seconds is unaffected.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.

Corpo della richiesta

application/json Schema: AgentTestRunRequest

Campo Tipo Obbligatorio Descrizione
scenario AgentTestScenarioRequest
scenario_id string

Risposte

Codice Descrizione
201 The stored run, full transcript included.
400 The scenario (stored or inline) fails validation (invalid_scenario).
401 Missing or invalid API key.
402 Refused by the billing gate, nothing started or billed. minutes_exhausted: the AI minutes are used up; the message tells the customer to add more minutes or upgrade the plan in the console. package_past_due: the plan fee is overdue (message: "Your plan payment is overdue. Settle it from Billing or upgrade your plan to continue."). package_suspended: the service is paused until the plan fee is settled (message: "Your service is paused until the plan payment is settled. Settle it from Billing to continue."). byok_balance_empty (a new voice call only, never chat): the account runs its voice calls on its own provider keys, which are paid from purchased minutes alone, and it has none left; included minutes do not admit the call, and the message tells the customer to get purchased minutes in the console. The first three codes are in blocked_reason on GET /me/wallet; byok_balance_empty is its byok_balance_empty flag.
404 No agent with that name (agent_not_found) or no scenario with that id (scenario_not_found).
422 The body is not valid JSON for this shape, names both scenario_id and scenario, or names neither (invalid_request).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl -X POST "https://api.voiceland.ai/v1/agents/{name}/test-runs" \
  -H "Authorization: Bearer VL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "scenario_id": "ats_9d8c7b6a"
}'

Esempio di risposta

{
  "agent": "front-desk",
  "channel": "voice",
  "id": "00001754550000000000000",
  "pass": true,
  "scenario_id": "ats_9d8c7b6a",
  "scenario_name": "book then cancel",
  "status": "passed",
  "tenant_slug": "acme",
  "turns": [
    {
      "pass": true,
      "reply": "I can offer Monday 09:00 or 10:00, which suits you?",
      "tool_calls": [
        {
          "args": {
            "event_type": "et1",
            "member_id": "m1"
          },
          "name": "check_availability",
          "result": "Open start times (UTC, RFC3339): 2026-08-17T09:00:00Z, 2026-08-17T10:00:00Z."
        }
      ],
      "user": "I'd like an appointment tomorrow morning."
    }
  ]
}

GET /v1/agents/{name}/test-runs/{id}#

Get a test run. One run in full: per-turn user text (with {{last_uid}} already substituted), the agent's reply, every tool call with arguments and result, the failure list and pass/fail per turn, and the aggregate verdict. The cost block (the run's model spend) is shown only when the run record says it used your own LLM provider key (BYOK), as totals alone (total_micros, llm_micros): no model or token counts. billed_seconds is unaffected.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.
id path string Sì Run id.

Risposte

Codice Descrizione
200 Success.
401 Missing or invalid API key.
404 No agent with that name (agent_not_found) or no run with that id (run_not_found).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl "https://api.voiceland.ai/v1/agents/{name}/test-runs/{id}" \
  -H "Authorization: Bearer VL_API_KEY"

Esempio di risposta

{
  "id": "00001754550000000000000",
  "pass": false,
  "status": "failed",
  "turns": [
    {
      "failures": [
        "reply_missing: nine"
      ],
      "pass": false,
      "reply": "We are open until five.",
      "user": "When are you open?"
    }
  ]
}

GET /v1/agents/{name}/test-scenarios#

List an agent's test scenarios. Every stored test scenario for the agent, in scenario-id order. A scenario is a scripted multi-turn conversation, an ordered list of user turns, each with the expectations the agent's handling of that turn must meet, plus a channel (chat or voice) that shapes how it runs.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.

Risposte

Codice Descrizione
200 Success.
401 Missing or invalid API key.
404 No agent with that name (agent_not_found).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl "https://api.voiceland.ai/v1/agents/{name}/test-scenarios" \
  -H "Authorization: Bearer VL_API_KEY"

Una risposta riuscita restituisce un AgentTestScenariosResponse.

Esempio di risposta

{
  "items": [
    {
      "agent": "front-desk",
      "channel": "voice",
      "id": "ats_9d8c7b6a",
      "name": "book an appointment",
      "tenant_slug": "acme",
      "turns": [
        {
          "expect": [
            {
              "tool": "check_availability"
            }
          ],
          "user": "I'd like an appointment tomorrow morning."
        }
      ]
    }
  ]
}

POST /v1/agents/{name}/test-scenarios#

Author a test scenario. Stores one scenario: a name, a channel (chat or voice, voice runs add a phone-call preamble and advertise the full tool surface; chat runs drop the SIP-only builtins exactly as a widget session does), an optional caller_phone, and 1 to 20 turns. caller_phone sets the number the scripted caller is calling from: the run's preamble tells the model, and the find_bookings tool defaults to it, exactly as a live call defaults to the SIP caller ID. Set it to script "change my appointment" flows where the caller never recites a booking reference. Each turn is a user utterance plus optional expect assertions, all of which must hold: - tool, at least one tool call with this name fired on the turn. - args_contain, narrows tool: each value must appear (substring) in the matching call's argument of that key. - tool_result_contains, narrows tool further: the matching call's result text must contain this (case-insensitive). - reply_contains / reply_not_contains, case-insensitive substring assertions on the turn's final text reply. - no_tool, the turn fired no tool at all. The literal {{last_uid}} in a turn's user text is substituted at run time with the booking reference the run's last successful book_meeting returned (empty before any booking), how a script cancels or reschedules a booking whose reference the calendar mints.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.

Corpo della richiesta

application/json Schema: AgentTestScenarioRequest

Campo Tipo Obbligatorio Descrizione
caller_phone string
channel string Sì
name string Sì
turns array of Turn Sì

Risposte

Codice Descrizione
201 The stored scenario, with its server-minted id.
400 No turns, more than 20, an empty user text, or a channel that is not chat/voice (invalid_scenario).
401 Missing or invalid API key.
404 No agent with that name (agent_not_found).
422 The body is not valid JSON for this shape (invalid_request).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl -X POST "https://api.voiceland.ai/v1/agents/{name}/test-scenarios" \
  -H "Authorization: Bearer VL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "channel": "voice",
  "name": "book then cancel",
  "turns": [
    {
      "expect": [
        {
          "args_contain": {
            "member_id": "m1"
          },
          "tool": "check_availability",
          "tool_result_contains": "Open start times"
        }
      ],
      "user": "I'\''d like an appointment tomorrow morning."
    },
    {
      "expect": [
        {
          "args_contain": {
            "action": "cancel"
          },
          "tool": "manage_booking"
        }
      ],
      "user": "Actually cancel {{last_uid}}."
    }
  ]
}'

Esempio di risposta

{
  "agent": "front-desk",
  "channel": "voice",
  "id": "ats_9d8c7b6a",
  "name": "book then cancel",
  "tenant_slug": "acme"
}

POST /v1/agents/{name}/test-scenarios/generate#

Generate test-scenario drafts with AI. Asks a model to draft test scenarios for this agent, grounded in the agent's own stored configuration, its system prompt, primary language (the drafted user turns are written in it) and tool surface. prompt is optional guidance ("cover cancelling and rescheduling"); count is how many drafts to ask for (1 to 8, default 3). **The drafts are returned UNSAVED.** Nothing is stored by this call: review the drafts, edit what needs editing, and save the keepers via POST /agents/{name}/test-scenarios, each draft's body is already the authoring shape (name, channel, optional caller_phone, turns with expect assertions), so a keeper posts as-is. Drafts the model produced that failed scenario validation are discarded and counted in dropped. Generation rides the same per-tenant LLM dispatch as a test run, on the agent's own model; the tokens are quality-assurance cost, metered on the grading bucket, not the conversational one.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.

Corpo della richiesta

application/json Schema: AgentTestGenerateRequest

Campo Tipo Obbligatorio Descrizione
count integer
prompt string

Risposte

Codice Descrizione
200 The validated drafts, returned for review, not stored.
401 Missing or invalid API key.
404 No agent with that name (agent_not_found).
422 The body is not valid JSON for this shape (invalid_request).
4XX Request error (validation, not-found, etc.).
502 The model's output produced no valid scenarios, or the LLM call failed (generation_failed).
503 Agent testing is not configured on this deployment (agent_testing_unavailable), or no LLM is wired for the tenant (llm_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl -X POST "https://api.voiceland.ai/v1/agents/{name}/test-scenarios/generate" \
  -H "Authorization: Bearer VL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "count": 3,
  "prompt": "cover cancelling and rescheduling an appointment"
}'

Una risposta riuscita restituisce un AgentTestGenerateResponse.

Esempio di risposta

{
  "dropped": 1,
  "items": [
    {
      "caller_phone": "+306912345678",
      "channel": "voice",
      "name": "cancel via caller id",
      "turns": [
        {
          "expect": [
            {
              "tool": "find_bookings"
            }
          ],
          "user": "Θέλω να ακυρώσω το ραντεβού μου."
        },
        {
          "expect": [
            {
              "args_contain": {
                "action": "cancel"
              },
              "tool": "manage_booking"
            }
          ],
          "user": "Ναι, αυτό είναι, ακυρώστε το."
        }
      ]
    }
  ]
}

DELETE /v1/agents/{name}/test-scenarios/{id}#

Delete a test scenario. Removes one scenario. Idempotent, an absent id answers 204 too. Past runs keep their own copy of everything they executed, so run history is unaffected.

Parametri

Nome Posizione Tipo Obbligatorio Descrizione
name path string Sì Agent name.
id path string Sì Scenario id.

Risposte

Codice Descrizione
204 Removed (or was never there).
401 Missing or invalid API key.
404 No agent with that name (agent_not_found).
4XX Request error (validation, not-found, etc.).
503 Agent testing is not configured on this deployment (agent_testing_unavailable).
5XX Server or upstream error.

Esempio di richiesta

curl -X DELETE "https://api.voiceland.ai/v1/agents/{name}/test-scenarios/{id}" \
  -H "Authorization: Bearer VL_API_KEY"

Schemi#

AgentTestGenerateRequest#

Campo Tipo Obbligatorio Descrizione
count integer
prompt string

AgentTestGenerateResponse#

Campo Tipo Obbligatorio Descrizione
dropped integer Sì
items array of Scenario Sì

AgentTestRunRequest#

Campo Tipo Obbligatorio Descrizione
scenario AgentTestScenarioRequest
scenario_id string

AgentTestRunsResponse#

Campo Tipo Obbligatorio Descrizione
items array of Run Sì

AgentTestScenarioRequest#

Campo Tipo Obbligatorio Descrizione
caller_phone string
channel string Sì
name string Sì
turns array of Turn Sì

AgentTestScenariosResponse#

Campo Tipo Obbligatorio Descrizione
billing TestRunBillingResponse
items array of Scenario Sì

Error#

Error envelope returned for non-2xx responses.

Campo Tipo Obbligatorio Descrizione
error object Sì

Expectation#

Campo Tipo Obbligatorio Descrizione
args_contain map of string
no_tool boolean
reply_contains string
reply_not_contains string
tool string
tool_result_contains string

Run#

Campo Tipo Obbligatorio Descrizione
agent string Sì
billed_seconds integer
channel string Sì
cost RunCost
duration_ms integer
error string
finished_at string (date-time) Sì
id string Sì
pass boolean Sì
scenario_id string Sì
scenario_name string Sì
started_at string (date-time) Sì
status string Sì
tenant_slug string Sì
turns array of TurnResult Sì

RunCost#

Campo Tipo Obbligatorio Descrizione
currency string Sì
input_tokens integer
knowledge_searches integer
llm_micros integer Sì
model string
output_tokens integer
total_micros integer Sì

Scenario#

Campo Tipo Obbligatorio Descrizione
agent string Sì
caller_phone string
channel string Sì
created_at string (date-time) Sì
id string Sì
name string Sì
tenant_slug string Sì
turns array of Turn Sì
updated_at string (date-time) Sì

TestRunBillingResponse#

Campo Tipo Obbligatorio Descrizione
cents_per_minute number Sì
currency string Sì
in_regime boolean Sì
ledger_kind string Sì
min_seconds integer Sì
overage_cents_per_min integer Sì
package_id string
pool_shared boolean Sì
rate_percent integer Sì
rounding_s integer Sì

ToolCallRecord#

Campo Tipo Obbligatorio Descrizione
args object
name string Sì
result string Sì

Turn#

Campo Tipo Obbligatorio Descrizione
expect array of Expectation
user string Sì

TurnResult#

Campo Tipo Obbligatorio Descrizione
failures array of string
pass boolean Sì
refused boolean
reply string Sì
tool_calls array of ToolCallRecord
user string Sì

La console

Queste pagine sono di sola lettura. La chiamata di prova, le chiavi API e il riferimento API aggiornato si trovano nella console, dove il suo account è connesso.

Apri la console