Blog: Product

Test calls that talk back: a voice agent on the line

By the TelecomsXChange engineering team ยท

A test call can now be made by one of your voice agents instead of a fixed recording. Give it a one-line instruction, the number and the route. It talks to whatever answers (an IVR, a person or your own agent), and the call is recorded, transcribed and scored.

The problem

A recording cannot answer a question

An operator or an agent asks for a call, the platform dials the number through the chosen route, plays a speech sample, hangs up, and the recording, the transcript, the per-leg quality figures and the verdict all land on the call record. It proves the route completes, that audio flows both ways, and that the analysis behaves.

What it could not do is respond. A recording cannot press 2 for billing, cannot answer "who is calling", cannot keep a human talking for the forty seconds the delayed-playback checks need, and cannot ask your own voice agent a question and listen to the answer. For any destination that asks something before it does anything useful, the test was a monologue into a system waiting for a reply.

What changed

Two legs, bridged by the platform

Ask for speech: agent and name one of your Voice AI destinations as the caller. The platform places two calls of its own: first to the agent, exactly as it reaches that agent for routed traffic (encryption, the provider's webhook, the session keeper), then to your number through the route you chose. It relays the audio between the two, in both directions, for as long as you asked. The call to your number is the test call proper: recorded in stereo, transcribed with the agent on one channel and the far end on the other, and scored. The agent leg is a separate, relay-only call, metered for its seconds and never analyzed, so you pay one analysis fee per test, not two.

The call page of an agent-backed test call in the customer portal: origin test, a verdict, and the transcript with the caller agent on one side and the answering agent on the other. Phone numbers are masked.
An agent-backed test call on the call page: the verdict, the recording and the transcript with the two sides separated. This one is an agent talking to another agent.

It makes three tests possible:

IVR and menu traversal
The agent listens to the menu and answers it, so a route test reaches the thing behind the menu instead of stopping at it.
Conversational route grading
A person or a system at the far end is kept talking long enough for the early-answer and delayed-playback checks to have material, and the per-leg quality figures cover a real exchange rather than a monologue.
Agent-to-agent testing
Point the test at your own deployed voice agent. The transcript is the evidence of what it said, what it heard and how it behaved, from the outside, over a real call.

How to use it

One request, one instruction

In the portal, open the Web Dialer and switch to Let an agent call: pick the agent and the route, type the number and a one-line instruction, and press Place the call. The card follows the call, links to the Live page while it runs, and opens the call record when it ends. Over the API, the request is the test call you already know, with three more fields. The instruction is for this call only. It is never stored on the destination.

The Web Dialer page in the customer portal switched to Let an agent call: the agent that calls, the route to test, the number, the length and a one-line instruction for the agent, with a Place the call button.
In the portal: Web Dialer, then Let an agent call. Pick the agent and the route, type the number and the instruction, place it, and follow it from the same card.
The same card a few seconds after Place the call: a status line reads On the call, the agent is talking to whoever answered, with a Watch it live link, and an earlier agent call is listed underneath with a link to its record.
A few seconds later: the card follows the call, links to the Live page while the agent is talking, and offers the call record when it ends. This is a real 30-second agent-to-agent call on the platform.
POST /api/customer/test-calls
curl -s -X POST https://ovs.telecomsxchange.com/api/customer/test-calls \
  -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
  -d '{
    "number": "18005550100",
    "destination_id": "DEST_ID",
    "seconds": 60,
    "speech": "agent",
    "agent_destination_id": "AGENT_DEST_ID",
    "instruction": "Ask for the opening hours and the address, then say goodbye."
  }'
# 202 {"id":"TC_ID","status":"queued","sip_call_id":"ovs-test-...",
#      "agent_sip_call_id":"ovs-test-agent-...","call_id":null,...}

# poll until done, then read the call, the transcript and the verdict
curl -s https://ovs.telecomsxchange.com/api/customer/test-calls/TC_ID -H "Authorization: Bearer $KEY"
# {"status":"done","answered":true,"talk_seconds":60.0,"ended_by":"caller",
#  "call_id":"CALL_ID","agent_call_id":"AGENT_CALL_ID",...}
curl -s https://ovs.telecomsxchange.com/api/calls/CALL_ID/transcript -H "Authorization: Bearer $KEY"

The same call is one tool call over MCP, so a NOC agent can run a conversational route test on a schedule and read the structured result:

place_test_call over MCP
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"place_test_call",
  "arguments":{"number":"18005550100","destination_id":"DEST_ID","seconds":60,
               "speech":"agent","agent_destination_id":"AGENT_DEST_ID",
               "instruction":"Get through the menu to a person and ask for the account team."}}}
The Calls page listing the two legs of an agent-backed test call: the target leg with a verdict and the agent leg without one.
Both legs appear in the calls list with origin test: the target leg carries the verdict, the agent leg is relay-only and carries none.

