---
title: "Bulk create annotations"
method: POST
path: "/api/annotations/bulk/"
tags: ["Annotations"]
---

# Bulk create annotations

`POST /api/annotations/bulk/`

Create multiple annotations at once

## Request body

- AnnotationBulkSerializerWithSelectedItemsRequest — Annotation Serializer with FSM state support. Note: The 'state' field will be populated from the queryset annotation if present, preventing N+1 queries. Use .with_state() on your queryset.
  - `bulk_created` boolean, nullable — Annotation was created in bulk mode
  - `completed_by` integer
  - `draft_created_at` string, date-time, nullable — Draft creation time
  - `ground_truth` boolean — This annotation is a Ground Truth (ground_truth)
  - `import_id` integer, nullable — Original annotation ID that was at the import step or NULL if this annotation wasn't imported
  - `last_action` 'prediction' | 'propagated_annotation' | 'imported' | 'submitted' | 'updated' | 'skipped' | 'accepted' | 'rejected' | 'fixed_and_accepted' | 'deleted_review' — * `prediction` - Created from prediction * `propagated_annotation` - Created from another annotation * `imported` - Imported * `submitted` - Submitted * `updated` - Updated * `skipped` - Skipped * `accepted` - Accepted * `rejected` - Rejected * `fixed_and_accepted` - Fixed and accepted * `deleted_review` - Deleted review
  - `last_created_by` integer, nullable — User who created the last annotation history item
  - `lead_time` number, double, nullable — How much time it took to annotate the task
  - `parent_annotation` integer, nullable — Points to the parent annotation from which this annotation was created
  - `parent_prediction` integer, nullable — Points to the prediction from which this annotation was created
  - `project` integer, nullable — Project ID for this annotation
  - `result` object[] — List of annotation results for the task
  - `selected_items` union — Task selection by IDs. If filters are applied, the selection will be applied to the filtered tasks.If "all" is `false`, `"included"` must be used. If "all" is `true`, `"excluded"` must be used.<br>Examples: `{"all": false, "included": [1, 2, 3]}` or `{"all": true, "excluded": [4, 5]}`
    - object
      - `all` false, required — No tasks are selected
      - `included` integer[] — List of included task IDs
    - object
      - `all` true, required — All tasks are selected
      - `excluded` integer[] — List of excluded task IDs
  - `task` integer, nullable — Corresponding task for this annotation
  - `tasks` integer[]
  - `unique_id` string
  - `updated_by` integer, nullable — Last user who updated this annotation
  - `was_cancelled` boolean — User skipped the task

## Response `201`

Bulk annotations created successfully

- object[]
  - `id` integer, required — Annotation ID

---

[API](https://skmtc.net/humansignal/apis/label-studio-api.md) · [All operations](https://skmtc.net/humansignal/apis/label-studio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/humansignal/label-studio-api/versions/1b113b8df950/schema)
