---
title: "Leaving ThunderPhone"
description: "Export an agent as open files, rebuild it on LiveKit Agents, Pipecat, Vapi, or Retell with a coding-agent skill, and download your call history and recordings."
ui: zeus
---

You can leave ThunderPhone whenever you want. Any agent exports as a zip of
open files, free, and a skill helps your coding agent rebuild it on LiveKit
Agents, Pipecat, Vapi, or Retell. This page covers what you can take, how to
export it, and what you redo on the other side.

## What you can take with you

| What | How |
|---|---|
| An agent: instructions, tools, transfer numbers, steps, settings, number routing, and webhooks | The [agent export](#export-an-agent), one zip per agent |
| The agent's knowledge files | Inside the agent export |
| Call history and transcripts | The [calls export](#call-history-and-recordings), up to 1,000 calls per request |
| Recordings | One recording per request, by call |
| Phone numbers on your own carrier | They never left your carrier. See [Phone numbers](#phone-numbers) |

## Export an agent

### In Zeus

Open the agent and go to its settings (**Call handling** in the agent's
editor). At the bottom, under **Export, copy or delete**, choose **Export**.
The zip downloads to your computer.

### With the API

<CodeGroup>
```bash cURL
curl 'https://api.thunderphone.com/v1/agents/12/export' \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -o agent-12.zip
```
</CodeGroup>

The zip is built when you ask for it. Anyone who can read the agent can
export it. Knowledge, numbers, and webhooks are included only when the
credential can read them: an OAuth token needs `knowledge:read`,
`numbers:read`, and `integrations:read`, and webhooks also need an admin or
owner. A part that is left out is listed under `omitted` in `manifest.json`.
The API answers `429` above 30 exports a minute.

| Query parameter | Description |
|---|---|
| `include_url_paths` | `true` keeps the path of each URL in the export, such as a tool's endpoint. By default every URL is cut to its host. User names, passwords, and query strings are removed from URLs either way |

Use `include_url_paths=true` when you are about to rebuild the agent
somewhere else, because the tool endpoints are needed there. Leave it off for
a copy you plan to share.

### What the zip holds

| File | Contents |
|---|---|
| `manifest.json` | The format (`thunderphone.agent-export/v1`), what is included, and an `omitted` list that names anything left out and why |
| `agent.json` | The agent as [`GET /v1/agents/{agent_id}`](/api-reference/agents#agent-object) returns it, with credentials removed |
| `prompt.md` | The live instructions |
| `knowledge/index.json` and the files beside it | The agent's knowledge. Each document is the original file where one is stored, otherwise its extracted text |
| `numbers.json` | The numbers routed to this agent, inbound and outbound, with any pinned version or variant |
| `webhooks.json` | The [webhook endpoints](/webhooks/endpoints) scoped to this agent, without their secrets |
| `README.md` | What each file is |

A knowledge file larger than 25 MB is left out, and so is anything past
100 MB for the whole export. Each one is listed in `manifest.json` with the
endpoint that downloads it,
[`GET /v1/knowledge/documents/{document_id}/original`](/api-reference/knowledge-bases#download-the-original-file).

### What is never included

- **Credential values.** A tool's headers are listed by name only. Header
  values are write-only in ThunderPhone: no API response returns them, so no
  export can. You re-enter them on the other side. This covers credentials
  ThunderPhone stores as credentials. Your instructions and knowledge files are
  copied exactly as you wrote or uploaded them, so if a key was ever pasted
  into a prompt or a document, it is in the zip. Check before you share it.
- **Call history and recordings.** They have their own exports; see
  [Call history and recordings](#call-history-and-recordings).
- **Version history.** The export holds the agent as it is live now. Earlier
  versions stay listed at
  [`GET /v1/agents/{agent_id}/versions`](/api-reference/agents#version-history).
- **Other agents this one hands off to.** Export each of them the same way.

## Move to another platform

The `migrate-off-thunderphone` skill walks your coding agent through the
move. Install the [ThunderPhone skills](/guides/coding-agents):

```bash
npx skills add thunderphone/skills
```

Then ask your coding agent to move an agent off ThunderPhone and name the
destination: **LiveKit Agents**, **Pipecat**, **Vapi**, or **Retell**. The
skill downloads the export, asks you for each credential, rebuilds the agent
from a mapping for that destination, and tests it there before any number
moves. The conversion runs in your coding agent, with your own keys.
ThunderPhone never writes to your account on another platform.

What carries over, as files the skill maps for you:

- Instructions, including shared instructions and steps.
- Tools: the same endpoint, method, and parameter schema. Each tool's
  `request_format` records the body shape your endpoint expects.
- Transfer numbers and the end-call and keypad settings.
- Knowledge files.
- Voicemail, silence, and call-length settings.
- Which numbers the agent answers and places calls from.

What you redo on the other side:

- **Speech, language-model, and voice providers.** You choose them on the
  destination. Nothing guarantees that a voice, or how a call sounds, will
  match.
- **Credentials.** Tool header values and webhook secrets.
- **Telephony.** How numbers reach the agent is set up differently on every
  platform.
- **Steps and handoffs.** A destination with a flow or handoff feature gets
  them rebuilt there. Elsewhere the skill folds the steps into the
  instructions and tells you.
- **ThunderPhone settings with no equivalent.** Intelligence, hearing and
  reply-speed settings, the built-in email and text-message tools, and call
  grading, summaries, and outcome labels do not move unless you rebuild them.
- **Request signatures.** ThunderPhone signs the tool requests and webhooks
  it sends. Another platform signs its own way, so an endpoint that
  [verifies the ThunderPhone signature](/guides/verify-webhook-signatures)
  needs a new check.
- **Testing.** Test the rebuilt agent on the destination before you move a
  number.

Leave the ThunderPhone agent in place until the new one has passed your
tests. It is your way back.

## Phone numbers

Move numbers last, after the new agent passes its tests.

- **A number on your own carrier** (a [VoIP connection](/guides/bring-your-own-numbers))
  stays with that carrier. Point it at the new platform in your carrier's
  console. Then choose **Release** on the number in ThunderPhone and leave
  **Also cancel this number in my … account** unticked: the number is
  disconnected from ThunderPhone and stays in your carrier account. Through
  the API, [release](/api-reference/phone-numbers#release-a-phone-number) it
  with `DELETE /v1/phone-numbers/{phone_number_id}?confirm=true` and do not
  send `release_at_provider`.
- **A number ThunderPhone provided.** Contact
  [support](mailto:support@thunderphone.com) before you release a number you
  want to keep. Releasing a ThunderPhone number is permanent: it returns to
  the pool and can go to another customer.

## Call history and recordings

These are separate from the agent export.

- **Calls.** [`GET /v1/calls/export`](/api-reference/calls#export-calls)
  returns up to 1,000 calls per request as CSV (metadata) or JSON (with
  transcripts). Filter by `agent_id` and page through your history with
  `start_date` and `end_date`. The `X-Truncated` response header is `true`
  when more calls matched than were returned.
- **Recordings.** [`GET /v1/calls/{call_id}/audio`](/api-reference/calls#get-recording-audio)
  returns a short-lived URL for one call's recording. There is no bulk
  recording download.

<CodeGroup>
```bash cURL
curl 'https://api.thunderphone.com/v1/calls/export?export_format=json&agent_id=12&start_date=2026-10-01T00:00:00Z&end_date=2026-11-01T00:00:00Z' \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -o calls-2026-10.json
```
</CodeGroup>

## What it costs

Nothing. The agent export, the calls export, and recording downloads are
free. ThunderPhone is [pay-as-you-go](/guides/pricing) with no subscription
and no seat fee. A ThunderPhone number stops billing when you release it.

## After you leave

There is no fixed term. You may end the agreement by written notice to
legal@thunderphone.com, sent from the account's administrative email or
another verifiable channel. A lapse in payment may suspend service; by itself
it never ends the agreement or triggers deletion of Customer Data. On data,
the Terms say: "After formal termination, Provider will return or delete Customer Data
within sixty (60) days, subject to Customer's export rights, backup cycles,
legal holds, legally required retention, the DPA, and any executed BAA."

The full text is in the
[Terms of Service](https://thunderphone.com/terms#term-termination), under
**Service term; suspension; termination**. The Terms govern; this is a summary.

## Related

- [Import agents from another platform](/guides/import-agents)
- [Skills for coding agents](/guides/coding-agents)
- [Agents API](/api-reference/agents)
- [Calls API](/api-reference/calls)
