docs/source/guide/storage_azure.md
Connect your Microsoft Azure Blob storage container with Label Studio. For details about how Label Studio secures access to cloud storage, see Secure access to cloud storage.
If you are planning to use proxy storage, you can skip this step.
If you are planning to use pre-signed URLs, you must configure CORS.
For more information, see Pre-signed URLs vs. Storage proxies.
In the Azure portal, navigate to the page for the storage account.
From the menu on the left, scroll down to Settings > Resource sharing (CORS).
Under Blob service add the following rule:
https://app.humansignal.com (or the domain you are using)GET, HEAD, OPTIONS**3600Click Save.
Before you begin, review the information in Cloud storage for projects and Secure access to cloud storage.
You will also need to provide the following information. It can all be found on the resource page for your storage account in the Azure console.
You will need:
!!! info Tip
If you are working in an on-prem deployment, you can set the AZURE_BLOB_ACCOUNT_NAME and AZURE_BLOB_ACCOUNT_KEY environment variables instead of manually adding them into the UI.
From Label Studio, open your project and select Settings > Cloud Storage > Add Source Storage.
Select Azure Blob Storage and click Next.
Complete the following fields and then click Test connection:
<div class="noheader rowheader"> <table style="width: 100%; border-collapse: collapse;"> <tr> <th style="width: 25%;">Field</th> <th>Description</th> </tr> <tr> <td>Storage Title</td> <td>Enter a name to identify the storage connection.</td> </tr> <tr> <td>Container Name</td> <td> Enter the name of your Azure storage container. This can be found in the Azure console on your storage account resource page under <strong>Data storage > Containers</strong>. (See the screenshot above.) </td> </tr> <tr> <td>Account Name</td> <td> Enter the name of your Azure storage account. (See the screenshot above.) </td> </tr> <tr> <td>Account Key</td> <td> Enter the access key for your Azure storage account This can be found in the Azure console on your storage account resource page under <strong>Security + networking > Access keys</strong>. (See the screenshot above.) </td> </tr> <tr> <td>Use pre-signed URLs (On) / Proxy through the platform (Off)</td> <td> This determines how data from your container is loaded: <ul> <li><strong>Use pre-signed URLs</strong>: Label Studio generates time-limited HTTPS links directly to your S3/GCS/Azure objects and redirects the browser there (HTTP 303), so annotators’ browsers download media straight from cloud storage. This is usually faster and scales better, but requires correct CORS and presign permissions on the bucket. It also means traffic flows from browser to storage, not through Label Studio.</li> <li><strong>Proxy through the platform</strong> – The backend downloads the file from cloud storage and streams it to the browser, so all media traffic passes through the Label Studio server. This keeps data fully inside the Label Studio/network boundary, enforces task-level access checks on every request, and avoids CORS/presign setup, but uses more Label Studio worker resources and can be slightly slower.</li> </ul> For more information, see
<a href="storage#Pre-signed-URLs-vs-Storage-proxies">Pre-signed URLs vs Storage proxies</a>.
</td>
Complete the following fields and then click Load preview to ensure you are syncing the correct data:
<div class="noheader rowheader">| Bucket Prefix | Optionally, enter the directory name within your container that you would like to use. For example, data-set-1 or data-set-1/subfolder-2. |
| Import Method | Select whether you want create a task for each file in your container or whether you would like to use a JSON/JSONL/Parquet file to define the data for each task. |
| File Name Filter | Specify a regular expression to filter container objects. Use .* to collect all objects. |
| Scan all sub-folders | Enable this option to perform a recursive scan across subfolders within your container. |
If everything looks correct, click Save & Sync to sync immediately, or click Save to save your settings and sync later.
!!! info Tip You can also use the API to sync import storage.
From Label Studio, open your project and select Settings > Cloud Storage > Add Target Storage.
Select Azure Blob Storage and click Next.
Complete the following fields:
<div class="noheader rowheader"> <table style="width: 100%; border-collapse: collapse;"> <tr> <td style="width: 25%;">Storage Title</td> <td>Enter a name to identify the storage connection.</td> </tr> <tr> <td>Container Name</td> <td> Enter the name of your Azure storage container. This can be found in the Azure console on your storage account resource page under <strong>Data storage > Containers</strong>. (See the screenshot above.) </td> </tr> <tr> <td>Container Prefix</td> <td> Optionally, enter the directory name within your container that you would like to use. For example, <code>data-set-1</code> or <code>data-set-1/subfolder-2</code>. </td> </tr> <tr> <td>Account Name</td> <td> Enter the name of your Azure storage account. (See the screenshot above.) </td> </tr> <tr> <td>Account Key</td> <td> Enter the access key for your Azure storage account This can be found in the Azure console on your storage account resource page under <strong>Security + networking > Access keys</strong>. (See the screenshot above.) </td> </tr> <tr> <td>Can delete objects from storage</td> <td>Enable this option if you want to delete annotations stored in the container when they are deleted in Label Studio.</td> </tr> </table> </div>After adding the storage, click Sync.
!!! info Tip You can also use the API to sync export storage.
In Label Studio Enterprise, you can use Azure Service Principal authentication to securely connect Label Studio to Azure Blob Storage without using storage account access keys.
For more information, see Azure Blob Storage with Service Principal in our Enterprise documentation.
</div> <div class="enterprise-only">You can use Azure Service Principal authentication to securely connect Label Studio Enterprise to Azure Blob Storage without using storage account access keys.
Service Principal authentication provides enhanced security through Entra (formerly "Azure Active Directory") identity and access management, allowing for fine-grained permissions and audit capabilities.
Service Principal authentication uses Entra ID to authenticate applications. Unlike storage account keys that provide full access to the storage account, Service Principal authentication allows you to grant specific permissions and can be easily revoked or rotated.
For more information, see Microsoft - Application and service principal objects in Microsoft Entra ID.
Open the Microsoft Entra admin center.
Select App registrations on the right and click New registration. See Register an application.
Provide a name and select the appropriate account type. You can leave the redirect URI blank.
Under Overview, copy the Application (client) ID and Directory (tenant) ID.
Under Certificates & secrets, add a new client secret.
Copy the Value field.
Return to the Azure portal and go to your storage account.
!!! warning If you plan to use pre-signed URLs, configure CORS on the Storage Account Blob service. See Set up CORS for Azure blob storage.
Microsoft.Storage/storageAccounts/blobServices/containers/read.../containers/blobs/read.../containers/blobs/read.../containers/blobs/write.../containers/read.../containers/blobs/delete (optional)These are included in the built-in Storage Blob Data Contributor role.
From Label Studio, open your project and select Settings > Cloud Storage > Add Source Storage.
Select Azure Blob Storage with Service Principal and click Next.
Complete the following fields and then click Test connection:
<div class="noheader rowheader">| Storage Title | Enter a name for the storage connection to appear in Label Studio. |
| Storage Name | Enter the name of your Azure storage account. |
| Container Name | Enter the name of a container within the Azure storage account. |
| Tenant ID | Specify the Directory (tenant) ID from your App Registration. |
| Client ID | Specify the Application (client) ID from your App Registration. |
| Client Secret | Specify the Value of the client secret you copied earlier. |
| Use pre-signed URLs / Proxy through the platform | Enable or disable pre-signed URLs. See more. |
| Expiration minutes | Adjust the counter for how many minutes the pre-signed URLs are valid. |
Complete the following fields and then click Load preview to ensure you are syncing the correct data:
<div class="noheader rowheader">| Bucket Prefix | Optionally, enter the folder name within the container that you would like to use. For example, data-set-1 or data-set-1/subfolder-2. |
| Import Method | Select whether you want create a task for each file in your container or whether you would like to use a JSON/JSONL/Parquet file to define the data for each task. |
| File Name Filter | Specify a regular expression to filter bucket objects. Use .* to collect all objects. |
| Scan all sub-folders | Enable this option to perform a recursive scan across subfolders within your container. |
If everything looks correct, click Save & Sync to sync immediately, or click Save to save your settings and sync later.
!!! info Tip You can also use the API to sync import storage.
From Label Studio, open your project and select Settings > Cloud Storage > Add Target Storage.
Select Azure Blob Storage with Service Principal and click Next.
Complete the following fields:
<div class="noheader rowheader">| Storage Title | Enter a name for the storage connection to appear in Label Studio. |
| Storage Name | Enter the name of your Azure storage account. |
| Container Name | Enter the name of a container within the Azure storage account. |
| Container Prefix | Optionally, enter the folder name within the container that you would like to use. For example, data-set-1 or data-set-1/subfolder-2. |
| Tenant ID | Specify the Directory (tenant) ID from your App Registration. |
| Client ID | Specify the Application (client) ID from your App Registration. |
| Client Secret | Specify the Value of the client secret you copied earlier. |
| Can delete objects from storage | Enable this option if you want to delete annotations stored in the bucket when they are deleted in Label Studio. Your credentials must include the ability to delete bucket objects. |
After adding, click Sync to push exports.
!!! info Tip You can also use the API to sync export storage.
You can also use the API to programmatically create connections. See our API documentation.