sip:sim-abc123@sip.usetuner.ai instead of +15551234567. It goes in the same field your API already uses for the number, and your platform dials it like any other call.
Prerequisite: your agent must already be integrated with Tuner and sending real calls — LiveKit, Pipecat, or Custom stack. Your agent must also be set up as outbound.
How it works
- You describe your call-starting API to Tuner, once. Every outbound agent has some endpoint that kicks off a call. You give Tuner that endpoint and Tuner uses it for every simulated call.
- Tuner builds the scenarios. Each run generates simulation agents with a persona, an intent, and something to stress-test — the same as inbound simulation. Each gets its own SIP URI.
- Tuner triggers your endpoint once per scenario, passing the SIP URI where your body expects the number, plus scenario context your agent can use.
- 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. That’s the key that matches the call to the simulation instead of treating it as production traffic. - Your production Evals run, and results appear in the Simulations table.
Configure the trigger endpoint
Open Agent Settings → Simulation Setup. This is where you describe your API to Tuner:
- Trigger URL — the endpoint on your side that places an outbound call.
- Headers — whatever your endpoint needs to accept the request (an
Authorizationtoken, for example). - Body — a JSON template in your endpoint’s shape, containing Tuner’s three placeholders:
The key names are entirely yours (
destination, to, phoneNumber, …). All three placeholders need a key in the template, but if you don’t use the intent or the name, park them under any key — only the SIP URI is essential.
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.
- LiveKit
- Pipecat
- Custom stack
- Python
- Node.js
Managed platforms
Running your outbound agent on Vapi, Retell, or another managed platform? Step-by-step guides are coming soon.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, or a different value was sent. Compare the URI your endpoint received byte-for-byte with the recipient on the synced call.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.
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.
Run your first simulation
Configure your simulation mix and start a batch.