Skip to main content
Your agent must already be integrated with Tuner and sending real calls through LiveKit, Pipecat, Vapi, ElevenLabs or a Custom stack, with its Call Direction set to Outbound. You configure outbound simulation in Agent Settings > Simulation Setup.
Outbound simulation tests agents that place calls. Tuner can’t call into an outbound agent, so the flow is reversed: Tuner tells your system who to call, and your agent calls the Simulated Caller that plays the customer in each Scenario. For LiveKit, Pipecat and Custom stack agents, “who to call” is a SIP URI such as sip:<token>@sip.usetuner.ai, where <token> is a 26-character ID unique to the Scenario, instead of a phone number like +15551234567. It goes in the same field your API already uses for the number, and your platform dials it like any other call. Vapi and ElevenLabs agents use a phone number on their platform instead; see Vapi and ElevenLabs.

Find your platform

The rest of this page covers the trigger endpoint, then Vapi and ElevenLabs.

How it works

  1. You describe your call-starting API to Tuner, once. Every outbound agent has an endpoint that starts a call. You give Tuner that endpoint, and Tuner uses it for every simulated call.
  2. Tuner builds the Scenarios. Each run generates Simulated Callers with a persona, an intent and something to test, the same as inbound simulation. Each gets its own SIP URI.
  3. Tuner triggers your endpoint once per Scenario, putting the SIP URI where your body expects the number, plus any Scenario and test profile values you ask for.
  4. Your agent dials and the conversation happens. From your agent’s side this is an ordinary outbound call.
  5. You sync the call back with the SIP URI in recipient. See How simulated calls are linked.
  6. Your production evals run, and results appear on the Runs tab of Simulations. See Run statuses.

Configure the trigger endpoint

Open Agent Settings > Simulation Setup. The Outbound Trigger Endpoint card is where you describe your API to Tuner: Agent Settings, Simulation Setup, Outbound Trigger Endpoint
1

Enter the Trigger URL

Trigger URL is the endpoint on your side that places an outbound call. Tuner always sends a POST with Content-Type: application/json.
  • It must use https.
  • Its host must resolve to a public address. Private, internal and loopback addresses are rejected.
2

Add headers

Under Headers, click Add Header for each header your endpoint needs, such as an Authorization token. Enter the Key and Value.In a header value, {{integration.api_key}} is replaced with the API key saved on your agent’s integration when Tuner triggers a call.
3

Write the body

Body is a JSON template in your endpoint’s shape. The key names are yours (destination, to, phoneNumber and so on). Put each placeholder inside a JSON string, and Tuner replaces it before sending:The body must be valid JSON and include {{sipUriToDial}}, or Save stays disabled.
4

Save

Click Save. Tuner checks the endpoint before it saves: it sends a POST to the Trigger URL with your headers as entered and no body. Saving fails if the URL can’t be reached, the check takes longer than 15 seconds, or the endpoint returns 401, 403, 404, 410, 503 or 504.Once saved, every simulation run triggers your endpoint once per Scenario.

Example

Say your endpoint takes a destination and dials it. Somewhere inside, there’s a line like this (LiveKit shown, same concept on any stack):
In Tuner, you mirror that endpoint with {{sipUriToDial}} in the destination field, since that’s where the number normally goes: Trigger URL
Headers Body
The example endpoint configured in Tuner, Agent Settings > Simulation Setup

Send the call back with recipient

When your integration syncs the finished call to Tuner, the dialed SIP URI must be in the recipient field, exactly as Tuner sent it. Whatever key you put {{sipUriToDial}} under, that’s the value to send back. Tuner links the call on the token in the URI, so a phone number or another SIP URI doesn’t link. If the SIP Call-ID of the call reaches Tuner unchanged, Tuner can also link on that. Don’t rely on it, because a carrier or proxy between your agent and Tuner can change it. Set it up on your integration page: LiveKit, Pipecat or Custom stack. For a custom stack, send the value as recipient in the Create Call API payload.
Want evals to use the intent or test profile values? Echo them back in the call’s metadata when you sync: extra_metadata on the LiveKit plugin or Pipecat observer, or metadata in the Create Call payload. See Evaluating agents with dynamic instructions.

Vapi

