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.
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
- 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.
- 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.
- 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.
- Your agent dials and the conversation happens. From your agent’s side this is an ordinary outbound call.
- You sync the call back with the SIP URI in
recipient. See How simulated calls are linked. - 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:
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 adestination and dials it. Somewhere inside, there’s a line like this (LiveKit shown, same concept on any stack):
{{sipUriToDial}} in the destination field, since that’s where the number normally goes:
Trigger URL
Body

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.
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:- Yes, I have one
- No, I don't have 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.
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:- Let Tuner create it
- Use an existing number
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.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
Simulated calls show up as ordinary production calls
Simulated calls show up as ordinary production calls
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.Tuner triggers my endpoint but no call arrives
Tuner triggers my endpoint but no call arrives
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.
Save fails with a Trigger URL error
Save fails with a Trigger URL error
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.My endpoint returns an error to Tuner
My endpoint returns an error to Tuner
Check the Headers saved in Simulation Setup, and confirm the body template matches the shape your endpoint expects.
ElevenLabs calls fail because the account is out of credits
ElevenLabs calls fail because the account is out of credits
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 calls fail because of a concurrent call limit
ElevenLabs calls fail because of a concurrent call limit
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.