Skip to content

Quickstart · you have a key

From a key to an agent that speaks.

Paste the key, pick a voice, point the stack you already run at it. Vapi takes no files and no code. Nothing on this page needs an account with us, a dashboard, or a call.

Paste it once.

Checked against GET /v1/prewarm, about ninety milliseconds, and the same request starts the fleet warming, so the audition below opens on a path that is already up. Nothing is synthesised to test the key, which is the point: a good key still reads as good on a day the engine is slow, and this page cannot tell you your key is bad unless the API said invalid_api_key.

Kept in this browser. Sent to tts.gandr.ai, and, if you use the Vapi step, to Vapi, which needs it to call us.

the same check, from your terminal
shell
curl https://tts.gandr.ai/v1/prewarm -H "x-api-key: gnd_YOUR_KEY"
# 202 {"status":"warming"}          good key, and the fleet is now warming
# 401 {"error":"invalid_api_key"}   bad key

Click a voice.

The audition runs on your key, not on a demo key of ours. The number that appears beside a voice is the time from the request leaving this browser to the audio arriving.

Point your stack at it.

Pick where the audio has to come out. Only that panel opens, the other five stay out of your way.

The one destination that needs nothing copied. This page asks Vapi for your assistants and patches the one you choose.

Held in this tab only, never stored, and never sent to us. It goes to api.vapi.ai and nowhere else.

what the button sends
PATCH https://api.vapi.ai/assistant/{assistantId}
Authorization: Bearer <your vapi private key>
Content-Type: application/json

{
  "voice": {
    "provider": "custom-voice",
    "voiceId": "gandr-mia",
    "server": {
      "url": "https://tts.gandr.ai/v1/vapi",
      "secret": "gnd_YOUR_KEY",
      "timeoutSeconds": 45
    },
    "fallbackPlan": {
      "voices": [{ "provider": "vapi", "voiceId": "Elliot" }]
    }
  }
}

The voice id travels in Vapi’s request payload, so this one URL serves every voice. Change the Voice ID in the Vapi dashboard later and you do not come back here.

The patch carries a fallback plan. If our engine does not answer a call, the call keeps talking in one of Vapi’s own voices instead of going silent, which is what a cold engine and no fallback plan add up to.

set it by hand instead
Server URL
https://tts.gandr.ai/v1/vapi
Secret
gnd_YOUR_KEY

In Vapi: Voice → custom-voice. Set Voice ID to gandr-mia.

Hear it on a call

Vapi dials out from a number on your own Vapi account. Digits with the country code.

Everything else

Full API reference, every parameter, every error code, the streaming lane and the cloning endpoint. Something this page does not cover: contact@gandr.ai.