Geti Application: Annotating & Managing Labels
Set up the labeled data that training needs: create a project bound to a
task type, curate its labels, upload media, and attach annotations
to media items and video frames — all through the Geti REST API. 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/.
Task/label background is application/docs/labels.md.
When to Use
- User wants to create a project and define its initial labels.
- User needs to add, rename/recolor, or remove labels on an existing project.
- User wants to upload images/videos and annotate them.
- User needs to set classification labels, bounding boxes, or polygons on media
or specific video frames.
- User wants to check whether a dataset is annotated enough to train.
Key concepts
- Task type is fixed per project. A project addresses one task
(classification, detection, instance segmentation); it cannot change after
creation. Supported annotation shapes follow the task type.
- Labels belong to the project. Labels have an immutable UUID plus editable
attributes (name, color, hotkey). They cannot be reparented to another
project.
exclusive_labels marks whether labels are mutually exclusive
(e.g. multiclass classification).
- Annotations attach to dataset items. For videos, annotations target a
specific
frame_index.
Create and configure a project
flowchart LR
A[Create project + labels] --> B[Upload media]
B --> C[Annotate media / frames]
C --> D[Check dataset statistics]
- Create a project with a task type and initial labels.
POST /api/projects with name, task.task_type
(classification / detection / instance_segmentation),
task.exclusive_labels, and task.labels[].
- Done when:
GET /api/projects/<id> returns the project with its labels.
- Manage labels on an existing project.
PATCH /api/projects/<id>/labels with labels_to_add[],
labels_to_edit[], labels_to_remove[].
- Done when:
GET /api/projects/<id> reflects the updated label set.
Upload media
- Upload an image or video:
POST /api/projects/<id>/dataset/media
(binary). This creates the corresponding dataset item.
- List media (paginated, filterable):
GET /api/projects/<id>/dataset/media
with query params like limit, offset, annotation_status, labels[],
subsets[], sort_by, sort_direction.
- Fetch a media file or thumbnail:
GET /api/projects/<id>/dataset/media/<media_id>/binary and /thumbnail.
- Delete media:
DELETE .../media/<media_id> or bulk delete with
DELETE .../media and media_ids[].
Annotate media
- Set / update annotations on a media item:
POST /api/projects/<id>/dataset/media/<media_id>/annotations with
annotations[] (shapes + labels), optional subset (train/val/test), and
frame_index for videos.
- Get annotations:
GET .../annotations (pass frame_index for videos).
- Delete annotations:
DELETE .../annotations (pass frame_index for
videos).
- Video frames: list annotated frames with
GET .../media/<media_id>/frames using frame_index_from /
frame_index_to.
Match shapes to the project task type:
| Task type |
Annotation shape |
| Classification |
image-level label(s) |
| Detection |
bounding box + label |
| Instance segmentation |
polygon + label |
Verify the dataset is trainable
- Dataset items:
GET /api/projects/<id>/dataset/items (filter by
annotation_status, labels[], subsets[]).
- Statistics:
GET /api/projects/<id>/dataset/statistics for media and
annotation counts.
- Done when: at least 3 annotated items exist in your dataset, although
annotating several more is recommended for better results — then launch a
train job (see geti-using-the-pipeline).
Notes
- To bring in an already-annotated dataset instead of annotating from scratch,
use
geti-import-export-datasets.
- The API spec at
/api/openapi.json is the only authoritative source for
endpoint paths and payloads. To add or change endpoints, use
geti-backend-dev and geti-openapi-sync.
Related skills
geti-import-export-datasets — import an existing annotated dataset instead
of manual annotation.
geti-using-the-pipeline — the end-to-end project → train → deploy workflow.
geti-backend-dev — change the project/label/media/annotation endpoints.
1---2name: geti-annotating-and-managing-labels3description: Create projects, manage labels, and annotate media in the Geti application via its REST API. Use when a user wants to create a project with a task type and label set, add/edit/remove labels, upload images or videos, draw or set annotations (classification labels, bounding boxes, polygons) on media or video frames, review dataset statistics, or prepare a dataset so it is trainable.4---56# Geti Application: Annotating & Managing Labels78Set up the labeled data that training needs: create a **project** bound to a9task type, curate its **labels**, upload **media**, and attach **annotations**10to media items and video frames — all through the Geti REST API. This skill is11about _using_ the API, not changing backend code (use `geti-backend-dev` for12that).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/`.26Task/label background is `application/docs/labels.md`.2728## When to Use2930- User wants to create a project and define its initial labels.31- User needs to add, rename/recolor, or remove labels on an existing project.32- User wants to upload images/videos and annotate them.33- User needs to set classification labels, bounding boxes, or polygons on media34 or specific video frames.35- User wants to check whether a dataset is annotated enough to train.3637## Key concepts3839- **Task type is fixed per project.** A project addresses one task40 (classification, detection, instance segmentation); it cannot change after41 creation. Supported annotation shapes follow the task type.42- **Labels belong to the project.** Labels have an immutable UUID plus editable43 attributes (name, color, hotkey). They cannot be reparented to another44 project. `exclusive_labels` marks whether labels are mutually exclusive45 (e.g. multiclass classification).46- **Annotations attach to dataset items.** For videos, annotations target a47 specific `frame_index`.4849## Create and configure a project5051```mermaid52flowchart LR53 A[Create project + labels] --> B[Upload media]54 B --> C[Annotate media / frames]55 C --> D[Check dataset statistics]56```57581. **Create a project** with a task type and initial labels.59 - `POST /api/projects` with `name`, `task.task_type`60 (`classification` / `detection` / `instance_segmentation`),61 `task.exclusive_labels`, and `task.labels[]`.62 - Done when: `GET /api/projects/<id>` returns the project with its labels.632. **Manage labels** on an existing project.64 - `PATCH /api/projects/<id>/labels` with `labels_to_add[]`,65 `labels_to_edit[]`, `labels_to_remove[]`.66 - Done when: `GET /api/projects/<id>` reflects the updated label set.6768## Upload media6970- **Upload** an image or video: `POST /api/projects/<id>/dataset/media`71 (binary). This creates the corresponding dataset item.72- **List** media (paginated, filterable): `GET /api/projects/<id>/dataset/media`73 with query params like `limit`, `offset`, `annotation_status`, `labels[]`,74 `subsets[]`, `sort_by`, `sort_direction`.75- **Fetch** a media file or thumbnail:76 `GET /api/projects/<id>/dataset/media/<media_id>/binary` and `/thumbnail`.77- **Delete** media: `DELETE .../media/<media_id>` or bulk delete with78 `DELETE .../media` and `media_ids[]`.7980## Annotate media8182- **Set / update annotations** on a media item:83 `POST /api/projects/<id>/dataset/media/<media_id>/annotations` with84 `annotations[]` (shapes + labels), optional `subset` (train/val/test), and85 `frame_index` for videos.86- **Get annotations**: `GET .../annotations` (pass `frame_index` for videos).87- **Delete annotations**: `DELETE .../annotations` (pass `frame_index` for88 videos).89- **Video frames**: list annotated frames with90 `GET .../media/<media_id>/frames` using `frame_index_from` /91 `frame_index_to`.9293Match shapes to the project task type:9495| Task type | Annotation shape |96| --------------------- | ------------------------ |97| Classification | image-level label(s) |98| Detection | bounding box + label |99| Instance segmentation | polygon + label |100101## Verify the dataset is trainable102103- **Dataset items**: `GET /api/projects/<id>/dataset/items` (filter by104 `annotation_status`, `labels[]`, `subsets[]`).105- **Statistics**: `GET /api/projects/<id>/dataset/statistics` for media and106 annotation counts.107- Done when: at least 3 annotated items exist in your dataset, although108 annotating several more is recommended for better results — then launch a109 `train` job (see `geti-using-the-pipeline`).110111## Notes112113- To bring in an already-annotated dataset instead of annotating from scratch,114 use `geti-import-export-datasets`.115- The API spec at `/api/openapi.json` is the only authoritative source for116 endpoint paths and payloads. To add or change endpoints, use117 `geti-backend-dev` and `geti-openapi-sync`.118119## Related skills120121- `geti-import-export-datasets` — import an existing annotated dataset instead122 of manual annotation.123- `geti-using-the-pipeline` — the end-to-end project → train → deploy workflow.124- `geti-backend-dev` — change the project/label/media/annotation endpoints.