Geti Application: Import & Export Datasets
Move datasets in and out of the Geti application through its REST API. This is
the practical "migration to Geti" path: bring existing annotated data from Geti,
CVAT, Label Studio, or any tool that emits a standard dataset archive, or export
a project's data for backup or reuse in other frameworks. This skill is about
using the API, not changing backend code (use geti-backend-dev for that).
These endpoints are served by a running Geti instance; how it was launched
does not matter (Docker container, Windows MSIX app, install script, or
just run-server from application/backend/ for development). Ask the user for
their base URL rather than assuming one — https://localhost:7860 is only the
default for a local deployment, the port is configurable and remote instances
use a different host. See application/docs/install.md for the deployment
modes. The authoritative API reference is the spec the instance serves; fetch it
as JSON from /api/openapi.json (the /api/docs page is only an HTML viewer
for humans). Read endpoint paths and payloads from there rather than from any
checked-in Markdown, which may be out of date. If no instance is running and you
have the sources, generate the spec with just gen-api-spec --output-path openapi.json from application/backend/.
Design background is application/docs/dataset-ie.md.
When to Use
- User has an existing dataset archive and wants to import it into Geti.
- User wants to migrate annotated data from another tool into a Geti project.
- User needs to export a project's dataset or a dataset revision for backup or
external use.
- User needs to remap labels or filter subsets/labels while transferring data.
Key concepts
- Standard archives. Uploaded and downloaded datasets are zip archives in a
standard format (Datumaro, COCO, YOLO, Pascal VOC).
- Staging area. Import/export flows through a filesystem staging area
(
data/staged_datasets/). Each staged dataset has a UUID. You can upload via
the API or drop an archive directly into the staging folder for large files.
- Everything long-running is a job. Prepare, import, export, and stage all
run as async jobs via
POST /api/jobs; poll or stream their status.
- Task compatibility. Importing into an existing project may transform
annotations to match the project task type; unsupported conversions fail the
import (see
application/docs/dataset-ie.md).
Import a dataset
flowchart LR
A[Upload archive to staging] --> B[prepare_dataset_for_import job]
B --> C[Review detected task/labels]
C --> D{Destination}
D -->|new project| E[import_dataset_as_new_project]
D -->|existing project| F[import_dataset_to_existing_project]
- Upload the archive to staging.
POST /api/staged_datasets (zip file) → staged dataset id.
- Alternatively drop the archive directly into
data/staged_datasets/ for
large or unreliable uploads.
- Done when:
GET /api/staged_datasets lists the entry.
- Prepare the dataset for import.
POST /api/jobs with job type prepare_dataset_for_import
(staged_dataset_id) → job id. This extracts, converts to Datumaro, and
detects task type, labels, and item/annotation counts.
- Done when:
GET /api/staged_datasets/<id> reports ready_for_import with
detected metadata.
- Review detected metadata (task type, labels, counts) to configure the
import — especially label remapping for an existing project.
- Import to a destination via
POST /api/jobs:
- New project:
import_dataset_as_new_project (staged_dataset_id,
project.name, project.task_type, optional filters).
- Existing project:
import_dataset_to_existing_project (staged_dataset_id,
project_id, labels_mapping, include_unannotated).
- Done when: the job finishes and the target project's dataset lists the new
items (
GET /api/projects/<id>/dataset/items).
Export a dataset
- Submit an export job.
POST /api/jobs with job type export_dataset (project_id, optional
dataset_id/revision, export_format such as COCO/YOLO/VOC, optional
filters for labels/subsets/unannotated) → job id.
- Done when: the job finishes and a staged dataset with
ready_for_export
appears.
- Download the archive.
GET /api/staged_datasets/<id>/zip, or take it directly from
data/staged_datasets/<id>/.
Filtering & label remapping
- Filtering (labels, subsets, include/exclude unannotated) can be applied at
stage/export time or at import time. Apply at stage time to reuse the same
filtered dataset across multiple imports; apply at import time for
per-import flexibility.
- Label remapping (
labels_mapping) aligns source labels to a destination
project's label set when importing into an existing project.
Tracking the jobs
All operations return a job id from POST /api/jobs (HTTP 202). Poll
GET /api/jobs/<id>, or stream GET /api/jobs/<id>/status and
GET /api/jobs/<id>/logs (SSE) until a terminal state (DONE, FAILED,
CANCELLED); cancel with POST /api/jobs/<id>:cancel.
Cleanup
- Delete a staged dataset when done:
DELETE /api/staged_datasets/<id>.
- Staged datasets locked by a running job cannot be deleted; the system may also
auto-clean old staged datasets.
Notes
- The REST snippets in
application/docs/dataset-ie.md are design-level and may
lag behind the implementation; the API spec at /api/openapi.json is the only
authoritative contract.
- Importing a dataset is supported; importing an externally trained model
(BYOM) is not — pipeline models come only from in-project training/quantization.
Related skills
geti-annotating-and-managing-labels — set up projects/labels and annotate
media before or after import.
geti-using-the-pipeline — the end-to-end project → train → deploy workflow.
geti-backend-dev — change the import/export endpoints or job implementations.
1---2name: geti-import-export-datasets3description: Import and export datasets in the Geti application via its REST API. Use when a user wants to bring an existing dataset into Geti (COCO/YOLO/VOC/Datumaro), migrate data from another tool, export a project's dataset or a dataset revision, remap labels or filter subsets during transfer, or track the async jobs that perform these operations.4---56# Geti Application: Import & Export Datasets78Move datasets in and out of the Geti application through its REST API. This is9the practical "migration to Geti" path: bring existing annotated data from Geti,10CVAT, Label Studio, or any tool that emits a standard dataset archive, or export11a project's data for backup or reuse in other frameworks. This skill is about12_using_ the API, not changing backend code (use `geti-backend-dev` for that).1314These endpoints are served by a **running Geti instance**; how it was launched15does not matter (Docker container, Windows MSIX app, install script, or16`just run-server` from `application/backend/` for development). Ask the user for17their base URL rather than assuming one — `https://localhost:7860` is only the18default for a local deployment, the port is configurable and remote instances19use a different host. See `application/docs/install.md` for the deployment20modes. The authoritative API reference is the spec the instance serves; fetch it21as JSON from `/api/openapi.json` (the `/api/docs` page is only an HTML viewer22for humans). Read endpoint paths and payloads from there rather than from any23checked-in Markdown, which may be out of date. If no instance is running and you24have the sources, generate the spec with `just gen-api-spec --output-path25openapi.json` from `application/backend/`.26Design background is `application/docs/dataset-ie.md`.2728## When to Use2930- User has an existing dataset archive and wants to import it into Geti.31- User wants to migrate annotated data from another tool into a Geti project.32- User needs to export a project's dataset or a dataset revision for backup or33 external use.34- User needs to remap labels or filter subsets/labels while transferring data.3536## Key concepts3738- **Standard archives.** Uploaded and downloaded datasets are zip archives in a39 standard format (Datumaro, COCO, YOLO, Pascal VOC).40- **Staging area.** Import/export flows through a filesystem staging area41 (`data/staged_datasets/`). Each staged dataset has a UUID. You can upload via42 the API or drop an archive directly into the staging folder for large files.43- **Everything long-running is a job.** Prepare, import, export, and stage all44 run as async jobs via `POST /api/jobs`; poll or stream their status.45- **Task compatibility.** Importing into an existing project may transform46 annotations to match the project task type; unsupported conversions fail the47 import (see `application/docs/dataset-ie.md`).4849## Import a dataset5051```mermaid52flowchart LR53 A[Upload archive to staging] --> B[prepare_dataset_for_import job]54 B --> C[Review detected task/labels]55 C --> D{Destination}56 D -->|new project| E[import_dataset_as_new_project]57 D -->|existing project| F[import_dataset_to_existing_project]58```59601. **Upload the archive to staging.**61 - `POST /api/staged_datasets` (zip file) → staged dataset id.62 - Alternatively drop the archive directly into `data/staged_datasets/` for63 large or unreliable uploads.64 - Done when: `GET /api/staged_datasets` lists the entry.652. **Prepare the dataset for import.**66 - `POST /api/jobs` with job type `prepare_dataset_for_import`67 (`staged_dataset_id`) → job id. This extracts, converts to Datumaro, and68 detects task type, labels, and item/annotation counts.69 - Done when: `GET /api/staged_datasets/<id>` reports `ready_for_import` with70 detected metadata.713. **Review detected metadata** (task type, labels, counts) to configure the72 import — especially label remapping for an existing project.734. **Import to a destination** via `POST /api/jobs`:74 - New project: `import_dataset_as_new_project` (`staged_dataset_id`,75 `project.name`, `project.task_type`, optional `filters`).76 - Existing project: `import_dataset_to_existing_project` (`staged_dataset_id`,77 `project_id`, `labels_mapping`, `include_unannotated`).78 - Done when: the job finishes and the target project's dataset lists the new79 items (`GET /api/projects/<id>/dataset/items`).8081## Export a dataset82831. **Submit an export job.**84 - `POST /api/jobs` with job type `export_dataset` (`project_id`, optional85 `dataset_id`/revision, `export_format` such as COCO/YOLO/VOC, optional86 `filters` for labels/subsets/unannotated) → job id.87 - Done when: the job finishes and a staged dataset with `ready_for_export`88 appears.892. **Download the archive.**90 - `GET /api/staged_datasets/<id>/zip`, or take it directly from91 `data/staged_datasets/<id>/`.9293## Filtering & label remapping9495- **Filtering** (labels, subsets, include/exclude unannotated) can be applied at96 stage/export time or at import time. Apply at stage time to reuse the same97 filtered dataset across multiple imports; apply at import time for98 per-import flexibility.99- **Label remapping** (`labels_mapping`) aligns source labels to a destination100 project's label set when importing into an existing project.101102## Tracking the jobs103104All operations return a job id from `POST /api/jobs` (HTTP 202). Poll105`GET /api/jobs/<id>`, or stream `GET /api/jobs/<id>/status` and106`GET /api/jobs/<id>/logs` (SSE) until a terminal state (`DONE`, `FAILED`,107`CANCELLED`); cancel with `POST /api/jobs/<id>:cancel`.108109## Cleanup110111- Delete a staged dataset when done: `DELETE /api/staged_datasets/<id>`.112- Staged datasets locked by a running job cannot be deleted; the system may also113 auto-clean old staged datasets.114115## Notes116117- The REST snippets in `application/docs/dataset-ie.md` are design-level and may118 lag behind the implementation; the API spec at `/api/openapi.json` is the only119 authoritative contract.120- Importing a *dataset* is supported; importing an externally trained *model*121 (BYOM) is not — pipeline models come only from in-project training/quantization.122123## Related skills124125- `geti-annotating-and-managing-labels` — set up projects/labels and annotate126 media before or after import.127- `geti-using-the-pipeline` — the end-to-end project → train → deploy workflow.128- `geti-backend-dev` — change the import/export endpoints or job implementations.