> ## Documentation Index
> Fetch the complete documentation index at: https://docs.conare.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from Turbopuffer

> Copy every Turbopuffer row, vector, and attribute into ConareDB with a resumable, verifying importer that stays read-only on the source.

The running engine ships its own migration CLI — download it from the service so it always matches the deployed build:

```bash theme={null}
curl -fsSO https://db.conare.ai/v1/tools/migrate-turbopuffer.py

export TURBOPUFFER_API_KEY='tpuf_...'
export CONAREDB_API_KEY='cdb_...'

python3 migrate-turbopuffer.py \
  --source-namespace my-production-data \
  --destination-namespace acme-production
```

## What it guarantees

* **Read-only on the source.** It never deletes or mutates Turbopuffer data, and your Turbopuffer key is never sent to Conare.
* **Resumable.** Pages by ascending id, atomically upserts destination batches, and writes a secret-free checkpoint after each acknowledged page — interrupt it and re-run, it continues where it stopped.
* **Verifying.** Compacts the destination and verifies the row count when the copy completes.
* **Fail-closed.** The importer supports one dense vector column per namespace; multi-vector, sparse-vector, and late-interaction namespaces fail with an explicit error instead of silently dropping data.

## Options

| Flag                                          | Purpose                                     |
| --------------------------------------------- | ------------------------------------------- |
| `--all-namespaces --destination-prefix acme-` | Migrate a complete account                  |
| `--dry-run`                                   | Validate the first page without writing     |
| `--vector-attribute name`                     | When the vector column isn't named `vector` |

## After migrating

Queries port naturally: the [`/v2` query shim](/db/search#turbopuffer-compatible-shim) accepts the Turbopuffer read shape (`rank_by`, `filters`, `top_k`, `include_attributes`) as-is, and the native [`/v1/search`](/db/search) filter DSL uses the same `[property, op, value]` operators you already write.
