Import / Export
Your memory data is never locked in. Both directions are NDJSON over the same API — move a self-hosted workspace to the cloud, take a backup, or leave with everything.
Export
curl https://your-deployment/api/v2/export \ -H "Authorization: Bearer utek_YOUR_KEY" \ -o workspace.ndjson
The response is a stream of JSON objects, one per line. Line 1 is a manifest describing the export; every following line is a memory. Embeddings are not included — entries are re-embedded automatically after an import, so files stay small and portable.
Import
curl https://your-deployment/api/v2/import \
-H "Authorization: Bearer utek_YOUR_KEY" \
-H "content-type: application/json" \
-d "$(jq -Rs '{data: .}' workspace.ndjson)" The body takes { "data": "…", "namespace": "…" } where data is the raw NDJSON text (or a JSON array of entries). Optional namespace is a
default for entries that lack one.
The jq -Rs wrapper reads the file and wraps it as a JSON string safely.
What import preserves
- IDs and created_at — entries exported from a cloud or OSS workspace keep their identity on re-import.
- Dedup — identical content is skipped, so re-running an import does not duplicate memories.
- Atomicity — a malformed entry fails the whole request fast (400 with the line number); there are no partial imports.
Response shape:
{ "imported": 128, "duplicates_skipped": 3, "id_conflicts_skipped": 0, "ignored": 1, "total": 132 } ignored counts non-memory lines such as the export manifest, which is skipped
automatically when you re-import a cloud export file.
Migrating from self-hosted OSS
- Run
/exportagainst your self-hosted instance (same Bearer auth, same NDJSON format). - Generate a cloud key at /portal/keys.
- Run
/importagainst the cloud with the same file. Search is usable immediately; vector recall warms up as re-embedding completes.