Label Studio subpackage_projects API
The subpackage_projects API from Label Studio — 8 operation(s) for subpackage_projects.
The subpackage_projects API from Label Studio — 8 operation(s) for subpackage_projects.
openapi: 3.1.0
info:
title: API Reference subpackage_actions subpackage_projects API
version: 1.0.0
servers:
- url: http://localhost:8000
tags:
- name: subpackage_projects
paths:
/api/projects/:
get:
operationId: list
summary: List projects
description: Retrieve a list of projects.
tags:
- subpackage_projects
parameters:
- name: archived
in: query
description: Filter by projects that belong to archived workspaces
required: false
schema:
type: boolean
- name: filter
in: query
description: Filter projects by pinned status. Use 'pinned_only' to return only pinned projects, 'exclude_pinned' to return only non-pinned projects, or 'all' to return all projects.
required: false
schema:
type: string
default: all
- name: ids
in: query
description: Filter id by in list
required: false
schema:
type: string
- name: include
in: query
description: 'Comma-separated list of count fields to include in the response to optimize performance. Available fields: task_number, finished_task_number, total_predictions_number, total_annotations_number, num_tasks_with_annotations, useful_annotation_number, ground_truth_number, skipped_annotations_number. If not specified, all count fields are included.'
required: false
schema:
type: string
- name: members_limit
in: query
description: Maximum number of members to return
required: false
schema:
type: integer
default: 10
- name: ordering
in: query
description: Which field to use when ordering the results.
required: false
schema:
type: string
- name: page
in: query
description: A page number within the paginated result set.
required: false
schema:
type: integer
- name: page_size
in: query
description: Number of results to return per page.
required: false
schema:
type: integer
- name: search
in: query
description: Search term for project title and description
required: false
schema:
type: string
- name: state
in: query
description: Filter current_state by exact match
required: false
schema:
type: string
- name: title
in: query
description: Filter title by contains (case-insensitive)
required: false
schema:
type: string
- name: workspaces
in: query
description: Filter workspaces by exact match
required: false
schema:
type: number
format: double
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedAllRolesProjectListList'
post:
operationId: create
summary: Create a project
description: Create a project for a specific organization.
tags:
- subpackage_projects
parameters:
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'201':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/LseProjectCreate'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/LseProjectCreateRequest'
/api/projects/counts/:
get:
operationId: list-counts
summary: List projects' counts
description: Returns a list of projects with their counts. For example, task_number which is the total task number in project
tags:
- subpackage_projects
parameters:
- name: archived
in: query
description: Filter by projects that belong to archived workspaces
required: false
schema:
type: boolean
- name: filter
in: query
description: Filter projects by pinned status. Use 'pinned_only' to return only pinned projects, 'exclude_pinned' to return only non-pinned projects, or 'all' to return all projects.
required: false
schema:
type: string
default: all
- name: ids
in: query
description: Filter id by in list
required: false
schema:
type: string
- name: include
in: query
description: 'Comma-separated list of count fields to include in the response to optimize performance. Available fields: task_number, finished_task_number, total_predictions_number, total_annotations_number, num_tasks_with_annotations, useful_annotation_number, ground_truth_number, skipped_annotations_number. If not specified, all count fields are included.'
required: false
schema:
type: string
- name: ordering
in: query
description: Which field to use when ordering the results.
required: false
schema:
type: string
- name: page
in: query
description: A page number within the paginated result set.
required: false
schema:
type: integer
- name: page_size
in: query
description: Number of results to return per page.
required: false
schema:
type: integer
- name: search
in: query
description: Search term for project title and description
required: false
schema:
type: string
- name: state
in: query
description: Filter current_state by exact match
required: false
schema:
type: string
- name: title
in: query
description: Filter title by contains (case-insensitive)
required: false
schema:
type: string
- name: workspaces
in: query
description: Filter workspaces by exact match
required: false
schema:
type: number
format: double
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedLseProjectCountsList'
/api/projects/{id}/:
get:
operationId: get
summary: Get project by ID
description: Retrieve information about a project by project ID.
tags:
- subpackage_projects
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: members_limit
in: query
description: Maximum number of members to return
required: false
schema:
type: integer
default: 10
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: Project information. Not all fields are available for all roles.
content:
application/json:
schema:
$ref: '#/components/schemas/LseProjectResponse'
delete:
operationId: delete
summary: Delete project
description: Delete a project by specified project ID.
tags:
- subpackage_projects
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: Successful response
patch:
operationId: update
summary: Update project details
description: Update the details of a specific project.
tags:
- subpackage_projects
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: members_limit
in: query
description: Maximum number of members to return
required: false
schema:
type: integer
default: 10
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/LseProjectUpdate'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchedLseProjectUpdateRequest'
/api/projects/{id}/annotators/:
get:
operationId: list-unique-annotators
summary: List unique annotators for project
description: Return unique users who have submitted annotations in the specified project.
tags:
- subpackage_projects
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: List of annotator users
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/UserSimple'
/api/projects/{id}/duplicate/:
post:
operationId: duplicate
summary: ✨ Duplicate project
description: "<Card href=\"https://humansignal.com/goenterprise\">\n <img style=\"pointer-events: none; margin-left: 0px; margin-right: 0px;\" src=\"https://docs.humansignal.com/images/badge.svg\" alt=\"Label Studio Enterprise badge\"/>\n <p style=\"margin-top: 10px; font-size: 14px;\">\n This endpoint is not available in Label Studio Community Edition. [Learn more about Label Studio Enterprise](https://humansignal.com/goenterprise)\n </p>\n </Card>\nMake a copy of project."
tags:
- subpackage_projects
parameters:
- name: id
in: path
required: true
schema:
type: integer
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'201':
description: Project duplicated
content:
application/json:
schema:
$ref: '#/components/schemas/projects_duplicate_Response_201'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectDuplicateRequest'
/api/projects/{id}/import:
post:
operationId: import-tasks
summary: Import tasks
description: "\n Import data as labeling tasks in bulk using this API endpoint. You can use this API endpoint to import multiple tasks.\n One POST request is limited at 250K tasks and 200 MB.\n\n **Note:** Imported data is verified against a project *label_config* and must\n include all variables that were used in the *label_config*. For example,\n if the label configuration has a *$text* variable, then each item in a data object\n must include a \"text\" field.\n <br>\n\n ## Async Import Behavior\n <hr style=\"opacity:0.3\">\n\n **For non-Community editions, this endpoint processes imports asynchronously.**\n \n - The POST request **can fail** for invalid parameters, malformed request body, or other request-level validation errors.\n - However, **data validation errors** that occur during import processing are handled asynchronously and will not cause the POST request to fail.\n - Upon successful request validation, a response is returned: `{\"import\": <import_id>}`\n - Use the returned `import_id` to poll the GET `/api/projects/{project_id}/imports/{import_id}` endpoint to check the import status and see any data validation errors.\n - Data-level errors and import failures will only be visible in the GET request response.\n\n For Community edition, imports are processed synchronously and return task counts immediately.\n <br>\n\n ## POST requests\n <hr style=\"opacity:0.3\">\n\n There are three possible ways to import tasks with this endpoint:\n\n ### 1. **POST with data**\n Send JSON tasks as POST data. Only JSON is supported for POSTing files directly.\n Update this example to specify your authorization token and Label Studio instance host, then run the following from\n the command line.\n\n ```bash\n curl -H 'Content-Type: application/json' -H 'Authorization: Token abc123' \\\n -X POST 'http://localhost:8000/api/projects/1/import' --data '[{\"text\": \"Some text 1\"}, {\"text\": \"Some text 2\"}]'\n ```\n\n ### 2. **POST with files**\n Send tasks as files. You can attach multiple files with different names.\n\n - **JSON**: text files in JavaScript object notation format\n - **CSV**: text files with tables in Comma Separated Values format\n - **TSV**: text files with tables in Tab Separated Value format\n - **TXT**: simple text files are similar to CSV with one column and no header, supported for projects with one source only\n\n Update this example to specify your authorization token, Label Studio instance host, and file name and path,\n then run the following from the command line:\n\n ```bash\n curl -H 'Authorization: Token abc123' \\\n -X POST 'http://localhost:8000/api/projects/1/import' -F 'file=@path/to/my_file.csv'\n ```\n\n ### 3. **POST with URL**\n You can also provide a URL to a file with labeling tasks. Supported file formats are the same as in option 2.\n\n ```bash\n curl -H 'Content-Type: application/json' -H 'Authorization: Token abc123' \\\n -X POST 'http://localhost:8000/api/projects/1/import' \\\n --data '[{\"url\": \"http://example.com/test1.csv\"}, {\"url\": \"http://example.com/test2.csv\"}]'\n ```\n\n <br>\n "
tags:
- subpackage_projects
parameters:
- name: id
in: path
description: A unique integer value identifying this project.
required: true
schema:
type: integer
- name: commit_to_project
in: query
description: Set to "true" to immediately commit tasks to the project.
required: false
schema:
type: boolean
default: true
- name: preannotated_from_fields
in: query
description: 'List of fields to preannotate from the task data. For example, if you provide a list of `{"text": "text", "prediction": "label"}` items in the request, the system will create a task with the `text` field and a prediction with the `label` field when `preannoted_from_fields=["prediction"]`.'
required: false
schema:
type: array
items:
type: string
- name: return_task_ids
in: query
description: Set to "true" to return task IDs in the response.
required: false
schema:
type: boolean
default: false
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'201':
description: 'Tasks successfully imported or import queued. **For non-Community editions**, the response will be `{"import": <import_id>}` which you can use to poll the import status. **For Community edition**, the response contains task counts and is processed synchronously.'
content:
application/json:
schema:
$ref: '#/components/schemas/projects_import_tasks_Response_201'
'400':
description: Bad Request
content:
application/json:
schema:
type: string
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ImportApiRequest'
/api/projects/{id}/import/predictions:
post:
operationId: import-predictions
summary: Import predictions
description: Import model predictions for tasks in the specified project.
tags:
- subpackage_projects
parameters:
- name: id
in: path
description: A unique integer value identifying this project.
required: true
schema:
type: integer
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'201':
description: Predictions successfully imported
content:
application/json:
schema:
$ref: '#/components/schemas/projects_import_predictions_Response_201'
'400':
description: Bad Request
content:
application/json:
schema:
description: Any type
requestBody:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PredictionRequest'
/api/projects/{id}/validate/:
post:
operationId: validate-label-config
summary: Validate project label config
description: Determine whether the label configuration for a specific project is valid.
tags:
- subpackage_projects
parameters:
- name: id
in: path
description: A unique integer value identifying this project.
required: true
schema:
type: integer
- name: Authorization
in: header
description: 'The token (or API key) must be passed as a request header. You can find your user token on the User Account page in Label Studio. Example: <br><pre><code class="language-bash">curl https://label-studio-host/api/projects -H "Authorization: Token [your-token]"</code></pre>'
required: true
schema:
type: string
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLabelConfig'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ProjectLabelConfigRequest'
components:
schemas:
AnnotationRequest:
type: object
properties:
bulk_created:
type:
- boolean
- 'null'
description: Annotation was created in bulk mode
completed_by:
type: integer
draft_created_at:
type:
- string
- 'null'
format: date-time
description: Draft creation time
ground_truth:
type: boolean
description: This annotation is a Ground Truth (ground_truth)
import_id:
type:
- integer
- 'null'
format: int64
description: Original annotation ID that was at the import step or NULL if this annotation wasn't imported
last_action:
oneOf:
- $ref: '#/components/schemas/LastActionEnum'
- type: 'null'
description: 'Action which was performed in the last annotation history item
* `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:
type:
- integer
- 'null'
description: User who created the last annotation history item
lead_time:
type:
- number
- 'null'
format: double
description: How much time it took to annotate the task
parent_annotation:
type:
- integer
- 'null'
description: Points to the parent annotation from which this annotation was created
parent_prediction:
type:
- integer
- 'null'
description: Points to the prediction from which this annotation was created
project:
type:
- integer
- 'null'
description: Project ID for this annotation
result:
type: array
items:
$ref: '#/components/schemas/AnnotationRequestResultItems'
description: List of annotation results for the task
task:
type:
- integer
- 'null'
description: Corresponding task for this annotation
unique_id:
type: string
updated_by:
type:
- integer
- 'null'
description: Last user who updated this annotation
was_cancelled:
type: boolean
description: User skipped the task
description: '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.'
title: AnnotationRequest
AssignmentSettingsRequest:
type: object
properties:
label_stream_task_distribution:
oneOf:
- $ref: '#/components/schemas/LabelStreamTaskDistributionEnum'
- type: 'null'
description: 'Automatic / Manual
* `auto_distribution` - Label Stream distributes tasks automatically to annotators
* `assigned_only` - Label Stream shows tasks only to assigned users'
project:
type:
- integer
- 'null'
title: AssignmentSettingsRequest
ProjectDuplicateRequest:
type: object
properties:
description:
type: string
default: ''
description: Project Description
mode:
$ref: '#/components/schemas/ProjectDuplicateModeEnum'
description: 'What to Duplicate (Project configuration only / Project configuration and tasks)
* `settings` - Only settings
* `settings,data` - Settings and tasks'
title:
type: string
description: Project Name
workspace:
type: integer
description: Destination Workspace
required:
- mode
- title
- workspace
title: ProjectDuplicateRequest
projects_duplicate_Response_201:
type: object
properties:
id:
type: integer
description: The ID of the duplicated project.
required:
- id
title: projects_duplicate_Response_201
ImportApiRequest:
type: object
properties:
allow_skip:
type:
- boolean
- 'null'
description: Whether this task can be skipped. Set to False to make task unskippable.
annotations:
type: array
items:
$ref: '#/components/schemas/AnnotationRequest'
cancelled_annotations:
type: integer
description: Number of total cancelled annotations for the current task
comment_authors:
type: array
items:
type: integer
description: Users who wrote comments
comment_count:
type: integer
description: Number of comments in the task including all annotations
data:
type: object
additionalProperties:
description: Any type
description: User imported or uploaded data for a task. Data is formatted according to the project label config. You can find examples of data for your project on the Import page in the Label Studio Data Manager UI.
file_upload:
type:
- integer
- 'null'
description: Uploaded file used as data source for this task
inner_id:
type:
- integer
- 'null'
format: int64
description: Internal task ID in the project, starts with 1
last_comment_updated_at:
type:
- string
- 'null'
format: date-time
description: When the last comment was updated
meta:
oneOf:
- description: Any type
- type: 'null'
description: Meta is user imported (uploaded) data and can be useful as input for an ML Backend for embeddings, advanced vectors, and other info. It is passed to ML during training/predicting steps.
overlap:
type: integer
description: Number of distinct annotators that processed the current task
precomputed_agreement:
type:
- number
- 'null'
format: double
description: Average agreement score for the task
predictions:
type: array
items:
$ref: '#/components/schemas/PredictionRequest'
total_annotations:
type: integer
description: Number of total annotations for the current task except cancelled annotations
total_predictions:
type: integer
description: Number of total predictions for the current task
unresolved_comment_count:
type: integer
description: Number of unresolved comments in the task including all annotations
updated_by:
type:
- integer
- 'null'
description: Last annotator or reviewer who updated this task
required:
- data
description: Tasks serializer for Import API (TaskBulkCreateAPI)
title: ImportApiRequest
ReviewSettingsRequest:
type: object
properties:
anonymize_annotations:
type: boolean
description: Hide annotator names from annotations while review
instruction:
type:
- string
- 'null'
description: Instructions
only_finished_tasks:
type: boolean
description: Show only finished tasks in the review stream
project:
type:
- integer
- 'null'
requeue_rejected_tasks_mode:
oneOf:
- $ref: '#/components/schemas/RequeueRejectedTasksModeEnum'
- type: 'null'
description: 'Remove rejected annotations from labeling queue / Requeue rejected annotations back to annotators / Allow reviewer to decide: Remove or Requeue
* `requeue` - Requeue
* `remove` - Remove
* `flexible` - Flexible'
require_comment_on_reject:
type: boolean
description: Reviewers must leave a comment on reject
review_criteria:
oneOf:
- $ref: '#/components/schemas/ReviewCriteriaEnum'
- type: 'null'
description: 'Task is reviewed after at least one accepted annotation / Task is reviewed when all annotations are reviewed
* `all` - Task is reviewed if all annotations are reviewed
* `one` - Task is reviewed if at least one annotation is reviewed'
review_only_manual_assignments:
type: boolean
description: Show only manually assigned tasks in the review stream
review_task_limit_percent:
type:
- string
- 'null'
format: decimal
description: Task limit (%)
sampling:
oneOf:
- $ref: '#/components/schemas/ReviewSettingsSamplingEnum'
- type: 'null'
description: 'By Task ID / Random
* `task_id` - By Task ID
* `random` - Random'
show_agreement_to_reviewers:
type: boolean
description: Show agreement to reviewers in the Data Manager
show_data_manager_to_reviewers:
type: boolean
description: Show the Data Manager to reviewers
show_instruction:
type: boolean
description: Show before reviewing
show_unused_data_columns_to_reviewers:
type:
- boolean
- 'null'
description: Show unused task data columns to reviewers in the Data Manager
title: ReviewSettingsRequest
PredictionRequest:
type: object
properties:
cluster:
type:
- integer
- 'null'
description: Cluster for the current prediction
mislabeling:
type: number
format: double
description: Related task mislabeling score
model:
type:
- integer
- 'null'
description: An ML Backend instance that created the prediction.
model_run:
type:
- integer
- 'null'
description: A run of a ModelVersion that c
# --- truncated at 32 KB (98 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/label-studio/refs/heads/main/openapi/label-studio-subpackage-projects-api-openapi.yml