label-studio Documentation

Label Studio is a multi-type data labeling and annotation tool with standardized output format

RAW Doc

Docker & Self-Hosted Deployment Verified OCI

Deploy label-studio on any server, homelab, or cloud container platform.

1-Click Terminal Command
bash (docker run)
docker run -d --name label-studio -p 9000:9000 --restart always quay.io/prometheus/prometheus:v2.37.1
Configured Services & Ports
⚙️ minio
image: minio/minio:${MINIO_VERSION:-RELEASE.2025-04-22T22-12-26Z}
🔌 Ports: 9000:9000, 9009:9009
⚙️ prometheus
image: quay.io/prometheus/prometheus:v2.37.1
docker-compose.yml
yaml (docker-compose.yml)
# rotating logs so they do not overflow
x-logging:
  logging: &default-logging
    driver: "local"
    options:
      max-size: "10m"
      max-file: "3"

services:
  # not replicated setup for test setup, use a proper aws S3 compatible cluster in production
  minio:
    image: "minio/minio:${MINIO_VERSION:-RELEASE.2025-04-22T22-12-26Z}"
    command: server /data --console-address ":9009"
    restart: unless-stopped
    logging: *default-logging
    ports:
      - "9000:9000"
      - "9009:9009"
    volumes:
      - minio-data:/data
    # configure env vars in .env file or your systems environment
    environment:
      - MINIO_ROOT_USER=${MINIO_ROOT_USER:-minio_admin_do_not_use_in_production}
      - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minio_admin_do_not_use_in_production}
      - MINIO_PROMETHEUS_URL=${MINIO_PROMETHEUS_URL:-http://prometheus:9090}
      - MINIO_PROMETHEUS_AUTH_TYPE=${MINIO_PROMETHEUS_AUTH_TYPE:-public}
  prometheus:
    image: quay.io/prometheus/prometheus:v2.37.1
    restart: unless-stopped
    logging: *default-logging
    #    ports:
    #      - "9090:9090"
    volumes:
      - "./prometheus/minio/prometheus.yml:/etc/prometheus/prometheus.yml"
      - "prometheus-data:/prometheus"
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
volumes:
  minio-data:
  prometheus-data:

Technical Documentation: HumanSignal/label-studio

ℹ️ Provenance: Multi-Tier Ingestion · CodeWiki Reference

Overview (README.md)

Website • Docs • Join Slack Community

What is Label Studio?

Label Studio is an open source data labeling tool. It lets you label data types like audio, text, images, videos, and time series with a simple and straightforward UI and export to various model formats. It can be used to prepare raw data or improve existing training data to get more accurate ML models.

Have a custom dataset? You can customize Label Studio to fit your needs. Read an introductory blog post to learn more.

Try out Label Studio

Install Label Studio locally or deploy it in a cloud instance. Or sign up for a free trial of our Starter Cloud edition! You can learn more about what each edition offers here.

Install locally with Docker

Official Label Studio docker image is here and it can be downloaded with docker pull.
Run Label Studio in a Docker container and access it at http://localhost:8080.

bash
docker pull heartexlabs/label-studio:latest
docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest

You can find all the generated assets, including SQLite3 database storage label_studio.sqlite3 and uploaded files, in the ./mydata directory.

Override default Docker install

You can override the default launch command by appending the new arguments:

bash
docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

Build a local image with Docker

If you want to build a local image, run:

bash
docker build -t heartexlabs/label-studio:latest .

Run with Docker Compose

Docker Compose script provides production-ready stack consisting of the following components:

  • Label Studio
  • Nginx - proxy web server used to load various static data, including uploaded audio, images, etc.
  • PostgreSQL - production-ready database that replaces less performant SQLite3.

To start using the app from http://localhost run this command:

bash
docker-compose up

Run with Docker Compose + MinIO

You can also run it with an additional MinIO server for local S3 storage. This is particularly useful when you want to
test the behavior with S3 storage on your local system. To start Label Studio in this way, you need to run the following command:

bash
# Add sudo on Linux if you are not a member of the docker group
docker compose -f docker-compose.yml -f docker-compose.minio.yml up -d

If you do not have a static IP address, you must create an entry in your hosts file so that both Label Studio and your
browser can access the MinIO server. For more detailed instructions, please refer to our guide on storing data.

Install locally with pip

bash
# Requires Python >=3.10
pip install label-studio

# Start the server at http://localhost:8080
label-studio

Install locally with poetry

bash
### install poetry
pip install poetry

### set poetry environment
poetry new my-label-studio
cd my-label-studio
poetry add label-studio

### activate poetry environment
poetry shell

### Start the server at http://localhost:8080
label-studio

Install locally with Anaconda

bash
conda create --name label-studio
conda activate label-studio
conda install psycopg2
pip install label-studio

Install for local development

You can run the latest Label Studio version locally without installing the package from pypi.

bash
# Install all package dependencies
pip install poetry
poetry install
# Run database migrations
python label_studio/manage.py migrate
python label_studio/manage.py collectstatic
# Start the server in development mode at http://localhost:8080
python label_studio/manage.py runserver

Deploy in a cloud instance

You can deploy Label Studio with one click in Heroku, Microsoft Azure, or Google Cloud Platform:



Apply frontend changes

For information about updating the frontend, see label-studio/web/README.md.

Install dependencies on Windows

To run Label Studio on Windows, download and install the following wheel packages from Gohlke builds to ensure you're using the correct version of Python:

bash
# Upgrade pip 
pip install -U pip

# If you're running Win64 with Python 3.8, install the packages downloaded from Gohlke:
pip install lxml‑4.5.0‑cp38‑cp38‑win_amd64.whl

# Install label studio
pip install label-studio

Run test suite

To add the tests' dependencies to your local install:

bash
poetry install --with test

Alternatively, it is possible to run the unit tests from a Docker container in which the test dependencies are installed:

bash
make build-testing-image
make docker-testing-shell

In either case, to run the unit tests:

bash
cd label_studio

# sqlite3
DJANGO_DB=sqlite DJANGO_SETTINGS_MODULE=core.settings.label_studio pytest -vv

# postgres (assumes default postgres user,db,pass. Will not work in Docker
# testing container without additional configuration)
DJANGO_DB=default DJANGO_SETTINGS_MODULE=core.settings.label_studio pytest -vv

What you get from Label Studio

https://github.com/user-attachments/assets/525ad5ff-6904-4398-b507-7e8954268d69

  • Multi-user labeling sign up and login, when you create an annotation it's tied to your account.
  • Multiple projects to work on all your datasets in one instance.
  • Streamlined design helps you focus on your task, not how to use the software.
  • Configurable label formats let you customize the visual interface to meet your specific labeling needs.
  • Support for multiple data types including images, audio, text, HTML, time-series, and video.
  • Import from files or from cloud storage in Amazon AWS S3, Google Cloud Storage, or JSON, CSV, TSV, RAR, and ZIP archives.
  • Integration with machine learning models so that you can visualize and compare predictions from different models and perform pre-labeling.
  • Embed it in your data pipeline REST API makes it easy to make it a part of your pipeline

Included templates for labeling data in Label Studio

Label Studio includes a variety of templates to help you label your data, or you can create your own using specifically designed configuration language. The most common templates and use cases for labeling include the following cases:

Set up machine learning models with Label Studio

Connect your favorite machine learning model using the Label Studio Machine Learning SDK. Follow these steps:

  1. Start your own machine learning backend server. See more detailed instructions.
  2. Connect Label Studio to the server on the model page found in project settings.

This lets you:

  • Pre-label your data using model predictions.
  • Do online learning and retrain your model while new annotations are being created.
  • Do active learning by labeling only the most complex examples in your data.

Integrate Label Studio with your existing tools

You can use Label Studio as an independent part of your machine learning workflow or integrate the frontend or backend into your existing tools.

Ecosystem

Project Description
label-studio Server, distributed as a pip package
Frontend library The Label Studio frontend library. This uses React to build the UI and mobx-state-tree for state management.
Data Manager library A library for the Data Manager, our data exploration tool.
label-studio-converter Encode labels in the format of your favorite machine learning library
label-studio-transformers Transformers library connected and configured for use with Label Studio

Citation

Include a citation for Label Studio in the References section of your articles:

tex
@misc{Label Studio,
  title={{Label Studio}: Data labeling software},
  url={https://github.com/HumanSignal/label-studio},
  note={Open source software available from https://github.com/HumanSignal/label-studio},
  author={
    Maxim Tkachenko and
    Mikhail Malyuk and
    Andrey Holmanyuk and
    Nikolai Liubimov},
  year={2020-2025},
}

License

This software is licensed under the Apache 2.0 LICENSE © Heartex. 2020-2025


README (`docs/README.md`)

Documentation of Label Studio

Use and deploy Hexo

Installing Dependencies

shell
npm install

Starting Development server

shell
npm run server

Starts a local server. By default, this is at http://localhost:4000/.

Deploying Documentation

shell
npm run publish

Deploy the docs locally using Hexo

To deploy the docs locally on your machine using Hexo, use the following steps.

Prerequisites

  • Install Hexo
  • Clone the Label Studio Github repository

Deploy the docs locally

In the label-studio/docs directory of the cloned repo, do the following:

  1. (First time) Install required dependencies:
shell
npm install
  1. Start the Hexo server:
shell
hexo serve

Hexo Official Documentation

https://hexo.io/docs/


Source Guide Dashboard Overview (`docs/source/guide/dashboard_overview.md`)


title: Projects overview dashboard short: Projects overview tier: enterprise type: guide order: 0 order_enterprise: 172 meta_title: Projects Overview Dashboard meta_description: Use the analytics overview page to explore progress across multiple projects section: "Analytics" date: 2026-01-10 11:50:41

The Analytics > Overview page is a centralized starting point to explore performance insights across multiple projects.

Access by user role

User role Access restrictions
Owner and Admin Can view the Overview dashboard and filter for all workspaces and projects.
Manager Can view the Overview dashboard, but can only filter for and view workspaces or projects in which they are a member.
Reviewer and Annotator Cannot access the Overview dashboard. When they open Analytics, they are redirected to the Member Performance dashboard, where they can only see their own annotation and review history.

Filtering

Filter by project and workspace

Select one or more workspaces or individual projects. To see all projects, select All Workspaces at the top of the workspace filter.

This does not include Personal Sandbox projects, and is limited to 50 projects at a time.

Filter by date range

You can select a date range to apply to the project metrics. If you want to be precise, you can also include time.

Note that annotation and acceptance metrics are calculated on when they are completed, not when they begin.

For example, say you select a date range of 2 days: Monday and Tuesday. If an annotator opens an annotation on Tuesday, begins working on it, and then submits it on Wednesday, then that annotation and the time they spent on it will not be included in the metrics.

Save views

You can save your date range and project filters as custom views. Saved views makes it easier for you to group dates and projects you want to readily access.

Note the following:

  • You can save, update, and delete views.
  • Views are only visible to you (meaning they are not shared with other users within your organization).

!!! note
If you click Apply after saving your date and project/workspace filters, your selections will propogate to other Analytics pages. You can reapply your view or incorporate those filters into a new or updated view.

Tasks and project states

For more information about the states referenced in the Overview dashboard, see Project and task state management.

!!! note

text
Project and task state history tracking did not start until state management was implemented for your organization. For most Label Studio Cloud organizations, state management was implemented in February 2026. 

This means that the **Overview** dashboard will not reflect when a project or task changed states if that change happened before state management was implemented.

Project progress summaries

At the top of the Overview dashboard, summary cards show aggregate metrics for the selected date range and workspaces or projects.

!!! note
A dash (--) appears when there is no data. A zero (0) appears when there is data available and the value is zero.

Metric Description
Total Done Tasks Total number of tasks in the Done state across the selected projects.
Total Tasks Annotated Total number of tasks that have the required annotations completed across all selected projects. This includes tasks in the Done state, Needs Review state, and the In Review state.
Total Annotations Submitted Total number of annotations submitted across all selected projects. This includes annotations that have been submitted or updated, whether or not they have been reviewed.
Total Time Spent Total time spent annotating (lead time) and reviewing across all selected projects. The lead time is the time spent on annotations in which the last action was one of the following: Submit, Update, Fix + Accept, Accept, Reject. Lead time includes idle time and is cumulative across multiple sessions.

Project progress charts

The Overview dashboard includes charts that break down metrics over the selected time period.

Dates for annotations and reviews are based on when they were completed, not when they were started.

Chart Description
Task Progress Shows how tasks move through states over the selected period of time.
Annotations Submitted vs Accepted Shows submitted annotations and accepted annotations over time, with an acceptance score line (the acceptance score is the number of accepted annotations divided by the number of annotations reviewed). Note that accepted annotations includes annotations that were fixed and then accepted.
Time Spent Shows time spent annotating and reviewing over time. Includes total time in the period and average time per submitted annotation.

Project progress table

The Project Progress table display detailed metrics for each project.

!!! note
A dash (--) appears when there is no data. A zero (0) appears when there is data available and the value is zero.

Column Description
Workspace The workspace that contains the project.
Project The project name. Click to open the project dashboard.
Task Count Number of tasks in the project. This includes every task and is not date filtered.
Tasks (Initial) Number of tasks in the Initial state.
Tasks (Annotating) Number of tasks in the Annotating state.
Tasks (Needs Review) Number of tasks in the Needs Review state.
Tasks (In Review) Number of tasks in the In Review state.
Tasks (Done) Number of tasks in the Done state.
Tasks Annotated Total number of tasks that have each received the required number of annotations during the selected date range. This includes tasks in the Done state, Needs Review state, and the In Review state.
Annotations Submitted Number of annotations submitted (includes those updated and/or reviewed).
Annotations Accepted Annotations accepted or fixed and then accepted.
Total Time Spent Total time spent annotating and reviewing annotations.
Avg Time / Annotation Average time spent per submitted annotation. Includes both annotation and review times.
Avg Agreement Score Average agreement Score across all tasks which have received the required number of annotations.
Acceptance Score Total number of accepted annotations divided by the number of annotations that have been reviewed.

Source Guide Prompts Overview (`docs/source/guide/prompts_overview.md`)


title: Prompts overview and use cases short: Overview and use cases tier: enterprise type: guide order: 0 order_enterprise: 225 meta_title: Prompts overview meta_description: An overview of the Prompts feature on the HumanSignal platform section: Prompts date: 2024-05-15 14:30:14

Use Prompts to evaluate and refine your LLM prompts and then generate predictions to automate your labeling process.

All you need to get started is an LLM deployment API key and a project.

With Prompts, you can:

  • Drastically improve the speed and efficiency of annotations, transforming subject matter experts (SMEs) into highly productive data scientists while reducing the dependency on non-SME manual annotators.
  • Increase annotation throughput, accuracy, and consistency, making the process faster and more scalable.
  • Empower users to harness the full potential of AI-driven text labeling, setting a new standard for efficiency and innovation in data labeling.
  • Leverage subject matter expertise to rapidly bootstrap projects with labels, allowing you to decrease time to ML development.
  • Allow your subject matter experts time focus on higher-level tasks rather than being bogged down by repetitive manual work.

Features, requirements, and constraints

Feature Support
Supported data types Text ImageNote: Images are only supported when uploaded through cloud storage.
Supported object tags Text HyperText Image
Supported control tags Choices (Text and Image)Labels (Text)TextArea (Text and Image)Pairwise (Text and Image)Number (Text and Image)Rating (Text and Image)
Supported base models See Supported base models
Class selection Multi-selection (the LLM can apply multiple labels per task)
Text compatibility Task text must be utf-8 compatible
Task size Total size of each task can be no more than 1MB (approximately 200-500 pages of text)
Network access If you are using a firewall or restricting network access to your OpenAI models, you will need to allow the following IPs: 3.219.3.197 34.237.73.3 4.216.17.242
Required permissions Owners, Administrators, Managers -- Can create Prompt models and update projects with auto-annotations. Managers can only apply models to projects in which they are already a member. Reviewers and Annotators -- No access to the Prompts tool, but can see the predictions generated by the prompts from within the project (depending on your project settings).
ML backend support Prompts should not be used with a project that is connected to an ML backend, as this can affect how certain evaluation metrics are calculated.
Enterprise vs. Open Source Label Studio Enterprise Starter Cloud

!!! note
For information on installing Prompts for on-prem environments, see Install Prompts.

Use cases

Auto-labeling with Prompts

Prompts allows you to leverage LLMs to swiftly generate accurate predictions, enabling instant labeling of thousands of tasks.

By utilizing AI to handle the bulk of the annotation work, you can significantly enhance the efficiency and speed of your data labeling workflows. This is particularly valuable when dealing with large datasets that require consistent and accurate labeling. Automating this process reduces the reliance on manual annotators, which not only cuts down on labor costs but also minimizes human errors and biases. With AI's ability to learn from the provided ground truth annotations, you can maintain a high level of accuracy and consistency across the dataset, ensuring high-quality labeled data for training machine learning models.

Workflow

  1. If you don't already have one, create a project and import a text-based dataset.

  2. Annotate a subset of tasks, marking as many as possible as ground truth annotations. The more data you have for the prompt evaluation, the more confident you can be with the results.

    If you want to skip this step, see the bootstrapping use case outlined below.

  3. Go to the Prompts page and create a new Prompt. If you haven't already, you will also need to add an API key to connect to your model.

  4. Write a prompt and evaluate it against your ground truth dataset.

  5. When your prompt is returning an overall accuracy that is acceptable, you can choose to apply it to the rest of the tasks in your project.

Bootstrapping projects with Prompts

In this use case, you do not need a ground truth annotation set. You can use Prompts to generate predictions for tasks without returning accuracy scores for the predictions it generates.

This use case is ideal for organizations looking to kickstart new initiatives without the initial burden of creating extensive ground truth annotations, allowing you to start analyzing and utilizing your data immediately. This is particularly beneficial for projects with tight timelines or limited resources.

By generating predictions and converting them into annotations, you can also quickly build a labeled dataset, which can then be refined and improved over time with the help of subject matter experts. This approach accelerates the project initiation phase, enabling faster experimentation and iteration.

Additionally, this workflow provides a scalable solution for continuously expanding datasets, ensuring that new data can be integrated and labeled efficiently as the project evolves.

!!! note
You can still follow this use case even if you already have ground truth annotations. You will have the option to select a task sample set without taking ground truth data into consideration.

Workflow

  1. If you don't already have one, create a project and import a text-based dataset.

  2. Go to the Prompts page and create a new Prompt. If you haven't already, you will also need to add an API key to connect to your model.

  3. Write a prompt and run it against your task samples.

When you run your prompt, you create predictions for the selected sample (this can be a portion of the project tasks or all tasks). From here you have several options:

  • Continue to work on your prompt and generate new predictions each time you run it against your sample.
  • Return to the project and begin reviewing your predictions. If you convert your predictions into annotations, you can use subject matter experts and annotators to begin interacting with those the annotations.
  • As you review the annotations, you can identify ground truths. With a ground truth dataset, you can further refine your prompt using its accuracy score.

Prompt evaluation and fine-tuning

As you evaluate your prompt against the ground truth annotations, you will be given an accuracy score for each version of your prompt. You can use this to iterate your prompt versions for clarity, specificity, and context.

This accuracy score provides a measurable way to evaluate and refine the performance of your prompt. By tracking accuracy, you can ensure that the automated labels generated by the LLM are consistent with ground truth data.

This feedback loop allows you to iteratively fine-tune your prompts, optimizing the accuracy of predictions and enhancing the overall reliability of your data annotation processes. In industries where data accuracy directly impacts decision-making and operational efficiency, this capability is invaluable.

Workflow

  1. If you don't already have one, create a project and import a text-based dataset.

  2. Annotate a subset of tasks, marking as many as possible as ground truth annotations. The more data you have for the prompt evaluation, the more confident you can be with the results.

  3. Go to the Prompts page and create a new Prompt. If you haven't already, you will also need to add an API key to connect to your model.

  4. Write a prompt and evaluate it against your ground truth dataset.

  5. Continue iterating and refining your prompt until you reach an acceptable accuracy score.


Source Skills Index (`docs/source/skills/index.md`)


title: Skills overview short: Overview tier: all type: skills order: 1 meta_title: Label Studio agent skills meta_description: Use HumanSignal agent skills to set up labeling projects and custom interfaces from inside your AI coding agent.

HumanSignal publishes a small set of agent skills that let you set up and iterate on Label Studio projects from inside an AI coding agent (Claude Code, Codex, Cursor, and other agents supported by the skills CLI). Each skill is a self-contained package: a workflow prompt, baked-in reference material, and small Python helper scripts that talk to your Label Studio instance over its public API.

Skills with the lock emoji 🔒 next to their name are only available for Label Studio Enterprise users.

Two skills are currently published:

Skill What it does Tier
create-xml-labeling-config-skill Drafts a Label Studio XML labeling configuration from a plain-English task description, validates it locally and against your running Label Studio instance, and (after explicit approval) pushes it as a new project or as an update to an existing one. OSS + Enterprise
🔒 create-interface-skill Generates a HumanSignal Interface — a single-file JSX annotation screen for Label Studio Enterprise — exporting paramsSchema / outputSchema / getResults / parseResults and the parenthesized-object-literal trailer the runtime requires. Enterprise

When to use which

  • You want a standard labeling project — text classification, NER/span labeling, image bounding boxes, audio transcription, taxonomy review, ranking, pairwise comparison, time-series segmentation. Use create-xml-labeling-config-skill. It writes an XML config using Label Studio's built-in tags, which is the right runtime for the vast majority of projects.

  • You need a custom React-based UI — the built-in tags don't cover your case, you're working with data types that don't have a standard object tag (3D, GEOTiff, DICOM), or you want to vibe-code your labeling screen. Use 🔒 create-interface-skill. The output is a single JSX file you can paste into the Label Studio Enterprise Interfaces editor or sync with the label-studio-sdk CLI.

If you're not sure which to start with, start with the XML config skill. It's the lighter-weight path and works on every Label Studio install.

How a skill run is structured

Both skills follow the same general shape:

  1. You describe the task in plain English ("NER for legal contracts with labels Party / Date / Amount / Clause type"). The skill asks one or two clarifying questions if it really needs them; otherwise it picks sensible defaults and surfaces its assumptions at the approval gate.
  2. The agent drafts the XML config or JSX interface using the skill's baked-in reference material. No external knowledge base or runtime lookup is required.
  3. Local validation runs automatically. Both skills ship Python scripts that catch structural issues before anything reaches your Label Studio instance.
  4. The agent shows you the config / interface, a sample task, and any assumptions it made, then waits for an explicit yes.
  5. On approval, the skill pushes to Label Studio. Either as a new project, or — for the config skill — as an update to an existing --project-id.

The approval gate in step 4 is load-bearing: neither skill writes to your Label Studio instance without you explicitly saying yes. If the agent gets an assumption wrong, you redirect at the gate and the skill iterates.

Install

Both skills install through the skills CLI, which targets the agent of your choice.

`create-xml-labeling-config-skill`

bash
# Claude Code
npx skills add humansignal/create-xml-labeling-config-skill --skill create-xml-labeling-config-skill -g -a claude-code

# Codex
npx skills add humansignal/create-xml-labeling-config-skill --skill create-xml-labeling-config-skill -g -a codex

# Cursor
npx skills add humansignal/create-xml-labeling-config-skill --skill create-xml-labeling-config-skill -g -a cursor

`create-interface-skill`

bash
# Claude Code
npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a claude-code

# Codex
npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a codex

# Cursor
npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a cursor

Restart your agent after installing.

Credentials

Both skills read from a .env at the skill root. The variables they look for:

Variable Used by Required?
LABEL_STUDIO_URL both Yes for the server-side validation and push steps. Defaults to http://localhost:8080.
LABEL_STUDIO_API_KEY both Yes for the server-side validation and push steps. Skip and local validation still runs, but you'll have to upload the config manually.

Get your API key from Account & Settings → Access Token in your Label Studio instance.

Source


Source Tags Index (`docs/source/tags/index.md`)


title: Introduction type: tags order: 201 meta_title: Customize the Label Studio User Interface meta_description: Customize the Label Studio labeling interface using XML-like tags for data annotation tasks in machine learning and data science projects.

You can use XML-like tags in Label Studio to configure the labeling interface. Label Studio uses three different types of tags to manage labeling:

  • Object tags for data types, used to display elements in a task that can be labeled such as audio, HTML, images, paragraphs, text, and more.
  • Control tags that you can use to annotate the objects. For example, use labels for semantic and named entity tasks, choices for classification tasks, textarea for transcription tasks, and more.
  • Visual tags to modify the visual aspects of the labeling interface, such as by controlling the view of specific labeling options, or adding a header.

Create a custom labeling configuration

When you set up your labeling interface, you can choose to use tags to create a custom labeling interface. When you create a custom labeling interface, you must pay attention to the structure of your task data and set up the configuration accordingly.

!!! error enterprise
Label Studio Enterprise has the option include plugins as part of your labeling interface. Plugins allow you to use Javascript to extend your interface and customize annotator workflows. For more information, see Plugins.

!!! info Tip
You can also implement plugins as part of your labeling interface. Plugins allow you to use Javascript to extend your interface and customize annotator workflows. For more information, see Plugins.

Connecting elements

All control and object tags require a name parameter. Every control tag also requires a toName parameter that matches the name parameter of the object tag in the configuration.

For example, if you want to apply labels to text for a named entity recognition task, you might use the following labeling configuration:

xml
<View>
  <Labels name="lbl" toName="txt">
    <Label value="Label 1"></Label>
    <Label value="Label 2"></Label>
  </Labels>
  <Text name="txt" value="$value"></Text>
</View>

In this example, the Label tags are used with the Text tag to label text. You can combine multiple control and object tags in the same configuration and use names to connect them.

Variables

All object tags and some control and visual tags support variables inside their parameters. You can use a variable to set up a labeling configuration once and manage what displays on the labeling interface with the data in a specific task.

To use a variable, use it with the value parameter of a tag and specify it using the $ sign and the name of the field that you want to reference. For example, for a sample task containing the following partial JSON:

json
{
  "header": "This is a different header for each task",
  "textlabel": "This is the text that needs to be labeled"
}

Use the following labeling configuration to reference the data fields:

xml
<View>
  <Header value="$header"></Header>
  <Text name="text" value="$textlabel"></Text>
  <Choices name="sentiment" toName="text" choice="single" showInLine="true">
   <Choice value="Positive"/>
   <Choice value="Negative"/>
   <Choice value="Neutral"/>
  </Choices>
</View>

Then your labeling interface looks like the following:

Styles

You can style the labeling interface using the Style tag, but you can also add styles to the View tag.

For example, you can style the View tag to create a two-column labeling interface with multiple control and object tags such as in the following labeling configuration:

xml
<View style="display: flex;">
  <View style="flex: 50%">
    <Header value="Choose:"></Header>
    <Text name="txt-1" value="$value"></Text>
    <Choices name="chc" toName="txt-1">
      <Choice value="Choice 1"></Choice>
      <Choice value="Choice 2"></Choice>
    </Choices>
  </View>
  <View style="flex: 50%; margin-left: 1em">
    <Header value="Enter your question and rate text:"></Header>
    <Text name="txt-2" value="$value"></Text>
    <Rating name="rating" toName="txt-2"></Rating>
    <TextArea name="question"></TextArea>
  </View>
</View>

Source Tutorials Index (`docs/source/tutorials/index.md`)


title: Tutorials meta_title: Tutorials meta_description: A curated list of tutorials to help you get started or learn how to integrate Label Studio into your workflow. layout: tutorials hide_sidebar: true


CONTRIBUTING (`docs/CONTRIBUTING.md`)

Contribute to the Label Studio documentation

Thank you for investing your time in contributing to our project! Any contribution you make will be reflected on the Label Studio documentation site at https://labelstud.io/guide/, or https://labelstud.io/templates/ if you contribute a template.

Before you start

We value input from each member of the community, and we ask that you follow our code of conduct. We are a small team, but we try to respond to issues and pull requests within 2 business days.

For changes that you contribute to any of the Label Studio repositories, please do the following:

  • Review the general contributor guidelines.
  • Create issues for any major changes and enhancements that you want to make.
  • Keep pull requests specific to one issue. Shorter pull requests are preferred and are easier to review.

Contribute updates to the documentation

Some types of documentation that you might want to contribute to Label Studio:

  • Small fix: Fix a typo or a broken link.
  • Add a section: Add a new section to an existing topic. For example, improve the troubleshooting guidance for ML backends based on an issue that you encountered.
  • Refactor: Rewrite a topic to make it clearer. For example, improve the guidance for creating custom webhook events.
  • Add new: Add a new topic, such as a new template or a new ML tutorial. If you want to add something else, please open an issue and discuss it with the team.

Contribute a template

All Label Studio templates are specific to a machine learning use case, such as Natural Language Processing, Computer Vision, Conversational AI, and others.

We welcome contributions of new templates and enhancements to existing templates. Before you make a contribution, you might want to file a feature request issue about your proposed template to discuss it before you put in the work of a pull request.

If you want to add a new template, ensure that it fits one of the ML use cases. If your template is a customization of an existing template that primarily affects the layout of the labeling interface, consider contributing to the existing template by adding a new section to the Enhance this template section.

Contribute a new template

If you want to contribute a new template, do the following.

Add the template to the documentation:

  1. Create a new file in the label-studio/docs/source/templates directory with the name of the template, separated by underscores, such as new_template.md.
  2. Add front matter to the template, including the title, category, type, order, and meta information. The type must be templates, and the order must be 1 higher than the last relevant template in the category to which your template applies. For example:
markdown
---
title: Document Retrieval
type: templates
category: Ranking and Scoring
cat: ranking-and-scoring
order: 502
meta_title: Document Retrieval Data Labeling Template
meta_description: Template for annotating documents for document retrieval tasks with Label Studio for your machine learning and data science projects.
---
  1. Add information about your template. Include 1-2 sentences introducing the machine learning use case for the template and how the template actually works. For example:
markdown
If you want to start training document retrieval or recommender models, you might want to develop a dataset with that identifies similar documents. Use this template to identify and choose documents that are related to a specific query or an existing document.
  1. Add boilerplate information to allow a template preview to render:
markdown
## Interactive Template Preview

<div id="main-preview"></div>
  1. Add a header ## Labeling Configuration and place the full template XML in html tags.
  2. Add a section ## About the labeling configuration and describe the tags in the template.
  3. (Optional) Add a section with enhancements to the template with alternate configurations, a section for related templates, or a section for related tags.

After adding the template file, add it to the relevant template gallery by doing the following:

  1. Locate the template gallery file for your template use case. All template galleries are named gallery_*.html with the last portion of the file name an abbreviation of the use case. For example, gallery_cv.html is the computer vision template gallery.
  2. Create a new entry for the template at the end of the file. For example, copy this and update the a href element to point to your new template file, add categories, and update the title:
html
<div class="column">
      <a href="/templates/image_ellipse.html">
        <div class="card">
          <div class="image-wrap">
            <div class="image" style="background-image: url(/images/templates-misc/object-detection-ellipses.png)"></div>
          </div>
          <div class="category">object detection, semantic segmentation</div>
          <div class="title">Object Detection with Ellipses</div>
        </div>
      </a>
    </div>

If you want to add an image, place it in the label-studio/docs/themes/htx/source/images/templates-misc/ directory and update the link in this section.

That's it! Feel free to put out a pull request with only part of the template documentation to get feedback too.

Contribute an enhancement to an existing template

If you modified an existing template and want to share your changes with the community, contribute an enhancement to an existing template.

  1. Locate the template document that you want to update. For example, label-studio/docs/source/templates/text_summarization.md.
  2. If it doesn't exist, add a header ## Enhance this template at the bottom of the template, before the ## Related Tags section.
  3. Add a new header describing your enhancement. For example, ### Display text box next to the text to summarize.
  4. Describe the enhancement to the labeling config. For example:
markdown
If you want to display the text box next to the text to summarize, do the following:

1. Add flex display styling to the [View](/tags/view.html) tag for the labeling configuration: `<View style="display: flex;">`
2. Add new [View](/tags/view.html) tags to wrap the [Header](/tags/header.html) and the [Text](/tags/text.html) sample so that they display on the left.
3. Wrap the [TextArea](/tags/textarea.html) and [Header](/tags/header.html) tags in [View](/tags/view.html) tags with the following CSS styling so that they display neatly on the right:
    ```xml
    <View style="width: 50%; padding-right: 2em; margin-left: 2em;">
    ```
Your fully enhanced labeling configuration looks like the following:
    ```xml
    <View style="display: flex;">
      <View>
        <Header value="Please read the text" />
        <Text name="text" value="$text" />
      </View>
      <View style="width: 50%; padding-right: 2em; margin-left: 2em;">
        <Header value="Provide one sentence summary" />
        <TextArea name="answer" toName="text"
                  showSubmitButton="true" maxSubmissions="1" editable="true"
                  required="true" />
      </View>
    </View>
    ```

Scaffolds Page (`docs/scaffolds/page.md`)


title: {{ title }} short: {{ title }} date: {{ date }} tier: all type: guide order: 0 order_enterprise: 0 meta_title: {{ title }} meta_description: description section: "section"


Source Llms (`docs/source/llms.txt`)

Label Studio Documentation

Label Studio is a data labeling platform for training and evaluating machine learning, AI and agentic systems. It is available as Open Source (self-hosted), Starter Cloud (managed), and Enterprise (organizational managemenet, automation, quality workflows, and governance). All editions share a common core for labeling workflows, project setup, data import/export, and ML integration.
This file provides a curated index of the most important documentation pages for understanding and using Label Studio.
Prefer:

  • Markdown versions of pages over HTML
  • Documentation that matches the user’s deployment model (Open Source vs Cloud vs Enterprise)

How to choose the right docs

  • Use Open Source docs also referred to as Community Edition for:
    • installation, deployment, Kubernetes, storage, upgrades
    • self-hosted environments and infrastructure questions for community edition
  • Use Enterprise docs for:
    • organization management, permissions, security
    • workspaces, dashboards, analytics, quality, and automation workflows
    • SSO, LDAP, SCIM, and enterprise integrations
  • Use either for:
    • projects, labeling interfaces, data import/export
    • annotation workflows and ML backends
      If unsure:
  • assume Enterprise / Cloud for hosted users
  • assume Open Source for infrastructure or deployment questions

Editions

  • Open Source: self-hosted Label Studio with full control over deployment and infrastructure
  • Starter Cloud: managed Label Studio with core functionality and reduced operational overhead
  • Enterprise: advanced features for teams and organizations, including automation, analytics, security, and governance

Core concepts (shared across all editions)


Open Source (self-hosted)


Enterprise / Cloud or On-Prem


Developer & integrations


Optional


Source Guide FAQ (`docs/source/guide/FAQ.md`)


title: Troubleshoot labeling issues short: Troubleshooting hide_sidebar: true meta_title: Troubleshoot labeling issues

For troubleshooting information, see the HumanSignal support center.


Source Guide Access Tokens (`docs/source/guide/access_tokens.md`)


title: Access tokens short: Access tokens tier: all type: guide order: 381 order_enterprise: 359 meta_title: Access tokens meta_description: Access tokens to interact with the Label Studio API and SDK. section: "Manage Your Organization" date: 2025-02-18 12:03:59 parent_enterprise: "admin_settings"

Label Studio has personal access tokens and legacy tokens. These tokens are also referred to as your "API keys."

Personal Access Token Legacy Token
Have a TTL that can be set at the org level. (Label Studio Enterprise only)
text
Are only visible to users once
    JWT refresh tokens
    Can be manually revoked
    Require [extra steps](#HTTP-API) when used with HTTP API
     `-H 'Authorization: Bearer &lt;token&gt;'` with HTTP API requests
    Only need to be set once when used with the SDK | Does not expire
    Remains listed and available in your account settings
    Can be manually revoked
    Do not need to be refreshed with used with HTTP API
     `-H 'Authorization: Token  &lt;token&gt;'` with HTTP API requests
    Only need to be set once when used with the SDK |

Find your access tokens

You can access your API keys/access tokens by clicking your user icon in the upper right and selecting Account & Settings.

If you do not see either the Personal Access Tokens or Legacy Tokens page, that means you first need to enable them for your organization.

Enable access tokens for an organization

The options that users see on their Account & Settings page depend on your settings at the organization level.

From the Organization page, select Settings > Access Token Settings.

!!! note
The Organization page is only available to users in the Admin and Owner role.

From here you can enable and disable token types.

  • When a certain token type is disabled, existing tokens will not be able to authenticate to the Label Studio platform.

  • Use the Personal Access Token Time-to-Live to set an expiration date for personal access tokens. (Enterprise only)

"API keys" vs. "Access tokens"

In Label Studio, "access tokens" and "API keys" mean the same thing and are used interchangeably.

Personal access tokens

SDK

Personal access tokens can be set directly in the script or set as the LABEL_STUDIO_API_KEY environment variable.

python
# Define the URL where Label Studio is accessible and the API key for your user account
LABEL_STUDIO_URL = 'http://localhost:8080'

# API key can be either your PAT or legacy access token
LABEL_STUDIO_API_KEY = 'your-token'

# Import the SDK and the client module
from label_studio_sdk import LabelStudio

# Connect to the Label Studio API 
client = LabelStudio(base_url=LABEL_STUDIO_URL, api_key=LABEL_STUDIO_API_KEY)

HTTP API

Because this is a JWT refresh token, you must use your PAT to generate a short-lived access token. This access token is then used for API authentication.

To generate this access token, make a POST request with your personal access token in the JSON body. For example:

bash
curl -X POST <your-label-studio-url>/api/token/refresh \
-H "Content-Type: application/json" \
-d '{"refresh": "your-personal-access-token"}'

In response, you will receive a JSON payload similar to:

json
{
    "access": "your-new-access-token"
}

Use this access token by including it in your API requests via the Authorization: Bearer header. For example:

http
curl -X <method> <Label Studio URL>/api/<endpoint> -H 'Authorization: Bearer your-new-access-token'

When that access token expires (after around 5 minutes) you’ll get a 401 response, and will need to use your personal access token again to acquire a new one. This adds an extra layer of security.

You can also check when the token is set to expire using the following script:

python
# pip install pyjwt
from datetime import datetime, timezone
import jwt

decoded = jwt.decode(token)
exp = decoded.get("exp")
token_is_expired = (exp <= datetime.now(timezone.utc).timestamp())

Legacy tokens

Generally speaking, the legacy tokens are not as secure as personal access tokens because they must be manually revoked.

SDK

There is no difference in how you use legacy tokens and personal access tokens with the Python SDK. See the example above.

HTTP API

Use this access token by including it in your API requests via the Authorization: Token header (this is different than the Authorization: Bearer header used with personal access tokens).

For example:

bash
curl -X <method> <Label Studio URL>/api/<endpoint> -H 'Authorization: Token <token>

Source Guide Active Learning (`docs/source/guide/active_learning.md`)


title: Set up active learning with Label Studio
short: Active learning loop
tier: enterprise
type: guide
order: 0
order_enterprise: 257
meta_title: Set up an active learning loop with Label Studio
meta_description: Set up an end-to-end active learning loop with Label Studio using the ML backend SDK and webhooks to perform model training and predictions and labeling.
section: "Machine Learning"


Follow this tutorial to set up an active learning loop with Label Studio.

Use Label Studio Enterprise Edition to build an automated active learning loop with a machine learning model backend. If you use the open source Community Edition of Label Studio, you can manually sort tasks and retrieve predictions to mimic an active learning process. If you're using Label Studio Community Edition, see how to manually manage your active learning loop.

About Active Learning

Creating annotated training data for supervised machine learning models can be expensive and time-consuming. Active Learning is a branch of machine learning that seeks to minimize the total amount of data required for labeling by strategically sampling observations that provide new insight into the problem.

In particular, Active Learning algorithms aim to select diverse and informative data for annotation, rather than random observations, from a pool of unlabeled data using prediction scores. For more about the practice of active learning, read this article written by our HumanSignal CTO on Towards Data Science.

Set up an automated active learning loop

Continuously train and review predictions from a connected machine learning model using Label Studio.

After a user creates an annotation in Label Studio, the configured webhook sends a message to the machine learning backend with the information about the created annotation. The fit() method of the ML backend runs to train the model. When the user moves on to the next labeling task, Label Studio retrieves the latest prediction for the task from the ML backend, which runs the predict() method on the task.

To set up this active learning, do the following:

  1. Set up an ML model as an ML backend for active learning.
  2. Connect the ML backend for getting predictions to Label Studio.
  3. Configure webhooks to send a training event to the ML backend (optional).
  4. Set up task sampling with prediction scores.
  5. Label the tasks.

As you label tasks, Label Studio sends webhook events to your machine learning backend and prompts it to retrain. As the model retrains, the predictions from the latest model version appear in Label Studio.

Set up an ML model as an ML backend for active learning

Set up an example machine learning model as an ML backend, or create a custom machine learning model.

Connect the ML backend to Label Studio for active learning

Follow the steps to connect a model to a Label Studio project and ensure the setting Start model training on annotation submission is enabled. This sends a training request to the backend after each annotation submission or update.

Configure webhooks to send a training event to the ML backend (optional)

By default, Label Studio notifies your ML backend every time an annotation is created or updated so that it can start training in response.

If you want, you can set up your project to send a webhook event and use that event and payload to drive event-specific training logic in your ML backend. If you want to customize the events and payloads sent to your ML backend, do the following:

  1. In the Label Studio UI, open the project that you want to use for active learning.
  2. Click Settings > Webhooks.
  3. Click Add Webhook.
  4. Add the following URL as your Payload URL: http://localhost:9090/webhook
  5. (Optional) Leave the option to Send payload enabled. The ML backend does not require a payload, but you can use it in your code to retrieve project-related details, such as the project ID that you can use to retrieve data, define training hyperparameters based on project settings, retrieve the project state, or other details.
  6. Disable the option to Send for all actions and enable Annotation created and Annotation updated.
  7. Click Add Webhook.

For more details on the webhook event payloads, see the full payload details for the annotation webhook.

Set up task sampling with prediction scores

In order to maximize the training efficiency and effectiveness of your machine learning model, you want your annotators to focus on labeling the tasks with the least confident, or most uncertain, prediction scores from your model. To do make sure of that, set up uncertainty task sampling.

Label the tasks

On the project data manager, select Label All Tasks to start labeling.

As your model retrains and a new version is updated in Label Studio, the tasks shown next to annotators are always those with the lowest prediction scores, reflecting those with the lowest model certainty. The predictions for the tasks correspond to the latest model version.

Customize your active learning loop

If you want to change the behavior of the active learning loop, you can make manual changes.

Set up manual active learning

If you're using Label Studio Community Edition, data annotators can't experience a live active learning loop. You can mimic an active learning experience by doing the following:

  1. Manually retrieve predictions from a model.
  2. Sort the tasks in the data manager by prediction score.
  3. Select Label Tasks As Displayed when labeling tasks.

This manual active learning loop does not automatically update the order of tasks presented to annotators as the ML backend trains with each new annotation and produces new predictions. Therefore, instead of on-the-fly automated active learning, you can perform a form of batched active learning, where you perform annotation for a period, stop to train the model, then retrieve new predictions and start annotating tasks again.


Source Guide Admin Interfaces (`docs/source/guide/admin-interfaces.md`)


title: Interface admin settings short: Interfaces tier: enterprise type: guide hide_menu: false order: 0 order_enterprise: 363 meta_title: Interface admin settings section: "Manage Your Organization" parent_enterprise: "admin_settings" date: 2025-02-18 12:03:59

The Organization > Settings > Interfaces page is where Owners and Admins turn the Interfaces feature on for the organization and configure the security allowlist that every Interface runs against.

These settings apply uniformly to every Interface in your organization — embedded iframes, the main labeling canvas, the in-product preview, and the Develop Locally playground.

Access these settings from Organization > Settings > Interfaces.

!!! info Which section do I need?
- To let an Interface call an external API/service (fetch/XHR/WebSocket) → API origins.
- To let an Interface load a third-party script/stylesheet from a CDN → Advanced: external scripts.
- To use a library with no external network at all, bundle it into the Interface. Nothing to configure here. See Use external libraries and services.

Enable Interfaces

Toggle Allow projects in this organization to use Interfaces to make the Interfaces feature available across the organization.

API origins

Hosts that Interfaces are allowed to reach via fetch, XHR, or WebSocket (the CSP connect-src directive).

Rule Detail
Format Full origin including scheme, for example https://api.example.com.
Wildcards Not allowed (no * or *.example.com). List specific hosts.
Empty An empty list means no outbound network from Interfaces — they can only call your Label Studio server.
Whitespace and commas Rejected. Add one host per entry.

!!! info Tip
Your Label Studio server's own origin is always allowed automatically — you don't need to add it. Only list third-party hosts.

Iframe capabilities

Capabilities that Interfaces are allowed to request through the iframe allow= attribute. Click any chip to toggle it on or off. The list is intentionally narrow:

Capability Typical use
autoplay Playing audio or video without user interaction.
camera Reading from the device camera.
clipboard-write Programmatically copying to the clipboard.
encrypted-media Playing DRM-protected media.
fullscreen Entering fullscreen mode.
geolocation Reading the user's location.
idle-detection Detecting when the user is idle.
language-detector Using the on-device language detection API.
microphone Reading from the device microphone.
on-device-speech-recognition Running speech recognition locally.
storage-access Requesting unpartitioned storage access.

!!! warning
Stay minimal. Every enabled capability is something an Interface (including a third-party or experimental one) could call into. Only enable a capability when an Interface in your organization needs it.

Advanced: external scripts

Use this section to allow Interfaces to load third-party <script> and <style> tags from a list of trusted hosts.

Enable Allow external scripts / stylesheets to unlock the origin list and then add one or more script origins, for example https://cdn.jsdelivr.net.

Rule Detail
Scheme Must be https://. HTTP origins are rejected.
Format Origin only — no paths, query strings, credentials, or fragments.
Wildcards Not allowed.
Toggle Origins are ignored unless the Allow external scripts checkbox is on. Turning the checkbox off clears the list on save.

!!! warning
Scripts loaded from these origins run with the Interface's full privileges and can read any task data the Interface is rendering. Only add hosts you trust completely. Most organizations should leave this section disabled.


Source Guide Admin Auth (`docs/source/guide/admin_auth.md`)


title: SSO, LDAP & SCIM short: SSO, LDAP & SCIM tier: enterprise type: guide order: 0 order_enterprise: 383 meta_title: Identity and access options for Label Studio Enterprise meta_description: Overview of identity and access options available in Label Studio Enterprise section: "Manage Your Organization" date: 2025-09-21 09:08:58

Label Studio Enterprise provides enterprise-grade identity and access management to centralize authentication, automate user lifecycle, and control access across organizations, workspaces, and projects.

!!! info Tip
SSO handles authentication; SCIM handles automated user and group provisioning.

text
Most enterprises enable SSO first, then SCIM for ongoing user/group sync. LDAP is typically used for on‑prem deployments.

LDAP

On-prem only.

Authenticate against your directory (e.g., AD/LDAP) in self-hosted environments while keeping roles managed in Label Studio.

  • Login with enterprise directory credentials
  • Keep RBAC and project/workspace permissions in Label Studio

See Set up LDAP authentication for Label Studio.

SSO (SAML 2.0)

Authenticate users via your IdP (Okta, Google SAML, Azure AD/Microsoft Entra, Ping Identity, OneLogin, etc.) for seamless, secure login flows.

  • Centralized login with your IdP
  • Single sign-on across your tools
  • Enterprise security policies enforced at IdP

See Set up SSO authentication for Label Studio and our SAML API docs.

SCIM 2.0

Automate provisioning/deprovisioning and group-to-role mappings. Supports Create/Update/Deactivate Users and Push Groups, including workspace/project membership management.

  • Provision/deprovision users automatically
  • Sync user profile changes
  • Push Groups for workspace and project membership
  • Map groups to organization roles and project-level roles

See and Set up SCIM2 for Label Studio our SCIM API docs.


Source Guide Admin Logs (`docs/source/guide/admin_logs.md`)


title: Activity logs short: Activity logs tier: enterprise type: guide order: 0 order_enterprise: 354 meta_title: User activity logs in Label Studio meta_description: How to view user activity logs in Label Studio section: "Manage Your Organization" date: 2024-02-05 16:40:16

You can view user logs from the Organization > Activity Log page. Only users with the Administrator or Owner role can access this page.

!!! note
In Label Studio Enterprise Cloud (app.humansignal.com), activity logs are retained for 180 days.

text
In Label Studio Enterprise On-Prem, there is no limit on the retention period of activity logs.

Logs include user ID, IP address, a timestamp, and the type of action performed by logging the API request. You can find out more about each action being performed by clicking the API request.

!!! note
In some cases, clicking the API request will not return additional information. This is typically because the request includes sensitive information, such as a password.

You can filter the logs by the following:

  • User
  • Project
  • Request type (GET, POST, PATCH, DELETE)
  • Date range
  • Request keyword

Source Guide Admin Manage (`docs/source/guide/admin_manage.md`)


title: Manage user accounts short: Manage user accounts tier: opensource type: guide order: 372 order_enterprise: 0 meta_title: Manage user accounts meta_description: Manage existing user accounts in Label Studio Community edition section: "Manage Your Organization" date: 2024-02-06 16:36:44

!!! error Enterprise
In Label Studio Community Edition, there are relatively limited options available for user management.

text
In Label Studio Enterprise, you can set roles for users, restrict their permissions, delete and deactivate users, and view detailed logs of user actions. For more information about the user management capabilities of Label Studio Enterprise, see [User management overview](https://docs.humansignal.com/guide/manage_users) in the Enterprise documentation. To start a free trial, [click here](https://app.heartex.com/user/trial).

Retrieve user info from the command line

You can retrieve information about a user, including the API user token for a user, from the command line after starting Label Studio.

From the command line, run the following:

bash
label-studio user --username <username>

You can see user info, including their API token, as the last line of the response. For example:

text
=> User info:
{'id': 1, 'first_name': 'User', 'last_name': 'Somebody', 'username': 'label-studio', 'email': '[email protected]', 'last_activity': '2021-06-15T19:37:29.594618Z', 'avatar': '/data/avatars/img.jpg', 'initials': 'el', 'phone': '', 'active_organization': 1, 'token': '<api_token>', 'status': 'ok'}

Users can also retrieve their own tokens from the Label Studio app. For more information, see Access Tokes.

Review existing accounts in Label Studio

You can view the organization user list from Label Studio:

  1. Open Label Studio and click the menu in the upper left.
  2. Select Organization.

Click the user's row to see additional details about their activity, such as when they were last active, which projects they created, and which projects they contributed to.

Reset passwords

If you forget your password or change passwords regularly for security reasons, you can change it from the command line.

On the server running Label Studio, run the following command. And then when prompted, type the username and the new password:

bash
label-studio reset_password

You can also use optional command line arguments to reset the password for a username.

  • Specify the username and type the password when prompted:

    bash
    label-studio reset_password --username <username>
    New password:
text
- Specify both the username and the password:

    ```bash
label-studio reset_password --username <username> --password <password>

Source Guide Admin Manage Lse (`docs/source/guide/admin_manage_lse.md`)


title: Manage user accounts short: Manage user accounts tier: enterprise type: guide order: 0 order_enterprise: 372 meta_title: Manage user accounts meta_description: How to assign users to roles, delete users, tag users, and deactivate users section: "Manage Your Organization" parent: "manage_users" parent_enterprise: "manage_users" date: 2024-02-06 12:00:25

!!! note
If you are using SSO/SAML or SCIM, you can map groups to roles on the organization level and the project level. For more information, see Set up SSO authentication for Label Studio and Set up SCIM2 for Label Studio.

text
If you are using an IdP with SCIM or SAML/SSO, you should also handle user deactivations and deletions from the IdP.

Assign roles to users

If you invite users using the invite link option, their account is created but must be activated by assigning them to a role.

!!! info Tip
You can use the role filter above the table to see all Pending users. Select the Not Activated role.

  1. Open Label Studio and click the menu in the upper left.

  2. Select Organization.

    If you do not see the Organization option, you do not have access to the Organization page. Only users in the Owner or Administrator role can access this page.

  3. Locate the user account to which you are assigning a role.

  4. Use the drop-down menu next to the user to select a role.

Programmatically assign roles

To programmatically activate and assign roles to users, you can use the API:

https://api.labelstud.io/api-reference/api-reference/organizations/members/update

You can find user ID and organization ID from the Organization page:

You can also use the API:

Tag members

You can tag organization members with metadata.

Apply member tags via CSV

To bulk apply member tags, go to the Organization page and click Tag Members.

From here you can upload a CSV with the following format:

csv
email,tags
[email protected],"Data Science, Seattle"
[email protected],"Finance, New York City"
  • Ensure you include email,tags as the header.
  • Tags must be encapsulated in quotation marks.
  • If you have multiple tags, separate them with a comma.

!!! info Tip
If you are exporting the CSV from a spreadsheet editor, make sure you check the format in a text editor before uploading. Spreadsheet editors can add unnecessary formatting.

Add and delete tags

To delete or manually add new tags, go to Organization > Settings > Member Tags.

Manually assign tags

If you want to manually assign tags to individual users, you can use the Tags column in the org members table.

Deactivate users

You can deactivate a user account by assigning them to the Deactivated role. Deactivating a user revokes their access and opens up their seat in your license.

You can reactivate a user by assigning them to an active user role.

Delete users

  1. From the Organization page, select the user you want to delete.

  2. Click Delete.

  3. A confirmation message appears. Click Delete Member.

Once deleted, any completed work or changes that the user made will appear as belonging to a "Deleted User."

If you want to add the user again at a later date, you will need to re-invite them to the organization.


Source Guide Admin Permissions (`docs/source/guide/admin_permissions.md`)


title: Customize organization permissions short: Permissions tier: enterprise type: guide hide_menu: false order: 0 order_enterprise: 362 meta_title: Customize organization permissions section: "Manage Your Organization" parent_enterprise: "admin_settings" date: 2025-02-18 12:03:59

!!! note
This page is only visible to users in the Owner role.

You can use this page to customize certain permissions for roles. For information about Label Studio Enterprise roles and default permissions, see User roles and permissions.

Note the following:

  • Permissions for the Owner role are not configurable.
  • You can use the options on this page to have a more fined-grained control on which roles can execute certain actions.
  • Any restrictions you configure will also apply to the API. For example, if you restrict Managers' ability to configure cloud storage, they will not be able to complete those actions through the UI or the API.

Permissions that can be configured include the following:

Permission Default Roles
Invite members to organization Manager+
Create API Tokens All roles
Edit Plugins Manager+
Manage Cloud Storage Manager+
Manage Webhooks Manager+
Access Project Dashboard Manager+
Access Member Performance Dashboard All roles
Access Project Members Dashboard Manager+
Use AI Assistant Manager+
Delete Tasks Manager+
Reset Project Cache Manager+
Drop All Tabs Manager+
Delete Project Manager+

!!! note
Permissions for Annotators, Reviewers, and Managers are already restricted to projects that they created (if a Manager) or have explicitly been granted access to.

!!! info tip
You can click Reset to Defaults to return all permissions to their default value.


Source Guide Admin Roles (`docs/source/guide/admin_roles.md`)


title: User roles and permissions short: Roles and permissions tier: enterprise type: guide order: 0 order_enterprise: 375 meta_title: User roles and permissions meta_description: A description of the user roles and permissions available in Label Studio Enterprise. section: "Manage Your Organization" parent: "manage_users" parent_enterprise: "manage_users" date: 2024-02-05 17:19:21

Your user role determines your level of access to actions and information in Label Studio.

  • Access for Annotators, Reviewers, and Managers is restricted based on which projects and workspaces they have access to. For more information, see Project setup.
  • Owners can further restrict permissions within their organization using the Permissions page.

Roles in Label Studio Enterprise

For information on how to assign users to roles, see Manage user accounts.

Role Description
Owner Manages the organization and has full permissions at all levels.This is not an assignable role, and there is only one Owner per organization. By default, the Owner is tied to the account that created the Label Studio organization. To change the Owner, you will need to open a support ticket.
Administrator Has full permissions at most levels.Can access and update all workspaces and projects, invite members to the organization, and set most (but not all) organization settings.
Manager Has full administrative access over projects and workspaces that they created or to which they have been added as a member. Managers cannot access the Organization page.
Reviewer Reviews annotated tasks.Can only view projects that include tasks assigned to them. Can review and update task annotations.
Annotator Labels tasks.Can only view projects with tasks assigned to them and label tasks in those projects.

Permissions in Label Studio Enterprise

Action Annotator Reviewer Manager Administrator Owner
Organization Management
View the Organization page ✅ ✅
Assign member roles ✅ ✅
Invite users ✅ ✅
View system-wide activity log ✅ ✅
Set up model providers for the org ✅ ✅
Configure organization settings Partial ✅
Project Management
Workspace access R R CRUD[^1] CRUD CRUD
Project access R R CRUD[^1] CRUD CRUD
View the Data Manager Depends on project settings Depends on project settings ✅ ✅ ✅
Configure project settings ✅ ✅ ✅
View and configure project plugins ✅[^2] ✅ ✅
Pause annotators and reviewers ✅ ✅ ✅
Data Access
Import data ✅ ✅ ✅
Export data ✅ ✅ ✅
Data Labeling Workflows
Assign annotators to tasks ✅ ✅ ✅
Access labeling workflow ✅ ✅ ✅ ✅ ✅
Access review workflow ✅ ✅ ✅ ✅
Monitor annotator agreement ✅ ✅ ✅ ✅
Verify annotation results ✅ ✅ ✅ ✅
Assign reviewers to tasks ✅ ✅ ✅
Perform bulk labeling ✅[^3] ✅ ✅ ✅ ✅
Advanced
API access to equivalent Label Studio functionality ✅ ✅ ✅[^1] ✅ ✅
Analytics
View project dashboard and members dashboard Workspace and invited projects Organization Organization
View annotator dashboard ✅[^4] ✅[^4] ✅ ✅ ✅
Prompts
Use Prompts (create/evaluate/run/apply to projects) ✅ ✅ ✅
See predictions generated by Prompts in projects ✅ ✅ ✅ ✅ ✅

[^1]: For workspaces or projects they created or were invited to
[^2]: Owners can restrict this in the org settings
[^3]: The project must be using manual distribution and the annotator must be granted Data Manager access
[^4]: For their own work/history


Source Guide Admin Settings (`docs/source/guide/admin_settings.md`)


title: Organization settings short: Settings type: guide tier: enterprise order: 0 order_enterprise: 357 meta_title: Organization settings meta_description: Configure org-wide settings in Label Studio Enterprise. section: "Manage Your Organization"

There are several places where you can configure org-wide settings:

Field Access Description
Usage & License OwnerAdmin This page has a mix of settings that can be set by Administrators (enabling email notifications) and Owners (enabling AI, enabling storage proxy, enabling early adopter features).
Access Token OwnerAdmin Control which types of access tokens are available in the organization.
Model Providers OwnerAdmin Set up model providers that can be used with Prompts and Chat.
Permissions Owner Customize certain permissions for roles.
Support reports OwnerAdmin Generate anonymized operational reports that help HumanSignal support understand your deployment, diagnose issues, and recommend workflow and performance improvements.

Source Guide Admin Usage (`docs/source/guide/admin_usage.md`)


title: Usage & License short: Usage & License type: guide tier: enterprise order: 0 order_enterprise: 358 meta_title: Usage & License meta_description: Find information about your Label Studio account and configure organization settings. section: "Manage Your Organization" parent_enterprise: "admin_settings"

You can find information about your plan and seat usage on this page.

Label Studio Enterprise

Seats in use

Here you can see the number of seats compared with the number of active users.

Each organization has a set amount of Label Studio seats in their license. To increase your seats, contact your HumanSignal account representative.

!!! note On-premise
On-premise deployments can use fewer seats than their license allows by setting the LICENSE_MAX_USERS_OVERRIDE environment variable. It can only lower the licensed seat count, and the deployment does not start if you set it higher. Seats are counted across all organizations in the deployment. See Available Helm values.

License info

This section includes general information about your Label Studio license, such as when it was issued and when it expires.

It also includes the following usage information:

Projects

Cloud/SaaS: Every project that belongs to your current organization, regardless of state (draft/published) or workspace (meaning that it includes sandbox projects).

On-prem: All projects on your server, regardless of state workspace.

Results

The total number of labeled regions (results) that your organization has created across all projects. A result is one item in an annotation’s result array — a bounding box, text span, relation between regions, etc.

Security

Only the org Owner can update these settings.

Session Timeout Policy
Field Description
Max session age (minutes) How many minutes a user can be idle. If they exceed this limit, they are automatically logged out the next time they trigger a request. Any interaction that hits the backend (clicks that trigger API calls, saves, polling, etc.) resets this timer.
Max time between activity (minutes) Absolute session lifetime. Regardless of activity, a session cannot last longer than this many minutes from login; once reached, the user must re-authenticate.
Single Sign-On (SSO) enabled
This indicates with your organization can use SSO.

SSO is not available if you are in a trial organization or if it is not enabled for your license.

Embedding

You can use these fields to set up Label Studio Embeds.

!!! note
Embedding is not available to all customers. Contact your HumanSignal account manager to enable.

Features

Only the org Owner can update these settings and request access.

The features can be requested and enabled for your license.

Field Description
Invite external annotators to projects When enabled, your organization can send email invites to contractors/partners to give them project-scoped access (Annotator role). When not enabled, only existing org members can be added to projects; you’d provision any new users through your normal onboarding (e.g., SSO/SCIM) first.
Access to Activity Log Whether your organization has access to activity logs.
Prompts Whether your organization has access to Prompts.
Whitelabel Whether your organization has whitelabeling enabled.
Plugins Toggle whether your organization has access to plugins. And, if enabled, whether users in the Manager role can create and update them.
Early Adopter Opt-in to new features before they're released to the public.
Enable Storage Proxy Allow Label Studio to proxy data from cloud storage.
Enable AI Features Enable AI Assistant for your labeling interface configuration.
Enable Ask AI Enable the AI Assistant for general Label Studio help.

Email notification settings

Determines what email preferences are available from the Account and Settings page.

Note the following:

  • New users will have their email preferences enabled by default.
  • If you disable a notification here, that preference is hidden from their Account and Settings page and is blocked for all users in your organization.
  • If you re-enable a notification, the preference will appear again in their Account and Settings page and will revert back to whatever state the user had it in before it was disabled for the organization.

Frequently asked Enterprise billing questions

Find answers to common questions related to billing.

What happens if my plan is inactive?

If your subscription to Label Studio Enterprise expires or is cancelled, you can no longer perform labeling, review annotations, or add new users to your organization. You can log in and export your completed annotations.

What happens if I have too many active users?

You need to purchase additional seats for your Label Studio Teams subscription if you have more active users than your subscription allows. A user counts as an active user when they are assigned a role. Invited users that have not yet accepted an invitation appear as "Not activated" and do not count toward the seat limit.

Label Studio Starter Cloud

Label Studio Starter Cloud has the Usage & Billing page that shows information about your subscription and how many seats you have in use.

!!! note
Only the Organization owner can access the Usage & Billing page.

There are two components to the subscription:

  • Base subscription - This is your access to Label Studio Starter Cloud and includes 1 seat.
  • Additional seats - You can purchase up to 11 additional seats (for a total of 12) on an as-needed basis.

Manage seats

Add seats

As an Owner, go to Organization > Usage & Billing. Click Manage Seats and increase your seat count.

When you add seats, the cost is prorated and is reflected on your next invoice. An organization can have up to 12 seats.

Remove seats

Before you can remove seats, you must deactivate their associated users. You cannot have more active users than seats.

To deactivate a user, go to the Organization > Members page and set the user's role to Deactivated.

Then click Manage Seats and decrease your seat count.

When you remove seats, the cost is prorated and is reflected on your next invoice.

Frequently asked Starter Cloud billing questions

How do I cancel?

As an Owner, go to Organization > Usage & Billing and click Cancel.

After cancellation, your account remains active until the end of your paid billing period. During this time, you have full access to the Label Studio Starter Cloud features.

However, after cancellation, you cannot add user seats. If you need more users than your current seat count allows, you must reactivate your subscription.

When the billing period ends, you will retain access to Label Studio and can download your data. However, you will be unable to import new data, annotate existing data, or create new projects.

How do I renew?

If you do not cancel your subscription, it is automatically renewed at the end of the billing period.

Can I upgrade to Label Studio Enterprise?

Yes, you can upgrade to Label Studio Enterprise, please contact our sales: [email protected].


Source Guide Admin User (`docs/source/guide/admin_user.md`)


title: Add members in Label Studio Enterprise short: Add members tier: enterprise type: guide order: 0 order_enterprise: 369 meta_title: Add and invite members to Label Studio meta_description: Overview of how you can add members to Label Studio Enterprise section: "Manage Your Organization" parent: "manage_users" parent_enterprise: "manage_users" date: 2024-02-05 17:15:19

You can view, add, and manage organization members from the Organization page in Label Studio.

Navigate to the Organization page by clicking the menu in the upper left and selecting Organization.

Only users in the Owner or Administrator role can access this page.

Invite members

Once the initial organization account is created, you can begin inviting users.

From the Organization page, click Invite Members. From here you have two options:

You can share this link with users, who can then complete the registration process.

However, they will be unable to access Label Studio until an Owner or Administrator manually assigns them a role. See User roles and permissions.

Click Reset to reset the link. When reset, anyone who has the old link will be unable to register a new user account.

Invite via email

Enter a list of email addresses separated by commas and then select a user role for the new accounts.

Users will receive an email with a link to create their Label Studio account, and will be able to access Label Studio as soon as their registration is complete.

Require invites for new users (on-prem deployments)

While you can invite users to join your organization with the invite link, this does not prevent users from registering a new account through the signup page.

You can remove the option to create accounts through the /user/signup page by setting the following environment variable:

bash
LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=true

Users will only be able to sign up through an invitation link or email.

Activate new users

Users who sign up through the link will not be able to access Label Studio until they are assigned a user role.

To filter for users who are pending, select Pending from the roles filter at the top of the Organization > Members page:

Then use the drop-down menu to assign a role:


Source Guide Agreement Metrics (`docs/source/guide/agreement_metrics.md`)


title: Built-in agreement metrics reference short: Built-in metrics tier: enterprise type: guide order: 0 order_enterprise: 309 meta_title: Built-in agreement metrics in Label Studio Enterprise meta_description: Built-in agreement metrics in Label Studio Enterprise. section: "Review & Measure Quality" parent: "stats" parent_enterprise: "stats"

The following metrics are available for control tags out-of-the-box in Label Studio Enterprise. You can use them as is, or you can create your own custom metrics.

All control tags

Metric Description Tags Methodology
Exact Match Evaluates whether annotation results exactly match, with optional label weights All tags Pairwise, Consensus

Choices and taxonomy

Categorical metrics are used for categorical control tags, such as Choices and Taxonomy.

Metric Description Tags Methodology
Common Labels Matches Evaluates common label matches for a taxonomy of labels assigned to regions. Computes partial credit along taxonomy paths. Taxonomy Pairwise
Common Labels Matches (Threshold) Evaluates common label matches for a taxonomy of labels, returns binarized match based on threshold Taxonomy Pairwise, Consensus
Common Subtree Matches Evaluates common subtree matches for a taxonomy of choices. Computes IoU over the subtree of selected taxonomy nodes. Taxonomy Pairwise
Common Subtree Matches (Threshold) Evaluates common subtree matches for a taxonomy of choices, returns binarized match based on threshold Taxonomy Pairwise, Consensus
Jaccard Similarity Evaluates common label matches using set intersection divided by set union Choices (multi-select) Pairwise
Jaccard Similarity (Threshold) Evaluates common label matches, returns binary match based on threshold Choices (multi-select) Pairwise, Consensus

Numeric

Metric Description Tags Methodology
Numeric Difference Evaluates how similar two numeric values are based on their absolute difference NumberRating Pairwise
Numeric Difference (Threshold) Evaluates whether two numeric values match within a specified tolerance NumberRating Pairwise, Consensus

Rectangles

Metric Description Tags Methodology
Intersection over Union Evaluates overlap between bounding box regions, returns raw IoU score RectangleLabelsRectangle Pairwise
Intersection over Union (Threshold) Evaluates overlap between bounding box regions, returns binarized match based on threshold RectangleLabelsRectangle Pairwise, Consensus
Bounding Box Labels Similarity Evaluates bbox overlap with Jaccard similarity for label matching, returns raw Jaccard score Choices* Pairwise
Bounding Box Labels Similarity (Threshold) Evaluates bbox overlap with Jaccard similarity for label matching, returns binary match based on threshold Choices* Pairwise, Consensus
Bounding Box Text Similarity Evaluates bounding box overlap with text similarity for text matching, returns raw similarity score TextArea* Pairwise
Bounding Box Text Similarity (Threshold) Evaluates bounding box overlap with text similarity for text matching, returns binary match based on threshold TextArea* Pairwise, Consensus

* Nested Choices or TextArea tags inside RectangleLabels/Rectangle tags

Polygons

Metric Description Tags Methodology
Intersection over Union for Polygons Evaluates overlap between polygon regions, returns raw IoU score PolygonLabelsPolygon Pairwise
Intersection over Union for Polygons (Threshold) Evaluates overlap between polygon regions, returns binarized match based on threshold PolygonLabelsPolygon Pairwise, Consensus
Polygon Labels Similarity Evaluates polygon overlap with Jaccard similarity for label matching, returns raw Jaccard score Choices* Pairwise
Polygon Labels Similarity (Threshold) Evaluates polygon overlap with Jaccard similarity for label matching, returns binary match based on threshold Choices* Pairwise, Consensus
Polygon Text Similarity Evaluates polygon overlap with text similarity for text matching, returns raw similarity score TextArea* Pairwise
Polygon Text Similarity (Threshold) Evaluates polygon overlap with text similarity for text matching, returns binary match based on threshold TextArea* Pairwise, Consensus

* Nested Choices or TextArea tags inside PolygonLabels/Polygon tags

Brush

Metric Description Tags Methodology
Brush Intersection over Union Evaluates pixel overlap between brush mask regions, returns raw IoU score BrushLabelsBrush Pairwise
Brush Intersection over Union (Threshold) Evaluates pixel overlap between brush mask regions, returns binarized match based on threshold BrushLabelsBrush Pairwise, Consensus

Span and segment

Metric Description Tags Methodology
Span Overlap Evaluates overlap between one-dimensional labeled regions, returns raw IoU score LabelsParagraphLabelsTimeSeriesLabelsTimelineLabels Pairwise
Span Overlap (Threshold) Evaluates overlap between labeled regions, returns binarized match based on threshold LabelsParagraphLabelsTimeSeriesLabelsTimelineLabels Pairwise, Consensus
Span Labels Similarity Evaluates span overlap with Jaccard similarity for label matching, returns raw Jaccard score Choices* Pairwise
Span Labels Similarity (Threshold) Evaluates span overlap with Jaccard similarity, returns binary match based on threshold Choices* Pairwise, Consensus
Span Text Similarity Evaluates span overlap with text edit distance, returns raw similarity score TextArea* Pairwise
Span Text Similarity (Threshold) Evaluates span overlap with text similarity, returns binary match based on threshold TextArea* Pairwise, Consensus
Unordered Naive Comparison for Timeline Labels Compares timeline label annotations without regard to label order TimelineLabels Pairwise, Consensus

* Nested Choices or TextArea tags inside Labels tags

HTML spans

Metric Description Tags Methodology
Overlap over HTML Spans Evaluates whether two given hypertext spans have points in common HyperTextLabels Pairwise
Overlap over HTML Spans (Threshold) Evaluates HTML span overlap, returns binarized match based on threshold HyperTextLabels Pairwise, Consensus
HTML Span Labels Similarity Evaluates HTML span overlap with Jaccard similarity for label matching, returns raw Jaccard score Choices* Pairwise
HTML Span Labels Similarity (Threshold) Evaluates HTML span overlap with Jaccard similarity, returns binary match based on threshold Choices* Pairwise, Consensus
HTML Span Text Similarity Evaluates HTML span overlap with text edit distance, returns raw similarity score TextArea* Pairwise
HTML Span Text Similarity (Threshold) Evaluates HTML span overlap with text similarity, returns binary match based on threshold TextArea* Pairwise, Consensus

* Nested Choices or TextArea tags inside HyperTextLabels tags

Text

Metric Description Tags Methodology
Text Similarity Uses the edit distance algorithm to calculate how similar two text annotations are to one another TextArea Pairwise
Text Similarity (Threshold) Uses the edit distance algorithm to determine if two text annotations match based on a similarity threshold TextArea Pairwise, Consensus
Semantic Similarity Evaluates text similarity by comparing semantic meaning using embeddings User-defined Pairwise, Consensus

Video

Metric Description Tags Methodology
Exact Frames Matching for Video Evaluates video annotations by comparing exact frame matches VideoRectangle Pairwise
Exact Frames Matching for Video (Threshold) Evaluates video annotations by comparing exact frame matches, returns binarized match based on threshold VideoRectangle Pairwise, Consensus
Video Tracking Evaluates video tracking by comparing bounding boxes using IoU score across frames User-defined Pairwise, Consensus

Keypoints

Metric Description Tags Methodology
Keypoint Distance Evaluates keypoint annotations by checking if corresponding labeled keypoints are within a coordinate distance threshold KeypointLabelsKeypoint Pairwise

Examples

Exact Match

Exact Match is the simplest agreement metric. It checks whether two annotators gave the exact same answer, and returns either a perfect score (1.0) or zero (0.0). There is no partial credit.

This is the default metric for Choices, Taxonomy, Pairwise, and DateTime tags. It is also available as an alternative metric for many other tag types.

What affects the score

Scenario Score
Annotators give the exact same answer 1.0
Annotators give different answers 0.0
Neither annotator provides an answer 1.0
One annotator provides an answer, the other doesn't 0.0

Unlike Span Overlap or IoU, there is no partial credit with Exact Match. The annotators either agree completely or they don't.

Single-select classification

When a labeling configuration uses a single-select Choices tag (e.g., sentiment analysis), each annotator picks one option. Exact Match compares the two selections directly.

Example: A project classifies customer reviews as Positive, Negative, or Neutral.

Annotator A Annotator B Score
Positive Positive 1.0
Positive Negative 0.0
Neutral Neutral 1.0

Multi-select classification

When a Choices tag allows multiple selections, each annotator's response is a list. Exact Match compares the two lists and requires them to contain the same items in the same order.

Example: A project tags articles with topics: Sports, Politics, Technology, Health.

Annotator A Annotator B Score
[Sports, Politics] [Sports, Politics] 1.0
[Sports, Politics] [Politics, Sports] 0.0 (different order)
[Sports, Politics] [Sports] 0.0 (different selections)

!!! note
If you want partial credit for multi-select classifications (e.g., matching 2 out of 3 selected items), use Jaccard Similarity instead of Exact Match.

Taxonomy

For Taxonomy tags, the annotator's selection is a specific path through the taxonomy tree. Exact Match requires the full path to be identical.

Example: A project uses a taxonomy to classify animals.

Annotator A Annotator B Score
Animals > Dogs > Labrador Animals > Dogs > Labrador 1.0
Animals > Dogs > Labrador Animals > Dogs > Poodle 0.0
Animals > Dogs > Labrador Animals > Dogs 0.0

!!! note
If you want partial credit for taxonomy paths that share a common prefix, use Common Labels Matches or Common Subtree Matches instead.

DateTime

For DateTime tags, Exact Match compares the two date/time values. They must be identical to score 1.0.

Annotator A Annotator B Score
2025-03-19 2025-03-19 1.0
2025-03-19 2025-03-20 0.0

Span Overlap

Span Overlap measures how much two annotators agree on the position of labeled spans in text (or other one-dimensional data like audio segments or time series). It is the default metric for Labels, ParagraphLabels, TimeSeriesLabels, and TimelineLabels tags.

What affects the score

Scenario Effect on score
Annotators highlight the exact same characters with the same label 1.0 (perfect agreement)
Spans overlap partially with the same label Between 0.0 and 1.0, proportional to the overlap
Spans have different labels, even if positions are identical 0.0
One annotator creates a span that the other doesn't Pulls the average down (unmatched span scores 0.0)
Neither annotator creates any spans 1.0 (agreement that there is nothing to label)

What counts as a "span"

When annotators highlight a region of text and assign it a label, Label Studio records the character positions where the highlight starts and ends, along with the label. For example, in the sentence:

Dr. Maria Chen presented her findings at the Berlin conference.

If an annotator highlights Dr. Maria Chen and labels the span as "Person", the span is recorded as characters 0 through 14.

Step 1: Check that labels match

Before measuring any positional overlap, Span Overlap first checks whether two spans share the same label. If the labels are different, the score for that pair is 0.0 regardless of how much they overlap positionally.

For example, if Annotator A labels characters 0–14 as Person and Annotator B labels characters 0–14 as Organization, the score is 0.0 even though the character ranges are identical.

Step 2: Calculate IoU (Intersection over Union)

For two spans with matching labels, the metric calculates how much they overlap using IoU:

text
IoU = Intersection length / Union length
  • Intersection is the region where both spans overlap.
  • Union is the total region covered by either span.

Example: Consider two annotators labeling the same sentence:

Dr. Maria Chen presented her findings at the Berlin conference.

Span Characters Label
Annotator A "Dr. Maria Chen" 0–14 Person
Annotator B "Maria Chen" 4–14 Person

The labels match (both Person), so we calculate IoU:

  • Intersection: characters 4–14 (the overlap) = 10 characters
  • Union: characters 0–14 (the combined extent) = 14 characters
  • IoU = 10 / 14 = 0.71

Step 3: Match spans across annotations using greedy matching

When annotators create multiple spans, the metric needs to figure out which spans from Annotator A correspond to which spans from Annotator B. It does this using greedy matching:

  1. For every span in Annotator A's work, find the span in Annotator B's work with the highest IoU score.
  2. For every span in Annotator B's work, find the span in Annotator A's work with the highest IoU score.
  3. Average all of these best-match scores together.

This two-way matching means that unmatched spans (spans one annotator created but the other didn't) naturally pull the overall score down, because their best-match score will be 0.0.

Full example: Two annotators label named entities in this sentence:

Dr. Maria Chen presented her findings at the Berlin conference.

Span Characters Label
Annotator A "Dr. Maria Chen" 0–14 Person
Annotator A "Berlin" 41–47 Location
Annotator B "Maria Chen" 4–14 Person
Annotator B "Berlin conference" 41–58 Location

First, compute the IoU for each possible pair:

B: "Maria Chen" (Person) B: "Berlin conference" (Location)
A: "Dr. Maria Chen" (Person) Labels match → IoU = 10/14 = 0.71 Labels differ → 0.0
A: "Berlin" (Location) Labels differ → 0.0 Labels match → IoU = 6/17 = 0.35

Then, find the best match for each span:

Span Best match Score
A: "Dr. Maria Chen" B: "Maria Chen" 0.71
A: "Berlin" B: "Berlin conference" 0.35
B: "Maria Chen" A: "Dr. Maria Chen" 0.71
B: "Berlin conference" A: "Berlin" 0.35

Final score = average of all best-match scores = (0.71 + 0.35 + 0.71 + 0.35) / 4 = 0.53

How the threshold variant works

The base Span Overlap metric returns a continuous score (0.53 in the example above). The Span Overlap (Threshold) variant converts this into a simple yes-or-no match by comparing the score against a threshold.

For example, with a threshold of 0.5:

  • Score 0.53 >= 0.5 → 1.0 (match)

With a threshold of 0.75:

  • Score 0.53 < 0.75 → 0.0 (no match)

The threshold variant is required when using the consensus methodology, which needs binary match/no-match decisions.

Intersection over Union (for bounding boxes)

Intersection over Union (IoU) measures how much two annotators agree on the position and size of bounding boxes drawn on an image. It is the default metric for RectangleLabels and Rectangle tags.

What affects the score

Scenario Effect on score
Annotators draw boxes in the exact same position and size with the same label 1.0 (perfect agreement)
Boxes overlap partially with the same label Between 0.0 and 1.0, proportional to the overlapping area
Boxes have different labels, even if positions are identical 0.0
One annotator draws a box that the other doesn't Pulls the average down (unmatched box scores 0.0)
Neither annotator draws any boxes 1.0 (agreement that there is nothing to label)

What counts as a bounding box

When an annotator draws a rectangle on an image and assigns it a label, Label Studio records the box's position (x, y coordinates of the top-left corner) and its width and height. For example, if an annotator draws a box around a dog in a photo and labels it Dog, Label Studio stores the box's coordinates along with that label.

Step 1: Check that labels match

Just like Span Overlap, IoU first checks whether two bounding boxes share the same label. If the labels are different, the score for that pair is 0.0 regardless of how much the boxes overlap.

For example, if Annotator A draws a box and labels it Dog and Annotator B draws a box in the exact same position but labels it Cat, the score is 0.0.

Step 2: Calculate IoU

For two boxes with matching labels, the metric calculates how much area they share:

text
IoU = Intersection area / Union area
  • Intersection is the area where both boxes overlap (the region covered by both).
  • Union is the total area covered by either box (both boxes combined, not double-counting the overlap).

Another way to express this:

text
IoU = Intersection area / (Area of box A + Area of box B − Intersection area)

Example: Two annotators are labeling dogs in a photo.

Annotator A draws a box around the dog:

  • Position: x=10, y=20
  • Size: 100 wide × 80 tall
  • Label: Dog

Annotator B draws a slightly different box around the same dog:

  • Position: x=30, y=20
  • Size: 100 wide × 80 tall
  • Label: Dog

The labels match (both Dog), so we calculate IoU:

  • Box A covers x=10 to 110, y=20 to 100
  • Box B covers x=30 to 130, y=20 to 100
  • Intersection: x=30 to 110, y=20 to 100 = 80 wide × 80 tall = 6,400 sq. units
  • Area of Box A = 100 × 80 = 8,000 sq. units
  • Area of Box B = 100 × 80 = 8,000 sq. units
  • Union = 8,000 + 8,000 − 6,400 = 9,600 sq. units
  • IoU = 6,400 / 9,600 = 0.67

Step 3: Match boxes across annotations using greedy matching

When annotators draw multiple bounding boxes, the metric uses the same greedy matching algorithm described in Span Overlap:

  1. For every box in Annotator A's work, find the box in Annotator B's work with the highest IoU score.
  2. For every box in Annotator B's work, find the box in Annotator A's work with the highest IoU score.
  3. Average all of these best-match scores together.

Full example: Two annotators label objects in a photo containing a dog and a cat.

Box Label
Annotator A Box around the dog Dog
Annotator A Box around the cat Cat
Annotator B Box around the dog (shifted slightly) Dog
Annotator B Box around the cat (slightly larger) Cat

Suppose the IoU for matching pairs is:

B: Dog box B: Cat box
A: Dog box Labels match → IoU = 0.67 Labels differ → 0.0
A: Cat box Labels differ → 0.0 Labels match → IoU = 0.85

Best match for each box:

Box Best match Score
A: Dog box B: Dog box 0.67
A: Cat box B: Cat box 0.85
B: Dog box A: Dog box 0.67
B: Cat box A: Cat box 0.85

Final score = (0.67 + 0.85 + 0.67 + 0.85) / 4 = 0.76

How the threshold variant works

The base IoU metric returns a continuous score (0.76 in the example above). The Intersection over Union (Threshold) variant converts this into a binary match/no-match result.

For example, with a threshold of 0.5:

  • Score 0.76 >= 0.5 → 1.0 (match)

With a threshold of 0.8:

  • Score 0.76 < 0.8 → 0.0 (no match)

IoU for other region types

The IoU concept applies to more than just rectangular bounding boxes. Label Studio adapts the same core idea for different annotation types:

  • Intersection over Union for Polygons works the same way, but calculates the overlapping area between polygon shapes instead of rectangles. This is useful when annotators draw freeform outlines around irregular objects.
  • Brush Intersection over Union compares pixel-level brush masks by counting how many pixels overlap versus the total pixels painted by either annotator. This is useful for segmentation tasks where annotators paint regions rather than drawing shapes.

In all cases, the overall process is the same: check that labels match, calculate the overlap ratio for the specific shape type, then use greedy matching to pair up regions and average the scores.

Jaccard Similarity

Jaccard Similarity measures how much two annotators' selections overlap when they can each choose multiple items from a list. Unlike Exact Match, it gives partial credit when annotators agree on some selections but not all of them.

This metric is dynamically available for Choices tags with multi-select enabled.

What affects the score

Scenario Score
Annotators select the exact same items 1.0
Annotators share some but not all selections Between 0.0 and 1.0, based on the overlap
Annotators select completely different items 0.0
Neither annotator selects anything 1.0 (agreement that nothing applies)
One annotator selects items, the other selects nothing 0.0

The formula

Jaccard Similarity treats each annotator's selections as a set and computes:

text
Jaccard Similarity = number of shared selections / total number of distinct selections

Or more formally:

text
J(A, B) = |A ∩ B| / |A ∪ B|
  • Intersection (A ∩ B) is the set of items both annotators selected.
  • Union (A ∪ B) is the set of all items selected by either annotator.

A simple example

A project asks annotators to tag articles with all relevant topics from a list: Sports, Politics, Technology, Health, Science.

Annotator A selects: Sports, Politics, Technology
Annotator B selects: Politics, Technology, Health

  • Shared selections (intersection): Politics, Technology = 2 items
  • All distinct selections (union): Sports, Politics, Technology, Health = 4 items
  • Jaccard Similarity = 2 / 4 = 0.50

How it compares to Exact Match

Using the same example above:

Metric Annotator A Annotator B Score
Exact Match [Sports, Politics, Technology] [Politics, Technology, Health] 0.0 (not identical)
Jaccard Similarity [Sports, Politics, Technology] [Politics, Technology, Health] 0.50 (2 out of 4 distinct items match)

This is why Jaccard Similarity is useful for multi-select tasks — it recognizes that agreeing on 2 out of 4 topics is meaningfully different from agreeing on 0.

More examples

Annotator A Annotator B Intersection Union Score
[Sports] [Sports] 1 1 1.0
[Sports, Politics] [Sports, Politics] 2 2 1.0
[Sports] [Politics] 0 2 0.0
[Sports, Politics, Technology] [Sports] 1 3 0.33
[Sports, Politics] [Sports, Politics, Technology, Health] 2 4 0.50

Note that order does not matter. [Sports, Politics] and [Politics, Sports] produce the same score because both are treated as sets.

How the threshold variant works

The base Jaccard Similarity metric returns a continuous score (like 0.50). The Jaccard Similarity (Threshold) variant converts this into a binary match/no-match result.

For example, with a threshold of 0.5:

  • Score 0.50 >= 0.5 → 1.0 (match)

With a threshold of 0.75:

  • Score 0.50 < 0.75 → 0.0 (no match)

The threshold variant is required when using the consensus methodology.

Text Similarity

Text Similarity measures how closely two free-text annotations match at the surface level — that is, how similar the actual characters or words are. It is the default metric for TextArea tags.

The core idea

Text Similarity uses edit distance algorithms to calculate how many changes (insertions, deletions, substitutions) would be needed to transform one text into the other. Fewer changes means higher similarity.

By default, it uses the Levenshtein algorithm, which counts the minimum number of single-character edits needed. The raw edit distance is then normalized to a score between 0.0 and 1.0, where 1.0 means the texts are identical.

Examples

Annotator A Annotator B Score Why
"The cat sat on the mat" "The cat sat on the mat" 1.0 Identical text
"The cat sat on the mat" "The cat sat on the mat." ~0.96 One extra character (period)
"The cat sat on the mat" "The cat sit on the mat" ~0.96 One character substitution (a→i)
"The cat sat on the mat" "A dog lay on the rug" ~0.43 Many differences
"hello" "world" ~0.20 Almost entirely different

Configurable parameters

Text Similarity lets you adjust two settings:

Algorithm — the method used to compare strings:

Algorithm How it works Good for
Levenshtein (default) Counts insertions, deletions, and substitutions General-purpose text comparison
Damerau-Levenshtein Like Levenshtein, but also counts transpositions (swapped adjacent characters) as a single edit Text where typos often involve swapped letters
Jaro-Winkler Weighs matching characters by position, with a bonus for shared prefixes Short strings like names or codes
Jaro Similar to Jaro-Winkler but without the prefix bonus Short strings
Hamming Counts positions where characters differ (strings must be the same length) Fixed-length codes or identifiers
Ratcliff-Obershelp Finds the longest common subsequences Texts with rearranged sections

Granularity — the level at which the text is split before comparison:

Granularity What it compares Example
Character (default) Individual characters "cat" → [c, a, t]
Bigram (2-gram) Pairs of characters "cat" → [ca, at]
Trigram (3-gram) Triples of characters "cats" → [cat, ats]
Word Whole words "the cat sat" → [the, cat, sat]

Character-level comparison is the most fine-grained and catches small typos. Word-level comparison is more forgiving of minor spelling differences but stricter about missing or extra words.

Multiple text fields

When a TextArea tag allows multiple lines of text, each annotator's response is a list of strings. Text Similarity compares each line in order and averages the scores.

Example: Annotators are asked to transcribe three lines of text from an image.

Line 1 Line 2 Line 3
Annotator A "John Smith" "123 Main St" "New York"
Annotator B "John Smith" "123 Main Street" "New York"
  • Line 1: "John Smith" vs "John Smith" → 1.0
  • Line 2: "123 Main St" vs "123 Main Street" → ~0.81
  • Line 3: "New York" vs "New York" → 1.0
  • Final score = (1.0 + 0.81 + 1.0) / 3 = 0.94

If one annotator writes more lines than the other, the extra lines are compared against nothing and score 0.0, pulling the average down.

How the threshold variant works

The base Text Similarity metric returns a continuous score. The Text Similarity (Threshold) variant converts this into a binary match/no-match result. The default threshold for text similarity is 0.85 (compared to 0.5 for most other metrics), reflecting the expectation that free-text annotations should be fairly close to count as agreement.

Semantic Similarity

Semantic Similarity measures whether two text annotations convey the same meaning, regardless of how they are worded. Instead of comparing characters or words directly, it compares the underlying meaning using AI embeddings.

The core idea

Semantic Similarity works in three steps:

  1. Convert each text to an embedding — A numerical representation (a vector) that captures the meaning of the text.
  2. Compute cosine similarity between the two vectors — This measures how close the two meanings are on a scale from 0.0 to 1.0.
  3. Compare against a threshold — If the similarity meets the threshold (default: 0.85), the texts are considered a match.

When meaning matters more than wording

The key difference from Text Similarity is that Semantic Similarity understands that different words can express the same idea.

Annotator A Annotator B Text Similarity Semantic Similarity
"The cat is on the mat" "The cat is on the mat" 1.0 (identical) ~1.0 (identical meaning)
"The cat is on the mat" "A feline is sitting on the rug" ~0.35 (very different words) ~0.90 (very similar meaning)
"The patient has a fever" "The patient's temperature is elevated" ~0.42 (different words) ~0.88 (same clinical meaning)
"The cat is on the mat" "The stock market crashed today" ~0.25 (different words) ~0.10 (completely different meaning)

Text Similarity would score the second and third rows low because the actual words are quite different. Semantic Similarity recognizes that the underlying meaning is essentially the same.

Configurable parameters

Semantic Similarity has one parameter:

  • Threshold (default: 0.85) — the minimum cosine similarity for two texts to be considered a match. Lower values are more lenient; higher values require closer meaning.

Choosing between Text Similarity and Semantic Similarity

Consider Text Similarity Semantic Similarity
How it compares Character-by-character or word-by-word Meaning and intent
Best for Tasks where exact wording matters Tasks where meaning matters more than wording
Handles synonyms No — "couch" vs "sofa" scores low Yes — "couch" vs "sofa" scores high
Handles paraphrasing No — rephrased text scores low Yes — same meaning scores high
Catches typos Yes — small edits produce high scores Yes — typos rarely change meaning

Use Text Similarity when:

  • Annotators are transcribing text (OCR, audio transcription)
  • Annotators are entering structured data (names, addresses, codes)
  • Exact wording is important to the task
  • You want to detect and measure minor typos or formatting differences

Use Semantic Similarity when:

  • Annotators are writing descriptions, summaries, or captions
  • Multiple valid phrasings exist for the same answer
  • You care about whether annotators understood the content the same way, not whether they used the same words
  • Annotators may be working in slightly different styles or vocabularies

Numeric Difference

Numeric Difference measures how close two numeric values are. Unlike Exact Match, which only cares whether two numbers are identical, Numeric Difference gives partial credit when values are close but not equal. It is the default metric for Number and Rating tags.

The formula

Numeric Difference converts the absolute difference between two values into a similarity score using this formula:

text
score = 1 / (1 + difference)

This produces a score between 0.0 and 1.0. Identical values score 1.0, and the score decreases smoothly as the difference increases.

Examples with a 1–5 rating scale

A project asks annotators to rate the quality of customer support responses on a scale from 1 to 5.

Annotator A Annotator B Difference Score Interpretation
4 4 0 1.0 Perfect agreement
4 5 1 0.50 Close, one step apart
4 3 1 0.50 Close, one step apart
5 3 2 0.33 Moderate disagreement
5 1 4 0.20 Strong disagreement

Examples with continuous numeric values

A project asks annotators to estimate the age of a person in a photo.

Annotator A Annotator B Difference Score
30 30 0 1.0
30 32 2 0.33
30 35 5 0.17
30 50 20 0.05

Notice that the score drops quickly for larger differences. A difference of 1 already halves the score, and a difference of 5 brings it down to 0.17. This makes the base metric most useful for detecting whether annotators are in close agreement.

How the threshold variant works

The threshold variant, Numeric Difference (Threshold), works differently from other threshold variants. Instead of binarizing the similarity score, it uses a maximum difference parameter (default: 1.0). If the absolute difference between two values is within this tolerance, the score is 1.0; otherwise it's 0.0.

Example: With a max difference of 1.0 on a 1–5 rating scale:

Annotator A Annotator B Difference Within tolerance? Score
4 4 0 Yes (0 <= 1.0) 1.0
4 5 1 Yes (1 <= 1.0) 1.0
4 2 2 No (2 > 1.0) 0.0

This is often more intuitive for rating scales: "Annotators agree if they're within 1 point of each other."

Taxonomy metrics

Label Studio offers two alternative metrics for Taxonomy tags that provide partial credit, unlike Exact Match which requires the full taxonomy selection to be identical. Both are useful when you want to recognize that two annotators who selected nearby items in a taxonomy are in closer agreement than two who selected completely unrelated items.

Understanding taxonomy paths

A taxonomy is a tree structure. When an annotator makes a selection, it is recorded as a path from the root to the selected node. For example, in this taxonomy:

text
Animals
├── Dogs
│   ├── Labrador
│   └── Poodle
├── Cats
│   ├── Siamese
│   └── Persian
└── Birds
    ├── Eagle
    └── Sparrow

Selecting "Labrador" produces the path: Animals > Dogs > Labrador
Selecting "Siamese" produces the path: Animals > Cats > Siamese

Annotators can also select multiple paths (e.g., both "Labrador" and "Eagle").

Common Labels Matches

Common Labels Matches compares taxonomy selections by treating each complete path as an item, then computing Jaccard Similarity over the set of paths. A path either matches exactly or it doesn't — there is no partial credit within a single path.

Example: An annotator can select multiple species from the taxonomy above.

Annotator A Annotator B Shared paths All distinct paths Score
[Labrador] [Labrador] 1 1 1.0
[Labrador, Eagle] [Labrador, Eagle] 2 2 1.0
[Labrador, Eagle] [Labrador, Sparrow] 1 (Labrador) 3 (Labrador, Eagle, Sparrow) 0.33
[Labrador] [Poodle] 0 2 0.0

Note that in the last row, Labrador and Poodle are both dogs, but Common Labels Matches treats them as completely different paths. If you want credit for shared ancestry, use Common Subtree Matches instead.

Common Subtree Matches

Common Subtree Matches gives partial credit for shared ancestry in the taxonomy tree. Before comparing, it expands each selected path into all of its ancestor prefixes. Then it computes Jaccard Similarity over these expanded sets.

How expansion works: The path "Animals > Dogs > Labrador" expands into:

  • Animals
  • Animals > Dogs
  • Animals > Dogs > Labrador

This means that even if two annotators selected different leaf nodes, they'll still get credit for agreeing on the parent categories.

Example: Comparing "Labrador" vs. "Poodle":

Expanded nodes
Annotator A: Labrador {Animals}, {Animals > Dogs}, {Animals > Dogs > Labrador}
Annotator B: Poodle {Animals}, {Animals > Dogs}, {Animals > Dogs > Poodle}
  • Shared nodes (intersection): {Animals}, {Animals > Dogs} = 2 nodes
  • All distinct nodes (union): {Animals}, {Animals > Dogs}, {Animals > Dogs > Labrador}, {Animals > Dogs > Poodle} = 4 nodes
  • Score = 2 / 4 = 0.50

Compare this to "Labrador" vs. "Siamese":

Expanded nodes
Annotator A: Labrador {Animals}, {Animals > Dogs}, {Animals > Dogs > Labrador}
Annotator B: Siamese {Animals}, {Animals > Cats}, {Animals > Cats > Siamese}
  • Shared nodes: {Animals} = 1 node
  • All distinct nodes: {Animals}, {Animals > Dogs}, {Animals > Dogs > Labrador}, {Animals > Cats}, {Animals > Cats > Siamese} = 5 nodes
  • Score = 1 / 5 = 0.20

And "Labrador" vs. "Eagle":

Expanded nodes
Annotator A: Labrador {Animals}, {Animals > Dogs}, {Animals > Dogs > Labrador}
Annotator B: Eagle {Animals}, {Animals > Birds}, {Animals > Birds > Eagle}
  • Shared nodes: {Animals} = 1 node
  • All distinct nodes: 5 nodes
  • Score = 1 / 5 = 0.20

The scores reflect how closely related the selections are in the taxonomy tree. Two dog breeds (0.50) score higher than a dog and a cat (0.20), which makes intuitive sense.

Comparing all three taxonomy metrics

Using the taxonomy above, here's how the three available metrics score the same pairs:

Annotator A Annotator B Exact Match Common Labels Matches Common Subtree Matches
Labrador Labrador 1.0 1.0 1.0
Labrador Poodle 0.0 0.0 0.50
Labrador Siamese 0.0 0.0 0.20
Labrador Eagle 0.0 0.0 0.20
[Labrador, Eagle] [Labrador, Sparrow] 0.0 0.33 0.67
  • Exact Match is strictest — any difference at all scores 0.0.
  • Common Labels Matches gives credit when some of the selected paths match exactly, but not for shared ancestry.
  • Common Subtree Matches is most lenient — it recognizes that selecting two items in the same branch of the taxonomy represents partial agreement.

Source Guide Api (`docs/source/guide/api.md`)


title: API Reference for Label Studio
short: API
type: guide
tier: all
order: 401
order_enterprise: 401
meta_title: API Endpoints
meta_description: API documentation for authenticating, listing data science projects, importing predictions and raw data and exporting annotated data, and user management.
section: "Integrate & Extend"


You can use the Label Studio API to import data for labeling, export annotations, set up machine learning with Label Studio, and sync tasks with cloud storage.

See the API reference documentation for further guidance and interactive examples. If you want to write Python scripts using the API, use the Label Studio Python SDK.

!!! info Tip
For additional guidance on using our API, see 5 Tips and Tricks for Label Studio’s API and SDK.

Authenticate to the API

You must retrieve your access token so that you can authenticate to the API.

Whether you can create a token, and which types of tokens you can create, depends on your org settings.

!!! note "API keys vs. Access tokens"
In Label Studio, "access tokens" and "API keys" mean the same thing and are used interchangeably.

There are two types of access tokens/API keys: Personal Access Tokens (PATs) and Legacy Tokens.

You can read more about the differences between them here: Access Tokens.

Find your access token

  1. Open Label Studio and click your user icon in the upper right. Select Account & Settings.
  2. Select Personal Access Token or Legacy Token on the left.

Depending on which one you select, you will need to either generate a new token or copy the one that is displayed.

Authenticate HTTP API requests with a personal access token

PATs use 'Authorization: Bearer <token>' when used with HTTP API requests, for example:

bash
curl -X <method> <Label Studio URL>/api/<endpoint> -H 'Authorization: Bearer <token>'

Authenticate HTTP API requests with a legacy token

Legacy tokens use 'Authorization: Token <token>' when used with HTTP API requests, for example:

bash
curl -X <method> <Label Studio URL>/api/<endpoint> -H 'Authorization: Token <token>

Authenticate Python SDK requests

When used with the SDK, you do not need to distinguish between legacy tokens or personal access tokens.

python
# Define the URL where Label Studio is accessible
LABEL_STUDIO_URL = 'YOUR_BASE_URL'

# API key can be either your PAT or legacy access token
LABEL_STUDIO_API_KEY = 'YOUR_API_KEY'

# Import the SDK and the client module
from label_studio_sdk import LabelStudio
client = LabelStudio(base_url=LABEL_STUDIO_URL, api_key=LABEL_STUDIO_API_KEY)

See API documentation for authentication.

List all projects

To perform most tasks with the Label Studio API, you must specify the project ID, sometimes referred to as the pk, or primary key. If you don't know what your project ID is, you might want to get a list of all projects in Label Studio that you can access. See the List your projects API endpoint documentation.

Create and set up a project

Create a project and set up the labeling interface in Label Studio using the API. See the Create new project API endpoint documentation.

If you want to make sure the configuration for your labeling interface is valid before submitting it using the API, you can use the validate label config API endpoint.

Import tasks using the API

To import tasks using the API, make sure you know the project ID that you want to add tasks to. See additional examples and parameter descriptions in the import data endpoint documentation

Retrieve tasks

Retrieve a paginated list of tasks for a specific project. If you want, you can also retrieve tasks and annotations using this API endpoint, as an alternative to exporting annotations. See details and parameters in the list project tasks endpoint documentation.

Export annotations

To export annotations, first see which formats are available to export for your project.

Choose your selected format from the response and then call the export endpoint. See the export annotations endpoint documentation for more details.


Source Guide Ask Ai (`docs/source/guide/ask_ai.md`)


title: AI Assistant short: AI Assistant tier: enterprise type: guide order: 0 order_enterprise: 356 meta_title: About AI Assistant meta_description: Information about using the AI features in Label Studio section: "Manage Your Organization" date: 2025-01-28 16:40:16

The Label Studio AI Assistant is an OpenAI LLM that has been trained on the Label Studio documentation, codebase, and several other Label Studio resources.

Use AI Assistant for project setup

Instead of manually building labeling interfaces or project instructions from scratch, you can prompt the AI with a description of what your labeling project needs and what you want annotators to be able to select.

You can interact with this as you would a chat, meaning that you can build off your previous instructions and request changes.

Use AI Assistant for general help

You can also use AI Assistant to ask for troubleshooting and general help with Label Studio.

AI Assistant FAQ

How do I enable or disable AI Assistant?

Your organization can enable AI Assistant from the Organization > Usage & License page.

!!! note
Only users in the Owner role can modify these settings. For Starter Cloud users, open a support ticket to request disablement.

  • Enable AI Features--Enable AI Assistant for your labeling interface configuration.
  • Enable Ask AI--Enable the AI Assistant for general Label Studio help.

What models do you use?

We use OpenAI Tier 5 models, primarily gpt-4o and o3-mini.

Do all your AI features use the same backend?

Yes.

What data is used to generate answers?

Only the data you provide in the chat window is used to generate responses, this includes:

  • All chat messages
  • Task samples you have uploaded
  • The current labeling config

How is my data used to train models?

The model is trained on public resources like our documentation, codebase, blog, and website. We also train it on additional examples we've written specifically for the model.

We are on a Tier 5 OpenAI account, and opt out of all requests for training data.

We track requests to our AI to use as quality control, but they are only used to test the outputs of the model. For example: If Company X asks "Make a project to label opossums," we may notice that our AI did not provide a satisfactory answer and we may create configurations with opossums in them and train the model on them. The model would not be trained on any of Company X's questions or data.

All tracked data is covered by our industry-leading security and privacy policies.

Is it HIPAA compliant?

Your Business Associate Agreement (BAA) does not cover these features. If you are required to comply with HIPAA, we recommend that you disable Ask AI.


Source Guide Auth Ldap (`docs/source/guide/auth_ldap.md`)


title: Set up LDAP authentication for Label Studio short: LDAP tier: enterprise type: guide order: 0 order_enterprise: 385 meta_title: LDAP authentication for Label Studio Enterprise meta_description: Label Studio Enterprise documentation for setting up LDAP authentication for your data labeling, machine learning, and data science projects. section: "Manage Your Organization" parent: "admin_auth" parent_enterprise: "admin_auth" date: 2024-05-24 09:08:58

Set up LDAP authentication to manage access to Label Studio.

!!! error Enterprise
LDAP authentication is only available in Label Studio Enterprise Edition and is only available for on-prem installations. If you're using Label Studio Community Edition, see Label Studio Features to learn more.

To more easily manage access to Label Studio Enterprise, you can map LDAP groups to both roles or workspaces.

Set up LDAP authentication

After you set up LDAP authentication, you can no longer use native authentication to log in to the Label Studio UI. Set up LDAP authentication and assign LDAP users to your Label Studio Enterprise organization using environment variables in Docker.

You can also map specific LDAP groups to specific organization roles and workspaces in Label Studio Enterprise, making it easier to set up and manage role-based access control (RBAC) and project access in Label Studio Enterprise.

You can refer to this example environment variable file for your own LDAP setup:

bash
AUTH_LDAP_ENABLED=1

# Use ldaps to secure the LDAP connection
AUTH_LDAP_SERVER_URI=ldaps://ldap.example.com
# LDAP admin credentials    
AUTH_LDAP_BIND_DN=uid=user,ou=sysadmins,o=123abc,dc=zexample,dc=com
AUTH_LDAP_BIND_PASSWORD=password123

# Allow users to use usernames (not only emails) to log into Label Studio
USE_USERNAME_FOR_LOGIN=1

# Simple user search in LDAP groups
AUTH_LDAP_USER_DN_TEMPLATE=uid=%(user)s,ou=Users,o=123abc,dc=example,dc=com

# Specify organization to assign it to all users on the platform
# Warning: the user with this email must be registered before any LDAP users log in 
[email protected]

# Populate the user from the LDAP directory:
# firstName, lastName, mail, sAMAccountName are taken from your LDAP record 
AUTH_LDAP_USER_ATTR_MAP_FIRST_NAME=firstName
AUTH_LDAP_USER_ATTR_MAP_LAST_NAME=lastName
# Specify the field to use for AUTH_LDAP_USER_QUERY_FIELD as 'email'
AUTH_LDAP_USER_ATTR_MAP_EMAIL=mail
# Specify the field to use for AUTH_LDAP_USER_QUERY_FIELD as 'username' 
AUTH_LDAP_USER_ATTR_MAP_USERNAME=sAMAccountName

# Query the authenticating user in Label Studio, it can be [email|username]
AUTH_LDAP_USER_QUERY_FIELD=email

# Group parameters
AUTH_LDAP_GROUP_SEARCH_BASE_DN=ou=Users,o=group-id,dc=example,dc=com
AUTH_LDAP_GROUP_SEARCH_FILTER_STR=(objectClass=groupOfNames)
AUTH_LDAP_GROUP_TYPE=ou

If you want to use a recursive scan to search in several LDAP groups to grant access to Label Studio, instead of relying on the simple search used by AUTH_LDAP_USER_ON_TEMPLATE, update your environment variables file like the following:

bash
# Leave this parameter empty
AUTH_LDAP_USER_DN_TEMPLATE=""
# Specify the groups that you want to be able to log in, separated by ';' 
AUTH_LDAP_USER_SEARCH_BASES="ou=guests,dc=domain,dc=com;ou=owners,dc=domain,dc=com"

User Role Mappings

Map LDAP groups to specific Label Studio Enterprise roles using ; to specify several groups.

bash
AUTH_LDAP_ORGANIZATION_ROLE_ADMINISTRATOR=cn=admins,ou=users,o=123abc,dc=example,dc=com 
AUTH_LDAP_ORGANIZATION_ROLE_MANAGER=cn=managers,ou=users,o=123abc,dc=example,dc=com 
AUTH_LDAP_ORGANIZATION_ROLE_REVIEWER=cn=reviewers,ou=users,o=123abc,dc=example,dc=com
AUTH_LDAP_ORGANIZATION_ROLE_ANNOTATOR=cn=annotators,ou=users,o=123abc,dc=example,dc=com;cn=guests,ou=users,o=123abc,dc=example,dc=com
AUTH_LDAP_ORGANIZATION_ROLE_NOT_ACTIVATED=cn=not,ou=users,o=123abc,dc=example,dc=com 
AUTH_LDAP_ORGANIZATION_ROLE_DEACTIVATED=cn=deactivated,ou=users,o=123abc,dc=example,dc=com

Workspace Mappings

Map LDAP groups to specific Label Studio workspaces. Use a JSON format where keys are workspace titles and values are LDAP groups. Split groups with ; to specify several groups.

bash
AUTH_LDAP_ORGANIZATION_WORKSPACES='{"Workspace 1":"cn=team1,ou=users,o=60cbc901ec2e8e387a3b2d3e,dc=jumpcloud,dc=com","Workspace 2":"cn=team2,ou=users,o=60cbc901ec2e8e387a3b2d3e,dc=jumpcloud,dc=com"}'

Manage user access only with LDAP

If you want to manage Label Studio roles and workspaces entirely with LDAP, add the following to your environment variable file:

text
MANUAL_PROJECT_MEMBER_MANAGEMENT=0
MANUAL_WORKSPACE_MANAGEMENT=0
MANUAL_ROLE_MANAGEMENT=0

Setting these options disables the Label Studio API and UI options to assign roles and workspaces for specific users within Label Studio and relies entirely on the settings in the environment variable file.

Enabling TLS on LDAP/Active Directory

To enable a secure Transport Layer Security (TLS) connection on LDAP/Active Directory, add the following env variables:

bash
AUTH_LDAP_CONNECTION_OPTIONS="OPT_X_TLS_CACERTFILE=/path/to/cert.crt;OPT_X_TLS_NEWCTX=0"

Where OPT_X_TLS_CACERTFILE points to a file with certificates. If you’re using self-signed certificates, you’ll need to add OPT_X_TLS_NEWCTX=0 as the last entry of the AUTH_LDAP_CONNECTION_OPTIONS env variable.


Source Guide Auth Setup (`docs/source/guide/auth_setup.md`)


title: Set up SSO authentication for Label Studio short: SSO and SAML tier: enterprise type: guide order: 0 order_enterprise: 387 meta_title: SSO authentication for Label Studio Enterprise meta_description: Label Studio Enterprise documentation for setting up SSO authentication for your data labeling, machine learning, and data science projects. section: "Manage Your Organization" parent: "admin_auth" parent_enterprise: "admin_auth"

Set up single sign-on using SAML to manage access to Label Studio using your existing Identity Provider (IdP).

!!! error Enterprise
SSO authentication is only available in Label Studio Enterprise Edition. If you're using Label Studio Community Edition, see Label Studio Features to learn more.

To more easily manage access to Label Studio Enterprise, you can map SAML groups to both roles or workspaces.

Set up SAML SSO

The organization Owner or Administrator for Label Studio Enterprise can set up SSO & SAML for the instance. Label Studio Enterprise supports the following IdPs:

After setting up the SSO, you can use native authentication to access the Label Studio UI, however it's not a recommended option especially for the user with the Owner role.

  • You can use SSO along with normal login. This is not a recommended option.

  • You can prevent a user from creating his own organization by using DISABLE_SIGNUP_WITHOUT_LINK option.

Connect your Identity Provider to Label Studio Enterprise

Set up Label Studio Enterprise as a Service Provider (SP) with your Identity Provider (IdP) to use SAML authentication.

The details will vary depending on your IdP, but in general you will complete the following steps:

From Label Studio:

  1. Go to the Organization page.

    If you do not see the option to select Organization, you are not logged in with the appropriate role.

  2. Select SSO & SAML in the upper right.

  3. In the Organization field, ensure the domain matches the domain used for your organization in your IdP.

  4. Copy the following URLs:

    • Assertion Consumer Service (ACS) URL with Audience (EntityID), and Recipient (Reply) details---The IdP uses this URL to redirect users to after a successful authentication.
    • Login URL---This is the URL that users will use to log in to Label Studio.
    • Logout URL---This is the URL used to redirect users after successfully logging out of Label Studio.

From your IdP:

  1. Paste the URLs copied from Label Studio in the appropriate location.
  2. Generate a metadata XML file, or a URL that specifies the metadata for the IdP.
  3. Set up or confirm setup of the following SAML attributes. Label Studio Enterprise expects specific attribute mappings for user identities.

The default attribute names are:

Data Default Attribute
Email address Email
First or given name FirstName
Last or family name LastName
Group name Groups

!!! note Note
Different Identity Providers use different attribute names. Label Studio provides presets in the SSO & SAML settings page to quickly configure the correct attribute mappings for popular IdPs. You can also manually configure custom attribute names if your IdP uses different values.

Attribute presets by IdP:

IdP Email FirstName LastName Groups
Default Email FirstName LastName Groups
Auth0 email given_name family_name groups
Entra ID (short) emailAddress givenName surname groups
Google Email FirstName LastName Groups
PingOne emailAddress givenName surname Groups
Okta email firstName lastName groups

Microsoft Entra ID with full URI format:

If your Entra ID is configured with default claim URIs, use:

Attribute URI
Email http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
FirstName http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname
LastName http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname
Groups http://schemas.microsoft.com/ws/2008/06/identity/claims/groups

From Label Studio:

  1. Return to the SSO & SAML page.

  2. Upload the metadata XML file or specify the metadata URL.

  3. Set up group mappings. These can also be added or edited later.

    Ensure the group name you enter is the same as the group name sent as an attribute in a SAML authentication response by your IdP.

    • Organization Roles to Groups Mapping---Map groups to roles at the organization level. The role set at the organization level is the default role of the user and is automatically assigned to workspaces and projects. For more information on roles, see Roles in Label Studio Enterprise.

      You can map multiple groups to the same role. Note that users who are Not Activated or Deactivated do not count towards the seat limit for your account.

    • Workspaces to Groups Mapping---Add groups as members to workspaces. Users with Manager, Reviewer, or Annotator roles can only see workspaces after they've been added as a member to that workspace.

      Select an existing workspace or create a new one. You can map multiple groups to the same workspace.

    • Projects to Groups Mapping---Map groups to roles at the project level. Project-level roles can be Annotator, Reviewer, or Inherit.

      You can map a group to different roles across multiple projects. You can also map multiple groups to the same roles and the same projects. For more information on roles, see Roles in Label Studio Enterprise.

      If you select Inherit, the group will inherit the role set above under Organization Roles to Groups Mapping. If the group is inheriting the Not Activated role, the users are mapped to the project, but they are not actually assigned to the project until the group is synced (meaning that the user authenticates with SSO).

  4. Click Save.

  5. Test the configuration by logging in to Label Studio Enterprise with your SSO account.

Setup SAML SSO with Okta video tutorial

Manage user access only with SSO

If you want to manage Label Studio roles and workspaces entirely with single sign-on (SSO), add the following to your environment variable file:

text
MANUAL_PROJECT_MEMBER_MANAGEMENT=0
MANUAL_WORKSPACE_MANAGEMENT=0
MANUAL_ROLE_MANAGEMENT=0

Setting these options disables the Label Studio API and UI options to assign roles and workspaces for specific users within Label Studio and relies entirely on the settings in the environment variable file.

!!! info Tip
If you are using the SaaS version of Label Studio (Label Studio Enterprise Cloud) and would like to enable these restrictions for your organization, open a ticket to submit your request.

text
If requested, we can also disable the common login option for your organization. When disabled, users can only use the SSO login fields and the common login  option is disabled completely.

Login page URL

You can also set the LOGIN_PAGE_URL environment variable to redirect the login page to the specified URL.


Source Guide Backup Enterprise (`docs/source/guide/backup_enterprise.md`)


title: Create backups for on-prem Label Studio Enterprise short: Back up Label Studio tier: enterprise type: guide order: 0 order_enterprise: 78 meta_title: Back up Label Studio Enterprise on-prem meta_description: How to back up your on-prem Label Studio Enterprise environment section: "Install" parent_enterprise: "install_enterprise" date: 2024-01-22 15:54:30

Backing up your Label Studio Enterprise on-prem installation involves more than just a database backup, although that is a critical component. Here's an overview of the steps you should take to back up your Label Studio Enterprise on-premises installation:

  1. Back up your databases (development and production). This is essential as it contains all your project data and configurations. If you're using PostgreSQL, you can use tools like pg_dump to create backups of your databases.

  2. Back up your file storage. If you're using local file storage or have files stored in a cloud storage that's synced with Label Studio, ensure you back up these files. This includes any media files (images, audio, video) that you've uploaded for labeling.

  3. Back up your configuration files that have environment variables. This includes your label-studio configuration file (which might contain your database connection settings and other configurations) and any custom scripts or machine learning models that you've integrated with Label Studio.

  4. Back up your environment variables. If you're using environment variables to configure Label Studio (which might include database credentials, secret keys, etc.), make sure to back these up as well.

  5. Back up your Docker volumes. If you're running Label Studio in Docker containers and you have data volumes, back up these volumes. Docker volumes may contain your database data, media uploads, and other persistent data.

  6. Document your current setup. Make sure to document the versions of Label Studio and any other dependencies you're using, as well as any specific configurations or customizations you've made. This will be helpful if you need to restore from a backup.

  7. Regularly test your backups. Ensure that your backup process is working by regularly testing that you can restore your Label Studio instance from the backups.

Remember to store your backups in a secure location, ideally in a different physical location than your production environment to protect against site-wide issues such as natural disasters or power outages. It's also a good practice to encrypt sensitive data in your backups to prevent unauthorized access.


Source Guide Command Palette (`docs/source/guide/command_palette.md`)


title: Command palette short: Command Palette tier: enterprise type: guide order: 0 order_enterprise: 356 meta_title: Enhanced search with the command palette meta_description: How to use the Label Studio command palette section: "Manage Your Organization" date: 2025-01-28 16:40:16

The command palette is an enhanced search and navigation tool.

To open it, click the search icon in the upper right or press Ctrl+K (Cmd+K on Mac)

What you can do

From here you can:

  • Search across your Label Studio org. For example, you can search for projects and workspaces.
  • Navigate to pages within the app.
  • Find quick links to Label Studio documentation and resources, such as the API docs and the changelog.
  • When you are in a project, you can search for settings pages or individual settings to quickly jump to them.

Role-aware results

Results respect your role and access. For example, Annotators and Reviewers won’t see workspaces or projects that they can’t access.

AI assistant

If AI assistant is enabled, you can enter a query and then press Tab. The assistant opens automatically with your query.

Keyboard shortcuts

  • Ctrl+K or Cmd+K to open the command palette
  • Use the Up and Down arrow keys to navigate through the results
  • Enter to select an option
  • Esc to close
  • Tab to open the AI assistant

Source Guide Comments Notifications (`docs/source/guide/comments_notifications.md`)


title: Comments and notifications short: Comments and notifications type: guide tier: enterprise section: "Review & Measure Quality" order: 0 order_enterprise: 306 meta_title: Comment in Label Studio Enterprise meta_description: The comments and notifications features define how annotators, reviewers and administrators communicate and receive updates on projects and tasks.

Comments are a Label Studio Enterprise feature that allows communication between reviewers and annotators:

Annotators Reviewers
Annotator to reviewer communication
  • Ask for clarification on a task

  • Provide reasoning or context for their annotation | Reviewer to annotator communication

  • Answer questions

  • Give feedback to help the annotator improve |

This annotator-reviewer feedback loop is an important tool in your review workflow, allowing you to:

  • Speed up the labeling process
  • Increase the annotation quality
  • Build more solid labeling and review processes

Permissions

All users have the following commenting permissions for any annotations that they would otherwise have access to view:

  • View the Comments panel and read previous comments.
  • Add new comments.

Additional permissions are as follows:

Action Annotator Reviewer and higher roles
Add comment true true
View comment true true
Resolve/unresolve own comment true true
Resolve/unresolve other comments false true
Delete own comment true true
Delete other comments false false
Link/unlink own comment true true
Link/unlink other comments false false

Add a comment

You can add comments from the Comments panel when viewing an annotation. All users have access to the Comments panel.

You can link your comment to a specific area within an annotation.

This can be a region (for example, a bounding box or a span of text) or it can be a field (for example, a classification).

Note the following:

  • You can link comments to fields within the labeling configuration. However, if the field is a classification, choice, or taxonomy, you can only attach a comment if there is already a selection.
  • You can only link comments to an entire text area. You cannot link comments to regions within text areas.
  • Linking is not supported for Ranker or Pairwise fields.

Comment actions

The actions you can perform depend on your user role permissions and whether it's your comment. You can access comment actions from the overflow menu:

Filter for comments

The Data Manager has several columns to display comment information:

Column Description View permissions
Comment texts The text in the comment. All user roles
Comments Total number of comments for a particular task. All user roles
Unresolved comments Total number of comments that are not yet resolved. All user roles
Commented at The date and time at which the comment was made. All user roles except Annotator
Commented authors User who wrote comments. All user roles except Annotator

!!! note
Users in the Reviewer or Annotator role must be granted access to view the Data Manager. You can grant access in the project settings.

Require comments

You can configure the project so that annotators and reviewers are required to leave comments after taking specific actions:

Comment notifications

To see notifications, click your user profile icon in the upper right.

Use the overflow menu to mark notifications as read or unread.

!!! note
Notifications that have already been read are denoted with a gray background.

Annotators

Annotators can write comments on their own annotations.

Sent notifications

When an annotator writes a comment, the users who are notified depend on whether it is the first comment on the annotation:

  • If this is the first comment on an annotation, then all users within a project that have the role of Reviewer or higher see the comment in their notification list.
  • If this comment is in response to an ongoing discussion within the comments panel, then only users who are have added comments to the annotation will see a notification.

Received notifications

An annotator receives a notification any time another user leaves a comment on one of their annotations.

Reviewers and other users

Reviewers can write comments on annotations that they are reviewing. This applies to users with the Reviewer, Manager, Admin, and Owner role.

Sent notifications

When a reviewer writes a comment, then the users who are notified depend on their role and whether they have also left comments:

  • Annotators get a notification for all comments on the annotations they created.
  • If other users have also left comments on the annotation (for example, if multiple users are reviewing the annotation), then they will also be notified when a new comment appears.

Received notifications

A reviewer receives a notification when:

  • If the comment is the first comment on an annotation, then all users within a project that have the role of Reviewer or higher see the comment in their notification list.
  • If you have already left a comment on an annotation, you receive a notification when any user, regardless of role, adds a new comment.

Source Guide Custom Metric (`docs/source/guide/custom_metric.md`)


title: Add a custom agreement metric to Label Studio short: Custom metrics tier: enterprise type: guide order: 0 order_enterprise: 310 meta_title: Add a Custom Agreement Metric for Labeling meta_description: Label Studio Enterprise documentation about how to add a custom agreement metric to use for assessing annotator agreement or the quality of your annotation and prediction results for data labeling and machine learning projects. section: "Review & Measure Quality" parent: "stats" parent_enterprise: "stats"

Write a custom agreement metric to assess the quality of the predictions and annotations in your Label Studio Enterprise project.

Label Studio Enterprise contains a variety of agreement metrics for your project, but if you want to evaluate annotations using a custom metric or a standard metric not available in Label Studio, you can write your own.

!!! note
This functionality is available out-of-the-box for Label Studio Enterprise Cloud users.

text
For Label Studio Enterprise on-prem environments, you must configure your cloud provider to allow Label Studio to deploy and invoke serverless functions. Label Studio supports [AWS Lambda](#AWS-Lambda) and [Google Cloud Functions](#Google-Cloud-Functions). For more information, see [On-prem deployments](#On-prem-deployments).

Label Studio Enterprise includes various annotation and labeling statistics and the ability to add your own. The open source Community Edition of Label Studio does not contain these calculations. If you're using Label Studio Community Edition, see Label Studio Features to learn more.

Add your custom agreement metric to Label Studio

Custom agreement metrics are added at the project level under Settings > Quality > Agreement > Custom Agreement Metric Code.

!!! note
You must configure the labeling interface before you can add your custom agreement metric.

On-prem deployment using AWS Lambda

Field Description
Lambda Tags Add tags to the AWS Lambda function using the syntax tag_name tag_value.
Lambda Prefix Select a prefix for the AWS Lambda function.

On-prem deployment using Google Cloud Functions

Unlike with AWS Lambda, you cannot set a prefix or tags for the Google Cloud Functions function. See How Label Studio manages your functions below.

How to write your custom agreement metric

For more information about agreement metrics, see Task agreement.

You can use the agreement metric to compare two annotations, or one annotation with one prediction. Use the input parameters annotation_1 and annotation_2 to specify the annotations to compare, or annotation and prediction to compare.

Add your code to the following function defined in Label Studio:

python
def agreement(annotation_1, annotation_2, per_label=False) -> float:

This function takes the following arguments:

argument format description
annotation_1 JSON object The first annotation or prediction to compare when calculating agreement. Retrieved in Label Studio JSON format.
annotation_2 JSON object The second annotation or prediction to compare when calculating agreement. Retrieved in Label Studio JSON format.
per_label boolean Whether to perform an agreement calculation for each label in the annotation, or across the entire annotation result.
return float The agreement score to assign, as a float point number between 0 and 1.

For example, given the following labeling config:

xml
<View>
  <Image name="image" value="$image"/>
  <Choices name="choice" toName="image" showInLine="true">
    <Choice value="Positive" />
    <Choice value="Negative" />
	<Choice value="Neutral" />
  </Choices>
</View>

The following agreement metric compares two annotations for a classification task with choice options of "Positive" and "Negative":

python
def agreement(annotation_1, annotation_2, per_label=False) -> float:

    # Retrieve two annotations in the Label Studio JSON format
    r1 = annotation_1["result"][0]["value"]["choices"][0]
    r2 = annotation_2["result"][0]["value"]["choices"][0]
    
    # Determine annotation agreement based on specific choice values
    if r1 == r2:
        # If annotations match and include the choice "Positive", return an agreement score of 0.99
        if r1 == "Positive":
            return 0.99
        # If annotations match and include the choice "Negative", return an agreement score of 0.7
        if r1 == "Negative":
            return 0.7
    # If annotations do not match, return an agreement score of 0
    else:
        return 0

If you set per_label=True, you can define a separate method or agreement score for each label. If you do this, you must return a separate score for each label. For example, for a classification task, you could use the following function to assign a weight and return a specific agreement score for each label used in an annotation:

python
def agreement(annotation_1, annotation_2, per_label=False) -> float:

    label_1 = annotation_1["result"][0]["value"]["choices"][0]
    label_2 = annotation_2["result"][0]["value"]["choices"][0]
    weight = {"Positive": 0.99, "Negative": 0.01}
    
    if label_1 == label_2:
        if per_label:
            return {label_1: weight[label_1]}
        else:
            return weight[label_1]
    else:
        if per_label:
            return {label_1: 0, label_2: 0}
        else:
            return 0

Show logs

You can view logs for your custom agreement metric for troubleshooting purposes.

For logs to generate, you must first have at least one task annotated by at least two annotators.

AWS Lambda (on-prem deployments)

If you have Label Studio Enterprise deployed in a private cloud (self-managed) Amazon Web Services (AWS) Elastic Compute Cluster (EC2) instance or Amazon Elastic Kubernetes Service (EKS), you must grant additional permissions so that Label Studio Enterprise can run custom agreement metrics in AWS Lambda.

To set up the permissions, do the following:

  1. Create an AWS IAM role to be used by the custom metric Lambda functions to store logs in Cloudwatch
  2. Set up permissions that grant access to AWS Lambda. How you do this depends on your deployment scenario:

You must know the AWS account ID for the AWS account that you use to manage Label Studio Enterprise to perform these steps.

Step 1: Create an AWS IAM role for logging

Using your preferred method, create an AWS IAM role.

  1. Create an AWS IAM role named LSE_CustomMetricsExecuteRole. Follow the steps to create a role to delegate permissions to an AWS service in the AWS Identity and Access Management documentation for Creating a role for an AWS service (console).
  2. Whether you create the role using the console or the AWS CLI, create or attach the following IAM policy to allow the role to store logs in Cloudwatch. Replace YOUR_AWS_ACCOUNT with your AWS account ID that has access to Label Studio Enterprise.
json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:*:YOUR_AWS_ACCOUNT:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:YOUR_AWS_ACCOUNT:log-group:/aws/lambda/custom-metric-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:PutRetentionPolicy"
            ],
           "Resource": [
               "arn:aws:logs:*:YOUR_AWS_ACCOUNT:log-group:/aws/lambda/custom-metric-*"
           ]
        }
    ]
}

Create an IAM policy to grant AWS Lambda permissions

To grant permissions to a specific user, role, or EKS node group used to manage Label Studio Enterprise access to interact with AWS Lambda, use the following IAM policy. Create an IAM policy called LSE_AllowInteractLambda and replace YOUR_AWS_ACCOUNT with your AWS account ID:

json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": "iam:PassRole",
         "Resource": "arn:aws:iam::YOUR_AWS_ACCOUNT:role/LSE_CustomMetricsExecuteRole"
      },
      {
         "Sid": "VisualEditor1",
         "Effect": "Allow",
         "Action": [
            "lambda:CreateFunction",
            "lambda:UpdateFunctionCode",
            "lambda:InvokeFunction",
            "lambda:GetFunction",
            "lambda:DeleteFunction",
            "lambda:TagResource",
            "lambda:ListTags"
         ],
         "Resource": [
            "arn:aws:lambda:*:YOUR_AWS_ACCOUNT:function:custom-metric-*"
         ]
      },
      {
         "Sid": "VisualEditor2",
         "Effect": "Allow",
         "Action": "lambda:ListFunctions",
         "Resource": "*"
      },
      {
         "Action": [
            "logs:CreateLogGroup",
            "logs:PutRetentionPolicy",
            "logs:TagResource",
            "logs:StartQuery",
            "logs:GetQueryResults"
         ],
         "Effect": "Allow",
         "Resource": [
            "arn:aws:logs:*:YOUR_AWS_ACCOUNT:log-group:/aws/lambda/custom-metric-*"
         ]
      }
   ]
}

Step 2: Configure permissions between Label Studio Enterprise and AWS Lambda

After creating an IAM role to manage logs for the custom agreement metric, set up permissions to allow Label Studio Enterprise to interact with AWS Lambda.

How you set up permissions depends on how you deployed Label Studio Enterprise in your self-managed cloud infrastructure:

Docker Compose running in EC2

If you deployed Label Studio Enterprise using Docker Compose in an AWS EC2 instance, do the following to finish setting up permissions for the custom agreement metric functionality:

  1. Follow the AWS documentation steps for Creating an IAM user in your AWS account to create an IAM user with programmatic access. This type of user is granted an access key to access AWS services.
  2. While creating the IAM user, for the Set permissions option, choose to Attach existing policies directly.
  3. Select Create policy and attach the LSE_AllowInteractLambda policy.
  4. When you finish creating the user, save the username and access key somewhere secure.
  5. In the docker-compose.yaml file that you use to deploy Label Studio Enterprise, add the following environment variables in the app and rqworkers sections:

!!! attention "important"
Update:
- YOUR_AWS_ACCESS_KEY_ID, YOUR_AWS_SECRET_ACCESS_KEY and YOUR_AWS_ACCOUNT with the credentials for the account created in step 1.
- YOUR_AWS_REGION with the AWS region that your EC2 instance exists in the following:

text
AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
LS_LAMBDA_REGION_CUSTOM_METRICS=YOUR_AWS_REGION
LS_LAMBDA_ROLE_CUSTOM_METRICS=arn:aws:iam::YOUR_AWS_ACCOUNT:role/LSE_CustomMetricsExecuteRole

After you set up these permissions in your environment, you're ready to write your custom agreement metric and add it to Label Studio Enterprise:

  1. Write your custom agreement metric.
  2. Add your custom agreement metric to Label Studio Enterprise.

Deployed in EKS with an OIDC provider

If you deployed Label Studio Enterprise in Amazon Elastic Kubernetes Service (EKS) with OpenID Connect (OIDC) for identity and access management (IAM), do the following to finish setting up permissions for the custom agreement metric functionality:

  1. Create an AWS IAM role named LSE_ServiceAccountApp following the steps to create a role to delegate permissions to an AWS service in the AWS Identity and Access Management documentation for Creating a role for an AWS service (console).
  2. When relevant, attach the LSE_AllowInteractLambda policy to the LSE_ServiceAccountApp role.
  3. Update your helm values.yaml file to include the following map. Replace YOUR_AWS_ACCOUNT with your AWS account ID:
yaml
app:
  serviceAccount:
    annotations: 
      eks.amazonaws.com/role-arn: arn:aws:iam::YOUR_AWS_ACCOUNT:role/LSE_ServiceAccountApp
  1. Restart your Helm release.

After you set up these permissions in your environment, you're ready to write your custom agreement metric and add it to Label Studio Enterprise:

  1. Write your custom agreement metric.
  2. Add your custom agreement metric to Label Studio Enterprise.

Deployed in EKS without an OIDC provider

If you deployed Label Studio Enterprise in Amazon Elastic Kubernetes Service (EKS) and are not using OpenID Connect (OIDC) for identity and access management (IAM), do the following to finish setting up permissions for the custom agreement metric functionality:

  1. In the AWS console UI, go to EKS > Clusters > YOUR_CLUSTER_NAME > Node Group.
  2. Select the name of YOUR_NODE_GROUP with Label Studio Enterprise deployed.
  3. On the Details page, locate and select the option for Node IAM Role ARN.
  4. Create the AWS IAM policy LSE_AllowInteractLambda.
  5. Restart your Helm release.

After you set up these permissions in your environment, you're ready to write your custom agreement metric and add it to Label Studio Enterprise:

  1. Write your custom agreement metric.
  2. Add your custom agreement metric to Label Studio Enterprise.

Google Cloud Functions (on-prem deployments)

If you deploy Label Studio Enterprise on Google Cloud Platform (GCP), you can run custom agreement metrics on Google Cloud Functions (2nd gen) instead of AWS Lambda.

Before you start, make sure you have your GCP project ID and know how Label Studio Enterprise is deployed (Compute Engine VM, GKE with Workload Identity, or GKE without Workload Identity).

Step 1: Enable the required GCP APIs

Label Studio Enterprise requires the following APIs to be enabled in your GCP project:

You can enable them using the gcloud CLI:

bash
gcloud services enable \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  storage.googleapis.com \
  logging.googleapis.com \
  artifactregistry.googleapis.com \
  run.googleapis.com \
  --project=YOUR_GCP_PROJECT

Step 2: Create a runtime service account for Cloud Functions

Create a dedicated service account for your Cloud Functions to run as. It only needs the Logs Writer role.

  1. Create the service account:
bash
gcloud iam service-accounts create lse-custom-metrics-runtime \
  --display-name="LSE Custom Metrics Runtime" \
  --project=YOUR_GCP_PROJECT
  1. Grant the Logs Writer role:
bash
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT \
  --member="serviceAccount:lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com" \
  --role="roles/logging.logWriter"

You'll need this service account email (lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com) later for the GCP_SERVICE_ACCOUNT_CUSTOM_METRICS environment variable.

Step 3: Grant permissions to the Label Studio Enterprise identity

The identity Label Studio Enterprise runs as needs to manage Cloud Functions and upload function source. This identity varies by deployment — your Compute Engine VM service account, a dedicated GCP service account bound via Workload Identity, or your GKE node pool service account. The deployment-specific sections below tell you which one to bind this role to.

Create a custom IAM role named LSE_CustomMetricsDeployer with the following permissions:

yaml
title: LSE Custom Metrics Deployer
description: Allows Label Studio Enterprise to deploy and invoke custom metric Cloud Functions
stage: GA
includedPermissions:
  # Cloud Functions lifecycle
  - cloudfunctions.functions.create
  - cloudfunctions.functions.update
  - cloudfunctions.functions.delete
  - cloudfunctions.functions.get
  - cloudfunctions.functions.list
  # Source upload via generateUploadUrl
  - cloudfunctions.functions.generateUploadUrl
  # Source code download from GCS staging bucket
  - storage.objects.get
  - storage.objects.create
  # Cloud Functions invocation (2nd gen uses Cloud Run)
  - run.routes.invoke
  # View function execution logs
  - logging.logEntries.list
  - logging.logs.list
  # Act as the runtime service account
  - iam.serviceAccounts.actAs

You can create this role using the gcloud CLI:

bash
gcloud iam roles create LSE_CustomMetricsDeployer \
  --project=YOUR_GCP_PROJECT \
  --title="LSE Custom Metrics Deployer" \
  --description="Allows Label Studio Enterprise to deploy and invoke custom metric Cloud Functions" \
  --permissions=cloudfunctions.functions.create,cloudfunctions.functions.update,cloudfunctions.functions.delete,cloudfunctions.functions.get,cloudfunctions.functions.list,cloudfunctions.functions.generateUploadUrl,storage.objects.get,storage.objects.create,run.routes.invoke,logging.logEntries.list,logging.logs.list,iam.serviceAccounts.actAs

Then bind it to the Label Studio Enterprise identity. Replace LSE_IDENTITY with the appropriate member (see the deployment-specific sections below):

bash
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT \
  --member="LSE_IDENTITY" \
  --role="projects/YOUR_GCP_PROJECT/roles/LSE_CustomMetricsDeployer"

!!! note
Instead of a single custom role, you can also assign the following predefined roles: roles/cloudfunctions.developer, roles/run.invoker, roles/storage.objectAdmin, roles/logging.viewer, and roles/iam.serviceAccountUser. The custom role above follows the principle of least privilege.

Deployed with Docker Compose on a Compute Engine VM

If you deployed Label Studio Enterprise using Docker Compose on a Compute Engine VM:

  1. Make sure the VM runs as a service account that has the LSE_CustomMetricsDeployer custom role (or the equivalent predefined roles) bound at the project level. If you need to create one, run:
bash
gcloud iam service-accounts create lse-app \
  --display-name="LSE Application" \
  --project=YOUR_GCP_PROJECT

gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT \
  --member="serviceAccount:lse-app@YOUR_GCP_PROJECT.iam.gserviceaccount.com" \
  --role="projects/YOUR_GCP_PROJECT/roles/LSE_CustomMetricsDeployer"
  1. Assign that service account to your Compute Engine instance.

  2. In the docker-compose.yaml file you use to deploy Label Studio Enterprise, add the following environment variables to the app and rqworkers sections:

!!! attention "important"
Replace YOUR_GCP_PROJECT with your GCP project ID and YOUR_GCP_REGION with your preferred region (for example, us-central1).

text
CUSTOM_METRIC_PROVIDER=gcp
GCP_PROJECT_CUSTOM_METRICS=YOUR_GCP_PROJECT
GCP_REGION_CUSTOM_METRICS=YOUR_GCP_REGION
GCP_SERVICE_ACCOUNT_CUSTOM_METRICS=lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com

!!! note
On Compute Engine with a properly scoped service account, Label Studio uses Application Default Credentials (ADC) automatically — no key file required.

Deployed in GKE with Workload Identity

If you're using GKE with Workload Identity:

  1. Create a GCP service account for Label Studio Enterprise (if you haven't already):
bash
gcloud iam service-accounts create lse-app \
  --display-name="LSE Application" \
  --project=YOUR_GCP_PROJECT
  1. Bind the LSE_CustomMetricsDeployer custom role to the service account:
bash
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT \
  --member="serviceAccount:lse-app@YOUR_GCP_PROJECT.iam.gserviceaccount.com" \
  --role="projects/YOUR_GCP_PROJECT/roles/LSE_CustomMetricsDeployer"
  1. Allow the Kubernetes service account to impersonate the GCP service account:
bash
gcloud iam service-accounts add-iam-policy-binding \
  lse-app@YOUR_GCP_PROJECT.iam.gserviceaccount.com \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:YOUR_GCP_PROJECT.svc.id.goog[YOUR_NAMESPACE/YOUR_K8S_SERVICE_ACCOUNT]"
  1. Update your Helm values.yaml to annotate the Kubernetes service account and set the required environment variables:
yaml
app:
  serviceAccount:
    annotations:
      iam.gke.io/gcp-service-account: lse-app@YOUR_GCP_PROJECT.iam.gserviceaccount.com
  extraEnvironmentVars:
    CUSTOM_METRIC_PROVIDER: gcp
    GCP_PROJECT_CUSTOM_METRICS: YOUR_GCP_PROJECT
    GCP_REGION_CUSTOM_METRICS: YOUR_GCP_REGION
    GCP_SERVICE_ACCOUNT_CUSTOM_METRICS: lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com

rqworker:
  extraEnvironmentVars:
    CUSTOM_METRIC_PROVIDER: gcp
    GCP_PROJECT_CUSTOM_METRICS: YOUR_GCP_PROJECT
    GCP_REGION_CUSTOM_METRICS: YOUR_GCP_REGION
    GCP_SERVICE_ACCOUNT_CUSTOM_METRICS: lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com
  1. Restart your Helm release.

Deployed in GKE without Workload Identity

If you're using GKE without Workload Identity, your pods authenticate as the GKE node's service account, so that's the identity you'll grant permissions to.

  1. Identify the service account used by your node pool. In the GCP console, go to Kubernetes Engine > Clusters > YOUR_CLUSTER > Node Pools > YOUR_NODE_POOL > Security and note the service account.

  2. Bind the LSE_CustomMetricsDeployer custom role to the node pool's service account:

bash
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT \
  --member="serviceAccount:YOUR_NODE_SERVICE_ACCOUNT@YOUR_GCP_PROJECT.iam.gserviceaccount.com" \
  --role="projects/YOUR_GCP_PROJECT/roles/LSE_CustomMetricsDeployer"
  1. Update your Helm values.yaml to set the required environment variables:
yaml
app:
  extraEnvironmentVars:
    CUSTOM_METRIC_PROVIDER: gcp
    GCP_PROJECT_CUSTOM_METRICS: YOUR_GCP_PROJECT
    GCP_REGION_CUSTOM_METRICS: YOUR_GCP_REGION
    GCP_SERVICE_ACCOUNT_CUSTOM_METRICS: lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com

rqworker:
  extraEnvironmentVars:
    CUSTOM_METRIC_PROVIDER: gcp
    GCP_PROJECT_CUSTOM_METRICS: YOUR_GCP_PROJECT
    GCP_REGION_CUSTOM_METRICS: YOUR_GCP_REGION
    GCP_SERVICE_ACCOUNT_CUSTOM_METRICS: lse-custom-metrics-runtime@YOUR_GCP_PROJECT.iam.gserviceaccount.com
  1. Restart your Helm release.

Environment variable reference for GCP

Variable Description Default
CUSTOM_METRIC_PROVIDER Set to gcp to use Google Cloud Functions instead of AWS Lambda. aws
GCP_PROJECT_CUSTOM_METRICS The GCP project ID where Cloud Functions are deployed. (none, required)
GCP_REGION_CUSTOM_METRICS The GCP region for Cloud Functions (e.g. us-central1, europe-west1). us-central1
GCP_SERVICE_ACCOUNT_CUSTOM_METRICS The email of the runtime service account that deployed Cloud Functions execute as. (none, optional)

Cloud Function runtime configuration

Label Studio Enterprise deploys each custom metric Cloud Function with a fixed runtime configuration. These values are not user-configurable from the UI or environment variables and apply to every deployed function:

Setting Value
Runtime Python 3.13 (python313)
Entry point agreement_handler
Memory 256 MB
Request timeout 60 seconds
Max instance count 1
Ingress Internal only (ALLOW_INTERNAL_ONLY)

What this means for your metric code:

  • Use Python 3.13–compatible code and imports.
  • Keep the agreement function lightweight and stateless. Loading large models or running expensive computation can exceed the 256 MB / 60 s limits and fail scoring.
  • Scoring requests are queued one-at-a-time per function. This is fine for background workers but means metrics aren't suited to interactive use.

Network connectivity

Custom metric functions are deployed with internal-only ingress, which affects how you reach them:

  • Same GCP project as Label Studio Enterprise: Works out of the box. Internal traffic from your Compute Engine or GKE workloads is allowed by default.
  • Different VPC or project: You'll need to set up internal connectivity first — Shared VPC, VPC peering, or a Serverless VPC Access connector — or scoring will fail.
  • Testing the function directly: You can't invoke it from outside Google's network. curl from your laptop or the Cloud Console Test button will return 403 Forbidden. To verify deployment, trigger scoring inside Label Studio Enterprise (for example, recalculate agreement on a project that uses the metric).

How Label Studio manages your functions

Label Studio creates one Cloud Function per project that uses a custom metric, reuses it across scoring runs, and resolves the function URL for you — there's no URL or function name to configure manually.

To find a function in the Google Cloud console:

  1. Open Cloud Functions in your configured GCP project and region.
  2. Look for functions named custom-metric--<timestamp>.
  3. Open a function to view logs, deployment state, and the trigger URL.

Function lifecycle behavior

Behavior Description
Deploy Creates a new function if no matching existing function is found.
Update Updates the existing function when possible.
Provider/metric change If you switch away from this metric/provider, Label Studio attempts to delete the previously managed GCP function.
Runtime status in app The app reports states such as NotDeployed, Pending, Active, Failed, NotFound, Error.
Discoverability and metadata Label Studio applies internal labels (metadata) to functions for project/org/host tracking. These labels are primarily for internal management and cloud-side filtering. The function HTTPS URL is resolved and cached automatically by Label Studio.

!!! attention "important"
Prefix and tags/labels are not currently exposed as user-facing fields in the UI for GCP.

text
Advanced users can only set such values through API-level metric parameters (if your organization exposes that workflow), not via standard settings screens.

Source Guide Dashboard Annotator (`docs/source/guide/dashboard_annotator.md`)


title: Member performance dashboard short: Member performance tier: enterprise type: guide order: 0 order_enterprise: 175 meta_title: Member performance dashboard meta_description: Use the performance dashboard to track user work and progress. section: "Analytics" date: 2024-04-04 11:50:41

The performance dashboard provides metrics about a user's annotation and review activities over a period of time, including how many tasks a user has completed and how quickly.

This can be useful in a number of ways:

  • Resource management optimization: If you have a project that is on a rigid timeline, you can determine which users have the quickest turnaround and assign them as necessary.
  • Annotator payment management: If you are using outside contractors or otherwise paying users based on their output, you can use this dashboard to help calculate or verify contractor payments.
  • Reduce costs associated with internal analytic reports: With this report, you no longer need to develop complex tools or workflows to track user performance.

Access the dashboard

Depending on your user role, you can access this dashboard in several ways:

  • From the Organization page, select a user on the Members page. Then select Member Performance on the right.

  • From the Home page, click Member Performance. This will pre-select your own performance dashboard.

  • From the Members dashboard on a project, click the overflow menu next to a username in the Annotation Summary table. This will pre-select that user's annotator performance dashboard for that specific project.

  • From anywhere within the app, open the navigation menu and select Analytics. This will pre-select your own annotator performance dashboard.

Access by user role

User role Access restrictions
Owner and Admin Can access from the navigation menu, the Organization page, the Home page, and the Members dashboard. Can filter for all users. Can filter for all workspaces.
Manager Can access from the navigation menu, the Home page and the Members dashboard. Can only filter for users who are members of workspaces or projects in which they are also a member. Can only filter for workspaces or projects in which they are a member.
Reviewer and Annotator Can access from navigation menu and the Home page. Can only see their own annotation and reviewer history. Can only filter for workspaces or projects in which they are a member.

Export data

You can use the Export drop-down to export the following:

  • Report - Download the information in the dashboard as CSV or JSON.

  • Timeline - Download a detailed timeline of all the user's annotation actions within the time frame, including when the began and submitted each annotation.

  • Comments Added - Download a CSV file with all of the comments that the user has left.

Filters

Filter by project and workspace

Select one or more workspaces or individual projects. To see all projects, select All Workspaces at the top of the workspace filter.

This does not include Personal Sandbox projects.

Filter by date range

You can select a date range to apply to the performance metrics. If you want to be precise, you can also include time.

Note that annotation and review metrics are calculated on when they are completed, not when they begin.

For example, say you select a date range of 2 days: Monday and Tuesday. If an annotator opens an annotation on Tuesday, begins working on it, and then submits it on Wednesday, then that annotation and the time they spent on it will not be included in your performance report.

Similarly, if a reviewer opens an annotation on Tuesday but then doesn't accept it until Wednesday, that annotation is not counted in their total reviews or accepted annotation metrics.

Save views

You can save your member, date range, and project filters as custom views. Saved views makes it easier for you to group member and project combos you want to readily access.

Note the following:

  • You can save, update, and delete views.
  • Views are only visible to you (meaning they are not shared with other users within your organization).

!!! note
If you click Apply after saving your date and project/workspace filters, your selections will propogate to other Analytics pages. You can reapply your view or incorporate those filters into a new or updated view.

Annotations

The Annotations tab shows information related to a user's annotation performance and history.

The metrics are calculated from the following data:

  • last_action -- The last action taken on an annotation. This can be submitted, updated, fixed and accepted, accepted, rejected.
  • submitted_or_reviewed -- Annotations that have a last action matching those listed above.
  • lead_times -- The time spent with annotations that have a last action matching those listed above. Lead time includes idle time and is cumulative across multiple sessions.

!!! note
A dash (--) appears when there is no data. A zero (0) appears when there is data available and the value is zero.

Annotation performance summaries

Metric Calculation Description
Total Submitted Annotations Sum of submitted_or_reviewed The total number of annotations the user submitted during the selected time frame. This includes annotations that have been submitted or updated, either reviewed or not. It does not include annotations that have been skipped. Note that each annotation is only included in their submitted count once. Label Studio does not count the same annotation twice based if it is later updated.
Time Annotating Sum of lead_times The total time spent annotating during the selected time frame. This is calculated based on annotations that meet the criteria for submitted_or_reviewed. All annotations have a lead time. The lead time reflects how much time a user spent labeling from the moment the task was opened until they click Submit or Update. This includes idle time and time spent updating previously submitted annotations. The total time does not include time spent on annotations that have not been submitted and/or updated. For example, it does not include time spent on drafts or time spent on skipped annotations. Lead time is cumulative across sessions. That means if they leave or log out, and then return to an annotation draft or a previously skipped annotation, then their earlier time spent on the annotation is included when calculating their lead time.
Performance Score Calculated from reviewer actions The Performance Score reflects the overall performance of annotators in terms of review actions (Accept, Reject, Fix+Accept). The calculation is as follows:
  • Each annotation review action (Accept, Reject, Fix+Accept) contributes to the score.
  • The score is calculated by summing the scores of all review actions and dividing by the total number of review actions. For example:
  • If an annotation is rejected twice and then accepted once, the Performance Score would be (0 + 0 + 1) / 3 = 33%.
  • If an annotation is rejected once and then fixed+accepted with an agreement score of 42%, the Performance Score would be (0 + 0.42) / 2 = 21%. The agreement here is measured between what the annotator submitted and what the reviewer submitted when fixing it.
  • Annotation charts

    Chart Description
    Annotation States Over Time A summary of all annotations completed by the user, segmented by date over the selected time period.
    Time Spent Annotating The time spent annotating (the lead time), segmented by date over the selected time period. This includes two metrics: The total time spent annotating in hours, and the average time per annotation in minutes.

    !!! note
    The date and time are calculated based on when they completed the annotation (see last_action above), and not when they began their annotation. See Filter by data range

    Annotator performance table

    This is a detailed table with performance metrics for each user.

    Keep in mind that all metrics in the table, including task assignments, are filtered by the time frame selected.

    Column Description
    Assigned The number of tasks that have either been manually assigned to the user or have received a submitted annotation from the user.
    Pending The number of tasks manually assigned to the user, and for which they haven't submitted an annotation and have not skipped.
    Submitted Number of submitted annotations. This includes annotations that have and have not been reviewed.
    Skipped Number of skipped annotations.
    Performance Score The performance score is calculated based on review actions on submitted annotations. See the table above for a complete description. If no annotations have been reviewed, this column is grayed out.
    Accepted Number of submitted annotations that have been accepted by reviewers.
    Fix + Accepted Number of submitted annotations that have been adjusted (fixed) by reviewers and then accepted.
    Rejected Number of submitted annotation that have been rejected by reviewers.
    Total Time The total time this user spent annotating (sum of lead_times). See the table above for a complete description.
    Average Time The average time spent on each submitted annotation (average of lead_times).
    Median Time The median time spent on each submitted annotation (median of lead_times).

    Reviews

    The Reviews tab shows information related to a user's activity reviewing other users' annotations.

    !!! note
    A dash (--) appears when there is no data. A zero (0) appears when there is data available and the value is zero.

    Review performance summaries

    Metric Description
    Total Reviews Total number of annotations reviewed by the user. This includes all annotations that they have accepted, rejected, or updated and then accepted.
    Time Reviewing The total time spent reviewing. This is calculated from when a user opens an annotation to when they either take action on it (such as approving it) or close it by moving away from the task. This also includes idle time when the window is in focus.

    !!! note
    Data collection for review time began on September 25, 2025 for cloud environments, or for 2.30 for on-prem deployments. If you filter for earlier dates, review time will not be calculated.

    Review charts

    Chart Description
    Review States Over Time A summary of all reviews completed by the user, segmented by date over the selected time period.
    Time Spent Reviewing The time spent reviewing, segmented by date over the selected time period. This includes two metrics: The total time spent reviewing in hours, and the average review time per annotation in minutes.

    !!! note
    The date and time are calculated based on when they either completed the review (such as by accepting it) or exited the annotation. See Filter by data range

    Reviewer performance table

    This is a detailed table with performance metrics for each user.

    Keep in mind that all metrics in the table, including task assignments, are filtered by the time frame selected.

    Column Description
    Annotations Reviewed The number of annotations that the user has reviewed. This includes all review actions (accept, reject, fix + accept).
    Pending The number of annotations that the user has been manually assigned as a reviewer and which have not yet received their review.
    Accepted Number of annotations the user has accepted.
    Fix + Accepted Number of annotations the user has updated and then accepted.
    Rejected Number of annotations the user has rejected.
    Total Time The total time this user spent reviewing. See the table above for a complete description.
    Average Time The average time spent reviewing each annotation.
    Median Time The median time spent reviewing each annotation.

    Source Guide Dashboard Data Quality (`docs/source/guide/dashboard_data_quality.md`)


    title: Data quality dashboard short: Data quality dashboard tier: enterprise type: guide order: 0 order_enterprise: 71 meta_title: Data quality dashboard meta_description: Use the Data quality dashboard to analyze agreement, confusion, and dimension-level quality for a project. section: "Project Management" parent: "dashboards" parent_enterprise: "dashboards" date: 2026-06-29 00:00:00

    Investigate project data quality with agreement metrics, dimension-level comparisons, and confusion analysis.

    The Data quality dashboard helps you understand how consistently tasks are labeled and where annotations or labels disagree. Use it to find ambiguous tasks, confusing labels, and dimensions that need clearer instructions or review.

    For velocity and time spent, see the Throughput dashboard. For member-level performance, see the Members dashboard.

    Access the dashboard

    From the project, open the Dashboard tab and select Data quality from the dashboard navigation.

    The Data quality dashboard has two tabs:

    • Agreement analysis: Review agreement metrics and confusion across dimensions.
    • Label distribution: Compare annotation and prediction label counts by dimension.

    Agreement analysis

    Use the Agreement analysis tab to understand where annotators, models, and ground truth annotations align or disagree.

    Average Task Agreement

    The Average Task Agreement KPI card shows the average agreement score for tasks in the project.

    Agreement is most useful when tasks have multiple annotations or a comparison source such as ground truth. Tasks with only one annotation do not provide an annotator-to-annotator agreement signal.

    Overall Agreement Charts

    Chart Description
    Task Agreement Distribution Histogram of task-level agreement scores. More tasks in higher ranges indicate stronger labeling consistency; more tasks in lower ranges suggest ambiguous instructions, difficult examples, or labels that need clarification. Clicking on a bar opens up the tasks tasks in the Data Manager.
    Agreement by Dimension Agreement score per dimension. Use it to identify which dimensions are driving disagreement issues.

    Ground Truth Agreement

    Chart Description
    Top Confusion Pairs Table of labels with the most number of incorrect values applied according to the ground truth.Use it to find label pairs that need better examples, clearer definitions, or additional training.
    Confusion Matrix Heatmap comparing labels or values within a selected dimension. Use the dimension dropdown to choose which dimension to inspect (default: All dimensions).

    Label distribution

    Use the Label distribution tab to compare values from annotations and predictions for each dimension.

    Each supported dimension has a card with:

    • Average Agreement: Agreement for the dimension when there is enough data to compare annotations or predictions.
    • Label Distribution chart: A grouped horizontal bar chart comparing values from annotations and predictions.
    • Label Distribution table: Counts from annotations and predictions for each value, plus a Total row. Values in the From Annotations and From Predictions columns link to the Data Manager with filters applied for the selected dimension and value.

    For more detail about supported dimensions and Label Distribution behavior, see the Label Distribution dashboard.

    Interpreting data quality issues

    Low agreement or high confusion does not always mean poor annotator or model performance. It can also indicate:

    • Ambiguous task data.
    • Labels that overlap conceptually.
    • Missing or unclear labeling instructions.
    • A project configuration that requires higher annotation overlap or additional review strategy.

    Use the Data quality dashboard together with the Members dashboard and Data Manager to decide whether to update instructions, add examples, reassign tasks, or coach specific members.


    Source Guide Dashboard Distribution (`docs/source/guide/dashboard_distribution.md`)


    title: Label distribution dashboard short: Label distribution tier: enterprise type: guide order: 0 order_enterprise: 175 meta_title: Label distribution dashboard meta_description: Use the Label Distribution dashboard to compare annotation and prediction label distributions by project dimension. section: "Analytics" date: 2026-06-29 00:00:00

    The Analytics > Label Distribution dashboard shows how annotation and prediction values are distributed across a project. Use it to identify imbalanced labels, compare annotator and model outputs, and drill into the tasks behind a label value.

    Access by user role

    User role Access restrictions
    Owner and Admin Can view the Label Distribution dashboard and filter for all projects.
    Manager Can view the Label Distribution dashboard, but can only filter for and view projects in which they are a member.
    Reviewer and Annotator Cannot access the Label Distribution dashboard. When they open Analytics, they are redirected to the Member Performance dashboard, where they can only see their own annotation and review history.

    Label distribution by dimension

    The dashboard groups results by labeling dimension. A dimension can come from a traditional labeling config control tag or from an Interface output, such as ReactCode or CustomInterface fields.

    Each supported dimension has a card with:

    • Average Agreement: Agreement for the dimension when there is enough data to compare annotations, predictions, or ground truth.
    • Label Distribution chart: A grouped horizontal bar chart comparing values from annotations and predictions.
    • Label breakdown table: Counts from annotations and predictions for each value.

    Label breakdown table

    The label breakdown table shows each value for the selected dimension, plus a Total row.

    Column Description
    Label Label or value name. The final row shows the total across all values.
    From Annotations Number of times the value appears in annotations.
    From Predictions Number of times the value appears in predictions.

    Values in the From Annotations and From Predictions columns can link to the Data Manager with filters applied for the selected project, dimension, value, and source. Use these links to inspect the underlying tasks, annotations, or predictions.

    Supported dimensions

    Label distribution supports dimensions with a finite set of values, including:

    • Label controls such as <Labels>, <RectangleLabels>, and other labels-based controls.
    • Choice controls such as <Choices>.
    • Taxonomy controls with finite, nested choices.
    • Enum-backed ReactCode and CustomInterface dimensions.
    • Other finite scalar dimensions that can be represented as a known set of values.

    Dimensions that do not have a finite set of values are not shown as label distributions. This includes free text, arbitrary numeric or date values, objects, arrays, and values that are not declared in the dimension schema.

    !!! note
    If a dimension is unsupported, the dashboard should show that it is unsupported rather than rendering an empty chart. This helps distinguish "no data" from data that cannot be safely summarized as a label distribution.


    Source Guide Dashboard Members (`docs/source/guide/dashboard_members.md`)


    title: Members dashboard short: Members dashboard tier: enterprise type: guide order: 0 order_enterprise: 72 meta_title: Members dashboard meta_description: Use the Members dashboard to monitor annotator and reviewer performance, agreement, and quality metrics within a project. section: "Project Management" parent: "dashboards" parent_enterprise: "dashboards" date: 2026-06-17 00:00:00

    Get insight into the performance, agreement, and quality of members working on a project.

    The Members dashboard gives you two views of your project's workforce: a Performance tab with separate tables for annotators and reviewers, and an Agreement Matrix tab for inter-annotator reliability.

    This can be useful in a number of ways:

    • Track annotator and reviewer performance: View key metrics like evaluation status, agreement, acceptance score, performance score, GT agreement, and time spent to identify who is aligned or needs support.
    • Monitor annotation and review progress: See how many annotations have been submitted, accepted, rejected, or are still pending review for both annotators and reviewers.
    • Identify quality and consistency issues: Use the Agreement Matrix tab to spot disagreements between members, then click into cells to view the specific tasks where they diverged.

    For member metrics across projects and over time, see the Member Performance dashboard.

    Access the dashboard

    From the project, open the Dashboard tab and select Members from the dashboard navigation.

    The Data quality dashboard has two tabs:

    • Performance: Review key metrics for individual annotators and reviewers in the project.
    • Agreement Matrix: Compare pairwise agreement scores between members, models, and ground truth.

    Filter by participants

    A participant filter is available in the top right of the dashboard. By default it shows All participants.

    • Annotators are listed under All Annotators; if the project has model predictions, model versions appear under All Model Versions.
    • Selecting specific participants narrows both the Performance tables and the Agreement Matrix to only those members.

    Performance

    The Performance tab has a toggle to switch between:

    • Annotations: metrics for each member's submission activity
    • Reviews: metrics for each member's review activity

    Use the Export button to download the currently visible table as a CSV.

    Annotation Summary

    The Annotation Summary table shows annotation metrics for each project member. The table is sortable and includes a totals row at the bottom. Use the Columns picker to show or hide columns.

    Column Description
    Annotator Member name. Click to open this member's Member Performance dashboard filtered to this project.
    ID Member's numeric user ID.
    Paused Toggle to manually pause or unpause an annotator. See Pause an annotator.
    Evaluation Shown when Annotator Evaluation is enabled. Status for annotators and reviewers: Passed, Failed, Not started, or In progress. Hover for the metric, score or sample progress, and when they were last evaluated. You cannot use the Paused toggle to unpause someone paused by evaluation.
    Agreement Average agreement score with other annotators on tasks where multiple annotations exist.
    Assigned Number of tasks manually assigned to the member or containing a submitted annotation by the member.
    Pending Number of tasks manually assigned to the member that do not yet have a submitted or skipped annotation.
    Submitted Total annotations submitted by the member. Includes submitted, updated, and reviewed annotations.
    Skipped Number of tasks skipped by the member.
    Accepted Number of submitted annotations accepted by reviewers.
    Fix + Accepted Number of submitted annotations fixed then accepted by reviewers.
    Rejected Number of submitted annotations rejected by reviewers.
    Updated Shown when Annotator Evaluation is enabled. Number of annotations whose last action is Updated, including updates before or after a review.
    Acceptance Score Accepted annotations (including Fix + Accepted) divided by total reviewed annotations. Uses the latest review outcome per annotation.
    Performance Score Overall annotation performance based on review outcomes (Accept, Reject, Fix+Accept). See Annotation performance summaries for the calculation.
    Total Lead Time Total elapsed time from task open to submit across all annotations. Includes time spent updating.
    Avg Lead Time Average elapsed time per submitted annotation.
    Median Lead Time Median elapsed time per annotation.
    GT Agreement Agreement between this member's annotations and ground truth annotations on overlapping tasks.
    Prediction Agreement Agreement between this member's annotations and model predictions on overlapping tasks.
    Last Active Date and time of the member's most recent activity in the project.

    !!! note
    The following columns are hidden by default and can be shown using the Columns picker: ID, Assigned, Pending, Median Lead Time, Prediction Agreement.

    Review Summary

    The Review Summary table shows review activity for each member who has performed reviews on the project.

    Column Description
    Reviewer Member name. Click to open this member's Member Performance dashboard filtered to this project.
    ID Member's numeric user ID.
    Paused Toggle to pause or unpause a reviewer.
    Reviewed Total annotations reviewed. Sum of accepted, fix+accepted, and rejected.
    Pending Number of tasks manually assigned to the reviewer that have not yet been reviewed.
    Accepted Number of annotations accepted by the reviewer.
    Fix + Accept Number of annotations fixed then accepted by the reviewer.
    Rejected Number of annotations rejected by the reviewer.
    Avg time Average time spent reviewing an annotation. Includes time spent fixing annotations.
    Total time Total time spent reviewing.
    Median time Median time spent reviewing an annotation.
    Last active Date and time of the reviewer's most recent review activity.

    !!! note
    The following columns are hidden by default and can be shown using the Columns picker: ID, Performance, Submitted tasks.

    !!! note
    Review time data collection began on September 25, 2025 for cloud environments, or version 2.30.0 for on-prem deployments. Filtering for earlier dates will not include review time.

    Performance by Dimension

    The Performance by Dimension table appears below the Annotation Summary on the Annotations sub-tab. It breaks down each member's performance score per labeling dimension configured in the project.

    Use the Compare with dropdown to choose how scores are calculated:

    • Compare with GT — scores reflect each member's agreement with ground truth annotations on overlapping tasks.
    • Compare with All Annotators — scores reflect each member's agreement with other annotators on the same tasks.

    An Avg column shows each member's overall average across all dimensions. A footer row shows the average per dimension across all members. Use the Columns picker to show or hide individual dimensions.

    Agreement Matrix

    The Agreement Matrix tab shows the Member / Model Agreement Matrix, a heatmap of pairwise agreement scores between all members (and models, if included via the participant filter) in the project.

    Click on any cell to open the Data Manager filtered to tasks where both members annotated, so you can inspect disagreements directly.

    !!! note
    Agreement in the Members dashboard reflects an agreement score between annotators, regardless of the agreement methodology configured for the project.

    Filters

    • Dimension: Filter agreement by a specific labeling dimension (control tag). Defaults to All dimensions.
    • Label: Filter to tasks where at least one annotation contains the specified label. Only available when a specific dimension is selected.

    Reading the matrix

    Cells are color-coded by agreement band:

    • Green — High (≥ 66%)
    • Yellow — Moderate (33–66%)
    • Red — Low (< 33%)

    Hover over any cell to see the agreement percentage and the number of tasks where both members annotated. If a Ground Truth column is present, it shows each member's agreement against the project's ground truth annotations.

    An Avg row at the bottom shows the average agreement per column across all members.

    The participant filter (top right) applies to this tab — select specific annotators or model versions to narrow the matrix.


    Source Guide Dashboard Throughput (`docs/source/guide/dashboard_throughput.md`)


    title: Throughput dashboard short: Throughput dashboard tier: enterprise type: guide order: 0 order_enterprise: 70 meta_title: Throughput dashboard meta_description: Use the Throughput dashboard to monitor project velocity, remaining work, and time spent. section: "Project Management" parent: "dashboards" parent_enterprise: "dashboards" date: 2026-06-29 00:00:00

    Track how quickly work is moving through a project and where bottlenecks are forming.

    The Throughput dashboard shows project velocity over time. Use it to monitor completed work, remaining work, and the time spent annotating and reviewing tasks.

    For data quality-focused metrics, see the Data quality dashboard. For member-level productivity and agreement, see the Members dashboard.

    Access the dashboard

    From the project, open the Dashboard tab and select Throughput from the dashboard navigation.

    Filter by date range

    Use the date range filter to update the KPI cards and charts for the selected time period.

    If you include a precise time, the dashboard uses that timestamp when determining which task and work events fall within the range.

    KPI cards

    The top of the dashboard shows summary cards for the selected date range.

    KPI Description
    Tasks Done Number of tasks that reached the Done state during the selected date range. Avg Tasks Done / Day sub-metric shows the average number of tasks completed per day in the selected date range. Calculated as Tasks Done / Days.
    Annotations Submitted Total number of annotations submitted (manually or created from a prediction) during the selected date range. Annotations / Day sub-metric shows the average number of annotations submitted per day in the selected date range. Calculated as Annotations Submitted / Days.
    Total Time Spent Total time spent annotating and reviewing. Note: Annotation time uses active annotation time, as opposed to lead time. The sub-metric shows the Total Time Spent on Done Tasks.
    Avg Time / Task Average active time spent per task that has started work (ie. past the initial stage). Calculated as Total Time Spent / Tasks Started. The sub-metric shows the Total Time Spent on Done Tasks / Tasks Done.

    !!! note
    Task state metrics are based on project and task state management. If state tracking was enabled after some project work had already happened, earlier state transitions might not appear in the dashboard.

    Throughput charts

    Chart Description
    Tasks by State Stacked bar chart of the number of tasks in each state (Initial, Annotating, Needs Review, In Review, Done) over time. Use it to track task progress or identify bottlenecks. Tasks start at the Initial state when they have been created but contain no annotations yet. Tasks that have completed the required number of annotations either move to the Needs Review or Done state, depending on whether your project settings require a review on the task. Learn more about task state management.
    Tasks Done / Day Number of tasks reaching the Done state per day. The same task may appear on multiple days if it is re-worked after reaching Done. Use it to track velocity and spot output changes after adjusting staffing, task instructions, review requirements, or project settings.
    Time Spent Time spent over the selected period, split between annotation and review. Use it to understand how effort is distributed across work types over time.

    Source Guide Dashboards (`docs/source/guide/dashboards.md`)


    title: Dashboards short: Dashboards tier: enterprise type: guide order: 0 order_enterprise: 135 meta_title: Dashboard in Label Studio meta_description: Use the project Dashboard tab to monitor project throughput, quality, and member performance. section: "Create & Manage Projects"

    Use project dashboards to monitor throughput, data quality, and member performance for a single project.

    The project Dashboard tab gives managers, administrators, and owners a project-level view of how work is moving, where quality issues are appearing, and how members are performing.

    Open a project and select Dashboard to access the project dashboards:

    • Throughput: Track velocity, remaining work, and time spent.
    • Data quality: Analyze agreement, dimension-level quality, and label confusion.
    • Members: Review annotator, reviewer, and model performance within the project.

    Choose a project dashboard

    Dashboard Use it to
    Throughput Understand whether the project is moving at the expected pace, where work is blocked, and how annotation and review time are trending.
    Data quality Investigate agreement, confusion between labels, quality by dimension, and the tasks behind quality issues.
    Members Compare annotator, reviewer, and model performance, including agreement, review outcomes, time spent, and per-dimension performance.

    Access by user role

    Project dashboards are available to users who can manage or monitor the project, such as Owners, Administrators, and Managers.

    Annotators and Reviewers generally do not use the project Dashboard tab. For individual work history across projects, see the Member Performance dashboard.

    Filtering and drilldowns

    Each project dashboard has filters that apply to the metrics on that page. Depending on the dashboard, you can filter by date range, task data, annotator, model, review outcome, ground truth status, labeling dimension, or label.

    Many cards, charts, and tables link to the Data Manager with relevant filters applied. Use these drilldowns to move from a summary metric to the exact tasks, annotations, predictions, or labels behind it.

    Analytics dashboards

    Analytics dashboards are available from the main Analytics navigation and can include data across projects, workspaces, or individual members depending on your role.

    Dashboard Description
    Projects overview dashboard Monitor progress across multiple projects and workspaces.
    Label Distribution dashboard Compare annotation and prediction value distributions for project dimensions.
    Member Performance dashboard Review an individual member's annotation and review activity across projects.

    Source Guide Decommission Minio (`docs/source/guide/decommission_minio.md`)


    title: Decommission minio short: Decommission minio meta_title: Decommission minio

    !!! warning
    Decommissioning Minio is a hazardous action because you may lose all your data uploaded using direct file upload. For more information or support, contact the Heartex team.

    To decommission Minio, do the following:

    Configure Persistent Storage

    To configure Persistent Storage, follow the instructions in Set up persistent storage.

    Upgrade to the latest available Release

    1. Add MINIO_MIGRATION: true into global.extraEnvironmentVars section of your ls-values.yaml file:
    shell
    global:
      extraEnvironmentVars:
        MINIO_MIGRATION: true
    1. Redeploy a release by following the steps from Upgrade Label Studio Enterprise.

    Run migration script

    1. Run shell in lse-app pod:
    shell
    kubectl exec -ti deploy/<YOUR_RELEASE_NAME>-lse-app -c lse-app -- bash
    1. Copy data from Minio to a persistent storage:
    shell
    JSON_LOG=0 python3 $LSE_DIR/label_studio_enterprise/manage.py minio-migrate

    Ensure a successful data migration

    !!! warning
    Minio service will be deleted in the next step.

    • Try to run Export in your project.
    • Ensure that this data appears in your bucket/volume by project_id/export.

    !!! note
    For more information or support, contact the Heartex team.

    Completely remove Minio service

    1. Add the following map to your ls-values.yaml file:
    yaml
    minio:
      enabled: false
    1. Remove MINIO_MIGRATION: true from global.extraEnvironmentVars section of your ls-values.yaml file.

    2. Redeploy a release by following steps from Upgrade Label Studio Enterprise.


    Source Guide Email Setup (`docs/source/guide/email_setup.md`)


    title: Set up email backend for Label Studio Enterprise
    short: Set up email backend
    tier: enterprise
    type: guide
    order: 0
    order_enterprise: 90
    meta_title: Email backends in Label Studio
    section: "Install & Setup"


    In Label Studio Enterprise, you can configure email backends to enable password reset via email and receive notifications. There are three available options for setting up email backends:

    • Dummy console email backend - all emails will be printed in the app console.
    • SMTP backend
    • Sendgrid backend

    Dummy Console Backend

    The Dummy Console Email Backend is a simple option for testing purposes. When this backend is configured, all emails generated by the application will be printed in the application console, rather than being sent to recipients.

    bash
    FROM_EMAIL = Label Studio <[email protected]>
    
    # option 1: app console
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

    SMTP Backend

    The SMTP (Simple Mail Transfer Protocol) Backend allows you to use a custom SMTP server to send emails. This provides flexibility in configuring email delivery options and can integrate with various email service providers.

    More details can be found here: https://docs.djangoproject.com/en/4.2/topics/email/#smtp-backend. If your SMTP configuration is not compatible with certificate or hostname validation, we provide the
    label_studio.core.utils.mail.NoVerificationEmailBackend which can be used instead of Django's default smtp.EmailBackend, but note that this option is less secure. See https://docs.djangoproject.com/en/5.0/releases/4.2/#miscellaneous for more information.

    bash
    # SMTP server,
    FROM_EMAIL=Label Studio <[email protected]>
    EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
    EMAIL_HOST=smtp.gmail.com
    EMAIL_PORT=587
    [email protected]
    EMAIL_HOST_PASSWORD=PASSWORD # It's your account password, or separate application password, if you have 2fa on your google account
    EMAIL_USE_TLS=1
    EMAIL_USE_SSL=0
    # EMAIL_SSL_KEYFILE=/path/inside/of/ls/container/key  # optional
    # EMAIL_SSL_CERTFILE=/path/inside/of/ls/container/cert  # optional
    EMAIL_TIMEOUT=60

    Sendgrid Backend

    The Sendgrid Backend utilizes the Sendgrid API to send emails. This option requires an active Sendgrid account and API key for authentication. The Sendgrid backend offers an easy-to-use and reliable email delivery service.

    bash
    # option 2: Sendgrid
    EMAIL_BACKEND=sendgrid_backend.SendgridBackend
    SENDGRID_API_KEY=<SENDGRID-API-KEY>

    Source Guide Embed (`docs/source/guide/embed.md`)


    title: Embed Label Studio - Beta 🧪 short: Embed Label Studio 🧪 type: guide tier: enterprise order: 409 order_enterprise: 409 meta_title: Embed Label Studio meta_description: Overview information for embedding Label Studio Enterprise in an external application. section: "Integrate & Extend"

    Label Studio Embeds allow you to seamlessly integrate annotation and review functionality into your own applications.

    !!! note
    This feature is not available to all customers. Contact your HumanSignal account manager to enable.

    Before you begin, ensure you have:

    • Label Studio:

      • You must have the Owner role in Label Studio.
      • From Organization > Settings > Access Token Settings, ensure that at least one option is enabled.
    • Your external application:

      • Access to your server backend (to generate signed tokens).
      • The URL where your embed will be hosted.

    Authorization

    At a high level, the embed process is a secure handshake between your app and Label Studio:

    1. A user logs into your external app.

    2. Your backend signs a JWT with their user_email, organization_id, and project_id using your private key.

    3. Your frontend initializes the Label Studio embed with id, url, and token.

    4. Label Studio validates the JWT and issues its own internal token.

    mermaid
    sequenceDiagram
        participant User
        participant YourApp as Your App (Frontend & Backend)
        participant LSE as Label Studio Enterprise
    
        User->>YourApp: Logs in
        YourApp->>YourApp: Backend signs JWT (user_email + organization_id + project_id)
        YourApp->>User: Sends JWT to frontend
        User->>LSE: Initializes Embed with (id, url, token)
        LSE->>LSE: Verifies JWT with Public Key
        LSE->>User: Issues Internal Token
        User->>LSE: Annotates, Reviews, Uses Embed

    Generate a JWT on your server

    You must begin by generating a JSON web token (JWT) that authenticates Label Studio.

    You will also need to generate a base64-encoded public URL key, which you will add to Label Studio.

    JWT claims required:

    json
    {
      "user_email": "[email protected]",
      "organization_id": 12345,
      "project_id": 67890,
      "iat": 1692445200,
      "exp": 1692452400
    }

    !!! note
    exp, organization_id, and project_id are required. Each accepts a positive integer or a string of digits. exp is a Unix timestamp in seconds and must fall within your organization's token lifetime (60 minutes by default). project_id scopes the embed to that project and must match the project in the embed URL. iat is optional.

    Notes:

    • You can find your organization ID from the Organization page in Label Studio.
    • The example below uses RS256 as a verification algorithm, but you can find a full list of supported algorithms from Organization > Usage & License > Embedding.
    • The public key must be stored in Label Studio in base64-url encoded format.

    Example: Node.js (jsonwebtoken)

    javascript
    const jwt = require("jsonwebtoken");
    const fs = require("fs");
    
    const privateKey = fs.readFileSync("./private.pem");
    
    const token = jwt.sign(
      {
        user_email: "[email protected]",
        organization_id: 12345,
        project_id: 67890,
      },
      privateKey,
      { algorithm: "RS256", expiresIn: "1h" }
    );
    
    console.log(token);

    Configure embedding in Label Studio

    From Label Studio, go to Organization > Usage & License > Embedding and complete the following fields:

    Field Description
    Supported domains List the domains of your external application where you will be adding an embedding.
    Public Verification Key This must be a base64-url encoded key.
    Public Verification Algorithms The algorithm you used when creating your key.
    Embed SDK Add this to your application to initialize the embedding.

    Configure an embedding page in your external application

    At a minimum, you need to add the Embed SDK script to an HTML page in your application. For example:

    xml
    <script src="https://app.humansignal.com/react-app/embed-sdk.js"></script>

    But to maximize the usability of your embedding, you can also include additional Label Studio elements. See our Frontend Reference.

    Here is an example:

    text
    /* Detailed source-code truncated for AI context efficiency. */

    Troubleshooting

    Blank/white screen

    • Domain not listed in Supported Domains within Label Studio.
    • Misconfigured/missing public verification key
    • Misconfigured/missing public verification algorithms
    • Verification of the external JWT failed to verify one or more of the claims provided (invalid JWT).
    • Active organization of the user was different than specified in the JWT claims.
    • Your org has not enabled legacy API tokens or personal access tokens (need at least one).
    • User with the provided user_email does not exist on LabelStudioEnterprise

    HTTP errors in SDK

    • 403 (permission errors)

      • User is not a member of the Project
      • Task was not assigned to a user, but attempted to load
      • User did not have access to an annotation or prediction, but it attempted to load anyways
    • 404

      • Task was not found
    • Other non-HTTP errors that caused a logical problem in the system.


    Source Guide Enterprise Features (`docs/source/guide/enterprise_features.md`)


    title: "Enterprise features: Label Studio at scale" short: Enterprise features type: guide tier: opensource order: 35 order_enterprise: 0 section: "Discover & Learn" meta_title: Label Studio Enterprise Features meta_description: Overview of the features in Label Studio Enterprise.

    This page provides an overview of the advanced capabilities available exclusively in Label Studio Enterprise. These features extend the core functionality of Label Studio with enterprise-scale user management, security, quality assurance, and automation.

    Organizations and Workspaces

    Label Studio Enterprise introduces a hierarchical structure for organizing projects and users through organizations and workspaces, which is not available in the community edition.

    Organizations

    Organizations are the top-level entity in Label Studio Enterprise that contain workspaces, projects, and users. Each organization is isolated from others, providing complete data separation.

    Key capabilities of organizations:

    • Organization-level user management
    • Isolated data and resources
    • Centralized billing and usage tracking
    • Custom branding options

    Workspaces

    Workspaces provide a way to group related projects within an organization. They help structure projects by department, team, or use case.

    Key capabilities of workspaces:

    • Group related projects together
    • Delegate management responsibilities
    • Control access at the workspace level
    • Share resources between projects in the same workspace

    Multi-tenant SaaS architecture

    Organizations provide complete isolation between different Label Studio Enterprise SaaS customers, ensuring data segregation and independent user management. Workspaces within organizations group related projects by team, department, or product line. Label Studio Enterprise may also be deployed on-prem (see Enterprise Deployment Options).

    User management and role-based access control

    Role hierarchy and permissions

    Label Studio Enterprise implements a comprehensive role-based access control (RBAC) system with five distinct roles, each providing specific capabilities and access levels. For information on how to assign users to roles, see Manage user accounts.

    Role Organization Access Primary Capabilities Project Management Annotation Review User Management
    Owner Full control Full system access, billing management All projects ✅ ✅ Full
    Admin Organization-wide User management, all organization settings All projects ✅ ✅ Limited
    Manager Workspace-scoped Project creation, workspace management Assigned projects ✅ ✅ Project-level
    Reviewer Project-scoped Review annotations, manage quality control View only ✅ ✅ None
    Annotator Project-scoped Create and edit annotations View only ✅ ❌ None
    mermaid
    graph TD
        subgraph Project Level
            Project1[Project 1]
            Project2[Project 2]
            Project3[Project 3]
            ReviewerRole[Reviewer Role]
            AnnotatorRole[Annotator Role]
            Project1 --> AnnotatorRole
            Project2 --> AnnotatorRole
            Project3 --> ReviewerRole
        end
    
        subgraph Workspace Level
            WorkspaceA[Workspace A]
            WorkspaceB[Workspace B]
            ManagerRole[Manager Role]
            WorkspaceA --> ManagerRole
            WorkspaceB --> ManagerRole
        end
    
        subgraph Organization Level
            Organization
            OwnerRole[Owner Role]
            AdminRole[Admin Role]
            Organization --> OwnerRole
            Organization --> AdminRole
        end
    
        Organization --> WorkspaceA
        Organization --> WorkspaceB
        WorkspaceA --> Project1
        WorkspaceA --> Project2
        WorkspaceB --> Project3

    Project-level roles

    Project roles are assigned independently of organization roles. For example, a user can be an Annotator in one project and a Reviewer in another project, allowing for flexible permission management:

    • Annotator: Can view projects and assigned tasks and can create annotations
    • Reviewer: Can review annotations, accept or reject them, and provide feedback

    User lifecycle management

    Enterprise features include comprehensive user account management capabilities:

    • Invitation-based signup: Control user onboarding through invitation links
    • Bulk user operations: Assign roles and update workspace memberships in bulk
    • User activity monitoring: Track annotation activity and system usage
    • Account deactivation: Preserve annotation history while removing access

    Authentication and identity management

    Label Studio Enterprise provides comprehensive identity management capabilities for large-scale deployments, supporting integration with existing enterprise identity providers.

    SSO and SAML integration

    The enterprise edition supports Single Sign-On through SAML 2.0 assertions, allowing integration with identity providers like Okta, Google SAML, Ping Identity, Microsoft Active Directory, and other SAML-compatible systems. For setup instructions, see the Authentication and SSO Configuration Guide.

    SCIM 2.0 provisioning

    System for Cross-domain Identity Management (SCIM) 2.0 enables automated user provisioning and deprovisioning from identity providers.

    The SCIM integration supports:

    • Create Users: Automatic user provisioning with role assignments
    • Update User Attributes: Synchronize profile changes and role modifications
    • Deactivate Users: Remove access while preserving annotation history
    • Push Groups: Workspace and project membership management

    For setup instructions, see the SCIM 2.0 Integration Guide.

    LDAP integration

    Enterprise customers can integrate with LDAP directories for user authentication while maintaining local role management.

    Advanced security features

    Enterprise security architecture

    Label Studio Enterprise includes comprehensive security features designed for enterprise compliance requirements. Enterprise security features include:

    • Redis over TLS with client certificate authentication
    • IP allowlisting and VPN access control for cloud storage
      (OSS supports limited IP filtering only for GCP)
    • Advanced audit logging
    • SCIM 2.0 user provisioning and deprovisioning
    • SAML-based Single Sign-On (SSO) integration
    • Role-based access controls across organizations and workspaces
    • Granular task and annotator guardrails (e.g. auto-pausing users, setting trust thresholds)
    • Custom plugins and front-end customization with organization-level isolation
    • Deployment support for fully air-gapped, on-prem environments
    • Uptime SLA and security certifications (e.g. SOC 2, HIPAA readiness)

    Data security

    • End-to-end TLS/SSL: Secure communication between all components
    • Audit Logging: Comprehensive logging of all user activities

    Advanced cloud storage options

    Label Studio Enterprise supports a wider range of persistent storage options for scalable, production-grade deployments. These include:

    • AWS S3 IAM role access: Configure secure access using IAM roles or static credentials
    • Google Cloud Storage with Workload Identity Federation (WIF): Use short-lived credentials to avoid hardcoded secrets

    Advanced labeling & evaluation workflows

    AI features and model integration

    Label Studio Enterprise provides enhanced machine learning capabilities:

    • AI Features Toggle: Enable AI helper tools
    • Prediction Score Display: View prediction/confidence scores in the labeling interface
    • Bulk Labeling: Quickly label multiple tasks at once

    Automated active learning loops

    Label Studio Enterprise supports active learning workflows that automatically update model predictions as labeling progresses.

    After each annotation, Label Studio can send a webhook to a connected machine learning backend. The backend uses the new data to retrain the model (fit()), and Label Studio fetches updated predictions (predict()) for the next task, creating a continuous feedback loop.

    Key components:

    • ML backend setup: Register a model to receive training data and return predictions
    • Prediction integration: Display updated predictions during labeling
    • Webhooks: Trigger model retraining after annotations
    • Task sampling: Use prediction scores to prioritize which tasks to label
    • Continuous loop: As labeling continues, predictions improve with each iteration

    Prompts

    For an additional fee, Label Studio Enterprise includes a built-in Prompts interface for working with language models as part of the labeling workflow.

    Prompt templates allow users to define inputs, models, and outputs to send to connected LLMs. Prompts can be used to pre-label data, generate new tasks, or support review workflows.

    The Prompts interface supports:

    • Prompt Templates: Define inputs, outputs, and model parameters
    • Inline Generation: Run prompts directly from the labeling interface
    • Model Connections: Connect to OpenAI, Anthropic, or custom endpoints via API
    • Pre-labeling: Populate fields using model-generated responses
    • Task Creation: Generate new tasks from prompt outputs

    For more information, see the Prompts Overview.

    Customization with plugins

    Label Studio Enterprise supports custom JavaScript plugins to extend and tailor the labeling interface for project-specific needs.

    Plugins run automatically when users interact with annotation tasks. They can be used to validate annotations, add visual elements, call external services, or apply custom logic based on events in the labeling UI.

    The plugin framework supports:

    • Project-specific scripts: Define custom plugins on a per-project basis
    • Event-driven behavior: Trigger logic on task load, annotation switch, and other actions
    • UI extensions: Add validations, overlays, or context-aware functionality
    • External integration: Connect to APIs or fetch reference data in real time
    • Testing and preview: Use the built-in panel to test plugins before deployment

    To learn how organizations are using plugins in real-world workflows, see the blog post Build Powerful Labeling Interfaces with Plugins.

    Quality workflows and analytics

    Label Studio Enterprise enhances the annotation workflow with features designed for quality control and team collaboration, as well as analytics to optimize annotation and dataset quality.

    Quality control features

    • Auto-validation
    • Review Workflows: Configure review processes for annotations
    • Inter-annotator agreement: Measure agreement between annotators to ensure quality
    • Annotator Performance Dashboard: Track and analyze annotator quality to identity low performers, implement training and corrective actions
    • Project Performance Dashboard: View label distribution to ensure completeness
    • Guardrails for low-trust annotators: Set limits or pause annotators to prevent

    Inter-annotator agreement metrics and matrices

    View real-time agreement metrics to take proactive action on quality. The Enterprise edition includes 30+ built-in agreement metrics for different annotation types, including:

    • Basic matching: Default evaluation for each control tag type
    • Intersection over Union (IoU): For bounding boxes and polygons
    • Edit distance algorithms: For text transcription tasks
    • F1, Precision, Recall: For classification and detection tasks

    To learn how different team structures use agreement metrics to scale high-quality labeling, see the blog post 3 Annotation Team Playbooks for Scalable Labeling.

    Low-trust annotator guardrails

    • Annotator pausing: Manual and automatic pausing based on performance criteria
    • Annotation limits: Configure maximum annotations per user to prevent spam

    Project performance dashboards

    The project dashboard provides a high-level view of project status over time, including metrics like tasks completed, annotations submitted, reviews performed, label distribution, and lead times. Users can filter by date ranges and reorder visualizations to focus on key indicators.

    Annotator performance dashboards

    Organization owners and administrators can view individual annotator dashboards to analyze task counts, average annotation times, review turnaround, and performance scoring. These dashboards help in managing resources, identifying top performers, and tracking quality without building custom analytics tools.

    Project Management

    Label Studio Enterprise includes advanced project configuration options to support complex workflows across teams and workspaces.

    Enterprise-Only Project Settings

    Setting Category Option Open Source Enterprise
    General Project Name, Description, Color ✅ ✅
    Workspace ❌ ✅
    Proxy Credentials ❌ ✅
    Labeling interface Labeling configuration (XML tags) ✅ ✅
    Annotation Labeling Instructions (“Show before labeling”) ✅ ✅
    Distribute Labeling Tasks (Auto vs. Manual) ❌ ✅
    Task Reservation ❌ ✅
    Skip Queue behavior (Requeue, Ignore, etc.) ❌ ✅
    Annotating Options • Show Skip button • Allow empty annotations • Reveal pre-annotations interactively • Require skip comments• Show Data Manager to annotators ❌ ✅
    Live Predictions Pre-label tasks via connected ML backend or Prompts ✅ ✅
    Task Sampling Sequential, Uniform, Uncertainty Sampling ❌ ✅
    Review Review stream settings: • Instructions • Reviewing Options • Reject Options • Data Manager for reviewers • Agreement column visibility ❌ ✅
    Quality Overlap of Annotations ❌ ✅
    Annotation Limit (per-user caps) ❌ ✅
    Annotator Evaluation (ground truth or acceptance score & auto-pause) ❌ ✅
    Task Agreement (metric, low-agreement strategy) ❌ ✅
    Custom label weights ❌ ✅
    Members Project-level roles (Annotator/Reviewer per project) ❌ ✅
    Manage Members (add/remove users, assign project roles) ❌ ✅
    Model Connect ML backends (fit on submit, interactive pre-annotations) ✅ ✅
    Predictions View/import pre-annotations ✅ ✅
    Cloud storage Source/Target connectors (S3, GCS, Azure, local) ✅ ✅
    Webhooks Configure task/annotation webhooks ✅ ✅
    Danger Zone Delete Project, Drop All Tabs ✅ ✅
    Reset Cache ❌ ✅

    For details, view the Enterprise Project Settings.

    Annotation workflow features

    Bulk labeling

    Label Studio Enterprise makes it easy to apply the same annotation to multiple tasks at once, ideal for quickly labeling filtered subsets or consistent repetitive data.

    Key features:

    • Supports all major data types: Works with images, text, audio, and video

    • Choose tasks in Data Manager: Select multiple tasks via list or grid view, then apply bulk labeling

    • Role-based access: Available to users with Reviewer, Manager, Admin, or Owner roles (Annotators can participate via plugins)

    • Supported control tags: Choices, DateTime, Number, Rating, Taxonomy, TextArea

    Auto distribution

    Label Studio Enterprise supports automated task assignment workflows—helping teams start labeling without manual setup.

    When you enable Auto distribution under Annotation settings, these project behaviors apply:

    • Immediate task access: Annotators can begin labeling as soon as the project is published
    • Configurable task overlap: Use "Annotations per task minimum" to define how many annotators must label each task
    • Task reservation (lock timeout): Define how long a task remains locked for an annotator before becoming available again
    • Skip queue behavior: Choose whether skipped tasks should be requeued to others, ignored, or skipped until reassignable

    These settings streamline labeling for large teams and support active learning workflows by routing tasks automatically and handling retries when tasks are skipped.

    Annotation results filtering

    Label Studio Enterprise enhances task review and management with flexible filtering and sorting options in the Data Manager.

    Key capabilities:

    • Field-level filtering: Filter tasks by annotation outcomes, label values, region attributes, or reviewer actions
    • Task sorting: Sort tasks by creation date, prediction confidence, or other metadata
    • Combined filters: Apply multiple filters at once to narrow results for review, QA, or targeted labeling

    Collaboration features

    Label Studio Enterprise supports rich collaboration capabilities to enhance communication, review workflows, and performance visibility across teams.

    Comments and notifications

    Annotators and reviewers can leave threaded comments linked to specific regions or fields within an annotation, enabling contextual feedback and clarification. All collaborators can view and add comments, with permissions to resolve or delete based on their role. Notifications inform users of new comments, either as the first comment on an annotation or replies to ongoing discussions

    Deep linking

    Users can generate direct links to specific annotations, regions, or fields, allowing reviewers or teammates to jump directly to the exact location needing attention. This improves communication efficiency and review precision.

    Enterprise deployment options

    Label Studio Enterprise may be deployed on-prem for air-gapped environments. It supports flexible deployment options designed for high availability and scalability.

    Kubernetes deployment

    Label Studio Enterprise can be deployed on Kubernetes clusters with advanced configuration options:

    Docker Compose deployment

    For simpler enterprise deployments, Label Studio Enterprise supports Docker Compose with external PostgreSQL and Redis dependencies. Key configuration elements:

    • Image repository: humansignal/label-studio-enterprise
    • License integration: Volume-mounted license file
    • Environment variables: Database connections, Redis configuration, storage settings
    • Worker queues: Separate containers for different priority levels

    High availability configuration

    Enterprise deployments support high availability configurations:

    • Multiple app replicas for fault tolerance
    • Configurable RQ worker replicas for different queues
    • Resource configuration for optimal performance
    • PostgreSQL and Redis with TLS support and high availability options

    Performance and scalability features

    • Storage Proxies
    • Optimized Database Queries: Improved performance for large projects
    • Scale-Out Architecture: Distribute workload across multiple pods
    • Redis for Background Tasks: Efficient queue system for handling asynchronous operations

    Whitelabeling

    For an additional fee, Enterprise customers can customize the appearance of their Label Studio instance:

    • Custom Branding: Customize logos, colors, and styles
    • Custom Domain: Use your own domain for the Label Studio instance
    • Login Page Redirects: Configure custom login page redirects with the LOGIN_PAGE_URL variable

    Enterprise support & professional services

    Enterprise customers receive:

    • 99.9% Uptime SLA: Production reliability guarantees
    • Premium Technical Support and SLAs: Priority technical support access
    • Customer Success Manager: Dedicated account management
    • Professional Services: Implementation and optimization assistance
    • Labeling Services: On-demand expert labeling services augment core team, fully integrated into the platform with full visibility and governance

    See how Label Studio Enterprise can work at your organization and contact sales.


    Source Guide Export (`docs/source/guide/export.md`)


    title: Export annotations and data from Label Studio
    short: Export annotations
    type: guide
    tier: all
    order: 166
    order_enterprise: 166
    meta_title: Export Annotations
    meta_description: Label Studio documentation for exporting data labeling annotations to use in machine learning models and data science projects.
    section: "Import & Export"


    At any point in your labeling project, you can export the annotations from Label Studio.

    Label Studio stores your annotations in a raw JSON format in the SQLite database backend, PostgreSQL database backend, or whichever cloud or database storage you specify as target storage. Cloud storage buckets contain one file per labeled task named task_id.json. For more information about syncing target storage, see Cloud storage setup.

    Image annotations exported in JSON format use percentages of overall image size, not pixels, to describe the size and location of the bounding boxes. For more information, see how to convert the image annotation units.

    !!! note
    Some export formats export only the annotations and not the data from the task. For more information, see the export formats supported by Label Studio.

    {% insertmd includes/annotation_ids.md %}

    Export using the UI in Community Edition of Label Studio

    Use the following steps to export data and annotations from the Label Studio UI.

    1. For a project, click Export.
    2. Select an available export format.
    3. Click Export to export your data.

    !!! note
    1. The export will always include the annotated tasks, regardless of filters set on the tab.
    2. Cancelled annotated tasks will be included in the exported result too.
    3. If you want to apply tab filters to the export, try creating export snapshots using the SDK.

    Export timeout in Community Edition

    Exports from the Community Edition UI are generated synchronously as part of the request. Community Edition keeps deployment simple and does not run background export workers by default. Label Studio Enterprise supports background workers for asynchronous snapshot exports, which is better suited for large-scale projects. For large projects, the community's export can take longer than the timeout configured in your reverse proxy or ingress (often around 90 seconds), which can result in 502/504 errors or an export timeout.

    If you hit this limitation, you can still export your data using one of these options:

    Export using console command

    Use the following command to export data and annotations.

    shell
    label-studio export <project-id> <export-format> --export-path=<output-path>

    To enable logs:

    shell
    DEBUG=1 LOG_LEVEL=DEBUG label-studio export <project-id> <export-format> --export-path=<output-path>

    Export snapshots using the UI

    In Label Studio Enterprise, create a snapshot of your data and annotations. Create a snapshot to export exactly what you want from your data labeling project. This delayed export method makes it easier to export large labeling projects from the Label Studio UI.

    1. Within a project in the Label Studio UI, click Export.
    2. Click Create New Snapshot.
    3. Apply filters from tab ...: Select Default from the drop-down list.
    4. (Optional) Snapshot Name: Enter a snapshot name to make it easier to find in the future. By default, export snapshots are named PROJECT-NAME-at-YEAR-MM-DD-HH-MM, where the time is in UTC.
    5. Include in the Snapshot…: Choose which type of data you want to include in the snapshot. Select All tasks, Only annotated tasks, or Only reviewed tasks.
    6. Drafts: Choose whether to export the complete draft annotations (Complete drafts) for tasks, or only the IDs (Only IDs) of draft annotations, to indicate that drafts exist.
    7. Predictions: Choose whether to export the complete predictions (Complete predictions) for tasks, or only the IDs (Only IDs) of predictions to indicate that the tasks had predictions.
    8. Annotations: Enable the types of annotations that you want to export. You can specify Annotations, Ground Truth annotations, and Skipped annotations. By default, only annotations are exported.
    9. (Optional) Enable the Remove user details option to remove the user's details.
    10. Click Create a Snapshot to start the export process.
    11. You see the list of snapshots available to download, with details about what is included in the snapshot, when it was created, and who created it.
    12. Click Download and select the export format that you want to use. Now, the snapshot file downloads to your computer.

    Export using the Easy Export API

    You can call the Label Studio API to export annotations. For a small labeling project, call the export endpoint to export annotations.

    Export all tasks including tasks without annotations

    Label Studio open source exports tasks with annotations only by default. If you want to easily export all tasks including tasks without annotations, you can call the Easy Export API with query param download_all_tasks=true. For example:

    text
    curl -X GET https://localhost:8080/api/projects/{id}/export?exportType=JSON&download_all_tasks=true

    If your project is large, you can use a snapshot export to avoid timeouts in most cases. Snapshots include all tasks without annotations by default.

    Export snapshots using the Snapshot API

    For a large labeling project with hundreds of thousands of tasks, do the following:

    1. Make a POST request to create a new export file or snapshot. The response includes an id for the created file.
    2. Check the status of the export file created using the id as the export_pk.
    3. Using the id from the created snapshot as the export primary key, or export_pk, make a GET request to download the export file.

    Export formats supported by Label Studio

    Label Studio supports many common and standard formats for exporting completed labeling tasks. If you don't see a format that works for you, you can contribute one. For more information, see the Label Studio Converter tool in our SDK repo.

    ASR_MANIFEST

    Export audio transcription labels for automatic speech recognition as the JSON manifest format expected by NVIDIA NeMo models. Supports audio transcription labeling projects that use the Audio tag with the TextArea tag.

    json
    {“audio_filepath”: “/path/to/audio.wav”, “text”: “the transcription”, “offset”: 301.75, “duration”: 0.82, “utt”: “utterance_id”, “ctm_utt”: “en_4156”, “side”: “A”}

    Brush labels to NumPy and PNG

    Export your brush mask labels as NumPy 2d arrays and PNG images. Each label outputs as one image. Supports brush labeling image projects that use the BrushLabels tag.

    COCO

    A popular machine learning format used by the COCO dataset for object detection and image segmentation tasks. Supports bounding box and polygon image labeling projects that use the BrushLabels, RectangleLabels, KeyPointLabels (see note below), or PolygonLabels tags.

    {% details KeyPointLabels Export Support %}

    If using KeyPointLabels, you will need to add the following to your labeling config:

    • At least one <RectangleLabels> option. You will use this as a parent bounding box for the keypoints.
    • Add a model_index to every <Label> inside your <KeyPointLabels> tag. The model_index value defines the order of the keypoint coordinates in the output array for YOLO.

    For example:

    xml
    <View>
      <Image name="image" value="$image"/>
    
      <KeyPointLabels name="kp" toName="image">
        <Label value="nose" model_index="0"/>
        <Label value="eye" model_index="1"/>
        <Label value="tail" model_index="2"/>
      </KeyPointLabels>
    
      <RectangleLabels name="bbox" toName="image">
        <Label value="animal"/>
      </RectangleLabels>
    </View>

    After annotating, you must drag-and-drop each keypoint region under its corresponding rectangle region in the Regions panel.

    This establishes a parent–child hierarchy (via parentID), which is necessary for export. See the export examples below.

    Export examples

    json
    [
          {
            "result": [
              {
                "id": "17n06ubOJs",
                "type": "keypointlabels",
                "value": {
                  "x": 6.675567423230974,
                  "y": 20.597014925373134,
                  "width": 0.26702269692923897,
                  "keypointlabels": [
                    "nose"
                  ]
                },
                "origin": "manual",
                "to_name": "image",
                "parentID": "QHG4TBXuNC",
                "from_name": "kp",
                "image_rotation": 0,
                "original_width": 200,
                "original_height": 179
              },
              {
                "id": "QHG4TBXuNC",
                "type": "rectanglelabels",
                "value": {
                  "x": 3.871829105473965,
                  "y": 4.029850746268656,
                  "width": 94.39252336448598,
                  "height": 92.08955223880598,
                  "rotation": 0,
                  "rectanglelabels": [
                    "animal"
                  ]
                },
                "origin": "manual",
                "to_name": "image",
                "from_name": "bbox",
                "image_rotation": 0,
                "original_width": 200,
                "original_height": 179
              }
    ]
    json
    [
        {
          "id": 0,
          "image_id": 0,
          "category_id": 0,
          "segmentation": [],
          "bbox": [
            7.74365821094793,
            7.213432835820895,
            188.78504672897196,
            164.84029850746268
          ],
          "ignore": 0,
          "iscrowd": 0,
          "area": 31119.38345654903
        },
        {
          "id": 1,
          "image_id": 0,
          "category_id": 0,
          "keypoints": [
            13,
            37,
            2,
            33,
            33,
            2,
            167,
            24,
            2
          ],
          "num_keypoints": 3,
          "bbox": [
            13,
            24,
            154,
            13
          ],
          "iscrowd": 0
        }
    ]
    text
    0 0.5106809078771696 0.5007462686567165 0.9439252336448598 0.9208955223880598 0.06675567423230974 0.20597014925373133 2 0.1628838451268358 0.18507462686567164 2 0.8371161548731643 0.13134328358208955 2

    {% enddetails %}

    CoNLL2003

    A popular format used for the CoNLL-2003 named entity recognition challenge. Supports text labeling projects that use the Text and Labels tags.

    CSV

    Results are stored as comma-separated values with the column names specified by the values of the "from_name" and "to_name" fields in the labeling configuration. Supports all project types.

    JSON

    List of items in raw JSON format stored in one JSON file. Use this format to export both the data and the annotations for a dataset. Supports all project types.

    JSON_MIN

    List of items where only "from_name", "to_name" values from the raw JSON format are exported. Use this format to export the annotations and the data for a dataset, and no Label-Studio-specific fields. Supports all project types.

    For example:

    json
    {
      "image": "https://htx-pub.s3.us-east-1.amazonaws.com/examples/images/nick-owuor-astro-nic-visuals-wDifg5xc9Z4-unsplash.jpg",
      "tag": [{
        "height": 10.458911419423693,
        "rectanglelabels": [
            "Moonwalker"
        ],
        "rotation": 0,
        "width": 12.4,
        "x": 50.8,
        "y": 5.869797225186766
      }]
    }

    Pascal VOC XML

    A popular XML-formatted task data is used for object detection and image segmentation tasks. Supports bounding box image labeling projects that use the RectangleLabels tag.

    spaCy

    Label Studio does not support exporting directly to spaCy binary format, but you can convert annotations exported from Label Studio to a format compatible with spaCy. You must have the spacy python package installed to perform this conversion.

    To transform Label Studio annotations into spaCy binary format, do the following:

    1. Export your annotations to CONLL2003 format.
    2. Open the downloaded file and update the first line of the exported file to add O on the first line:
    text
    -DOCSTART- -X- O O
    1. From the command line, run spacy convert to convert the CoNLL-formatted annotations to spaCy binary format, replacing /path/to/<filename> with the path and file name of your annotations:

      spacy version 2:

      shell
      spacy convert /path/to/<filename>.conll -c ner

      spacy version 3:

      shell
      spacy convert /path/to/<filename>.conll -c conll .

      For more information, see the spaCy documentation on Converting existing corpora and annotations on running spacy convert.

    TSV

    Results are stored in a tab-separated tabular file with column names specified by "from_name" and "to_name" values in the labeling configuration. Supports all project types.

    YOLO

    Export object detection annotations in the YOLOv3 and YOLOv4 format. Supports object detection labeling projects that use the RectangleLabels and KeyPointLabels tags.

    !!! note
    If using KeyPointLabels, see the note under COCO.

    {% insertmd includes/task_format.md %}

    {% insertmd includes/image_units.md %}

    Manually convert JSON annotations to another format

    You can run the Label Studio converter tool on a directory or file of completed JSON annotations using the command line or Python to convert the completed annotations from Label Studio JSON format into another format.

    !!! note
    If you use versions of Label Studio earlier than 1.0.0, then this is the only way to convert your Label Studio JSON format annotations into another labeling format.

    Access task data (images, audio, texts) outside of Label Studio for ML backends

    Machine Learning backend uses data from tasks for predictions, and you need to download them on Machine Learning backend side. Label Studio provides tools for downloading of these resources, and they are located in label-studio-tools Python package. If you are using official Label Studio Machine Learning backend, label-studio-tools package is installed automatically with other requirements.

    Accessing task data from Label Studio instance

    There are several ways of storing tasks resources (images, audio, texts, etc) in Label Studio:

    • Cloud storages
    • External web links
    • Uploaded files
    • Local files directory

    Label Studio stores uploaded files in Project level structure. Each project has it's own folder for files.

    You can use label_studio_tools.core.utils.io.get_local_path to get task data - it will transform path or URL from task data to local path.
    In case of local path it will return full local path and download resource in case of using download_resources parameter.

    Provide Hostname and access_token for accessing external resource.

    Accessing task data outside of Label Studio instance

    You can use label_studio_tools.core.utils.io.get_local_path method to get data from outside machine for external links and cloud storages.

    !!! attention "important"
    Don't forget to provide credentials.

    You can get data with label_studio_tools.core.utils.io.get_local_path in case if you mount same disk to your machine. If you mount same disk to external box

    Another way of accessing data is to use link from task and ACCESS_TOKEN (see documentation for authentication). Concatenate Label Studio hostname and link from task data. Then add access token to your request:

    json
    curl -X GET http://localhost:8080/api/projects/ -H 'Authorization: Token {YOUR_TOKEN}'

    Frequently asked questions

    Question #1: I have made a request and received the following API responses:

    • No data was provided.
    • 404 or 403 error code was returned.

    Answer:
    First check the network access to your Label Studio instance when you send API requests. You can execute test curl request with sample data.

    Question #2: I tried to access files and received a `FileNotFound` error.

    Answer:

    1. Check that you have mounted the same disk as your Label Studio instance. Then check your files' existence in Label Studio instance first.

    2. Check LOCAL_FILES_DOCUMENT_ROOT environment variable in your Label Studio instance and add it to your accessing data script.

    Question #3: How to modify order of categories for COCO and YOLO exports?

    Labels are sorted in alphabetical order, that is default behavior. If you want to modify that, please add category attribute in <Label> to modify that behaviour. For example:

    xml
    <Label value="abc" category="1" />
    <Label value="def" category="2" />

    Source Guide Frontend (`docs/source/guide/frontend.md`)


    title: Frontend builds
    short: Frontend builds
    tier: all
    order: 0
    order_enterprise: 0
    hide_menu: true
    meta_title: Customize User Interface
    meta_description: Label Studio documentation for integrating the Label Studio frontend interface into your own machine learning or data labeling application workflow.
    section: "Integrate & Extend"


    !!! attention
    As of Label Studio 1.11.0, the Label Studio frontend has been deprecated as a separate library and is no longer supported as a standalone distribution. For information about using the frontend library within Label Studio, see the README.

    text
    Rather than building a new labeling application from scratch, AI agents can build powerful labeling interfaces on top of Label Studio by combining the [XML labeling config builder skill](https://github.com/HumanSignal/create-xml-labeling-config-skill) with the [Label Studio SDK/CLI](https://api.labelstud.io/api-reference/introduction/getting-started). This lets agents generate optimized labeling configs directly from your specs and wire them into projects programmatically.

    The Label Studio Frontend (LSF) is the main labeling interface distributed within Label Studio and as a separate package via NPM and Unpkg. You can integrate the LSF into your projects without Label Studio to provide data labeling capabilities to your users.

    LSF can be customized and extended to fit your needs, and you can use a custom version of LSF standalone or in your LS installation. For more information see Custom LSF + LS integration.

    LSF is located as a separate GitHub repository: https://github.com/HumanSignal/label-studio-frontend

    *Figure 1: Label Studio Frontend *

    Installation

    There are two ways to install the LSF as follows:

    1. Using the package manager
    2. Using the Unpkg CDN

    You can either use npm or yarn to install the LSF.

    bash
    npm install heartexlabs@label-studio@latest --save
    bash
    yarn add heartexlabs@label-studio@latest

    Using Unpkg.com CDN

    xhtml
    <link href="https://unpkg.com/heartexlabs@label-studio@latest/build/static/css/main.css" rel="stylesheet">
    
    
    <script src="https://unpkg.com/heartexlabs@label-studio@latest/build/static/js/main.js"></script>

    Frontend integration guide

    The LSF can be used with Vanilla JS or with the framework of your choice. The following examples cover basic integration with Vanilla and React.

    Vanilla JS integration

    You can use the Label Studio Frontend separately in your own projects by including it in your HTML page. Instantiate a new Label Studio object with a selector for the div that should become the editor.

    To see all the available options for the initialization of LabelStudio object, see the Label Studio Frontend.

    {% collapse "Using modern JS techniques (recommended)" %}

    This guide assumes that you're using a bundler like Webpack or Rollup to assemble your JS bundles, and LSF is installed via a package manager.

    In your HTML add the following code:

    xhtml
    <div id="label-studio"></div>

    Now to initialize the Label Studio Frontend, add the following code to your JS file:

    js
    import LabelStudio from 'heartexlabs@label-studio@latest';
    import 'heartexlabs@label-studio@latest/build/static/css/main.css';
    
    const labelStudio = new LabelStudio('label-studio', {
      config: `
        <View>
          <Image name="img" value="$image"></Image>
          <RectangleLabels name="tag" toName="img">
            <Label value="Hello"></Label>
            <Label value="World"></Label>
          </RectangleLabels>
        </View>
      `,
      interfaces: [
        "panel",
        "update",
        "controls",
        "side-column",
        "annotations:menu",
        "annotations:add-new",
        "annotations:delete",
        "predictions:menu"
      ],
      user: {
        pk: 1,
        firstName: "James",
        lastName: "Dean"
      },
      task: {
        annotations: [],
        predictions: [],
        id: 1,
        data: {
          image: "https://htx-pub.s3.us-east-1.amazonaws.com/examples/images/nick-owuor-astro-nic-visuals-wDifg5xc9Z4-unsplash.jpg"
        }
      }
    });
    
    labelStudio.on("labelStudioLoad", (LS) => {
      // Perform an action when Label Studio is loaded
      const c = LS.annotationStore.addAnnotation({
        userGenerate: true
      });
      LS.annotationStore.selectAnnotation(c.id);
    });
    
    labelStudio.on("submitAnnotation", (LS, annotation) => {
      // Retrieve an annotation in JSON format
      console.log(annotation.serializeAnnotation())
    });

    {% endcollapse %}

    {% collapse "Using plain HTML and JS" %}

    This technique is useful if you're not using a bundler or if you want to use the LSF in a static HTML page.

    xhtml
    <link href="https://unpkg.com/heartexlabs@label-studio@latest/build/static/css/main.css" rel="stylesheet">
    
    <div id="label-studio"></div>
    
    
    <script src="https://unpkg.com/heartexlabs@label-studio@latest/build/static/js/main.js"></script>
    
    <script>
    const root = document.querySelector('#label-studio');
    const labelStudio = new LabelStudio(root, {
      // all configuration options are the same
    });
    </script>

    {% endcollapse %}

    React integration

    LSF is flexible and can be used with a framework of choice. This guide covers the React integration but the same principles can be applied to other frameworks.

    {% collapse "LSF with React" %}
    Prepare new custom component:

    jsx
    // components/LabelStudio.js
    import {useRef} from 'react';
    
    const LabelStudioReact = (props) => {
      const labelStudioContainerRef = useRef();
      const labelStudioRef = useRef();
    
      useEffect(() => {
        if (labelStudioContainerRef.current) {
          labelStudioRef.current = new LabelStudio(
            labelStudioContainerRef.current,
            props
          );
        }
      }, []);
    
      return (
        <div
          id="label-studio"
          ref={function(el) {
            labelStudioContainerRef.current = el
          }}
        />
      );
    }

    Use the component in your React application

    jsx
    // App.js
    import { render } from 'react-dom';
    import LabelStudioReact from './components/LabelStudio';
    
    const labelinConfig = `
      <View>
        <Image name="img" value="$image"></Image>
        <RectangleLabels name="tag" toName="img">
          <Label value="Hello"></Label>
          <Label value="World"></Label>
        </RectangleLabels>
      </View>
    `
    
    const task = {
      annotations: [],
      predictions: [],
      id: 1,
      data: {
        image: "https://htx-pub.s3.us-east-1.amazonaws.com/examples/images/nick-owuor-astro-nic-visuals-wDifg5xc9Z4-unsplash.jpg"
      }
    }
    
    const App = () => {
      return (
        <div class="app-root">
          <LabelStudioReact
            config={labelinConfig}
            task={task}
            interfaces={[
              "panel",
              "update",
              "controls",
              "side-column",
              "annotations:menu",
              "annotations:add-new",
              "annotations:delete",
              "predictions:menu"
            ]}
            user={{
              pk: 1,
              firstName: "James",
              lastName: "Dean"
            }}
          />
        </div>
      )
    }
    
    render(<App />, document.getElementById('root'));

    {% endcollapse %}

    Frontend development

    Refer to the Frontend Reference when developing with Label Studio Frontend.

    Manual builds

    If you want to build a new tag or change the behaviour of default components inside of LSF, then you need to go into the LSF repo and review the Development part of the README file. Making any changes requires that you have a good knowledge of React and Javascript.build.js ``

    GitHub Artifacts

    Use GitHub Artifacts to download a zip-formatted archive with LSF builds. Branches from the official LSF repo are built automatically and hosted on GitHub Artifacts.

    See the GitHub Actions for the LSF repository to access them.

    You can also configure a GitHub token to obtain artifacts automatically:

    text
    export GITHUB_TOKEN=<token>
    cd label-studio/frontend
    yarn download:lsf <branch-name-from-official-lsf-repo>

    Custom LSF in Label Studio

    LS Frontend (LSF) with Backend (LSB) integration is similar what is described in the Frontend integration guide. The JavaScript integration script is placed in lsf-sdk.js in the Label Studio Backend. The main idea of this integration based on LSF callbacks.

    Check out a quick guide on how to use custom LSF in Label Studio.

    Prepare a custom LSF build

    1. Make your custom LSF build by following these instructions.
    2. Finalize your development with npm run build:module to generate main.css and main.js files.
    3. Confirm files appearance in the build/static folder.

    Integrate LSF into Label Studio

    All frontend-related files are stored under label-studio/frontend directory. You will also find dist/ folder there that contains the latest builds of the external frontend libraries.

    Under dist/ folder locate the lsf/ folder and replace its contents with your custom LSF build.

    !!! note
    Inside every folder under dist/ you will find a version.json file. Do not modify or remove it. Its presence is required for the Label Studio to operate.

    1. Do not forget to remove the old build from LSB:

      bash
      rm -rf label-studio/label_studio/frontend/dist/lsf/{js,css}
    2. Copy build folder from LSF to LS:

      bash
      cp -r label-studio-frontend/build/static/{js,css} label-studio/label_studio/frontend/dist/lsf/

      If you installed LS as a pip package, replace <env-path>/lib/python<version>/site-packages/label_studio/frontend/dist/lsf/

    3. Run the LS instance as usual. It is now using the new LSF build:

      bash
      label-studio start <your-project>

    Source Guide Frontend Reference (`docs/source/guide/frontend_reference.md`)


    title: Frontend reference short: Frontend type: guide tier: all order: 416 order_enterprise: 416 meta_title: Frontend Library Reference meta_description: Reference documentation for implementing the Label Studio frontend into your own machine learning or data science application workflows. section: "Integrate & Extend"

    Label Studio frontend (LSF) includes several UI options and callbacks that you can use when implementing the frontend with a custom labeling backend, or when customizing the Label Studio interface.

    !!! attention
    As of Label Studio 1.11.0, the Label Studio frontend has been deprecated as a separate library and is no longer supported as a standalone distribution. For information about using the frontend library within Label Studio, see the README.

    Updates to LSF in version 1.0.0

    !!! warning
    LSF version 1.0.0 is not compatible with earlier versions of Label Studio.

    If you use LSF with a custom backend, you must make changes to the API callbacks that you use as follows:

    Callback in 0.9.1 and earlier Renamed callback in 1.0.0
    onSubmitCompletion onSubmitAnnotation
    onUpdateCompletion onUpdateAnnotation
    onDeleteCompletion onDeleteAnnotation

    If you rely on specific formatting of Label Studio completed tasks, Label Studio's annotation format has also been updated.

    Implement the Label Studio Frontend

    javascript
    var labelStudio = new LabelStudio("editor", options);

    The following options are recognized when initializing a Label Studio instance version 1.0.0.

    Options

    config

    Default: null

    Type data: string

    XML-based configuration of the labeling interface. This configuration relies on the data field of the task.
    See Customizable Tags for more information.

    interfaces

    Default: null

    Type data: array

    Collection of UI elements to show. Available interfaces:

    • panel - Enable navigaion panel for the current task with buttons: undo, redo and reset.
    • update - Show a button to update the current task after submitting.
    • submit - Show a button to submit or update the current annotation.
    • skip - Show a button to skip the current task.
    • controls - Enable panel with controls (submit, update, skip).
    • infobar - A show button for information.
    • topbar - A labeling interface that lists the top-level items in the Label Studio UI.
    • instruction - A button for the instructions.
    • side-column - Show a column on the left or right side of the Label Studio UI.
    • annotations:history - A show button for annotation history.
    • annotations:tabs - A show button for annotation tabs.
    • annotations:menu - A show button for the annotation menu.
    • annotations:current - A show button for the current annotation.
    • annotations:add-new - A show button to add new annotations.
    • annotations:delete - A show button to delete the current annotation.
    • annotations:view-all - A show button to view all annotations.
    • predictions:tabs - Show predictions tabs.
    • predictions:menu - Show predictions menu.
    • auto-annotation - Show auto annotations.
    • edit-history - Show edit history.

    messages

    Default: null

    Type data: object

    Messaging used for different actions

    javascript
    {
      DONE: "Done!",
      NO_COMP_LEFT: "No more annotations",
      NO_NEXT_TASK: "No more data available for labeling",
      NO_ACCESS: "You don't have access to this task"
    }
    • DONE - Shown after the task is submitted to the server
    • NO_COMP_LEFT - Shown if there are no more annotations
    • NO_NEXT_TASK - No next task to load
    • NO_ACCESS - Can't access the provided task

    description

    Default: No description

    Type data: string

    Description of the current task.

    task

    Task data

    Default: null

    Type data: object

    json
    {
      id: 1,
      load: false
      },
      data: {
        text: "Labeling text..."
      },
      annotations: [],
      predictions: [],
    }

    id

    Type data: integer

    Default: null

    data

    annotations

    Type data: array

    Array of annotations. See the annotation documentation for more information.

    predictions

    Type data: array

    Array of predictions. Similar structure as completions or annotations. See the annotation documentation and guidance for importing predicted labels for more information.

    user

    User data

    Type data: object

    json
    {
      "pk": 1,
      "firstName": "Stanley",
      "lastName": "Kubrick"
    }

    pk

    Type data: number

    firstName

    Type data: string

    lastName

    Type data: string

    Event system

    LSF has a built-in event system that allows you to listen to events and trigger custom actions. You can subscribe to or unsubscribe from event at any time after the Label Studio instance is initialized.

    Using events

    Subscribe to an event

    javascript
    const callback = () => {
      console.log("Event triggered");
    };
    labelStudio.on("event", callback);

    Unsubscribe from an event

    javascript
    const callback = () => {
      console.log("Event triggered");
    };
    labelStudio.off("event", callback);

    !!! note
    To be able to unsubscribe from an event, you must pass the same callback function reference to the off method.

    Available events

    Top-level events

    This events group contains top-level events. Those events are not related to any internal entities of the LSF.

    `labelStudioLoad`

    Label Studio instance is loaded.

    !!! warning
    This event does not work in plugins.

    Event handler arguments

    Argument Type Description
    labelStudio Object Instance of Label Studio

    `storageInitialized`

    The internal storage is initialized.

    !!! warning
    This event does not work in plugins.

    Event handler arguments

    Argument Type Description
    labelStudio Object Instance of Label Studio

    Task events

    This events group contains events related to the task.

    `skipTask`

    User clicked the "Skip" button.

    Event handler arguments

    Argument Type Description
    labelStudio Object Instance of Label Studio
    payload Object Additional data sent during the skip action

    `unskipTask`

    User clicked the "Cancel Skip" button.

    Argument Type Description
    labelStudio Object Instance of Label Studio

    `nextTask`

    User clicked the "Next" (chevron right) button.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    taskId Number? ID of the next task in history
    annotationId Number? ID of the annotation to select within the task

    `prevTask`

    User clicked the "Previous" (chevron left) button.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    taskId Number? ID of the previous task in history
    annotationId Number? ID of the annotation to select within the task

    `submitDraft`

    Draft is sent to the server.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation
    params Object? Extra params sent with the draft

    Annotation events

    This events group contains events related to the annotation.

    `beforeSaveAnnotation`

    Annotation is going to be saved as the result of the submit or update action.
    Returning false from this event will prevent saving the annotation.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation
    payload Object Additional information
    payload.event string Indicates which event is about to be executed (submitAnnotation, updateAnnotation, etc.)

    `submitAnnotation`

    Annotation is submitted.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation

    `updateAnnotation`

    Annotation is updated.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation

    `selectAnnotation`

    Annotation is selected.

    Argument Type Description
    annotation Object Current annotation
    previousAnnotation Object Previous annotation
    payload Object? Additional information
    payload.fromViewAll boolean true if ViewAll has just been switched off

    `deleteAnnotation`

    Annotation is deleted.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation

    `groundTruth`

    Annotation is set as Ground Truth (the star button clicked).

    Argument Type Description
    store Object Instance of Label Studio
    labelStudio Object Instance of Label Studio
    params Object
    params.isDirty Boolean true if annotation was changed
    params.entity Object Current annotation

    `selectHistory`

    Step in the annotation history is selected.

    Argument Type Description
    labelStudio Object Instance of Label Studio
    annotation Object Current annotation
    historyItem Object Current history item

    Region events

    This events group contains events related to the regions. Regions are the special entities used in segmentation tasks like image segmentation, audio segmentation, etc.

    `entityCreate`

    Region is created.

    Argument Type Description
    region Object Newly created region

    `entityDelete`

    Region is deleted.

    Argument Type Description
    region Object Newly created region

    {% collapse "Callbacks (deprecated)" %}

    Callbacks can be used to execute actions based on user interaction with the interface. For example, label-studio server uses callbacks to communicate with an API. Pass them along with other options when initiating the instance.

    onSubmitAnnotation

    Type data: function

    Called when the submit button is pressed. ls is label studio instance, annotation is the value of the current annotation.

    Example

    javascript
    onSubmitAnnotation: function(ls, annotation) {
      console.log(annotation)
    }

    onUpdateAnnotation

    Type data: function

    Called when the update button is pressed. ls is label studio instance, annotation is the value of the current annotation.

    Example

    javascript
    onUpdateAnnotation: function(ls, annotation) {
      console.log(result)
    }

    onDeleteAnnotation

    Type data: function

    Called when the delete button is pressed. ls is label studio instance, annotation is value of current annotation.

    Example

    javascript
    onDeleteAnnotation: function(ls, annotation) {
      console.log(result)
    }

    onEntityCreate

    Type data: function

    Called when a new region gets labeled, for example, a new bbox is created. region is the object that was created.

    Example

    javascript
    onEntityCreate: function(region) {
      console.log(region)
    }

    onEntityDelete

    Type data: function

    Called when an existing region gets deleted. region is the object itself.

    Example

    javascript
    onEntityDelete: function(region) {
      console.log(region)
    }

    onSkipTask

    Type data: function

    Called when the skip button is pressed. ls is label studio instance.

    Example

    javascript
    onSkipTask: function(ls) {
      console.log(result)
    }

    onLabelStudioLoad

    Type data: function

    Called when Label Studio has fully loaded and is ready for labeling. ls is the label studio instance

    Example

    javascript
    onLabelStudioLoad: function(ls) {
      console.log(result)
    }

    {% endcollapse %}


    Source Guide Get Started (`docs/source/guide/get_started.md`)


    title: Label Studio overview short: About Label Studio type: guide tier: all order: 2 order_enterprise: 2 section: "Discover & Learn" meta_title: Overview of Label Studio meta_description: Get started with Label Studio by creating projects to label and annotate data for machine learning and data science models.

    What is Label Studio?

    Label Studio is an open source data labeling tool that supports multiple projects, users, and data types in one platform. It allows you to do the following:

    Label Studio is also available an Enterprise cloud service with enhanced security (SSO, RBAC, SOC2), team management features, data discovery, analytics and reporting, and support SLAs. A free trial is available to get started quickly and explore the enterprise cloud product.

    Interface

    Project List Screenshot

    Data Manager Screenshot

    Quick View Screenshot

    Project List Screenshot

    Data Manager Screenshot

    Quick View Screenshot

    Labeling workflow

    Start and finish a labeling project with Label Studio by following these steps:

    1. Install Label Studio.

    2. Start Label Studio.

    3. Create accounts for Label Studio. Create an account to manage and set up labeling projects.

    4. Set up the labeling project. Define the type of labeling to perform on the dataset and configure project settings.

    5. Set up the labeling interface. Add the labels that you want annotators to apply and customize the labeling interface.

    6. Import data as labeling tasks.

    7. Label and annotate the data.

    8. Export the labeled data or the annotations.

    9. Create accounts for Label Studio. Create an account to manage and set up labeling projects.

    10. Restrict access to the project. Set up role-based access control. Only available in Label Studio Enterprise Edition.

    11. Set up the labeling project. Define the type of labeling to perform on the dataset and configure project settings.

    12. Set up the labeling interface. Add the labels that you want annotators to apply and customize the labeling interface.

    13. Import data as labeling tasks.

    14. Label and annotate the data.

    15. Review the annotated tasks. Only available in Label Studio Enterprise Edition.

    16. Export the labeled data or the annotations.

    Label Studio citations

    If you would like to cite Label Studio, you can add the following information to your references section:

    text
    @misc{Label Studio,
      title={{Label Studio}: Data labeling software},
      url={https://github.com/HumanSignal/label-studio},
      note={Open source software available from https://github.com/HumanSignal/label-studio},
      author={
        Maxim Tkachenko and
        Mikhail Malyuk and
        Andrey Holmanyuk and
        Nikolai Liubimov},
      year={2020-2025},
    }

    Architecture

    !!! error Enterprise
    You can use any of the Label Studio components in your own tools, or customize them to suit your needs. Before customizing Label Studio extensively, you might want to review Label Studio Enterprise Edition to see if it already contains the relevant functionality you want to build. See Label Studio Features for more.

    The component parts of Label Studio are available as modular extensible packages that you can integrate into your existing machine learning processes and tools.

    Module Technology Description
    Label Studio main app Python and Django The main app with most of the backend code for Label Studio; used to perform data labeling.
    Label Studio frontend JavaScript web app using React and MST Located within the main app repo. web/apps/labelstudio acts as the central integration point for all frontend elements. web/libs/editor is the frontend library.
    Data Manager JavaScript web app using React Manage data and tasks for labeling. Located under web/libs/datamanager in the main app repo.
    Machine Learning Backends Python Predict data labels at various parts of the labeling process.

    Source Guide Glossary (`docs/source/guide/glossary.md`)


    title: Label Studio terminology short: Terminology tier: all type: guide order: 16 order_enterprise: 16 meta_title: Label Studio terminology meta_description: A glossary of common terms seen throughout Label Studio. section: "Discover & Learn" date: 2023-10-27 11:38:25

    The following table describes some terms you might encounter as you use Label Studio:

    Term Description
    Annotations The output of a labeling task. Previously called "completions". The terms "annotations" and "labels" are frequently used interchangeably.
    Bounding box Region within an image.
    Dataset What you import into Label Studio, comprised of individual items, or labeling tasks.
    Labels What you add to each region while labeling a task in Label Studio.
    Label stream When you click Label All Tasks from the Data Manager, you are working within the label stream.
    Labeling configuration The labeling configuration determines what annotators and reviewers will see. It is configured in the project settings.
    Predictions, Pre-annotations Annotations in Label Studio format that machine learning models create for an unlabeled dataset. See import pre-annotations
    Relation A defined relationship between two labeled regions.
    Result A label applied to a specific region as stored in an annotation or prediction. See Label Studio JSON format of annotated tasks.
    Quick view The "quick view" is what you see when you click an individual item in the Data Manager to open it (different than viewing it in the "label stream").
    Record Item in a dataset.
    Region The portion of the task identified for labeling. For example, when working with text, this might be a specific span of text or field. For images, an example region is a bounding box. For text, an example region is a span of text. Often has a label assigned to it.
    Task When you upload data to Label Studio, each item in the dataset becomes a labeling task. A task is a distinct item from a dataset that is ready to be labeled, pre-annotated, or has already been annotated. For example: a text snippet, an image, or a video clip.
    Tags Configuration options to customize the labeling interface. See more about tags.
    Templates Example labeling configurations that you can use to specify the type of labeling that you're performing with your dataset. See all available templates

    Source Guide Google Saml (`docs/source/guide/google_saml.md`)


    title: Google SAML SSO Setup Example short: Google SAML SSO with Label Studio Setup Example tier: enterprise order: 253 meta_title: Google SAML SSO with Label Studio Setup Example meta_description: Label Studio Enterprise documentation for setting up Google as Identity Provider for SAML SSO Setup Example. hide_sidebar: true

    You can set up Label Studio to use Google's IdP for SSO.

    You will need the following permissions:

    Step 1: Get Label Studio ACS endpoints as a Service Provider (SP)

    1. Access Label Studio SSO settings:

      • Log in to Label Studio with an account that has the Owner or Administrator role.
      • Click the menu in the upper left and select Organization.
      • Select SSO & SAML in the upper right.
    2. Copy SAML configuration

      • From the Details for Identity Provider section, copy the following URLs:
        • Assertion Consumer Service (ACS) URL
        • Login URL
        • Logout URL

    Step 2: Configure Google Groups and Users

    1. Access Google Admin Console:

    2. Add a new group:

      • Click Create group and follow the steps to create and save a new group. In this example, the group is named "TestGroup."
    3. Assign users to the new group:

      • Go to Directory > Users.
      • Select the users you want to add to your new group.
      • Select More options > Add selected users to groups.

    Step 3: Configure Google as an Identity Provider (IdP)

    1. Access Google Admin console:

    2. Add a new SAML app:

      • Select Add App > Add custom SAML app.
      • Enter a name for the app (e.g. "Label Studio") and click Continue.
    3. Download IdP metadata:

      • When given the option, download the IdP metadata file for your new app. This file contains all the necessary information to configure Label Studio.
    4. Configure SAML settings:

      • In the Service Provider Details section, enter the following:
        • ACS URL: Paste the ACS URL copied from Label Studio.
        • Entity ID: Use the same URL as the ACS URL.
        • Start URL: (Optional) You can leave this blank or use the Login URL from Label Studio.
        • Signed Response: Leave this unchecked.
      • Click Continue.
    5. Map attributes:

      • In the Attribute Mapping section, map the following attributes:
        • Primary Email: Email
        • First Name: FirstName
        • Last Name: LastName
      • Click Finish.

    Step 4: Complete configuration in Label Studio

    1. Upload IdP Metadata:

      • Return to the Label Studio SSO & SAML settings page.
      • Scroll to Add metadata from Identity Provider.
      • Upload the IdP metadata file you downloaded from Google Admin console.
    2. Map Groups and Roles:

      • Set up group mappings to roles and workspaces as needed. Ensure the group names match those sent by Google in the SAML response.
    3. Save Configuration:

      • Click Save to apply the SSO configuration.

    Step 5: Complete configuration in the Google Admin console

    1. Return to the Google Admin console:

      • From the Google Admin console, go to Apps > Web and mobile apps.
      • Select the Label Studio app.
    2. Assign the Label Studio application to the group:

      • Click the User access card.
      • Search for and then assign the group to the app.
      • Enable the Service status toggle.

    Step 6: Test the configuration

    Log in using SSO:

    • Navigate to the Label Studio login page.
    • Click the SSO Login button and enter your company domain if prompted.
    • You should be redirected to the Google SSO login page. After successful authentication, you will be redirected back to Label Studio.

    Additional notes

    • If you encounter any issues, verify that the SAML attributes and URLs are correctly configured in both Label Studio and Google Admin Console.

    For more detailed information, you can refer to the


    Source Guide Ground Truths (`docs/source/guide/ground_truths.md`)


    title: Ground truth annotations short: Ground truth annotations tier: enterprise type: guide order: 0 order_enterprise: 305 meta_title: Ground truth annotations meta_description: Set ground truth annotations in Label Studio Enterprise. section: "Review & Measure Quality" date: 2024-09-30 13:57:28

    A "ground truth" annotation is a verified, high-quality annotation that serves as the correct answer for a specific task. It acts as a benchmark to assess the accuracy of other annotations and the performance of machine learning models.

    Label Studio Enterprise compares annotations from annotators and model predictions against the ground truth annotations for a task to calculate an accuracy score between 0 and 1.

    !!! error Enterprise
    Ground truth annotations are only available in Label Studio Enterprise Edition. If you're using Label Studio Community Edition, see Label Studio Features to learn more.

    Mark an annotation as a ground truth

    Open the task to review its annotations. Click the star icon at the bottom to set a specific annotation as the ground truth:

    !!! note
    A task can only have one annotation set as the ground truth annotation for the task. If you set a new annotation for a task as a ground truth, the previous annotation for that task set as a ground truth is updated to no longer be a ground truth annotation.

    Set ground truths by user

    To bulk update tasks to ensure that annotations from a specific annotator should be considered ground truth, first select the tasks you want to update.

    Then select Actions >Set Ground Truths. You can then select from a list of annotators.

    Review existing ground truth annotations

    You can identify which tasks already have a ground truth using the Ground Truth column in the Data Manager:

    You can also use a filter to include or exclude tasks that have ground truths set.

    View ground truths in the inter-annotator agreement popover

    Hover over the Agreement column to view a pop-over showing inter-annotator agreement. Annotations that have been marked ground truth are indicated with a star icon ⭐️:

    Remove ground truth annotations

    To remove a single ground truth annotation, simply open the task and click the star icon again to unset it.

    To remove multiple ground truth annotations, select the checkboxes next to the tasks in the Data Manager and then select Actions > Delete Ground Truths.


    Source Guide Helm Values (`docs/source/guide/helm_values.md`)


    title: Available Helm values for Label Studio Helm Chart short: Available Helm values tier: all type: guide order: 72 order_enterprise: 74 meta_title: Available Helm values for Label Studio Helm Chart meta_description: For cases when you want to customize your Label Studio Kubernetes deployment, review these available Helm values that you can set in your Helm chart. section: "Install & Setup" parent: "install_k8s" parent_enterprise: "install_enterprise_k8s"

    Refer to these tables with available Helm chart values for your values.yaml file
    when configuring your Label Studio deployment on Kubernetes. See Deploy Label Studio on Kubernetes for more.

    Refer to these tables with available Helm chart values for your values.yaml file
    when configuring your Label Studio deployment on Kubernetes. See Deploy Label Studio on Kubernetes for more.

    Global parameters

    Global parameters for the Helm chart.

    Parameter Description Default
    global.imagePullSecrets Global Docker registry secret names as an array []
    global.image.repository Image repository heartexlabs/label-studio
    global.image.pullPolicy Image pull policy IfNotPresent
    global.image.tag Image tag (immutable tags are recommended) develop
    global.pgConfig.host PostgreSQL hostname ""
    global.pgConfig.port PostgreSQL port 5432
    global.pgConfig.dbName PostgreSQL database name ""
    global.pgConfig.userName PostgreSQL database user account ""
    global.pgConfig.password.secretName Name of an existing secret holding the password of PostgreSQL database user account ""
    global.pgConfig.password.secretKey Key of an existing secret holding the password of PostgreSQL database user account ""
    global.pgConfig.ssl.pgSslMode PostgreSQL SSL mode ""
    global.pgConfig.ssl.pgSslSecretName Name of an existing secret holding the ssl certificate for PostgreSQL host ""
    global.pgConfig.ssl.pgSslRootCertSecretKey Key of an existing secret holding the ssl certificate for PostgreSQL host ""
    global.pgConfig.ssl.pgSslCertSecretKey Name of an existing secret holding the ssl certificate private key for PostgreSQL host ""
    global.pgConfig.ssl.pgSslKeySecretKey Key of an existing secret holding the ssl certificate private key for PostgreSQL host ""
    global.redisConfig.host Redis connection string in a format: redis://[:password]@localhost:6379/1 ""
    global.redisConfig.password.secretName Name of an existing secret holding the password of Redis database ""
    global.redisConfig.password.secretKey Key of an existing secret holding the password of Redis database ""
    global.redisConfig.ssl.redisSslCertReqs Whether to validate the server public key or ignore it. Accepts ("", "optional", "required"). ""
    global.redisConfig.ssl.redisSslSecretName Name of an existing secret holding the ssl certificate for Redis host ""
    global.redisConfig.ssl.redisSslCaCertsSecretKey Key of an existing secret holding the ssl certificate for Redis host ""
    global.redisConfig.ssl.redisSslCertFileSecretKey Name of an existing secret holding the ssl certificate private key for Redis host ""
    global.redisConfig.ssl.redisSslKeyFileSecretKey Key of an existing secret holding the ssl certificate private key for Redis host ""
    global.extraEnvironmentVars Key/value map of an extra Environment variables, for example, PYTHONUNBUFFERED: 1 {}
    global.extraEnvironmentSecrets Key/value map of an extra Secrets {}
    global.persistence.enabled Enable persistent storage. See more about setting up persistent storage true
    global.persistence.type Persistent storage type volume
    global.persistence.config.s3.accessKey Access key to use to access AWS S3 ""
    global.persistence.config.s3.secretKey Secret key to use to access AWS S3 ""
    global.persistence.config.s3.accessKeyExistingSecret Existing Secret name to extract Access key from to access AWS S3 ""
    global.persistence.config.s3.accessKeyExistingSecretKey Existing Secret key to extract Access key from to access AWS S3 ""
    global.persistence.config.s3.secretKeyExistingSecret Existing Secret name to extract Access secret key from to access AWS S3 ""
    global.persistence.config.s3.secretKeyExistingSecretKey Existing Secret key to extract Access secret key from to access AWS S3 ""
    global.persistence.config.s3.region AWS S3 region ""
    global.persistence.config.s3.bucket AWS S3 bucket name ""
    global.persistence.config.s3.folder AWS S3 folder name ""
    global.persistence.config.s3.urlExpirationSecs The number of seconds that a presigned URL is valid for 86400
    global.persistence.config.s3.endpointUrl Custom S3 URL to use when connecting to S3, including scheme ""
    global.persistence.config.volume.storageClass StorageClass for Persistent Volume ""
    global.persistence.config.volume.size Persistent volume size 10Gi
    global.persistence.config.volume.accessModes PVC Access mode [ReadWriteOnce]
    global.persistence.config.volume.annotations Persistent volume additional annotations {}
    global.persistence.config.volume.existingClaim Name of an existing PVC to use ""
    global.persistence.config.volume.resourcePolicy PVC resource policy ""
    global.persistence.config.volume.annotations Persistent volume additional annotations {}
    global.persistence.config.azure.storageAccountName Azure Storage Account Name to use to access Azure Blob Storage ""
    global.persistence.config.azure.storageAccountKey Azure Storage Account Key to use to access Azure Blob Storage ""
    global.persistence.config.azure.storageAccountNameExistingSecret Existing Secret name to extract Azure Storage Account Name from to access Azure Blob Storage ""
    global.persistence.config.azure.storageAccountNameExistingSecretKey Existing Secret key to extract Azure Storage Account Name from to use to access Azure Blob Storage ""
    global.persistence.config.azure.storageAccountKeyExistingSecret Existing Secret name to extract Azure Storage Account Key from to access Azure Blob Storage ""
    global.persistence.config.azure.storageAccountKeyExistingSecretKey Existing Secret key to extract Azure Storage Account Key from to use to access Azure Blob Storage ""
    global.persistence.config.azure.containerName Azure Storage container name ""
    global.persistence.config.azure.folder Azure Storage folder name ""
    global.persistence.config.azure.urlExpirationSecs The number of seconds that a presigned URL is valid for 86400
    global.persistence.config.gcs.projectID GCP Project ID to use ""
    global.persistence.config.gcs.applicationCredentialsJSON Service Account key to access GCS ""
    global.persistence.config.gcs.applicationCredentialsJSONExistingSecret Existing Secret name to extract Service Account Key from to access GCS ""
    global.persistence.config.gcs.applicationCredentialsJSONExistingSecretKey Existing Secret key to extract Service Account Key from to access GCS ""
    global.persistence.config.gcs.bucket GCS bucket name ""
    global.persistence.config.gcs.folder GCS folder name ""
    global.persistence.config.gcs.urlExpirationSecs The number of seconds that a presigned URL is valid for 86400
    global.featureFlags Key/value map of Feature Flags {}
    global.envInjectSources List of file names of a shell scripts to load additional environment variables from. This is useful when using Vault Agent Injector []
    global.cmdWrapper Additional commands to run prior to starting App. Useful to run wrappers before startup command ""
    global.customCaCerts List of file names of SSL certificates to add into trust chain []

    App parameters

    Parameters specific to the app portion of the Label Studio deployment.

    Parameter Description Default
    app.args Override default container args (useful when using custom images) ["label-studio-uwsgi"]
    app.deploymentStrategy.type Deployment strategy type RollingUpdate
    app.replicas Amount of app pod replicas 1
    app.NameOverride String to partially override release template name ""
    app.FullnameOverride String to fully override release template name ""
    app.resources.requests.memory The requested memory resources for the App container 384Mi
    app.resources.requests.cpu The requested cpu resources for the App container 250m
    app.resources.limits.memory The memory resources limits for the App container ""
    app.resources.limits.cpu The cpu resources limits for the App container ""
    app.initContainer.resources.requests Init container db-migrations resource requests {}
    app.initContainer.resources.limits Init container db-migrations resource limits {}
    app.readinessProbe.enabled Enable redinessProbe false
    app.readinessProbe.path Path for reasinessProbe /version
    app.readinessProbe.failureThreshold When a probe fails, Kubernetes will try failureThreshold times before giving up 2
    app.readinessProbe.initialDelaySeconds Number of seconds after the container has started before probe initiates 60
    app.readinessProbe.periodSeconds How often (in seconds) to perform the probe 10
    app.readinessProbe.successThreshold Minimum consecutive successes for the probe to be considered successful after having failed 1
    app.readinessProbe.timeoutSeconds Number of seconds after which the probe times out 5
    app.livenessProbe.enabled Enable livenessProbe true
    app.livenessProbe.path Path for livenessProbe /health
    app.livenessProbe.failureThreshold When a probe fails, Kubernetes will try failureThreshold times before giving up 3
    app.livenessProbe.initialDelaySeconds Number of seconds after the container has started before probe initiates 60
    app.livenessProbe.periodSeconds How often (in seconds) to perform the probe 10
    app.livenessProbe.successThreshold Minimum consecutive successes for the probe to be considered successful after having failed 1
    app.livenessProbe.timeoutSeconds Number of seconds after which the probe times out 5
    app.extraEnvironmentVars A map of extra environment variables to set {}
    app.extraEnvironmentSecrets A map of extra environment secrets to set {}
    app.nodeSelector Labels for pod assignment, formatted as a multi-line string or YAML map {}
    app.annotations k8s annotations to attach to the app pods {}
    app.extraLabels extra k8s labels to attach {}
    app.affinity Affinity for pod assignment {}
    app.tolerations Toleration settings for pod []
    app.nginx.resources.requests Nginx sidecar container: resource requests {}
    app.nginx.resources.limits Nginx sidecar container: resource limits {}
    app.dnsPolicy Pod DNS policy ClusterFirst
    app.enableServiceLinks Service environment variables false
    app.shareProcessNamespace Enable shared process namespace in a pod false
    app.automountServiceAccountToken Automount service account token for the server service account true
    app.serviceAccount.create Enable the creation of a ServiceAccount for app pod true
    app.serviceAccount.name Name of the created ServiceAccount
    app.serviceAccount.annotations Custom annotations for app ServiceAccount {}
    app.podSecurityContext.enabled Enable pod Security Context true
    app.podSecurityContext.fsGroup Group ID for the pod 1001
    app.containerSecurityContext.enabled Enable container security context true
    app.containerSecurityContext.runAsUser User ID for the container 1001
    app.containerSecurityContext.runAsNonRoot Avoid privilege escalation to root user true
    app.extraVolumes Array to add extra volumes []
    app.extraVolumeMounts Array to add extra mounts (normally used with extraVolumes) []
    app.topologySpreadConstraints Topology Spread Constraints for pod assignment []
    app.nginx.args Override default container args (useful when using custom images) ["nginx"]
    app.nginx.livenessProbe.enabled Nginx sidecar container: Enable livenessProbe true
    app.nginx.livenessProbe.path Nginx sidecar container: path for livenessProbe /nginx_health
    app.nginx.livenessProbe.failureThreshold Nginx sidecar container: when a probe fails, Kubernetes will try failureThreshold times before giving up 2
    app.nginx.livenessProbe.initialDelaySeconds Nginx sidecar container: Number of seconds after the container has started before probe initiates 60
    app.nginx.livenessProbe.periodSeconds Nginx sidecar container: How often (in seconds) to perform the probe 5
    app.nginx.livenessProbe.successThreshold Nginx sidecar container: Minimum consecutive successes for the probe to be considered successful after having failed 1
    app.nginx.livenessProbe.timeoutSeconds Nginx sidecar container: Number of seconds after which the probe times out 3
    app.nginx.readinessProbe.enabled Nginx sidecar container: Enable readinessProbe true
    app.nginx.readinessProbe.path Nginx sidecar container: Path for readinessProbe /version
    app.nginx.readinessProbe.failureThreshold Nginx sidecar container: When a probe fails, Kubernetes will try failureThreshold times before giving up 2
    app.nginx.readinessProbe.initialDelaySeconds Nginx sidecar container: Number of seconds after the container has started before probe initiates 60
    app.nginx.readinessProbe.periodSeconds Nginx sidecar container: How often (in seconds) to perform the probe 10
    app.nginx.readinessProbe.successThreshold Nginx sidecar container: Minimum consecutive successes for the probe to be considered successful after having failed 1
    app.nginx.readinessProbe.timeoutSeconds Nginx sidecar container: Number of seconds after which the probe times out 5
    app.service.type k8s service type ClusterIP
    app.service.port k8s service port 80
    app.service.targetPort k8s service target port 8085
    app.service.portName k8s service port name service
    app.service.annotations Custom annotations for app service {}
    app.service.sessionAffinity Custom annotations for app service None
    app.service.sessionAffinityConfig Additional settings for the sessionAffinity {}
    app.ingress.enabled Set to true to enable ingress record generation false
    app.ingress.className IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+) ""
    app.ingress.host Default host for the ingress resource ""
    app.ingress.path The Path to LabelStudio. You may need to set this to '/*' in order to use this with ALB ingress controllers. /
    app.ingress.extraPaths Extra paths to prepend to the host configuration []
    app.ingress.tls TLS secrets definition []
    app.ingress.annotations Additional ingress annotations {}
    app.rbac.create Specifies whether RBAC resources should be created for app service false
    app.rbac.rules Custom RBAC rules to set for app service []
    app.contextPath Context path appended for health/readiness checks /
    app.cmdWrapper Additional commands to run prior to starting App. Useful to run wrappers before startup command ""

    Rqworker parameters

    Parameters specific to the rqworkers service of your Label Studio Enterprise deployment.

    Parameter Description Default
    rqworker.enabled Enable rqworker pod true
    rqworker.NameOverride String to partially override release template name ""
    rqworker.FullnameOverride String to fully override release template name ""
    rqworker.deploymentStrategy.type Deployment strategy type Recreate
    rqworker.extraEnvironmentVars A map of extra environment variables to set {}
    rqworker.extraEnvironmentSecrets A map of extra environment secrets to set {}
    rqworker.nodeSelector labels for pod assignment, formatted as a multi-line string or YAML map {}
    rqworker.annotations k8s annotations to attach to the rqworker pods {}
    rqworker.extraLabels extra k8s labels to attach {}
    rqworker.affinity Affinity for pod assignment {}
    rqworker.tolerations Toleration settings for pod []
    rqworker.queues.high.replicas Rqworker queue "high" replicas amount 1
    rqworker.queues.high.args Rqworker queue "high" launch arguments "high"
    rqworker.queues.low.replicas Rqworker queue "low" replicas amount 1
    rqworker.queues.low.args Rqworker queue "low" launch arguments "low"
    rqworker.queues.default.replicas Rqworker queue "default" replicas amount 1
    rqworker.queues.default.args Rqworker queue "default" launch arguments "default"
    rqworker.queues.critical.replicas Rqworker queue "critical" replicas amount 1
    rqworker.queues.critical.args Rqworker queue "critical" launch arguments "critical"
    rqworker.queues.all.replicas Rqworker queue "all" replicas amount 1
    rqworker.queues.all.args Rqworker queue "all" launch arguments "low", "default", "critical", "high"
    rqworker.dnsPolicy Pod DNS policy ClusterFirst
    rqworker.enableServiceLinks Service environment variables false
    rqworker.shareProcessNamespace Enable shared process namespace in a pod false
    rqworker.automountServiceAccountToken Automount service account token for the server service account true
    rqworker.readinessProbe.enabled Enable redinessProbe false
    rqworker.readinessProbe.path Path for reasinessProbe /version
    rqworker.readinessProbe.failureThreshold When a probe fails, Kubernetes will try failureThreshold times before giving up 2
    rqworker.readinessProbe.initialDelaySeconds Number of seconds after the container has started before probe initiates 60
    rqworker.readinessProbe.periodSeconds How often (in seconds) to perform the probe 5
    rqworker.readinessProbe.successThreshold Minimum consecutive successes for the probe to be considered successful after having failed 1
    rqworker.readinessProbe.timeoutSeconds Number of seconds after which the probe times out 3
    rqworker.livenessProbe.enabled Enable livenessProbe false
    rqworker.livenessProbe.path Path for livenessProbe /health
    rqworker.livenessProbe.failureThreshold When a probe fails, Kubernetes will try failureThreshold times before giving up 2
    rqworker.livenessProbe.initialDelaySeconds Number of seconds after the container has started before probe initiates 60
    rqworker.livenessProbe.periodSeconds How often (in seconds) to perform the probe 5
    rqworker.livenessProbe.successThreshold Minimum consecutive successes for the probe to be considered successful after having failed 1
    rqworker.livenessProbe.timeoutSeconds Number of seconds after which the probe times out 3
    rqworker.serviceAccount.create Enable the creation of a ServiceAccount for rqworker pod true
    rqworker.serviceAccount.name Name of the created ServiceAccount ""
    rqworker.podSecurityContext.enabled Enable pod Security Context true
    rqworker.podSecurityContext.fsGroup Group ID for the pod 1001
    rqworker.containerSecurityContext.enabled Enable container security context true
    rqworker.containerSecurityContext.runAsUser User ID for the container 1001
    rqworker.containerSecurityContext.runAsNonRoot Avoid privilege escalation to root user true
    rqworker.serviceAccount.annotations Custom annotations for app ServiceAccount {}
    rqworker.extraVolumes Array to add extra volumes []
    rqworker.extraVolumeMounts Array to add extra mounts (normally used with extraVolumes) []
    rqworker.topologySpreadConstraints Topology Spread Constraints for pod assignment []
    rqworker.rbac.create Specifies whether RBAC resources should be created for rqworker service false
    rqworker.rbac.rules Custom RBAC rules to set for rqworker service []
    rqworker.cmdWrapper Additional commands to run prior to starting App. Useful to run wrappers before startup command ""

    Label Studio Enterprise parameters

    Parameter Description Default
    enterprise.enabled Enable Enterprise features false
    enterprise.enterpriseLicense.secretName Name of an existing secret holding the Label Studio Enterprise license information ""
    enterprise.enterpriseLicense.secretKey Key of an existing secret holding the enterprise license information license

    Sub-charts parameters

    Parameter Description Default
    postgresql.enabled Enable Postgresql sub-chart true
    postgresql.architecture PostgreSQL architecture (standalone or replication) standalone
    postgresql.image.tag PostgreSQL image tag 13.8.0
    postgresql.auth.username Name for a custom user to create labelstudio
    postgresql.auth.password Password for the custom user to create. Ignored if auth.existingSecret with key password is provided labelstudio
    postgresql.auth.database Name for a custom database to create labelstudio
    redis.enabled Enable Redis sub-chart false
    redis.architecture Redis architecture. Allowed values: standalone or replication standalone
    redis.auth.enabled Enable password authentication false

    Other parameters

    Parameter Description Default
    upgradeCheck.enabled Enable upgradecheck false
    ci Indicate that deployment running for CI purposes false
    clusterDomain Kubernetes Cluster Domain cluster.local
    checkConfig.skipEnvValues Skip validation for env variables false

    The `global.extraEnvironmentVars` usage

    The global.extraEnvironmentVars section can be used to configure environment properties of Label Studio.

    Any key value put under this section translates to environment variables used to control Label Studio's configuration. Every key is upper-cased before setting the environment variable.

    An example:

    yaml
    global:
      extraEnvironmentVars:
         PG_USER: labelstudio

    !!! note
    If you are deploying to a production environment, you should set SSRF_PROTECTION_ENABLED: true. See Secure Label Studio.

    Lower the seat limit of your license

    Set LICENSE_MAX_USERS_OVERRIDE to use fewer seats than your license allows, for example to keep a staging deployment within a smaller budget:

    yaml
    global:
      extraEnvironmentVars:
         LICENSE_MAX_USERS_OVERRIDE: 50

    By default this variable is not set and the seat count from your license applies. It can only lower that count: if you set it higher than your licensed seats, or below 1, the deployment fails to start. The license itself is not modified, so removing the variable and restarting restores the licensed seat count.

    Because on-premise seats are counted across all organizations in the deployment, the override applies to the whole deployment rather than to a single organization. It also lowers the number of free View-Only seats when your license does not set them explicitly. See Usage & License.


    Source Guide Hotkeys (`docs/source/guide/hotkeys.md`)


    title: Hotkeys short: Hotkeys tier: all type: guide order: 138 order_enterprise: 138 meta_title: Hotkeys in Label Studio section: "Create & Manage Projects" parent: "labeling" parent_enterprise: "labeling" date: 2025-05-24 17:19:21

    Use keyboard shortcuts, or hotkeys, to improve your labeling performance.

    View out-of-the-box hotkeys

    From the labeling editor, click the settings icon to see more details about hotkeys or to enable or disable hotkeys.

    !!! info Tip
    If enter is specified and you have a Mac keyboard, use return instead. Use delete instead of backspace, and option instead of alt.

    Customize global hotkeys from your account page

    You can easily customize global hotkeys on from the Account & Settings > Hotkeys page.

    Customize global hotkeys using environment variables

    If you want to change the hotkeys used for specific actions, set the EDITOR_KEYMAP environment variable with valid JSON in your .env file or when starting Label Studio. For example, to change the keyboard shortcut used to submit an annotation to shift + s, set the environment variable as follows:

    text
    EDITOR_KEYMAP='{"annotation:submit":{"key": "shift+s","description": "My Custom Submit Hotkey!"}}'

    This overwrites the existing hotkey mapping with your custom mapping. See more about how to set environment variables.

    Refer to the full list of customizable hotkeys in the keymap.json file to update a different hotkey combination.

    You cannot use this environment variable to remove an existing or add a new keyboard shortcut.

    Use the `` tag

    Use the Shortcut tag to allow annotators to insert a predefined text snippet into their current annotation.

    They can do this by either clicking the shortcut button or by pressing its hotkey.

    !!! info Tip
    Shortcuts work inside control tags (e.g., <TextArea>, <Labels>)

    For example, use the following to insert predefined text into a text area:

    html
    <View>
      <Image name="image" value="$captioning"/>
      <Header value="Describe the image:"/>
      <TextArea name="caption" toName="image">
        
        <Shortcut alias="Car" value="CAR" hotkey="ctrl+1" background="#333333"/>
        
        <Shortcut alias="Airplane"   value="AIRPLANE"   hotkey="ctrl+2" background="#FFEE00"/>
      </TextArea>
    </View>

    Source Guide Ingress Config (`docs/source/guide/ingress_config.md`)


    title: Set up an ingress controller for Label Studio Kubernetes deployments short: Set up an ingress controller type: guide tier: all order: 70 order_enterprise: 70 meta_title: Set up an ingress controller for Label Studio Kubernetes Deployments meta_description: Set up an ingress controller to manage load balancing and access to Label Studio Kubernetes deployments for your data science and machine learning projects. section: "Install & Setup" parent: "install_k8s" parent_enterprise: "install_enterprise_k8s"

    Set up an ingress controller to manage Ingress, the Kubernetes resource that exposes HTTP and HTTPS routes from outside your Kubernetes cluster to the services within the cluster, such as Label Studio rqworkers and others.

    Select the best option for your deployment:

    • Ingress for Amazon Elastic Kubernetes Service (EKS)
    • Ingress for Google Kubernetes Engine (GKE)
    • Ingress for Microsoft Azure Kubernetes Service (AKS)
    • Ingress using nginx (cloud-agnostic)
    • Terminate TLS on the Load Balancer (cloud-agnostic)

    Configure ingress before or after setting up persistent storage, but before you deploy Label Studio.

    !!! note
    You only need to set up an ingress controller if you plan to deploy Label Studio on Kubernetes.

    Configure ingress for Amazon EKS

    If you plan to deploy Label Studio onto Amazon EKS, configure ingress.

    1. Install the AWS Load Balancer Controller to install an ingress controller with default options. See the documentation for AWS Load Balancer Controller in the Amazon EKS user guide.
    2. After installing the AWS Load Balancer Controller, configure SSL certificates using the AWS Certificate Manager (ACM). See Requesting a public certificate in the ACM user guide.
    3. Update your ls-values.yaml file with the ingress details like the following example. Replace "your_domain_name" with your hostname.
    yaml
    app:
      ingress:
        enabled: true
        path: /*
        host: "your_domain_name"
        className: alb
        annotations: 
          alb.ingress.kubernetes.io/scheme: internet-facing
          alb.ingress.kubernetes.io/target-type: ip

    !!! note
    If you want to configure a certificate that you create in the ACM for the load balancer, add this annotation (updated for your certificate) to your ls-values.yaml file:

    text
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:account-id:certificate/aaaa-bbbb-cccc

    For more details about annotations that you can configure with ingress, see the guide on Ingress annotations in the AWS Load Balancer Controller documentation on GitHub.

    Configure ingress for GKE

    Google Kubernetes Engine (GKE) contains two pre-installed Ingress classes:

    • The gce class deploys an external load balancer
    • The gce-internal class deploys an internal load balancer

    Label Studio is considered as an external service, so you want to use the gce class to deploy an external load balancer.

    1. Update your ls-values.yaml file with the ingress details like the following example. Replace "your_domain_name" with your hostname.
    yaml
    app:
      service:
        type: nodePort
      ingress:
        enabled: true
        path: /*
        host: "your_domain_name"
        className: gce

    !!! note
    You can also request Google-managed SSL certificates to use on the load balancer. See the details on Using Google-managed SSL certificates in the Google Kubernetes Engine how-to guide. If you use a managed certificate, add an annotation to your ls-values.yaml file like the following example, replacing "managed-cert" with your ManagedCertificate object name:

    yaml
    "networking.gke.io/managed-certificates": "managed-cert"

    For more details about annotations and ingress in GKE, see Configuring Ingress for external load balancing in the Google Kubernetes Engine how-to guide.

    Configure ingress for Microsoft Azure Kubernetes Service

    Configure ingress for Microsoft Azure Kubernetes Service (AKS).

    1. Deploy an Application Gateway Ingress Controller (AGIC) using a new Application Gateway. See How to Install an Application Gateway Ingress Controller (AGIC) Using a New Application Gateway in the Microsoft Azure Ingress for AKS how-to guide.
    2. Update your ls-values.yaml file with the ingress details like the following example. Replace "your_domain_name" with your hostname.
    yaml
    app:
      ingress:
        enabled: true
        host: "your_domain_name"
        className: azure/application-gateway

    !!! note
    You can create a self-signed certificate to use in AGIC. Follow the steps to Create a self-signed certificate in the Microsoft Azure Networking Tutorial: Configure an application gateway with TLS termination using the Azure portal.

    For more details about using AGIC with Microsoft Azure, see What is Application Gateway Ingress Controller? and Annotations for Application Gateway Ingress Controller in the Microsoft Azure Application Gateway documentation.

    Set up a cloud-agnostic ingress configuration

    For advanced Kubernetes administrators, you can use the NGINX Ingress Controller to set up a cloud-agnostic ingress controller.

    1. Deploy NGINX Ingress Controller following the relevant steps for your cloud deployment. See Cloud deployments in the NGINX Ingress Controller Installation Guide.
    2. In order to terminate SSL certificates in the ingress controller, install cert-manager. See Installation on the cert-manager documentation site.
    3. You must synchronize the ingress hosts with DNS. Install ExternalDNS and choose the relevant cloud provider for your deployment.
    4. Finally, update your ls-values.yaml file with the ingress details like the following example. Replace "your_domain_name" with your hostname and <CERTIFICATE_NAME> with the name of the resource that you created with ExternalDNS.
    yaml
    app:
      ingress:
        enabled: true
        host: "your_domain_name"
        className: nginx
        tls:
          - secretName: <CERTIFICATE_NAME>
            hosts:
              - "your_domain_name"

    Terminate TLS on the Load Balancer

    If SSL termination is happening on a Load Balancer before traffic is forwarded to the Ingress, you'll need to set the LABEL_STUDIO_HOST environment variable.

    Update your ls-values.yaml file with the LABEL_STUDIO_HOST environment variable like the following example. Replace "your_domain_name" with your hostname.

    yaml
    global:
      extraEnvironmentVars:
        LABEL_STUDIO_HOST: https://your_domain_name

    Handle large file uploads with NGINX ingress

    When uploading large files through an NGINX ingress controller, you might encounter a "413 Request Entity Too Large" error. This happens because NGINX has a default limit of 1MB on the size of client request body.

    To handle large file uploads, you can configure the proxy-body-size annotation in your ingress configuration. Update your ls-values.yaml file to include this annotation:

    yaml
    app:
      ingress:
        annotations:
          nginx.ingress.kubernetes.io/proxy-body-size: "200m"

    If you're using a different ingress controller, consult the documentation for that specific controller to learn how to configure request body size limits. For example:

    • For HAProxy Ingress Controller, use the haproxy.org/client-max-body-size annotation
    • For Traefik, configure the maxRequestBodyBytes middleware
    • For AWS ALB Ingress Controller, the maximum request body size is controlled by the ALB settings

    The exact configuration will depend on your ingress controller type and version. Refer to your controller's documentation for the specific annotation or configuration needed.


    Source Guide Install (`docs/source/guide/install.md`)


    title: Installation type: guide tier: opensource order: 60 order_enterprise: 0 meta_title: Install and Upgrade Label Studio meta_description: "Label Studio documentation: install and upgrade Label Studio with Docker, pip, and anaconda for your machine learning and data science projects." section: "Install & Setup"

    Install Label Studio on premises or in the cloud. Choose the installation method that works best for your environment:

    Label Studio is also available an enterprise product, which you can explore instantly through a free trial.

    {% insertmd includes/deploy.md %}

    Web browser support

    Label Studio is tested with the latest version of Google Chrome.

    If using other web browsers, or older versions of supported web browsers, unexpected behavior could occur.

    Install prerequisite

    Install Label Studio in a clean Python environment. We highly recommend using a virtual environment (venv or conda) to reduce the likelihood of package conflicts or missing packages.

    Install using pip

    To install Label Studio with pip and a virtual environment, you need Python version 3.8 or later. Run the following:

    bash
    python3 -m venv env
    source env/bin/activate
    python -m pip install label-studio

    To install Label Studio with pip, you need Python version 3.8 or later. Run the following:

    bash
    pip install label-studio

    After you install Label Studio, start the server with the following command:

    bash
    label-studio

    The default web browser will automatically open at http://localhost:8080 with Label Studio. Please refer to start Label Studio for more options when starting Label Studio.

    Install using Homebrew

    To install Label Studio with Brew, you need to have Brew package manager installed on your system. If you do not have Brew installed, please visit brew.sh for installation instructions.

    Execute the following command to add the Heartexlabs tap:

    bash
    brew tap humansignal/tap

    Execute the following command to install Label Studio:

    bash
    brew install humansignal/tap/label-studio

    After you install Label Studio, initiate the server using the following command:

    bash
    label-studio

    The default web browser will automatically open at http://localhost:8080 with Label Studio. Please refer to start Label Studio for more options when starting Label Studio.

    !!! note
    If you've previously installed the brew tap from the now-deprecated organization name heartexlabs/tap, we've got good news. You don't have to worry about migrating immediately. The deprecated tap has been set up as a mirror for humansignal/tap. This ensures continuity and minimizes disruptions for existing users.

    Install with Docker

    Label Studio is also available as a Docker container. Make sure you have Docker installed on your machine.

    Install with Docker on \*nix

    To install and start Label Studio at http://localhost:8080, storing all labeling data in ./mydata directory, run the following:

    bash
    docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest

    !!! attention "important"
    As this is a non-root container, the mounted files and directories must have the proper permissions for the UID 1001.

    Install with Docker on Windows

    Or for Windows, you have to modify the volumes paths set by -v option.

    Override the default Docker install

    You can override the default Docker install by appending new arguments.

    In Windows Command Line (cmd):

    bash
    docker run -it -p 8080:8080 -v %cd%/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

    In PowerShell:

    bash
    docker run -it -p 8080:8080 -v ${PWD}/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

    Build a local image with Docker

    If you want to build a local image, run:

    bash
    docker build -t heartexlabs/label-studio:latest .

    Run with Docker Compose

    Use Docker Compose to serve Label Studio at http://localhost:8080. You must use Docker Compose version 1.25.0 or higher.

    Start Label Studio:

    bash
    docker-compose up -d

    This starts Label Studio with a PostgreSQL database backend. You can also use a PostgreSQL database without Docker Compose. See Set up database storage.

    Install Label Studio without internet access

    Download label-studio docker image (host with internet access and docker):

    bash
    docker pull heartexlabs/label-studio:latest

    Export it as a tar archive:

    bash
    docker save heartexlabs/label-studio:latest | gzip > label_studio_latest.tar.gz

    Transfer it to another VM:

    bash
    scp label_studio_latest.tar.gz <ANOTHER_HOST>:/tmp

    SSH into <ANOTHER_HOST> and load the image from the archive:

    bash
    docker load --input /tmp/label_studio_latest.tar.gz

    Follow steps from Install and Upgrade to run LS.

    Install on Ubuntu

    To install Label Studio on Ubuntu and run it in a virtual environment, run the following command:

    bash
    python3 -m venv env
    source env/bin/activate
    sudo apt install python3.9-dev
    python -m pip install label-studio

    Install from source

    If you want to use nightly builds or extend the functionality, consider downloading the source code using Git and running Label Studio locally:

    bash
    git clone https://github.com/HumanSignal/label-studio.git
    
    # install dependencies
    cd label-studio
    pip install poetry
    poetry install
    
    # run db migrations
    poetry run python label_studio/manage.py migrate
    
    # collect static files
    poetry run python label_studio/manage.py collectstatic
    
    # start the server in development mode at http://localhost:8080
    poetry run python label_studio/manage.py runserver

    Install with Anaconda

    bash
    conda create --name label-studio
    conda activate label-studio
    conda install psycopg2  # required for LS 1.7.2 only
    pip install label-studio

    Upgrade Label Studio

    To upgrade to the latest version of Label Studio, reinstall or upgrade using pip.

    bash
    pip install --upgrade label-studio

    Migration scripts run when you upgrade to version 1.0.0 from version 0.9.1 or earlier.

    To make sure an existing project gets migrated, when you start Label Studio, run the following command:

    bash
    label-studio start path/to/old/project

    The most important change to be aware of is changes to rename "completions" to "annotations". See the updated JSON format for completed tasks.

    If you customized the Label Studio Frontend, see the Frontend reference guide for required updates to maintain compatibility with version 1.0.0.


    Source Guide Install Enterprise (`docs/source/guide/install_enterprise.md`)


    title: Installation overview short: Installation tier: enterprise type: guide order: 0 order_enterprise: 60 meta_title: Installation overview for Label Studio Enterprise meta_description: Overview of the components involved when installing Label Studio Enterprise as an on-prem deployment section: "Install & Setup"

    The two central components of Label Studio Enterprise are the main app and the RQ (Redis Queue) workers. An on-prem deployment typically also includes the following components:

    • Identity provider: An external IdP that connects to the main app to send a SAML or SCIM2.0 assertion to Label Studio. Identity providers help you manage user credentials and access. Common IdPs include Okta, Ping, Microsoft Active Directory.

      While integrating an identity provider is recommended for managing user authentication and access control in a more scalable and secure manner, Label Studio Enterprise can be deployed with its own internal user management system if preferred.

    • Load balancer/ingress: This serves as a traffic manager that directs incoming network requests to the main app.

    • PostgresSQL database: This connects with the main app to store annotation metadata. It also connects with the RQ workers to store reports and pre-annotations.

    • Redis: This works with the main app to perform background tasks such as computing statistical reports and predictions. It also communicates with the RQ workers to manage the background jobs queue.

    • Cloud storage: Cloud storage works with both the main app and the RQ workers to manage assets and data.

      • Persistent storage for assets such as avatars and snapshots.
      • Import storage that passes data to Label Studio to be used in labeling tasks.
      • Export storage for saving the exported annotation data as those tasks are labeled.
    • Integrations: For example, these can be a custom ML backend that calculates pre-annotations, or any other third-party services that you integrate with Label Studio using webhooks.


    Source Guide Install Enterprise Docker (`docs/source/guide/install_enterprise_docker.md`)


    title: Install Label Studio Enterprise On-premises using Docker Compose short: Install using Docker type: guide tier: enterprise order: 0 order_enterprise: 75 meta_title: Install Label Studio Enterprise on-premises using Docker meta_description: Install, back up, and upgrade Label Studio Enterprise with Docker to create machine learning and data science projects on-premises. section: "Install & Setup" parent_enterprise: "install_enterprise"

    Install Label Studio Enterprise on-premises if you need to meet strong privacy regulations, legal requirements, or want to manage a custom installation on your own infrastructure using Docker or public cloud. If you want to use a different installation method:

    See Secure Label Studio for more details about security and hardening for Label Studio Enterprise.

    !!! note
    Docker deployments are more suitable for proof-of-concept builds and small projects. For production environments and larger deployments, we strongly recommend using Kubernetes. Kubernetes deployments provide better scalability, reliability, and access to advanced features such as Prompts. See Deploy Label Studio Enterprise on Kubernetes for more information.

    To install Label Studio Community Edition, see Install Label Studio. This page is specific to the Enterprise version of Label Studio.

    !!! note
    On-prem deployments of Label Studio Enterprise are not supported for Academic licenses.

    {% insertmd includes/deploy.md %}

    Install Label Studio Enterprise using Docker

    1. Log in to a Docker registry.
    2. Add the license file.
    3. Start the server using Docker Compose.

    Prerequisites

    Make sure you have an authorization token to retrieve Docker images and a current license file. If you are a Label Studio Enterprise customer and do not have access, email support or open a ticket through our support portal to receive an authorization token and a copy of your license file.

    Make sure Docker Compose is installed on your system.

    After you install Label Studio Enterprise, the app is automatically connected to the following running services:

    • PostgresSQL (versions >=13)
    • Redis (version >=6.0)

    Log in to a Docker registry

    You must be authorized to access Label Studio Enterprise images.

    Set up the Docker login to retrieve the latest Docker image:

    bash
    docker login --username heartexlabs

    When prompted to enter the password, enter the token. If login succeeds, a ~/.docker/config.json file is created with the authorization settings.

    !!! note
    If you have default registries specified when logging into Docker, you might need to explicitly specify the registry: docker login --username heartexlabs docker.io.

    Add the license file

    After you retrieve the latest Label Studio Enterprise image, add the license file. You can't start the Docker image without a license file.

    1. Create a working directory called label-studio-enterprise and place the license file in it.
    bash
    mkdir -p label-studio-enterprise
    cd label-studio-enterprise
    1. Move the license file, license.txt, to the label-studio-enterprise directory.

    Start using Docker Compose

    To run Label Studio Enterprise in production, start it using Docker compose. This configuration lets you connect Label Studio to external databases and services.

    1. Create a file, label-studio-enterprise/env.list with the required environment variables:
    text
    /* Detailed source-code truncated for AI context efficiency. */
    1. After you set all the environment variables, create the following docker-compose.yml:
    text
    /* Detailed source-code truncated for AI context efficiency. */
    1. Run Docker Compose:
    bash
    docker-compose up

    !!! note
    If you expose port 80, you must start Docker with sudo.

    Get the Docker image version

    To check the version of the Label Studio Enterprise Docker image, use the docker ps command on the host.

    From the command line, run the following as root or using sudo and review the output:

    bash
    $ docker ps
    03b88eebdb65   heartexlabs/label-studio-enterprise:2.2.8-1   "uwsgi --ini deploy/…"   36 hours ago   Up 36 hours   0.0.0.0:80->8000/tcp   label-studio-enterprise_app_1

    In this example output, the image column displays the Docker image and version number. The image heartexlabs/label-studio-enterprise:2.2.8-1 is using the version 2.2.8-1.


    Source Guide Install Enterprise K8s (`docs/source/guide/install_enterprise_k8s.md`)


    title: Deploy Label Studio Enterprise on Kubernetes
    short: Install using Kubernetes
    tier: enterprise
    type: guide
    order: 0
    order_enterprise: 69
    meta_title: Deploy Label Studio Enterprise on Kubernetes
    meta_description: Deploy Label Studio Enterprise on Kubernetes, such as on Amazon Elastic Container Service for Kubernetes, to create machine learning and data science projects in a scalable containerized environment.
    section: "Install & Setup"
    parent_enterprise: "install_enterprise"


    Deploy Label Studio Enterprise on a Kubernetes Cluster using Helm 3. You can use this Helm chart to set up Label Studio Enterprise for deployment onto a Kubernetes cluster and install, upgrade, and manage the application.

    Your Kubernetes cluster can be self-hosted or installed somewhere such as Amazon EKS. See the Amazon tutorial on how to Deploy a Kubernetes Application with Amazon Elastic Container Service for Kubernetes for more about deploying an app on Amazon EKS.

    !!! warning
    To install Label Studio Community Edition, see Deploy Label Studio on Kubernetes. This page is specific to the Enterprise version of Label Studio.

    !!! note
    On-prem deployments of Label Studio Enterprise are not supported for Academic licenses.

    This high-level architecture diagram that outlines the main components of a Label Studio Enterprise deployment.

    !!! warning
    Label Studio Enterprise 2.2.9 decommissioned MinIO as a service.

    Label Studio Enterprise runs on Python and uses rqworkers to perform additional tasks. Metadata and annotations are stored in a bundled version of PostgreSQL that functions as persistent storage. If you host Label Studio Enterprise in the cloud, use persistent storage in the cloud instead of MinIO.

    Install Label Studio Enterprise on Kubernetes

    If you want to install Label Studio Enterprise on Kubernetes and you have unrestricted access to the internet from your K8s cluster, follow these steps.

    1. Verify that you meet the Required software prerequisites and review the capacity planning guidance.
    2. Prepare the Kubernetes cluster.
    3. Add the Helm chart repository.
    4. Configure Kubernetes secrets
    5. Configure persistent storage.
    6. Configure ingress.
    7. Configure a values.yaml file.
    8. (Optional) Set up TLS for PostgreSQL
    9. (Optional) Set up TLS for Redis
    10. Use Helm to install Label Studio Enterprise on your Kubernetes cluster.

    If you use a proxy to access the internet from your Kubernetes cluster, or it is airgapped from the internet, see how to Install Label Studio Enterprise without public internet access.

    Required software prerequisites

    • Kubernetes — version 1.17 or higher
    • Helm — version 3.6.3 or higher
    • Redis — version 6.0.5 or higher
    • PostgreSQL — version 14.0 or higher
    • Persistent storage — PVC with ReadWriteMany access mode or S3-compatible object storage

    Redis and PostgreSQL are mandatory components of Label Studio Enterprise and are required for it to be fully functional. This chart does not include or install Redis or PostgreSQL; you must have them preconfigured (for example, according to your company’s standards) and provide connection details in your Helm values.

    Persistent storage must use one of the following: a Persistent Volume Claim (PVC) with ReadWriteMany access mode, or S3-compatible object storage. See Set up persistent storage for configuration details.

    This chart has been tested and confirmed to work with the NGINX Ingress Controller and cert-manager. See Set up an ingress controller for Label Studio Kubernetes deployments for more on ingress settings with Label Studio.

    Your Kubernetes cluster can be self-hosted or installed somewhere such as Amazon EKS.

    Capacity planning

    To plan the capacity of your Kubernetes cluster, refer to these guidelines.

    Label Studio Enterprise has the following default configurations for resource requests, resource limits, and replica counts:

    yaml
    app:
      replicas: 1
      resources:
        requests:
          memory: 1024Mi
          cpu: 1000m
        limits:
          memory: 6144Mi
          cpu: 4000m
    
    rqworker:
      queues:
        high:
          replicas: 1
        low:
          replicas: 1
        default:
          replicas: 4
        critical:
          replicas: 1
      resources:
        requests:
          memory: 256Mi
          cpu: 100m
        limits:
          memory: 1024Mi
          cpu: 1000m

    Before you make changes to these values, familiarize yourself with the Resource Management for Pods and Containers guidelines in the Kubernetes documentation.

    If you choose to make changes to these default settings, consider the following:

    For this case Adjust this
    More than 10 concurrent annotators Adjust the requests and limits for resources in the app pod
    Increase fault tolerance Increase the number of replicas of app and/or rqworker services
    Production deployment (replicas) Replicas equivalent or greater than the number of availability zones in your Kubernetes cluster

    RQ worker replicas

    The default queue is the most extensive queue. It is recommended to use 4 times more replicas for the default queue compared to the other queues. The other queues (critical, high, low) can have the same number of replicas. You can start with 1 replica for each of them.

    Prepare the Kubernetes cluster

    Before installing Label Studio, prepare the Kubernetes cluster with kubectl.

    Install Label Studio Enterprise and set up a PostgreSQL and Redis databases to store relevant Label Studio Enterprise configurations and annotations using the Helm chart. You must configure specific values for your deployment in a YAML file that you specify when installing using Helm.

    Add the Helm chart repository

    Add the Helm chart repository to easily install and update Label Studio.

    1. From the command line:
      shell
      helm repo add heartex https://charts.heartex.com/
      helm repo update heartex
    2. If you want, check for available versions:
      shell
      helm search repo heartex/label-studio

    Configure Kubernetes secrets

    1. Ensure that you have license key and Docker Hub credentials or request them from Heartex Team.
    2. Create a key to pull the latest Label Studio Enterprise image from the Docker registry. From the command line of your cluster, run the following:
      shell
      kubectl create secret docker-registry heartex-pull-key \
          --docker-server=https://index.docker.io/v2/ \
          --docker-username=heartexlabs \
          --docker-password=<CUSTOMER_PASSWORD>
    3. Create the Label Studio Enterprise license as a Kubernetes secret. You can specify it as a file or as a specific URL.
      From the command line, specify the license as a file:
      shell
      kubectl create secret generic lse-license --from-file=license=path/to/lic
      Or from the command line, specify the license as a URL:
      shell
      kubectl create secret generic lse-license --from-literal=license=https://lic.heartex.ai/db/<CUSTOMER_LICENSE_ID>

    Configure values.yaml

    You must configure a values.yaml file for your Label Studio Enterprise deployment. The following file contains default values for a minimal installation of Label Studio. This chart has been tested and confirmed to work with the NGINX Ingress Controller and cert-manager.

    Example values.yaml file for a minimal installation of Label Studio Enterprise Enterprise:

    text
    /* Detailed source-code truncated for AI context efficiency. */

    Adjust the included defaults to reflect your environment and copy these into a new file and save it as ls-values.yaml.

    !!! note
    For more complex configurations, you can create your own file based on the list of all available Helm values.

    Optional: Set up TLS for PostgreSQL

    To configure Label Studio Enterprise to use TLS for end-client connections with PostgreSQL, do the following:

    1. Enable TLS for your PostgreSQL instance and save Root TLS certificate, client certificate and its key for the next steps.
    2. Create a Kubernetes secret with your certificates, replacing , and `` with paths to your certificates:
    shell
    kubectl create secret generic <YOUR_SECRET_NAME> --from-file=ca.crt=<PATH_TO_CA> --from-file=client.crt=<PATH_TO_CLIENT_CRT> --from-file=client.key=<PATH_TO_CLIENT_KEY>
    1. Update your ls-values.yaml file with your newly-created Kubernetes secret:

    !!! note
    If POSTGRE_SSL_MODE: verify-ca, the server is verified by checking the certificate chain up to the root certificate stored on the client. If POSTGRE_SSL_MODE: verify-full, the server host name will be verified to make sure it matches the name stored in the server certificate. The SSL connection will fail if the server certificate cannot be verified. verify-full is recommended in most security-sensitive environments.

    yaml
    global:
      pgConfig:
        ssl:
          pgSslMode: "verify-full"
          pgSslSecretName: "<YOUR_SECRET_NAME>"
          pgSslRootCertSecretKey: "ca.crt"
          pgSslCertSecretKey: "client.crt"
          pgSslKeySecretKey: "client.key"
    1. Install or upgrade Label Studio Enterprise using Helm.

    Optional: Set up TLS for Redis

    To configure Label Studio Enterprise to use TLS for end-client connections with Redis, do the following:

    1. Enable TLS for your Redis instance and save Root TLS certificate, client certificate and its key for the next steps.
    2. Create a Kubernetes secret with your certificates, replacing , and `` with paths to your certificates:
    shell
    kubectl create secret generic <YOUR_SECRET_NAME> --from-file=ca.crt=<PATH_TO_CA> --from-file=client.crt=<PATH_TO_CLIENT_CRT> --from-file=client.key=<PATH_TO_CLIENT_KEY>
    1. Update your ls-values.yaml file with your newly-created Kubernetes secret:

    !!! note
    In the case if you are using self-signed certificates that host cannot verify you have to set redisSslCertReqs to None

    yaml
    global:
      redisConfig:
        ssl:
          redisSslCertReqs: "required"
          redisSslSecretName: "<YOUR_SECRET_NAME>"
          redisSslCaCertsSecretKey: "ca.crt"
          redisSslCertFileSecretKey: "client.crt"
          redisSslKeyFileSecretKey: "client.key"
    1. Install or upgrade Label Studio Enterprise using Helm.

    Optional: Set up username and password for Redis

    Use one of these options to set a password and a username for Redis:

    1. Password via Kubernetes Secret. Use this when:

    • You want to avoid embedding credentials in values.yaml
    • You already manage Secrets in your cluster
    • You need a simple auth without multiple Redis users and you don't have username
    yaml
    global:
      redisConfig:
        host: "redis://redis.example.com:6379/1"
        password:
          secretName: "my-redis-secret"   # Kubernetes Secret name
          secretKey: "redis-password"      # Key inside Secret

    2. Username + password in URL. Use this when:

    • Redis v.7 or later, and with ACL-enabled users
    • You need a dedicated Redis user for permission scoping
    • You need a quick, throwaway setup or local testing
    yaml
    global:
      redisConfig:
        host: "redis://myuser:[email protected]:6379/1"

    3. Username in environment variables + password in secret. Use this when:

    • Redis v.7 or later, and with ACL-enabled users
    • You want to keep the password secret but still specify a username
    yaml
    global:
      redisConfig:
        host: "redis://redis.example.com:6379/1"
        password:
          secretName: "my-redis-secret"   # Kubernetes Secret name
          secretKey: "redis-password"      # Key inside Secret
      extraEnvironmentVars:
        REDIS_USERNAME: "myuser"           # Injected into pod env

    Use Helm to install Label Studio Enterprise on your Kubernetes cluster

    Use Helm to install Label Studio Enterprise on your Kubernetes cluster. Provide your custom resource definitions YAML file. Specify any environment variables that you need to set for your Label Studio Enterprise installation using the --set argument with the helm install command.

    !!! note
    If you are deploying to a production environment, you should set the SSRF_PROTECTION_ENABLED: true environment variable. See Secure Label Studio.

    From the command line, run the following:

    shell
    helm install <RELEASE_NAME> heartex/label-studio -f ls-values.yaml

    After installing, check the status of the Kubernetes pod creation:

    shell
    kubectl get pods

    Restart Label Studio Enterprise using Helm

    Restart your Helm release by doing the following from the command line:

    1. Identify the <RELEASE_NAME> of the latest Label Studio Enterprise release:
    shell
    helm list
    1. Restart the rqworker for Label Studio:
    shell
    kubectl rollout restart deployment/<RELEASE_NAME>-ls-rqworker
    1. Restart the Label Studio Enterprise app:
    shell
    kubectl rollout restart deployment/<RELEASE_NAME>-ls-app

    Uninstall Label Studio Enterprise using Helm

    To uninstall Label Studio Enterprise using Helm, delete the configuration.

    From the command line, run the following:

    shell
    helm delete <RELEASE_NAME>

    Source Guide Install K8s (`docs/source/guide/install_k8s.md`)


    title: Deploy Label Studio on Kubernetes short: Install using Kubernetes tier: opensource type: guide order: 69 order_enterprise: 0 meta_title: Deploy Label Studio on Kubernetes meta_description: Deploy Label Studio on Kubernetes, such as on Amazon Elastic Container Service for Kubernetes, to create machine learning and data science projects in a scalable containerized environment. section: "Install & Setup" parent: "install"

    Deploy Label Studio on a Kubernetes Cluster using Helm 3. You can use this Helm chart to set up Label Studio for deployment onto a Kubernetes cluster and install, upgrade, and manage the application.

    Your Kubernetes cluster can be self-hosted or installed somewhere such as Amazon EKS. See the Amazon tutorial on how to Deploy a Kubernetes Application with Amazon Elastic Container Service for Kubernetes for more about deploying an app on Amazon EKS.

    !!! warning
    To install Label Studio Enterprise Edition, see Deploy Label Studio Enterprise on Kubernetes. This page is specific to the community version of Label Studio.

    Install Label Studio on Kubernetes

    If you want to install Label Studio on Kubernetes and you have unrestricted access to the internet from your K8s cluster, follow these steps.

    1. Verify that you meet the Required software prerequisites and review the capacity planning guidance.
    2. Prepare the Kubernetes cluster.
    3. Add the Helm chart repository.
    4. (Optional) Set up persistent storage.
    5. (Optional) Configure ingress.
    6. (Optional) Configure values.yaml.
    7. (Optional) Set up TLS for PostgreSQL
    8. Use Helm to install Label Studio on your Kubernetes cluster.

    If you use a proxy to access the internet from your Kubernetes cluster, or it is airgapped from the internet, see how to Install Label Studio without public internet access.

    Required software prerequisites

    • Kubernetes and kubectl version 1.17 or higher
    • Helm version 3.6.3 or higher

    This chart has been tested and confirmed to work with the NGINX Ingress Controller and cert-manager. See Set up an ingress controller for Label Studio Kubernetes deployments for more on ingress settings with Label Studio.

    Your Kubernetes cluster can be self-hosted or installed somewhere such as Amazon EKS.

    Capacity planning

    To plan the capacity of your Kubernetes cluster, refer to these guidelines.

    Label Studio has the following default configurations for resource requests, resource limits, and replica counts:

    yaml
    app:
      replicas: 1
      resources:
        requests:
          memory: 1024Mi
          cpu: 1000m
        limits:
          memory: 6144Mi
          cpu: 4000m

    Before you make changes to these values, familiarize yourself with the Resource Management for Pods and Containers guidelines in the Kubernetes documentation.

    If you choose to make changes to these default settings, consider the following:

    For this case Adjust this
    More than 10 concurrent annotators Adjust the requests and limits for resources in the app pod
    Increase fault tolerance Increase the number of replicas of app pod
    Production deployment (replicas) Replicas equivalent or greater than the number of availability zones in your Kubernetes cluster

    Prepare the Kubernetes cluster

    Before installing Label Studio, prepare the Kubernetes cluster with kubectl.

    Add the Helm chart repository

    Add the Helm chart repository to easily install and update Label Studio.

    1. From the command line:
      shell
      helm repo add heartex https://charts.heartex.com/
      helm repo update heartex
    2. If you want, check for available versions:
      shell
      helm search repo heartex/label-studio

    Optional: set up TLS for PostgreSQL

    To configure Label Studio to use TLS for end-client connections with PostgreSQL, do the following:

    1. Enable TLS for your PostgreSQL instance and save Root TLS certificate, client certificate and its key for the next steps.
    2. Create a Kubernetes secret with your certificates, replacing , and `` with paths to your certificates:
    shell
    kubectl create secret generic <YOUR_SECRET_NAME> --from-file=ca.crt=<PATH_TO_CA> --from-file=client.crt=<PATH_TO_CLIENT_CRT> --from-file=client.key=<PATH_TO_CLIENT_KEY>
    1. Update your ls-values.yaml file with your newly-created Kubernetes secret:

    !!! note
    If POSTGRE_SSL_MODE: verify-ca, the server is verified by checking the certificate chain up to the root certificate stored on the client. If POSTGRE_SSL_MODE: verify-full, the server host name will be verified to make sure it matches the name stored in the server certificate. The SSL connection will fail if the server certificate cannot be verified. verify-full is recommended in most security-sensitive environments.

    yaml
    global:
      pgConfig:
        ssl:
          pgSslMode: "verify-full"
          pgSslSecretName: "<YOUR_SECRET_NAME>"
          pgSslRootCertSecretKey: "ca.crt"
          pgSslCertSecretKey: "client.crt"
          pgSslKeySecretKey: "client.key"
    1. Install or upgrade Label Studio using Helm.

    Use Helm to install Label Studio on your Kubernetes cluster

    Use Helm to install Label Studio on your Kubernetes cluster. Provide your custom resource definitions YAML file. Specify any environment variables that you need to set for your Label Studio installation using the --set argument with the helm install command.

    !!! note
    If you are deploying to a production environment, you should set the SSRF_PROTECTION_ENABLED: true environment variable. See Secure Label Studio.

    From the command line, run the following:

    shell
    helm install <RELEASE_NAME> heartex/label-studio -f ls-values.yaml

    After installing, check the status of the Kubernetes pod creation:

    shell
    kubectl get pods

    Restart Label Studio using Helm

    Restart your Helm release by doing the following from the command line:

    1. Identify the <RELEASE_NAME> of the latest Label Studio release:
    shell
    helm list
    1. Restart the Label Studio app:
    shell
    kubectl rollout restart deployment/<RELEASE_NAME>-ls-app

    Upgrade Label Studio using Helm

    To upgrade Label Studio using Helm, do the following.

    1. Determine the latest tag version of Label Studio and add/replace the following in your ls-values.yaml file:
      yaml
      global:
        image:
          tag: "20210914.154442-d2d1935"
    2. After updating the values file, retrieve the latest updates for the Helm chart:
      shell
      helm repo update heartex
    3. Run the following from the command line to upgrade your deployment:
      shell
      helm upgrade <RELEASE_NAME> heartex/label-studio -f ls-values.yaml
      If you want, you can specify a version from the command line:
      shell
      helm upgrade <RELEASE_NAME> heartex/label-studio -f ls-values.yaml --set global.image.tag=20210914.154442-d2d1935
      This command overrides the tag value stored in ls-values.yaml. You must update the tag value when you upgrade or redeploy your instance to avoid version downgrades.

    Uninstall Label Studio using Helm

    To uninstall Label Studio using Helm, delete the configuration.

    From the command line, run the following:

    shell
    helm delete <RELEASE_NAME>

    Source Guide Install K8s Airgapped (`docs/source/guide/install_k8s_airgapped.md`)


    title: Install Label Studio without public internet access short: Airgapped Server tier: all type: guide order: 71 order_enterprise: 73 meta_title: Install Label Studio without public internet access meta_description: Install Label Studio without public internet access to create machine learning and data science projects in an airgapped environment. section: "Install & Setup" parent: "install_k8s" parent_enterprise: "install_enterprise_k8s"

    If you need to install Label Studio on a server that blocks access to the internet using a proxy, or an airgapped server that does not allow outgoing connections to the internet, follow these steps:

    Install behind an HTTPS proxy

    !!! note
    If you are using a SOCKS proxy, Helm 3 does not support SOCKS proxies. See Install without internet access or HTTPS proxy.

    If your organization uses an HTTPS proxy to manage access to the internet, do the following.

    1. Work with your network security team to whitelist https://charts.heartex.com so that you can access the Helm charts for deployment.
    2. On the Label Studio server, set an environment variable with the HTTPS proxy address:
    shell
    export HTTPS_PROXY=<your_proxy>
    1. Use Helm to install Label Studio on your Kubernetes cluster.

    2. Work with your network security team to whitelist https://charts.heartex.com so that you can access the Helm charts for deployment.

    3. On the Label Studio server, set an environment variable with the HTTPS proxy address:

    shell
    export HTTPS_PROXY=<your_proxy>
    1. Use Helm to install Label Studio on your Kubernetes cluster.

    Install without internet access or HTTPS proxy

    If you can't access the internet using a proxy supported by Helm or at all, follow these steps to download the Helm charts necessary to deploy Label Studio on an airgapped Kubernetes cluster.

    !!! note
    You need the Label Studio credentials provided to you by your account manager to download the Helm charts.

    1. Download the latest version of Label Studio Helm chart:
      shell
      helm repo add heartex https://charts.heartex.com/
      helm repo update heartex
      helm pull heartex/label-studio
    2. Transfer the downloaded tar.gz archive to the host that has kubectl and helm installed.
    3. Expand the tar.gz archive.
    4. Install Label Studio, updating the path in the helm commands to reference the relative path of the folder where you expanded Label Studio Helm cahrt. For example, if you expanded the archive file in the current directory, run the following:
    shell
    helm install ls ./label-studio -f ls-values.yaml

    Source Guide Install Prompts (`docs/source/guide/install_prompts.md`)


    title: Install Prompts in an on-prem environment (optional) short: Install Prompts type: guide tier: enterprise order: 0 order_enterprise: 71 meta_title: Install Prompts meta_description: Install Prompts in a Label Studio Enterprise on-prem environment section: "Install & Setup" parent: "install_k8s" parent_enterprise: "install_enterprise_k8s"

    Installing Prompts in an on-prem environment requires installing Adala, our data labeling agent microservice.

    You only need to complete these steps if you want to use Prompts. For more information, see our Prompts overview.

    !!! note
    Prompts are only supported for Kubernetes deployments. If you are using Docker, you will need to migrate to a Kubernetes deployment to use Prompts. See Deploy Label Studio Enterprise on Kubernetes for more information.

    Prerequisites

    • Kubernetes cluster v1.24 or later
    • Helm v3.8.0 or later
    • Docker CLI (for logging into Docker Hub)

    Resource requirements

    Before installing, ensure your Kubernetes cluster can provide the following minimum resources for Adala:

    Resource Requirement
    CPU 6 cores
    Memory 12 GB

    1. Authenticate to Docker Hub and validate access

    You will need your Docker Hub username and password. If you do not have them, request access from the HumanSignal team.

    Log in to DockerHub to access the private OCI repository:

    bash
    docker login -u CUSTOMER_USERNAME

    When prompted, enter your Docker Hub password.

    Then verify your credentials and access:

    bash
    helm pull oci://registry-1.docker.io/heartexlabs/adala

    Expected output:

    bash
    Pulled: registry-1.docker.io/heartexlabs/adala:X.X.X
    Digest: sha256:***************************************************

    2. Create a Kubernetes secret for image pulling

    Create a Kubernetes secret to allow your cluster to pull private Adala images:

    bash
    kubectl create secret docker-registry heartex-pull-key \
      --docker-server=https://index.docker.io/v2/ \
      --docker-username=CUSTOMER_USERNAME \
      --docker-password=CUSTOMER_PASSWORD

    3. Prepare your custom values file

    Create a file named custom.values.yaml with the following contents:

    yaml
    adala-app:
      deployment:
        image:
          tag: 20260409.063233-main-6b619568
          pullSecrets:
            - heartex-pull-key
    adala-worker:
      deployment:
        image:
          tag: 20260409.063233-main-6b619568
          pullSecrets:
            - heartex-pull-key

    !!! note
    Replace the image.tag with the appropriate version if necessary.

    4. Create a dedicated namespace for Adala

    Create a dedicated namespace prompt for Adala:

    bash
    kubectl create namespace prompt

    5. Install the Adala Helm chart

    Run the following command to install Adala using your custom values:

    bash
    helm install lse oci://registry-1.docker.io/heartexlabs/adala --values custom.values.yaml

    6. Validate that Adala is running

    Check if all pods in the prompt namespace are in the Running or Completed state:

    bash
    kubectl get pods -n prompt

    You should see output where all pods have STATUS set to Running, for example:

    text
    NAME                                  READY   STATUS    RESTARTS       AGE
    adala-adala-app-d4564ffd7-gtmhx       1/1     Running   0              100m
    adala-adala-kafka-controller-0        1/1     Running   0              110m
    adala-adala-kafka-controller-1        1/1     Running   0              111m
    adala-adala-kafka-controller-2        1/1     Running   0              113m
    adala-adala-redis-master-0            1/1     Running   0              125m
    adala-adala-worker-5d87f97f76-mq952   1/1     Running   0              111m

    If any pod is not running, you can investigate further:

    bash
    kubectl describe pod <pod-name> -n prompt

    or

    bash
    kubectl logs <pod-name> -n prompt

    7. Update the Label Studio `values.yaml` file

    You will need to update the global section of your Label Studio Enterprise values.yaml file to include the following:

    • Add the Adala endpoint, which will allow Label Studio to connect to Adala.
    • Add the Prompts feature flag, to enable Prompts visibility within Label Studio.
    yaml
    global:
      extraEnvironmentVars:
        PROMPTER_ADALA_URL: http://adala-adala-app.prompt:8000
      featureFlags:
        fflag_feat_all_dia_835_prompter_workflow_long: true

    Note the following for PROMPTER_ADALA_URL:

    • prompt is the namespace where Adala is installed.
    • adala-adala-app is the name of the Adala service automatically created by the Helm release.
    • Port 8000 is the default port where Adala listens.

    After updating the values file, redeploy Label Studio to apply the changes.

    8. Optional: Add a custom CA bundle

    If your environment requires a custom CA bundle (for example, when communicating with an LLM provider behind a corporate proxy with a self-signed certificate), you must make the CA certificate available to the Adala pods.

    Because Label Studio Enterprise and Adala (Prompts) are deployed in separate namespaces, Kubernetes secrets cannot be shared between them. Even if you already have a CA bundle secret in the Label Studio namespace, you must create a new secret in the prompt namespace:

    bash
    kubectl create secret generic custom-ca-bundle \
      --from-file=ca.crt=my.cert \
      -n prompt

    Replace my.cert with the path to your CA certificate file. The key name (ca.crt) must match the key referenced in the values file below.

    Then add the following to your custom.values.yaml and re-run the helm install/helm upgrade command from step 5:

    yaml
    adala-app:
      deployment:
        extraEnvVars:
          REQUESTS_CA_BUNDLE: /etc/ssl/custom/ca.crt
          SSL_CERT_FILE: /etc/ssl/custom/ca.crt
        extraVolumeMounts:
          - mountPath: /.cache
            name: cache-dir
          - mountPath: /etc/ssl/custom
            name: custom-ca
            readOnly: true
        extraVolumes:
          - name: cache-dir
            emptyDir: {}
          - name: custom-ca
            secret:
              secretName: custom-ca-bundle
              items:
                - key: ca.crt
                  path: ca.crt
    
    adala-worker:
      deployment:
        extraEnvVars:
          REQUESTS_CA_BUNDLE: /etc/ssl/custom/ca.crt
          SSL_CERT_FILE: /etc/ssl/custom/ca.crt
        extraVolumeMounts:
          - mountPath: /.cache
            name: cache-dir
          - mountPath: /etc/ssl/custom
            name: custom-ca
            readOnly: true
        extraVolumes:
          - name: cache-dir
            emptyDir: {}
          - name: custom-ca
            secret:
              secretName: custom-ca-bundle
              items:
                - key: ca.crt
                  path: ca.crt

    Source Guide Install Requirements (`docs/source/guide/install_requirements.md`)


    title: Requirements to Install and upgrade Label Studio short: Requirements tier: opensource section: "Install & Setup" order: 61 meta_title: Requirements to Install and Upgrade meta_description: "Label Studio documentation: Requirements to install and upgrade Label Studio."

    {% insertmd includes/deploy.md %}

    Install prerequisite

    Install Label Studio in a clean Python environment. Heartex highly recommends using a virtual environment (venv or conda) to reduce the likelihood of package conflicts or missing packages.

    Install with pip

    To install Label Studio with pip and a virtual environment, you need Python version 3.8 or later. Run the following:

    bash
    python3 -m venv env
    source env/bin/activate
    python -m pip install label-studio

    To install Label Studio with pip, you need Python version 3.8 or later. Run the following:

    bash
    pip install label-studio

    After you install Label Studio, start the server with the following command:

    bash
    label-studio

    The default web browser opens automatically at http://localhost:8080 with Label Studio. See start Label Studio for more options when starting Label Studio.

    Install with Docker

    Label Studio is also available as a Docker container. Make sure you have Docker installed on your machine.

    Install with Docker on *nix

    To install and start Label Studio at http://localhost:8080, storing all labeling data in ./my_project directory, run the following:

    bash
    docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest

    !!! attention "important"
    As this is a non-root container, the mounted files and directories must have the proper permissions for the UID 1001.

    Install with Docker on Windows

    Or for Windows, you have to modify the volumes paths set by -v option.

    Override the default Docker install

    You can override the default Docker install by appending new arguments.

    In Windows Command Line (cmd):

    bash
    docker run -it -p 8080:8080 -v %cd%/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

    In PowerShell:

    bash
    docker run -it -p 8080:8080 -v ${PWD}/mydata:/label-studio/data heartexlabs/label-studio:latest label-studio --log-level DEBUG

    Build a local image with Docker

    If you want to build a local image, run:

    bash
    docker build -t heartexlabs/label-studio:latest .

    Run with Docker Compose

    Use Docker Compose to serve Label Studio at http://localhost:8080. You must use Docker Compose version 1.25.0 or higher.

    Start Label Studio:

    bash
    docker-compose up -d

    This starts Label Studio with a PostgreSQL database backend. You can also use a PostgreSQL database without Docker Compose. See Set up database storage.

    Install Label Studio without internet access

    Download label-studio docker image (host with internet access and docker):

    bash
    docker pull heartexlabs/label-studio:latest

    Export it as a tar archive:

    bash
    docker save heartexlabs/label-studio:latest | gzip > label_studio_latest.tar.gz

    Transfer it to another VM:

    bash
    scp label_studio_latest.tar.gz <ANOTHER_HOST>:/tmp

    SSH into and import the archive:

    bash
    docker image import /tmp/label_studio_latest.tar.gz

    Follow steps from Install and Upgrade to run LS.

    Install on Ubuntu

    To install Label Studio on Ubuntu and run it in a virtual environment, run the following command:

    bash
    python3 -m venv env
    source env/bin/activate
    sudo apt install python3.9-dev
    python -m pip install label-studio

    Install from source

    If you want to use nightly builds or extend the functionality, consider downloading the source code using Git and running Label Studio locally:

    bash
    git clone https://github.com/HumanSignal/label-studio.git
    cd label-studio
    # Install all package dependencies
    pip install -e .
    # Run database migrations
    python label_studio/manage.py migrate
    # Start the server in development mode at http://localhost:8080
    python label_studio/manage.py runserver

    Install with Anaconda

    bash
    conda create --name label-studio
    conda activate label-studio
    pip install label-studio

    Upgrade Label Studio

    To upgrade to the latest version of Label Studio, reinstall or upgrade using pip.

    bash
    pip install --upgrade label-studio

    Migration scripts run when you upgrade to version 1.0.0 from version 0.9.1 or earlier.

    To make sure an existing project gets migrated, when you start Label Studio, run the following command:

    bash
    label-studio start path/to/old/project

    The most important change to be aware of is changes to rename "completions" to "annotations". See the updated JSON format for completed tasks.

    If you customized the Label Studio Frontend, see the Frontend reference guide for required updates to maintain compatibility with version 1.0.0.


    Source Guide Install Troubleshoot (`docs/source/guide/install_troubleshoot.md`)


    title: Troubleshoot installation issues short: Troubleshooting tier: opensource type: guide order: 81 order_enterprise: 0 meta_title: Troubleshoot Label Studio installation issues meta_description: Tips for troubleshooting Label Studio installation issues section: "Install & Setup" parent: "install" date: 2023-12-06 10:38:02

    You might see errors when installing Label Studio. Follow these steps to resolve them.

    Run the latest version of Label Studio

    Many bugs might be fixed in patch releases or maintenance releases. Make sure you're running the latest version of Label Studio by upgrading your installation before you start Label Studio.

    Errors about missing packages

    If you see errors about missing packages, install those packages and try to install Label Studio again. Make sure that you run Label Studio in a clean Python environment, such as a virtual environment.

    For Windows users the default installation might fail to build the lxml package. Consider manually installing it from the unofficial Windows binaries. If you are running Windows 64-bit with Python 3.8 or later, run pip install lxml‑4.5.0‑cp38‑cp38‑win_amd64.whl to install it.

    Errors from Label Studio

    If you see any other errors during installation, try to rerun the installation.

    bash
    pip install --ignore-installed label-studio

    OpenBLAS blas_thread_init: pthread_create failed for thread X of Y: Operation not permitted

    Upgrade Docker Engine to the latest available version(>= 20.10.12).

    PermissionError: [Errno 13] Permission denied: `/label-studio/data/media`

    !!! warning
    Starting with Label Studio 1.7.0 release, the application run using a non-root docker user with ID 1001.

    You may already be aware that Docker containers generally operate with root privileges by default. This unrestricted container management permits actions like installing system packages, modifying configuration files, and binding privileged ports, which are all beneficial for development purposes. However, this can lead to significant risks when containers are deployed in a production environment.

    This is because anyone who gains access to your root-running container could initiate undesirable processes, such as injecting malicious code. Running a process in your container as root also enables altering the user id (UID) or group id (GID) when launching the container, making your application more vulnerable.

    It is advised to use non-root containers for the following reasons:

    • Security: Non-root containers inherently offer better security. In the event of a container engine security issue, running the container as a non-privileged user will prevent malicious code from obtaining elevated permissions on the container host. For more information on Docker's security features, refer to this guide.

    • Platform limitations: Some Kubernetes distributions such as OpenShift, execute containers with random UUIDs. This method is incompatible with root containers, which must always run using the root user's UUID. In these situations, only non-root container images will operate, making them a necessity.

    Our Dockerfile contains the line USER 1001 which assigns a non-root user UID to the image, enabling the container to run as an unprivileged user. This implementation applies the security enhancements and other restrictions mentioned above to the container.

    File permissions for non-root user

    By default, Label Studio container images operate as non-root. As a result, any directory requiring write access must be assigned to the root group (GID 0). This ensures that the arbitrary user (default UID 1001) can write to the directory, as this user is always part of the root group. To achieve this, simply set the ownership of the local directory to the root group (GID 0), which will be enough regardless of the UID:

    bash
    mkdir mydata
    sudo chown :0 mydata

    !!! note

    text
    If you want to learn more about non-root containers and Docker and Kubernetes security, check out the following articles:
    
    [Docker Security documentation](https://docs.docker.com/engine/security/security/)
    
    [Understanding how uid and gid work in Docker containers by Marc Campbell](https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf)
    
    [Processes In Containers Should Not Run As Root](https://medium.com/@mccode/processes-in-containers-should-not-run-as-root-2feae3f0df3b)
    
    [Just say no to root (containers) by Daniel J. Walsh](https://opensource.com/article/18/3/just-say-no-root-containers)
    
    [Running a Docker container as a non-root user by Lucas Willson-Richter](https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15)
    
    [How to run a more secure non-root user container by Dan Wash](https://www.projectatomic.io/blog/2016/01/how-to-run-a-more-secure-non-root-user-container/)

    Source Guide Interfaces Agent (`docs/source/guide/interfaces-agent.md`)


    title: Use the Label Studio agent to create an Interface short: Create with agent tier: enterprise type: guide order: 0 order_enterprise: 142 meta_title: Interfaces meta_description: "Build custom labeling interfaces with React" section: "Interfaces"

    You can create Interfaces in two ways. Pick whichever you prefer:

    • Within Label Studio - Use Label Studio's out-of-the-box Interface builder to prompt our agent to build and refine your Interface.

    • Developed locally - Install the create-interface-skill and use an agent of your choice to vibe code an Interface that you can then import into Label Studio. For more information, see Develop an Interface locally.

    !!! note
    These are two independent ways to build the same thing, and the resulting Interface is identical either way; only the authoring path differs.

    text
    On Label Studio Cloud, both **Create with Agent** and [Develop Locally](interfaces-local) are available; choose whichever fits your workflow. **Create with Agent** is a Label Studio Cloud feature: on self-hosted or on-prem deployments it isn't available, so build your Interface with **Develop Locally** instead.

    To begin, select Interfaces in the main menu and then select Create Interface > Create with Agent.

    !!! info Tip
    If you want to start from an existing labeling UI rather than a blank slate, select the overflow menu next to any Interface and select Duplicate. From here you can edit the copy.

    The Interface builder is comprised of the following tabs:

    Tab Description
    Chat Provide instructions to the Label Studio agent to build out your custom interface.
    Code View and manually update the React component created during your building session.
    Version navigator As you iterate on the interface via chat, you can navigate between versions of the preview.
    Preview An interactive preview of your interface.
    Input/Output Customize the input data you want to see in the preview, and see the output you would achieve as you interact with the preview.
    Config Once you have a basic version of the Interface built, you can use this tab to modify the interface rather than iterating through the chat.
    Grid Cell If you enabled Build custom grid view in the settings, this tab lists each grid cell.

    Chat

    The Chat tab is where you collaborate with the agent to build the Interface.

    In the message box at the bottom, describe the labeling UI you want. Be specific about:

    • What the annotator should see (text, image, dialogue, side-by-side documents, etc.).
    • What they are being asked to do (pick a label, highlight spans, fill a form, rank options).
    • Any domain constraints (label names, required fields, rules).

    Plan mode

    In Plan mode, the agent will surface:

    • Question cards — Multiple-choice questions the agent uses to narrow the design. Click the options that apply and submit.
    • A plan summary card — The proposed design. You can Approve it, Approve with edits (tweak the plan text first), or Revise (send feedback and let the agent propose again).

    Once the plan is approved, the agent switches to code generation.

    Settings

    You can select whether you want to build a custom grid view for your Interface.

    Grid view allows you add a custom summary that appears in the Data Manager when viewing tasks in Grid View. This summary can be edited when modifying the Interface from the project settings.

    Code

    The Code tab is where you can view and manually update the React component created during your building session.

    Version navigator

    As you update the Interface, the preview will update to reflect the changes. You can move between versions of the Interface using the controls above the chat panel:

    Use this to:

    • Step through every snapshot the agent has produced and every manual edit you've made.
    • Roll the preview back to an earlier version if a later change broke something.
    • Pick any earlier snapshot as the basis for the next prompt.

    !!! info Tip
    Versions you navigate to stay editable — you can keep refining from any point in history.

    Preview

    Every time the agent writes or edits code, the Preview on the right re-renders using the current sample task data. Click around in the preview exactly as a labeler would — if something looks wrong, describe the fix in chat and the agent will patch the code.

    If the code has a syntax or runtime error, an error message appears in the preview pane so you know what's broken.

    !!! info Tip
    As you interact with the preview, check the Input/Output tab to see a preview of the annotation output in JSON format. Ensure this matches what you would expect.

    Input/Output

    Section Description
    Input The input data that the Interface reads from. You can edit the example input to see how the Interface behaves against realistic data.
    Output The output data that the Interface produces. As you interact with the interface under the Preview tab, this section automatically updates to show the output in JSON format.

    Config

    The Config tab allows you to adjust the Interface's annotation controls. For example, you can add or delete choices, change the colors of labels, adjust the display text of labels, and more. The changes you make will be reflected in the preview and the code.

    These values can also be updated in the Chat panel by describing the changes you want to make, and can also be updated later from the project settings.

    Grid Cell

    The Grid Cell tab only appears if you have enabled Build custom grid view in the settings. It lists each grid cell in the Interface.


    Source Guide Interfaces Details (`docs/source/guide/interfaces-details.md`)


    title: View Interface details short: Interface details tier: enterprise type: guide order: 0 order_enterprise: 145 meta_title: Interfaces meta_description: "View, manage, and version custom labeling Interfaces" section: "Interfaces"

    The Interface details page is the home base for a saved Interface. Use it to inspect the Interface, edit it, manage versions, and create projects from it.

    To open it, select Interfaces in the main menu and then select the Interface you want to view.

    Actions

    The top bar of the Interface details page provides the following actions:

    Button Description
    Iterate with Agent Open the interface editor with the agent. This will open a new tab with the interface editor and the agent.
    Develop Locally Install the create-interface-skill and work with a local coding agent to develop your Interface.

    And from the overflow menu in the top right corner of the page:

    Action Description
    Edit Edit the Interface name and description.
    Create Project Starts a new project pinned to the version currently selected in the version navigator. For more information, see Use an Interface in a project.
    Duplicate Creates a new copy of the Interface.
    Delete Delete the Interface. This action is not available if the Interface is used by any projects.

    !!! info Tip
    Template Interfaces can only be used and edited by duplicating them first.

    Preview

    The Preview section renders the Interface against the current sample task data, exactly as a labeler will see it. Click through the controls to confirm the Interface behaves the way you expect.

    !!! info Tip
    The preview always reflects the version currently selected in the version navigator. Switch versions to compare how the Interface behaved at different points in its history.

    Versions

    A list of versions appears to the right of the Preview section.

    Select a version to update the Preview, Data I/O, and Code sections to that version's source.

    You can also manage versions from the overflow menu next to that version:

    Action Description
    Add Description Add a description to the version.
    Unpublish When you create projects from an Interface, project managers can switch between interface versions from the context of the project. Unpublishing a version will hide it from the version list under Project > Settings > Labeling Interface.

    Data I/O

    The Data I/O section provides information about the required input and the expected output of the Interface.

    Use this section to confirm the Interface reads the task fields you plan to import and produces the annotation shape downstream workflows (exports, analytics, Prompts) expect.

    !!! info Tip
    You can edit the example task data to see how the Interface behaves against realistic data.

    Projects

    The Projects section lists every project currently using this Interface, along with the version each project is pinned to, the creation date, and the task count.

    From this section you can:

    • Click a project to open it directly.
    • Click Create Project to start a new project from the Interface. The project is pinned to the version currently selected in the version navigator.

    !!! info Tip
    Editing an Interface does not retroactively update existing projects. Each project keeps running against its pinned version until you upgrade it from the project's labeling settings. See Use an Interface in a project for more information.

    Code

    The Code section shows the read-only JSX source for the selected version. Use it to:

    • Audit what the Interface actually does before attaching it to a project.
    • Copy snippets to share with teammates or paste into a duplicate.
    • Confirm the Interface exposes the optional helpers you expect (such as paramsSchema, outputSchema, or GridCell).

    Source Guide Interfaces Libraries (`docs/source/guide/interfaces-libraries.md`)


    title: Use external libraries and services in an Interface short: External libraries & APIs tier: enterprise type: guide order: 0 order_enterprise: 146 meta_title: Use external libraries and network services in Label Studio Interfaces meta_description: "How to call external APIs, load third-party packages, or bundle libraries directly into a Label Studio Interface, and which security setting each one needs." section: "Interfaces"

    An Interface runs as a sandboxed module inside the Label Studio editor. By default that sandbox has no outbound network and cannot load third-party code. This is a deliberate security posture that you can relax when your Interface needs it.

    Common cases are small and specific: fetching predictions from your ML backend, formatting dates with date-fns, validating a payload with zod, pulling map tiles from a tile server, or drawing a chart with d3. When your Interface needs an external API or a third-party library, you enable exactly what you need in one of three ways.

    The single most common point of confusion: "call an external API" and "use an external package" are configured in different places. Allow-listing a host in the wrong section silently does nothing. This page explains which is which.

    The three paths at a glance

    You want to… Example Where to enable
    Call an external HTTP service from your Interface fetch() your ML backend, a geocoder, an internal microservice, a tile server Organization > Settings > Interfaces → API origins
    Load a third-party package from a CDN at runtime Pull three.js or d3 from cdn.jsdelivr.net via a <script> tag Organization > Settings > Interfaces → Advanced: external scripts
    Use a third-party package with no external network Bundle three.js into the Interface and publish it Nothing to configure. The code is self-contained.

    Choosing a path

    • Calling a service over HTTP? → API origins (Path 1).
    • Need a third-party library and OK trusting a CDN? → Advanced: external scripts (Path 2).
    • Need a third-party library with no external dependencies / air-gapped / strict security? → Bundle locally (Path 3). Preferred default.

    You can also combine them. A point-cloud Interface might bundle three.js locally (path 3) and allow-list your tile/asset server under API origins (path 1) so it can fetch the data to render.

    !!! info Can I use a third-party library?
    Yes. Interface source code can't use import / require, because each Interface is one self-contained module rather than an ES module. That's a limit on module syntax; third-party code is still fine. Bring a library in by loading it from an allow-listed CDN (path 2) or by bundling it into the Interface (path 3).


    Path 1: Call an external API or service (API origins)

    Use this when your Interface needs to talk to an HTTP service over fetch, XHR, or WebSocket. For example: sending a selected region to an ML backend for inference, geocoding an address, or pulling map tiles.

    1. Go to Organization > Settings > Interfaces → API origins.
    2. Add the exact origin (scheme and host), e.g. https://api.example.com. One host per entry.
    3. Save. Your Interface's fetch() calls to that origin now succeed.
    Rule Detail
    Format Full origin including scheme (https://host).
    Wildcards Not allowed (no * or *.example.com). List each host explicitly.
    Your LS server Always allowed automatically. Don't add it; only list third-party hosts.
    Empty list No outbound network. The Interface can only reach your Label Studio server.

    API origins governs data requests only. It does not let you load a <script> from that host. If you add a package CDN here expecting a library to load, nothing happens (use Path 2 for that).

    !!! info Example
    To connect a custom ML backend to an Interface, you allow-list the backend's origin here. That is what lets the Interface send region payloads to it and render the predictions. No package is being installed; it's an API call.


    Path 2: Load a package from a CDN (Advanced: external scripts)

    Use this when you want the convenience of pulling a library straight from a CDN at runtime and you trust that host completely.

    1. Go to Organization > Settings > Interfaces → Advanced: external scripts.
    2. Turn on Allow external scripts / stylesheets.
    3. Add one or more script origins, e.g. https://cdn.jsdelivr.net.
    4. In your Interface, load the library from that origin (for example, inject a <script> and use its global).
    Rule Detail
    Scheme Must be https://. HTTP origins are rejected.
    Format Origin only (no paths, query strings, credentials, or fragments).
    Wildcards Not allowed.
    Toggle Origins are ignored unless the checkbox is on. Turning it off clears the list on save.

    This is a different setting from API origins. A host listed here can serve executable code to your Interface; a host listed under API origins cannot, and vice versa.

    !!! warning
    Scripts loaded from these origins run with the Interface's full privileges and can read any task data the Interface is rendering. Only add hosts you trust completely. Most organizations should leave this section disabled and prefer Path 3.


    Path 3: Bundle a package locally (nothing to allow-list, no network)

    Recommended for locked-down, on-premise, or air-gapped deployments, and for any team that would rather not open an outbound origin or trust a CDN.

    Because an Interface is a single self-contained module, a third-party library can travel inside your Interface code. The library becomes part of what you publish: no CDN, no <script> tag, no allow-list entry, and no outbound network at label time.

    How to do it

    1. Get a browser build that attaches to a variable: a prebuilt single-file dist, or produce one with a bundler (for example, esbuild --bundle --format=iife --global-name=MyLib). Interface source is compiled but not bundled for you, so resolve the dependency into this one file first. Avoid an ES-module build: import / export statements aren't supported.
    2. Include that code in your Interface source and reference the library through the variable/global it defines. Do not use import / require in your own code.
    3. Validate, preview, and publish as usual (via the Interfaces editor, or label-studio-sdk interface validate/preview/sync). The library ships with the published Interface.

    What works well this way

    • Pure-computation and rendering libraries: date/number utilities, validation (e.g. zod), charting/geometry, and in-browser renderers.
    • Standard browser rendering APIs: Canvas and WebGL are available in the sandbox, so libraries like three.js can render inside an Interface. (The iframe capabilities list governs device features such as camera and microphone, not 2D/3D rendering.)

    Constraints to keep in mind

    • Use an IIFE / global build. import / export statements aren't supported, and a build that relies on top-level module.exports or require(...) may not pass validation. You also can't require() an npm package at label time; bundle the dependency into the file rather than requiring it, and reference the variable/global it defines.
    • The library must run in-browser within the sandbox: no Node.js APIs, no access to the parent page's window/document, no persistent localStorage/sessionStorage, and any network the library itself performs is still governed by API origins (Path 1).
    • The bundled code becomes part of the Interface's stored body. There's no fixed size limit, but very large bundles add to load and parse time, so keep an eye on it.

    Worked example: rendering large point clouds

    Suppose you need to review LiDAR point clouds and expect to use three.js to render them.

    • Air-gapped / strict security: bundle three.js locally (Path 3). Nothing is allow-listed; the renderer ships inside the Interface. If the point-cloud data is fetched from a service, add that data host under API origins (Path 1).
    • CDN acceptable: allow-list the CDN under Advanced: external scripts (Path 2) and load three.js from there.

    Point-cloud rendering works because WebGL is available in the sandbox. The real limit is data size and performance: very large clouds stress browser/WebGL memory regardless of how the library is packaged, so test with representative data and down-sample or tile if needed.

    !!! info
    A heavy third-party renderer already ships inside a stock Interface today: the Document AI template renders PDFs with PDF.js from its bundled code. This is a concrete precedent that large libraries run inside Interfaces, including ones that compile internally or offload work to a web worker.


    Troubleshooting

    Symptom Likely cause Fix
    fetch() to my service is blocked The host isn't in API origins, or it's mistakenly listed under external scripts. Add the exact origin under API origins (Path 1).
    My CDN <script> won't load, but I added the host to API origins API origins governs data requests, not script loading. Add the host under Advanced: external scripts and enable the toggle (Path 2).
    "Interfaces can't use packages" Misreading the no-import rule as a ban on all third-party code. You can't import npm packages, but you can bundle them in (Path 3) or load them from an allow-listed CDN (Path 2).
    Bundled library works in the app but fails local validation The build relies on top-level module.exports / require. Use an IIFE / global build (e.g. esbuild --format=iife --global-name=…) and reference the variable it defines.
    Library expects Node APIs or the parent window It isn't browser/sandbox-compatible. Use a browser build; keep any network calls behind API origins.

    Source Guide Interfaces Local (`docs/source/guide/interfaces-local.md`)


    title: Develop an Interface locally short: Develop locally tier: enterprise type: guide order: 0 order_enterprise: 143 meta_title: Interfaces meta_description: "Build and iterate on custom labeling Interfaces from your terminal using the Label Studio SDK CLI" section: "Interfaces"

    You can build or iterate on an Interface from your own editor and your own coding agent (Claude, Codex, or Cursor) instead of using the in-product agent. This is a first-class option on any deployment (many teams prefer it), and it's the way to build Interfaces on self-hosted or on-prem (including air-gapped) deployments, where Create with Agent (a Label Studio Cloud feature) isn't available.

    You write JSX on disk, preview it live against your Label Studio instance, and sync the result back when you're ready to publish.

    Developing locally is useful when you want to:

    • Use a coding agent or IDE you already have set up.
    • Work offline against a checked-out copy of an Interface, then push the changes back.
    • Bring an existing React mockup into Label Studio.
    • Run automated validation and Playwright scenarios against your Interface before publishing.

    1. Install the label-studio-sdk package and check your setup

    Before you begin, make sure you have:

    • The label-studio-sdk Python package. If you already have it installed, ensure you version 2.0.22 or later.
      bash
      pip install --upgrade label-studio-sdk
      # or
      poetry add label-studio-sdk
    • Node.js and npm available on your PATH.
    • Your Label Studio Enterprise URL and an API token.
    • A coding agent installed (Claude, Codex, or Cursor) if you want agent assistance.

    To begin, select Interfaces in the main menu and then select Create Interface > Develop Locally.

    !!! info Tip
    To iterate on an Interface that already exists in Label Studio, open the Interface details page and click Develop Locally in the top bar. The dialog respects the version currently selected in the version navigator.

    2. Install the create-interface skill

    Install the create-interface-skill for your local coding agent. The skill includes the commands and conventions for working with Interfaces locally so your agent can author a valid Interface module.

    In the Develop Locally modal, choose your agent and copy the install command:

    Agent Install command
    Claude npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a claude-code
    Codex npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a codex
    Cursor npx skills add humansignal/create-interface-skill --skill create-interface-skill -g -a cursor

    Run the command in your terminal, then restart your agent so that it picks up the new skill. You only need to install the skill once per agent.

    !!! info Tip
    You can skip this step if you'd rather write the Interface by hand. The skill is optional — it just gives your agent context.

    3. Initialize the Interface

    Use the SDK-provided command to initialize the Interface in a local directory:

    bash
    export LABEL_STUDIO_URL="https://your-instance.humansignal.com"
    export LABEL_STUDIO_API_KEY="<your token>"
    label-studio-sdk interface init ./my-interface
    cd ./my-interface
    label-studio-sdk interface preview .

    interface init scaffolds a starter Screen.jsx, task.json, and scenarios.js so you have a working baseline to build from.

    !!! info Tip
    You can also pass --lse-url and --token to individual commands instead of exporting them. This is useful if you work against more than one Label Studio instance.

    Start from an existing Interface

    To iterate on an Interface that already exists in Label Studio, open the Interface details page and click Develop Locally in the top bar. The dialog respects the version currently selected in the version navigator.

    Alternatively, you can use:

    bash
    label-studio-sdk interface pull --id <interface-id> --version <version-id> ./my-interface

    The dialog pre-fills the --id and --version for you. Without --version, pull grabs the latest version of the Interface, including any unpublished local drafts.

    4. Check local setup

    Run the following command to check your local setup:

    bash
    label-studio-sdk interface doctor

    The first validation or doctor run installs the Node validator dependencies into a user cache directory.

    5. Start the live preview

    Change into your Interface directory and run the preview command:

    bash
    cd ./my-interface
    label-studio-sdk interface preview .

    This opens a playground in Label Studio (at the interfaces/playground URL) that is live-connected to your local environment. The playground watches your source files — every save reflects your latest changes in the preview in real time.

    For example, if your Label Studio instance is at https://your-instance.humansignal.com, the playground will be at https://your-instance.humansignal.com/interfaces/playground.

    6. Develop in your local environment

    With the playground running, you can work in your familiar local tools — your IDE, terminal, or a coding agent on your machine — rather than editing in-product. Save your changes as you would for any other project, and the playground re-renders against the current sample task data.

    7. Validate the Interface

    Before syncing your changes, validate the Interface to catch any issues:

    bash
    label-studio-sdk interface validate .

    Static validation checks JSX compilation, the final module shape, schema exports, and runs smoke tests against getResults and parseResults. To also run any browser-driven Playwright scenarios you've defined in scenarios.js, add --scenario:

    bash
    label-studio-sdk interface validate . --scenario scenarios.js

    Validation also runs as part of sync, so you can skip this step if you'd rather catch issues at sync time. Use --no-validate on sync to bypass the check entirely.

    8. Sync your changes back to Label Studio

    Once your local code is ready, run the sync command to synchronize your local directory with the Label Studio instance:

    Mode Sync command
    New Interface label-studio-sdk interface sync . --title "My Interface" --workspace --publish
    Existing Interface label-studio-sdk interface sync . --message "Describe the change"

    Note the following:

    • By default, sync creates an unpublished local draft so you can review the version in Label Studio before publishing.

    • Add --publish to publish the version immediately and make it available to new projects. The Develop Locally dialog includes --publish automatically when starting a new Interface from scratch and omits it when iterating on an existing one.

    • For new Interfaces, the --workspace flag is optional. If you don't specify a workspace, the Interface will be created in the Shared scope (it can be used by projects in any workspace).

    Useful flags for sync:

    Flag Description
    --publish Publish the version immediately instead of leaving it as a draft.
    --message "..." Store a history message alongside the synced version.
    --dry-run Print the planned action without writing to the server.
    --workspace / --workspace-title "..." Place a newly created Interface in a specific workspace.
    --force Upload even when the local source hash hasn't changed.
    --no-validate Skip the validation gate (compilation is still required).

    After a successful sync, the CLI writes a sidecar file (Screen.jsx.ls-interface.json) next to your source.

    The sidecar is keyed by Label Studio base URL and remembers the Interface ID, workspace, source version, and last pushed source hash, so future sync, start, and open commands don't need --id.

    !!! info Tip
    Click Refresh Versions in the Develop Locally modal after a sync to see your new draft or published version appear on the Interface details page.

    Useful CLI commands

    The full command reference is in the Interface CLI Guide. The most useful commands while developing locally are:

    Command Description
    interface init <dir> Scaffold a starter Interface (Screen.jsx, task.json, scenarios.js).
    interface pull --id <dir> Download an existing Interface to a local directory. Defaults to the latest version (including drafts) when --version isn't set.
    interface preview <dir> Open the live playground and watch the source for changes.
    interface validate <dir> Run static validation and (optionally) Playwright scenarios.
    interface sync <dir> Push local changes back to Label Studio. Creates a draft by default; add --publish to publish.
    interface start <dir> Sync the Interface, create a project that uses it, and open the project's Data tab.
    interface open <dir> Open the saved Interface in Label Studio using the local sidecar.
    interface doctor Check Node.js, npm, the API token, and connectivity.

    Troubleshooting

    Error What to do
    node is required for interface validation Install Node.js and make sure node is on your PATH.
    npm is required to install validator dependencies Install npm and re-run interface doctor.
    source did not compile Fix JSX syntax errors. Interface files are compiled as self-contained JSX snippets; import / require and bundler-specific syntax aren't supported. To use a third-party library, pre-bundle it into the single source file (or load it from an allow-listed host). See Use external libraries and services.
    Module did not return an object Make the final expression in the file an object literal wrapped in parentheses, for example ({ default: Screen }).
    Missing getResults or Missing parseResults Warnings during static validation, but required for scenario validation. Add both functions when you need reliable save/load behavior.
    no sidecar entry Run interface sync against the target Label Studio URL, or pass --id to commands that support it.
    multiple workspaces titled ... Pass --workspace with the numeric workspace ID instead of --workspace-title.

    Source Guide Interfaces Project (`docs/source/guide/interfaces-project.md`)


    title: Create a project from an Interface short: Interface projects tier: enterprise type: guide order: 0 order_enterprise: 144 meta_title: Create projects from Interfaces meta_description: "Create and update projects using Label Studio Interfaces" section: "Interfaces"

    Once you have created an Interface, you can create a project from it.

    !!! note
    You can only use one Interface per project. However, you can customize the Interface and switch between versions in the project settings.

    Create a project from an Interface

    • From the Interfaces list, click the overflow menu and select Create Project.
    • From the Interface details page, select the Projects tab and click Create Project.
    Field Description
    Workspace The workspace where the project will be created. You can only select workspaces for shared Interfaces.
    Project Title The name of the project.
    Description A description of the project.

    What each project inherits

    The project owns its own copy of the Interface code, pinned to the version you selected.

    Note the following:

    • Later edits to the Interface don't retroactively change existing projects.

      A project keeps running its pinned version until someone explicitly changes versions. You can do this from the version selector under Project > Settings > Labeling Interface.

    • Configuration lives with the project.

      Any configurable options the Interface exposes (label names, colors, display text, which task data field holds the primary content, etc.) are stored per project. Editing one project's configuration does not affect any other project, even projects that share the same Interface and version.

    Configure the project's Interface

    For projects created from Interfaces, you can adjust the UI from Settings > Labeling Interface.

    Adjustments you make from the project context will only affect the Interface for that project, and will not iterate the Interface version.

    If you want to iterate the Interface version, you can do so from the Interface details page. Click Open Interface.

    Source Interface

    From here you can see information about the Interface such as its name, creation date, and the version that you are using in the project.

    Use the drop-down to switch between versions.

    Interface configuration

    From here you can configure labeling elements such as label names, colors, and display text.


    Source Guide Interfaces (`docs/source/guide/interfaces.md`)


    title: Interfaces overview short: Overview tier: enterprise type: guide order: 0 order_enterprise: 141 meta_title: Interfaces meta_description: "Build custom labeling interfaces with React" section: "Interfaces"

    The Interfaces builder allows you to build highly customized labeling UIs to use across your Label Studio projects.

    Instead of choosing a template and tuning out-of-the-box XML tags, with Interfaces you describe the experience you want and Label Studio builds a fully interactive React-based labeling UI that you can preview, refine, save, and share across projects.

    !!! note Availability
    Interfaces are available in Label Studio Enterprise (including self-hosted) and Starter Cloud. If you're on a self-hosted or on-prem deployment and don't see Interfaces, contact your account manager to enable it for your organization.

    text
    There are two ways to build an Interface:
    
    - **Create with Agent**: the in-product builder. Available on **Label Studio Cloud only**.
    - **[Develop Locally](interfaces-local)**: build with your own coding agent and sync the result to Label Studio. Available on any deployment.
    
    On Label Studio Cloud you can use either path, whichever you prefer. On self-hosted or on-prem deployments (including air-gapped), **Develop Locally is the way to build Interfaces**, since Create with Agent is a Cloud-only feature.
    
    Everything else about Interfaces (versioning, projects, exports) works the same across both paths. See [Create with the agent](interfaces-agent).

    When to use Interfaces

    Interfaces are Label Studio's most powerful UI builder. Use them when:

    • Label Studio's XML tags don't support your use case. For example, if you want to annotate data types that do not have a corresponding object tag (3D files, GEOTiff, DICOM, etc).
    • When you want to be able to vibe code your labeling UI either within Label Studio or using your own tools and agent outside of Label Studio. To work with a coding agent like Claude Code, Codex, or Cursor, install the create-interface-skill — or see the full agent skills overview.
    • When you need to be able to version your labeling UIs.
    • When you need more custom logic.

    For a full comparison between Interfaces and classic Label Studio tags, see Interfaces vs. classic tags.

    Project and feature integration

    Once saved, you can use the Interface to create new projects (subject to the workspace scope — see Interface scope). The project uses the Interface to render the labeling UI.

    Because annotations are still stored as regular Label Studio results, standard review workflows and exports continue to work.

    Feature Notes
    Prompts The Interface's output schema instructs Prompts how to turn an LLM's structured response into Label Studio annotations, so you can pre-label tasks and have humans review.
    Agreements You can view and explore agreement as you would with any other task. However, you cannot customize per-control-tag agreement metrics.
    Analytics You can use the dashboards to visualize annotation and review work as you would with any other Label Studio project.
    Project settings There is no change or restriction on project settings when configuring a project that has an Interface attached.
    Plugins Plugins are not supported with Interfaces. Instead, you can directly include plugin-type functionality within your Interface code.
    XML tags Interfaces do not incorporate classic XML tags and cannot be combined with a classic XML labeling interface.

    Interfaces vs. classic tags

    Feature Classic XML tags Interfaces
    Format XML tag library React / agent-generated code
    How to build Configure XML or template selection Natural-language prompting via the Label Studio agent or coding agent with skills.md
    Iteration speed Moderate Extremely fast (prompt → refine → ship)
    Multi-modal support Supported, but constrained Fully flexible and supports data not supported by traditional XML tags (3D data, geotiff, etc)
    Business logic Implemented via plugins as separate code that hooks into the configuration Written directly into the Interface component
    AI automation Connect models via ML backend ML backend, native model integration, supported in Prompts for LLM-as-a-judge pre-labeling or evaluation with
    Reusability across projects Configuration is project-scoped; reuse means duplication and drift Interfaces are first-class objects — port one to any project without copying
    Versioning Limited Built-in version history with one-click rollback
    Access control Project-level Workspace- or project-level access on the Interface itself
    Backend integration Yes Yes
    Agent compatibility No Yes (Label Studio agent or select your own)
    Guardrails Tag library enforces compatibility Agent runs separate from your production environment

    Interface scope

    There are template Interfaces, shared Interfaces, and Interfaces scoped to specific workspaces.

    Template Interfaces are the quickest way to get started; shared and workspace scopes let teams standardize on a shared set of labeling experiences.

    Scope Who can see it Who can edit it
    Templates Everyone in your organization No one — HumanSignal-maintained, read-only. However, you can duplicate a system interface and edit the copy.
    Shared Everyone in your organization Anyone with the appropriate permissions
    Workspace Members of the chosen workspace only Owners and Admins, or Managers who are members of that workspace

    Note the following:

    • Template interfaces are read-only. You cannot modify or delete a HumanSignal-provided template — duplicate it first and edit the copy.

    • Scope changes are structural. Moving an Interface between shared and workspace scope can change who is able use it to create new projects.

    Security

    User access

    Role Access
    Owners and Admins Can create and edit shared Interfaces and for any workspace
    Managers Can create and edit shared Interfaces and for any workspace in which they are a member
    Annotators and Reviewers Do not have access to the Interfaces feature

    Admin controls

    You can enable or disable the ability to create and edit Interfaces for your organization. For more information, see Interfaces settings.

    Sandboxing

    Interfaces run as sandboxed modules rendered inside the Label Studio editor shell. To keep them safe, portable, and upgrade-friendly, the runtime enforces a narrow contract:

    • React-only source, closed by default. The code runs with React and the standard hooks (useState, useRef, useEffect, useCallback, useMemo) plus a small getField helper. You can't import npm packages in the source. You can still use a third-party library by bundling it into the Interface or by loading it from a host you allow-list. See Use external libraries and services.
    • Plain JavaScript with JSX. No TypeScript, no type annotations, no import / export statements. The module is compiled and evaluated at runtime, and must expose a default component plus optional helpers (getResults, parseResults, outputSchema, inputSchema, paramsSchema, GridCell).
    • No network access by default. Out of the box an Interface can only reach your Label Studio server. To let it call an external service (for example an ML backend), an Owner/Admin allow-lists that origin under Organization > Settings > Interfaces → API origins. See Use external libraries and services.
    • Limited persistence. State lives only for the duration of a labeling session. Anything you want to keep has to come back out through the annotation results.

    Source Guide Label