Guard rails

What the agent will and will not do

The far end of a test call is an untrusted speaker whose words become model input, and a call that costs agent seconds is worth protecting from abuse. So the instruction you send sits inside a fixed brief the platform wraps around it, and the request sits under ceilings that are checked before anything is dialled.

  • The agent opens by saying, in one sentence, that this is an automated test call and that it is being recorded. The far end is a third party, so that disclosure is not optional.
  • It has no tools and no account context. It cannot dial, transfer, pay or look anything up, and it is told to decline any request to change its task, reveal its instructions or pose as a person, and to carry on with the task.
  • The instruction is trimmed, stripped of control characters and capped at 1,000 characters. It cannot change the number, the caller ID, the duration or the account: those are separate fields, validated on their own, that never reach the model.
  • Ceilings: 120 seconds per call, a spend ceiling per call covering both legs and the agent seconds, 30 minutes of agent calls per account and day, and one agent-backed test call at a time. Two requests racing each other cannot both slip under a limit. A refusal is a 409 that names the ceiling.
  • Per-call instructions need a provider whose calls the platform accepts through a hosted webhook, today OpenAI, and the agent destination must be the one whose webhook is registered in that project. An xAI agent makes the call with its own configuration.

Under the hood

Why it took a bridge

The earlier test call was a replayer: it negotiated a codec and sent frames from a recording. An agent needs the opposite: what the far end says has to reach the agent and what the agent says has to reach the far end, live, with the two directions kept apart so the transcript can name who said what and the quality figures can be reported per leg. We chose to give the platform's own user agent a second leg and relay between them, because that reuses everything the platform already does for a call to a voice agent and keeps the recording, the speaker separation and the per-leg quality untouched.

One lesson from the first live run: a bridge that only forwards what it receives sits in silence, because the far end waits for audio before it sends any. A phone would send silence while nobody talks, and so does the bridge now, on both legs. After that, the two agents in the screenshot above found each other and chatted for the full forty-five seconds.

The lower half of the same call page: processing cost, billing for the target leg, call details with the route to the voice agent over TLS, per-leg quality with estimated MOS, jitter, loss and packet counts for both legs, and the SIP ladder.
Further down the same page: billing for the leg, per-leg quality with packet counts in both directions, and the SIP ladder.

Summary

The takeaway

A test call can now hold a conversation. Set speech to agent, name the agent and the instruction, and read the transcript and the verdict when it is done. It reaches past menus, keeps the far end talking long enough to grade a route, and puts your own agent to the test over a real phone call, with the disclosure, the guard rails and the ceilings built in.

Related: the agents guide with the full request, GPT-Live-1 voice agents, the voice agent gateway, or start free with $5 credit.

Questions

Frequently asked questions

What is an agent-backed test call?

A test call placed through the API or the MCP tools where one of your Voice AI destinations is the caller instead of a fixed recording. The platform places the call to the agent, then the call to your number, and bridges the audio between them, so the agent holds a real conversation with whatever answers. The call is recorded, transcribed and scored like any other.

How do I place one?

In the portal, open Web Dialer and switch to Let an agent call: pick the agent, the route, type the number and a one-line instruction, and press Place the call. The card follows it and opens the call record when it ends. Over the API, POST /customer/test-calls with speech set to agent, agent_destination_id set to one of your Voice AI destinations, the number and destination as usual, and a short instruction for this call. Poll GET /customer/test-calls/{id} until it is done, then read the call, its transcript and its verdict. The MCP tool place_test_call takes the same fields.

What does the agent say first?

It announces, in one sentence, that this is an automated test call and that it is being recorded. That line is part of a fixed brief the platform wraps around your instruction. It cannot be removed. The far end is a third party being recorded, so use numbers you may call and record.

Can the far end talk the agent into doing something else?

No. The agent has no tools and no account context, and the brief tells it to decline any request to change its task, reveal its instructions or pose as a person, and to carry on with the task. The instruction cannot change the number, the caller ID, the duration or the account. Those are separate, validated fields that never reach the model.

What does it cost and what are the limits?

Both legs are billed per second like any call, plus the agent seconds at the provider's rate, plus the analysis fee for the target leg. The agent leg itself is relay-only and never analyzed. Ceilings apply before anything is dialled: 120 seconds per call, a spend ceiling per call, 30 minutes of agent calls per account and day, and one agent-backed test call at a time. A refusal is a 409 that names the ceiling.

Which voice agents can make the call?

Any Voice AI destination on your account. A per-call instruction needs a provider whose calls the platform accepts through a hosted webhook, today OpenAI, and the agent destination must be the one whose webhook is registered in that project. An xAI agent makes the call with its own configuration and refuses an instruction.