Vapi outbound agents don’t use a trigger endpoint. Tuner starts each call through Vapi’s API from your assistant (the agent’s Agent Remote ID), using your Vapi integration’s API key and a Vapi phone number that dials Tuner. You give Tuner that number’s VAPI Phone Number ID. Open Agent Settings > Simulation Setup. Under Do you already have a VAPI Phone Number ID?, choose one:
Enter the phone number resource ID from your Vapi dashboard in VAPI Phone Number ID and click Save. Tuner checks that the number exists in your Vapi account before it saves.
To change the number later, edit VAPI Phone Number ID and click Save.

ElevenLabs

ElevenLabs outbound agents don’t use a trigger endpoint. Open Agent Settings > Simulation Setup. The Outbound Trigger Endpoint card shows an ElevenLabs Phone Number ID field. Choose one:
When no number is saved, the card shows What Tuner creates in ElevenLabs, a preview of the request Tuner sends to ElevenLabs, with your API key hidden. Click Create phone number.Tuner uses your saved ElevenLabs API key to create a SIP trunk number labeled Tuner Outbound, assigned to your agent, with Tuner’s SIP host as its outbound address. If your account already has a Tuner Outbound number that points at Tuner, Tuner reuses it. Tuner then saves the number’s ID to your outbound config. A message says ElevenLabs phone number created. or Reused existing ElevenLabs phone number.
To change the number later, edit ElevenLabs Phone Number ID and click Save. If no number is saved, the Run a simulation dialog asks you to configure your ElevenLabs Phone Number ID before the run starts. Click Configure → to open Simulation Setup. Once a number is saved, the dialog shows it under Calls triggered via: as ElevenLabs · <phone number ID>. Tuner starts each call through ElevenLabs’ outbound call API from your agent (the agent’s Agent Remote ID), using your ElevenLabs API key and the saved number. The number’s outbound trunk address must be Tuner’s SIP host, so ElevenLabs dials the Simulated Caller through Tuner. If ElevenLabs accepts a call request but can’t place the call, Tuner counts it as a failed dial. Check the number’s outbound trunk address and the agent ID. Before it places each call, Tuner checks that your ElevenLabs account has credits left. If it has none, Tuner doesn’t place the call and marks it failed. See Troubleshooting.

Limits

The outbound config is also available through the public API: see Save Outbound Config in the Agent Settings group of the API Reference.

Troubleshooting

The synced call’s recipient didn’t match the SIP URI Tuner sent: it was never set, was modified (for example cut down to a phone number), or a different value was sent. A call is linked only when Tuner first saves it, so run the Scenario again after you fix it. Compare the URI your endpoint received byte for byte with the recipient on the synced call. In the run, these calls show as Unreported.
The dial failed on your side. Check your platform’s logs, and confirm your trunk can dial a SIP URI. Some configurations only allow phone numbers.
Tuner checks the endpoint when you click Save. Confirm the URL uses https, is publicly reachable, accepts a POST with the Headers you entered and an empty body, and responds within 15 seconds without 401, 403, 404, 410, 503 or 504.
Check the Headers saved in Simulation Setup, and confirm the body template matches the shape your endpoint expects.
Tuner checks your ElevenLabs credits before each call. If the account has none left, Tuner doesn’t place the call. If ElevenLabs refuses a call request or ends a call because the account is out of credits or over its quota, Tuner fails that call for the same reason.When every call in the run fails before it’s placed, the run card says Your ElevenLabs account is out of credits or over its quota. Top up or raise the limit in ElevenLabs, then run again. Top up or raise the limit in ElevenLabs, then run the Scenarios again.
ElevenLabs refuses new calls when your plan’s concurrent call limit is reached. Tuner waits and retries the call up to 3 times. If ElevenLabs still refuses it, the call fails.When every call in the run fails this way, the run card says ElevenLabs refused the calls because your plan’s concurrent call limit was reached. Run fewer scenarios at once or raise the limit in ElevenLabs, then run again. Run fewer Scenarios at once, or raise the limit in ElevenLabs.

Next steps

Run a simulation

Configure your Simulation Mix and start a run.

Test Profiles

Give the Simulated Caller an identity and pass its fields to your endpoint.