Skip to content
Guide

Gemini Live on a real phone call with the Wixzel Voice API

Four HTTP requests take you from an empty account to a phone ringing with Google's Gemini Live model on the line: connect your SIP trunk, register a number, create a realtime agent, place the call. A fifth reads back the record, with the transcript and what the call cost. With your carrier already set up it takes about 10 minutes. The Gemini Live engine is $0.0466 per connected minute, the lowest in the price book, so a three-minute call is about $0.14, billed per second from a prepaid balance, plus your carrier's rate.

By · Published · Updated

Takes
About 10 minutes with your carrier set up
Engine time
$0.0466 per connected minute

What do you need before you start?

  • A Wixzel Voice API key with credit. The minimum top-up is $5.
  • A SIP trunk at your carrier and a number on it that the carrier lets you present as caller ID.
  • curl, jq and uuidgen.

How do you build this on Wixzel Voice, step by step?

  1. 01Connect your SIP trunk

    Set your key and the API base once, then create the trunk. tee keeps the full response, because you need two values from it besides the id:

    shell
    export WIXZEL_API_KEY="wv_live_..."
    API=https://api.voice.wixzel.com/v1
    
    TRUNK_ID=$(curl -s $API/sip-trunks \
      -H "Authorization: Bearer $WIXZEL_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "My carrier",
        "host": "sip.your-carrier.example",
        "username": "your-sip-username",
        "password": "your-sip-password"
      }' | tee trunk.json | jq -r .id)
    
    jq -r '.platform_ip, .origination_uri' trunk.json

    Leave out username and password if your carrier authorises by IP. Either way, allowlist platform_ip at the carrier so it accepts calls from the platform; origination_uri is where the carrier should send inbound calls, which this guide does not need.

  2. 02Register the number you will call from

    Use your own number, in E.164 form:

    shell
    NUMBER_ID=$(jq -n --arg trunk "$TRUNK_ID" \
      '{phone_number: "+14155550100", sip_trunk_id: $trunk}' |
      curl -s $API/phone-numbers \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)
  3. 03Create the Gemini Live agent

    The voice is one realtime model rather than three stages:

    shell
    AGENT_ID=$(jq -n --arg number "$NUMBER_ID" '{
        name: "Gemini Live",
        system_prompt: "You are a friendly assistant on a phone call. Keep answers to one or two sentences.",
        opening_message: "Hi, this is an automated assistant. Do you have a minute?",
        outbound_phone_number_id: $number,
        voice: { realtime: { model: "google/gemini-live", voice: "Charon" } }
      }' |
      curl -s $API/agents \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)

    voice.realtime hands the whole turn, listening, reasoning and speaking, to Gemini Live, so there is no stt, llm or tts block; the API refuses a voice that names both shapes. Charon is one of Gemini's prebuilt voices, and GET /v1/engines/gemini_live/voices lists them all with Google's one-word descriptions.

    outbound_phone_number_id gives the agent a caller ID, which is what lets the next request leave out from_number_id.

  4. 04Place the call

    Replace the to number with the phone you want to ring:

    shell
    CALL_ID=$(jq -n --arg agent "$AGENT_ID" '{to: "+14155551234", agent_id: $agent}' |
      curl -s $API/calls \
        -H "Authorization: Bearer $WIXZEL_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d @- | jq -r .id)

    The API answers 201 with status: "queued" at once, and the phone rings a moment later. Idempotency-Key is required here: a network timeout tells you nothing about whether the call was placed, and a retry with the same key returns the original call instead of dialling twice, so keep the key if you script retries. A call that cannot fund its first 15 seconds is refused with 402 before anything is dialled.

  5. 05Read what happened

    The fifth request reads the call back:

    shell
    curl -s $API/calls/$CALL_ID \
      -H "Authorization: Bearer $WIXZEL_API_KEY" | jq
    Example response, shortened
    {
      "id": "6a96a3ead6e886d42462dd3e",
      "object": "call",
      "session_id": "sip-5b0c7c0e-9d1f-4c52-8a9e-2f0d3a4b6c7d",
      "status": "completed",
      "direction": "outbound",
      "channel": "phone",
      "engine": "gemini_live",
      "to": "+14155551234",
      "duration_seconds": 94,
      "cost_micros": 73007,
      "failure_code": null,
      "failure_reason": null,
      "transcript": [
        { "role": "assistant", "content": "Hi, this is an automated assistant. Do you have a minute?" },
        { "role": "user", "content": "Sure, go ahead." }
      ]
    }

    status moves from queued through ringing and in-progress to completed, or ends as failed, busy or no-answer. cost_micros is written when the call settles (1,000,000 is $1.00) and stays null on a call that never connected, because such a call is not charged. When a call fails, failure_code is the carrier's Q.850 cause (17 busy, 19 no answer, 21 rejected by the carrier) and failure_reason says what to do about it. GET /v1/usage/events?session_id=… itemises every charge.

What does this build cost on Wixzel Voice?

Engine time for 3-minute calls on the gemini-live engine at $0.0466 per connected minute: about $0.14 per call. Telephony is your own trunk at your carrier’s rate and is not included.

Monthly engine cost for this guide’s build
Calls per monthConnected minutesEngine cost per month
300900$41.94
1,5004,500$210
6,00018,000$839

The per-minute figure is at typical speech rates, including the orchestration fee. Gemini Live is metered in audio tokens while the call is live, so a quiet call costs less than the estimate and a talkative one more. The example response above prices a 94-second call at the per-minute rate. Your carrier bills the line separately, with no markup.

Prepaid, with no subscription and no free tier: add credit from $5 and usage spends it. Estimate your own mix.

Which Wixzel Voice limits apply to this build?

  • Phone calls need your own SIP trunk. Wixzel Voice does not sell, port or hold numbers.
  • A test call from POST /v1/agents/{id}/test-call speaks its one phrase through the classic voice pipeline, because Gemini Live has no single-phrase mode. To hear the Gemini voice itself, place an ordinary call.
  • Five calls can be live at once per account by default, raised on request.
  • No latency figure is published: a realtime engine answers as fast as the model itself does. Wixzel Voice is in alpha, and behavioural changes ship behind a dated Wixzel-Version header.

Frequently asked questions

Can Gemini Live make phone calls?
Gemini Live is a model, not a phone service. Wixzel Voice connects the two: create an agent whose voice is {"realtime": {"model": "google/gemini-live"}}, and POST /v1/calls dials a real number over your own SIP trunk with Gemini Live on the line.
Do I need a Google Cloud or Gemini API key?
No. On the hosted platform the provider accounts belong to Wixzel Voice. One wv_live_ API key and a prepaid balance cover Gemini Live and every other engine.
Which voices can Gemini Live use on a call?
Its prebuilt voices, such as Charon, Kore and Puck. GET /v1/engines/gemini_live/voices lists them all. A voice from another engine's roster is refused when the agent is created.
What does a Gemini Live phone call cost?
$0.0466 per connected minute at typical speech rates, about $0.14 for three minutes, billed per second from prepaid credit, plus your carrier's rate. A call that never connects costs nothing.
Can the Gemini Live agent answer inbound calls too?
Yes. Set the phone number's inbound_agent_id to the agent with PATCH /v1/phone-numbers/{id}, and point your carrier's inbound route at the trunk's origination_uri.

Where to read more

  • Quickstartdocs

    The same four requests, also in the TypeScript and Dart SDKs.

  • Voice enginesdocs

    The realtime voice shape, rosters and languages.

  • SIP trunksdocs

    Allowlisting, inbound routing and what each failure code means.

  • Idempotencydocs

    Why POST /v1/calls needs a key and how replays work.

APIs for agentic telephony

About Wixzel Voice

Wixzel Voice is a voice AI API for building AI agents that place and answer real phone calls over your own SIP trunk, or talk to people in your web and mobile apps. One API key and one prepaid balance cover every voice engine, billed per second of actual usage.