How to migrate from Vapi to ThunderPhone (2026): import assistants, tools, and knowledge bases
ThunderPhone can import your Vapi assistants, tools, and knowledge bases with a private API key or a JSON export. The importer creates reviewable agent configurations; it does not move phone numbers, copy credentials stored by Vapi, or silently recreate unsupported tools. Plan for a review pass and several manual connection steps before directing live traffic to the imported agents.
Before you start
Inventory every assistant you expect to move, including prompts, first-message behavior, languages, voices, tools, knowledge files, transfer destinations, voicemail behavior, and timeouts. Separately list phone numbers, ownership, per-assistant server URLs, credentials held inside Vapi, squads, workflows, and any sms, ghl, make, code, or mcp tools. That second list becomes the manual migration queue.
Run the import as a ThunderPhone admin. For the API route, create a Vapi private key with enough access to read the objects being migrated. ThunderPhone encrypts the key for the duration of the import and deletes it when the import finishes, fails, or is discarded. It is never stored with your account. Because a Vapi private key can carry broad privileges, use a dedicated key where practical and revoke it after confirming the import.
Also record which agents are production configurations and which are test copies. The importer unticks names containing test, demo, copy, untitled, sample, or playground by default, but you should still inspect the selection.
Step 1: get your API key
In Vapi, open the dashboard's API Keys page and create or copy a private key. Vapi distinguishes private keys used for server-side API access from public keys intended for client-side use; use a private key for this migration. Keep the key out of shared documents and chat threads. Vapi API keys, accessed 2026-09-10.
If your organization does not permit temporary third-party key use, skip to the JSON method below. The API-key route is more complete because the importer can resolve referenced IDs and retrieve related objects directly.
Step 2: run the import
In the ThunderPhone dashboard, go to Agents → Import, choose Vapi, paste the private key, and continue to the review table. Review each selected agent rather than importing the full list automatically.
For every agent, the table shows its name, voice match and confidence level (exact, by voice type, or default), intelligence tier (Spark, Bolt, or Storm), tools, knowledge bases, and notes. It also offers two prompt forms. Rewritten restructures the source to follow the ThunderPhone prompting guide while preserving every phone number, URL, tool name, and placeholder. Structured keeps the source content but lays it out under headings. Choose per agent based on how much editorial restructuring you want.
The importer reports items that require follow-up, including number ownership, webhooks, credentials stored by the vendor, and unsupported tools. Treat that report as part of the migration record, not as an optional warning screen.
What the importer maps
| Vapi field | ThunderPhone |
|---|---|
model.messages[system] |
Prompt |
firstMessage, firstMessageMode |
Opening line in the prompt; who speaks first |
voice.provider + voiceId |
Closest catalog voice (match confidence shown) |
transcriber.language |
Primary language |
model.model |
Intelligence tier |
model.tools / toolIds (function, apiRequest) |
API connections |
transferCall destinations |
Hand-off section of the prompt (built-in transfer) |
endCall, dtmf |
Built-ins |
knowledgeBaseId + files |
Knowledge base with documents |
endCallMessage, endCallPhrases, voicemailMessage, messagePlan.idleMessages |
Prompt sections; voicemail message setting |
silenceTimeoutSeconds |
Silence hang-up |
maxDurationSeconds, server.url, squads, workflows, sms/ghl/make/code/mcp tools |
Reported, not imported |
Voice matching selects from ThunderPhone's catalog of 123 voices across 47 languages. A lower-confidence match is a review prompt, not proof that the voices are equivalent. Likewise, the mapped intelligence tier is a starting configuration to test with realistic calls.
Vapi's maximum-duration field is reported rather than copied. ThunderPhone has no per-agent maximum call duration; use silence hang-up behavior and clear prompt rules to control when the agent should end a call.
What needs a manual step
Phone numbers never move automatically. Vapi-provided free numbers are platform-owned and cannot be carried over as customer-owned numbers. Numbers brought through Twilio, Vonage, or another bring-your-own arrangement are owned outside Vapi; reconnect or port those through the appropriate telephony process. Confirm ownership before canceling anything, and keep the existing routing live until the replacement passes inbound and outbound tests.
Recreate each server.url as the appropriate ThunderPhone organization webhook or API connection. Add authentication again for any imported tool whose secret was stored by Vapi; the importer can reproduce a tool's shape without extracting the vendor-held credential. Review squads, workflows, and reported unsupported tools individually. Their intent may belong in a prompt procedure, a supported API connection, or an external orchestration layer, but they are not imported as working equivalents.
Importing without a key
From Agents → Import → Vapi, choose the JSON option and paste an export containing the assistant objects and, where available, related tools and knowledge-base objects. JSON is useful for controlled reviews and organizations that do not permit an API key to leave the vendor boundary.
The limitation is ID resolution. An assistant can refer to toolIds, knowledgeBaseId, files, squads, or workflows whose definitions are not embedded in the assistant JSON. If the referenced objects are absent, the importer can report the IDs but cannot reconstruct their contents. Include all exportable related objects, then compare the review notes with your inventory and recreate unresolved items manually.
After the import
- Open every imported agent and confirm the selected prompt version, opening behavior, language, voice confidence, and intelligence tier.
- Read every importer note, including notes attached to agents that were unticked by default.
- Place a test call from the builder and exercise greetings, transfers, keypad behavior, voicemail handling, silence, and failure paths.
- Attach a number only after the agent passes the builder test; verify both inbound and outbound routing where applicable.
- Open every API connection and run its test request after entering fresh credentials. A mapped schema is not evidence that authentication works.
- Review each knowledge base and confirm its documents have finished indexing before testing grounded answers.
- Set an organization webhook for the events your downstream systems require, and verify delivery against a test call.
Keep the old Vapi route available during acceptance testing. Move traffic only after the imported agent, number, connections, knowledge, and event delivery have all been checked together.