Skip to main content
If your agent runs on the LiveKit Agents framework, this is the simplest way to simulate calls. Bluejay manages room and token creation and places the Digital Human directly in the room with your agent.
This method is for inbound agents: your agent answers and the Digital Human starts the conversation. If your agent places calls, use Outbound agents instead.

How it connects

Bluejay creates a room inside your LiveKit Cloud project, dispatches your agent into it, then mints a token and joins the Digital Human to the same room. No SIP or trunks involved.

Quick start

  1. Add your LiveKit credentials — in Settings → Integrations, add your LiveKit api_key, api_secret, and url.
  2. Set your agent name — in Agent Settings → Connection, enter the name your agent registers with, or leave it blank to dispatch your default agent.
  1. Create a simulation — go to the Simulations page, click Create in the top right, select your agent, and add or auto-generate Digital Human personas.
  2. Run it — in the Simulations tab, click Run on the simulation, then click Run calls (the button shows the call count, e.g. “Run 3 calls”).
  3. Review results — transcripts, recordings, and metric scores.

Token webhook

If you’d rather not store your LiveKit API key and secret with Bluejay, set a Token Webhook URL in Agent Settings → Connection instead. Before each simulated call, Bluejay POSTs to your endpoint and your side mints the room token.

Request

If you set an Authorization value in the connection settings, Bluejay stores it encrypted and sends it verbatim as the Authorization header on this POST (e.g. Bearer <token>). No other authentication is added.

Response

In webhook mode you own agent dispatch: either bake a RoomAgentDispatch into the token’s room configuration using the agent_name and agent_metadata we send, or dispatch your agent server-side when you handle the request.

Failure behavior

If your endpoint (or a proxy in front of it) responds 401 or 403, Bluejay does not retry. The run fails immediately with status NO_CONNECTION and error code LIVEKIT_SESSION_SETUP_FAILED, and the error message states whether the configured Authorization header was sent. The header is sent exactly as configured, so a 401 means your side rejected that exact value. Timeouts and 5xx responses are retried up to 3 times before the run fails.

Room metadata

Optionally include metadata on the room at creation: add JSON to the metadata field in Agent Connection settings.

Tool call tracking

Bluejay can capture tool calls your agent makes during a simulation. Publish a data packet to a LiveKit topic and Bluejay ingests it. In Agent Connection settings, set the LiveKit Customer Tool Topic field to the topic your code publishes to (e.g. customer.tool.calls). Then, whenever your agent invokes a tool:
Only name is required; everything else is optional: Bluejay buffers packets during the call and persists them when the simulation ends.

Sending traces to Bluejay

Export OpenTelemetry traces from your LiveKit agent so they’re used and displayed in simulation evaluations.
After session.start(), capture the trace ID from the active span:

Linking data to simulation results

POST trace IDs and tool calls at shutdown via ctx.add_shutdown_callback():
Ordering matters: span.end() → force_flush() → POST → tracer_provider.shutdown(). If you POST before ending the span, the trace may not be in Bluejay yet.
For the full traces concept, see the Traces documentation.