<!-- BusyBot node reference — https://busybot.net/tools/microsoft-storage/ -->

> Node: Microsoft Azure Storage (`microsoft_storage`) · Action (binary) · v1
> Category: Data & Storage · Credentials: Microsoft Azure Storage API (`microsoftStorageApi`)
> Updated: 2026-08-16

# Microsoft Azure Storage

> Manage blobs and containers in Azure Blob Storage

## Overview

Full blob and container management through the Azure Blob Storage REST API, across two resources. **Blob** covers create (upload from binary data or copy from a URL), delete, get (download) and list with pagination. **Container** covers create with name validation, delete, read properties, and list with pagination.

Blob download writes the file to a binary property on the output item; blob create reads binary data from an upstream item or has Azure copy the content server-side from a URL. Requests are signed with a SharedKey signature against API version 2021-12-02.

**Category:** Data & Storage  
**Tool Name:** `microsoft_storage`  
**Version:** 1

**Appearance:** Icon: `lucide-HardDrive` | Color: `#0078D4`

## Node Type

**Action (Binary)** — handles file/binary data operations

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **Microsoft Azure Storage API** credentials.
See the [Credentials Guide](https://busybot.net/credentials/microsoft-storage-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Blob | `blob` |
| Container | `container` |

### Operations

Both resources offer the same four operation values; the Resource selector decides what they act on.

| Operation | Value | Description |
|-----------|-------|-------------|
| Create | `create` | Create a new blob or replace an existing one |
| Delete | `delete` | Delete a blob |
| Get | `get` | Retrieve data for a specific blob (download) |
| Get Many | `getAll` | Retrieve a list of blobs |
| Create | `create` | Create a container |
| Delete | `delete` | Delete a container |
| Get | `get` | Retrieve data for a specific container |
| Get Many | `getAll` | Retrieve a list of containers |

### Parameters

#### Blob: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container to create the blob in. Supports expressions. |
| Blob Name | `string` | Yes | — | The name of the new or existing blob. Supports expressions like {{ $json.filename }}. |
| From | `options` | Yes | `binary` | Whether to upload from binary data on the input item or copy from a URL. |
| | | | | Options: `binary`, `url` |
| Binary Property | `string` | Yes | `data` | Name of the binary property containing the file to upload. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. _(shown when From is `binary`)_ |
| URL | `string` | Yes | — | URL to copy the blob contents from (server-side copy). Supports expressions. _(shown when From is `url`)_ |
| Options | `collection` | No | `{}` | Blob properties, metadata and policies to set on creation. |
| — Access Tier | `options` | No | `Hot` | The tier to set on the blob (Hot, Cool, Cold, Archive). |
| | | | | Options: `Archive`, `Cold`, `Cool`, `Hot` |
| — Blob Type | `options` | No | `BlockBlob` | The type of blob to create. _(shown when From is `binary`)_ |
| | | | | Options: `BlockBlob`, `PageBlob`, `AppendBlob` |
| — Cache Control | `string` | No | — | Sets the blob cache control value. |
| — Content CRC64 | `string` | No | — | CRC64 hash for integrity verification. |
| — Content Encoding | `string` | No | — | Sets the blob content encoding. |
| — Content Language | `string` | No | — | Sets the blob content language. |
| — Content MD5 | `string` | No | — | Sets the blob MD5 hash for integrity verification. |
| — Content Type | `string` | No | — | Sets the blob content type. |
| — Encryption Context | `string` | No | — | Blob system metadata. Max 1024 chars. Valid for accounts with hierarchical namespace. _(shown when From is `binary`)_ |
| — Encryption Scope | `string` | No | — | Encryption scope for encrypting the request contents. |
| — Expiry Option | `options` | No | `Absolute` | Expiration option for accounts with hierarchical namespace. |
| | | | | Options: `Absolute` (Expiry Time must be specified), `NeverExpire` |
| — Expiry Time | `string` | No | — | ISO 8601 datetime when the blob should expire (e.g. 2025-12-31T23:59:59Z). |
| — Filename | `string` | No | — | Override the filename in Content-Disposition header. |
| — Immutability Policy Date | `string` | No | — | Retention-until date (ISO 8601). The blob is protected from modification until this date. _(shown when From is `binary`)_ |
| — Immutability Policy Mode | `options` | No | `unlocked` | Immutability policy mode for the blob. _(shown when From is `binary`)_ |
| | | | | Options: `locked` (users cannot modify the policy), `unlocked` (users can change the policy) |
| — Lease ID | `string` | No | — | Required if the blob has an active lease. |
| — Legal Hold | `boolean` | No | `false` | Whether to set a legal hold on the blob. _(shown when From is `binary`)_ |
| — Metadata | `fixedCollection` | No | `{ metadataValues: [] }` | Name-value pairs to associate with the blob as metadata. |
| — Field Name | `string` | No | — | Metadata key. |
| — Field Value | `string` | No | — | Metadata value. |
| — Origin | `string` | No | — | Origin for CORS headers on the response. |
| — Tags | `fixedCollection` | No | `{ tagValues: [] }` | Tags to set on the blob. |
| — Tag Name | `string` | No | — | Tag key. |
| — Tag Value | `string` | No | — | Tag value. |

#### Blob: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container the blob is in. Supports expressions. |
| Blob Name | `string` | Yes | — | Name of the blob to delete. Supports expressions. |
| Options | `collection` | No | `{}` | Lease handling. |
| — Lease ID | `string` | No | — | Required if the blob has an active lease. |

#### Blob: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container the blob is in. Supports expressions. |
| Blob Name | `string` | Yes | — | Name of the blob to download. Supports expressions. |
| Binary Property | `string` | No | `data` | Name of the binary property to write the downloaded blob to. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. |
| Options | `collection` | No | `{}` | Lease handling and response shaping. |
| — Lease ID | `string` | No | — | Required if the blob has an active lease. |
| — Origin | `string` | No | — | Origin for CORS headers on the response. |
| — Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response metadata. |
| — UPN | `boolean` | No | `false` | Whether to transform Microsoft Entra object IDs to User Principal Names. Valid for hierarchical namespace accounts. |

#### Blob: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container to list blobs from. Supports expressions. |
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of blobs to return. _(shown when Return All is `false`)_ |
| Options | `collection` | No | `{}` | Extra fields, filters and response shaping. |
| — Fields | `multiOptions` | No | `[]` | Additional fields to include in the response. |
| | | | | Options: `copy`, `deleted`, `deletedwithversions`, `immutabilitypolicy`, `legalhold`, `metadata`, `permissions`, `snapshots`, `tags`, `uncommittedblobs`, `versions` |
| — Filter | `multiOptions` | No | `[]` | Filter types for hierarchical namespace accounts. |
| | | | | Options: `deleted`, `files`, `directories` |
| — Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response. |
| — UPN | `boolean` | No | `false` | Whether to transform Microsoft Entra object IDs to User Principal Names. |

#### Container: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the new container (3-63 chars, lowercase alphanumeric and hyphens, no consecutive hyphens). Supports expressions. |
| Options | `collection` | No | `{}` | Public access level and metadata for the new container. |
| — Access Level | `options` | No | — | Public access level for the container. |
| | | | | Options: `blob` (public read access for blobs only), `container` (full public read access for container and blob data), empty (private — no public access, the default) |
| — Metadata | `fixedCollection` | No | `{ metadataValues: [] }` | Name-value pairs to associate with the container as metadata. |
| — Field Name | `string` | No | — | Metadata key. |
| — Field Value | `string` | No | — | Metadata value. |

#### Container: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container to delete. Supports expressions. |

#### Container: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Container Name | `string` | Yes | — | Name of the container to get properties for. Supports expressions. |
| Options | `collection` | No | `{}` | Response shaping. |
| — Simplify | `boolean` | No | `true` | Whether to return a simplified version of the response. |

#### Container: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of containers to return. _(shown when Return All is `false`)_ |
| Options | `collection` | No | `{}` | Extra fields and a name filter. |
| — Fields | `multiOptions` | No | `[]` | Additional fields to include in the response. |
| | | | | Options: `metadata`, `deleted`, `system` |
| — Filter (Prefix) | `string` | No | — | Filter results to only containers with a name beginning with the specified prefix. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `10` | Maximum number of items to process concurrently. |

## Output Data

Results are merged into the input item's JSON, so the incoming fields stay available downstream, and binary data on the input item is forwarded.

| Operation | Output |
|-----------|--------|
| `blob` / `create`, `delete` and `container` / `create`, `delete` | One item carrying the Azure response headers parsed into JSON — the request's `etag`, `lastModified`, encryption flags and similar. |
| `blob` / `get` | One item carrying `name`, a `properties` object and `metadata` when the blob has any; the blob's bytes are written to the binary property you named, alongside any binary already on the item. |
| `blob` / `getAll` | **One item per blob.** An empty container produces one item carrying an empty `blobs` array. |
| `container` / `get` | One item carrying `name`, a `properties` object and `metadata` when the container has any. |
| `container` / `getAll` | **One item per container.** An account with no matching containers produces one item carrying an empty `containers` array. |

A downloaded blob's JSON looks like this:

```json
{
  "name": "reports/2024/summary.pdf",
  "properties": {
    "contentType": "application/pdf",
    "contentLength": 148213,
    "lastModified": "Mon, 04 Nov 2024 10:12:31 GMT",
    "etag": "0x8DCFC2A1B3E4F56"
  },
  "metadata": { "author": "user123" }
}
```

**Simplify** (on by default for Get and Get Many) trims the property set to the commonly used fields; turn it off to receive everything Azure returned.

## Usage Examples

- Download a blob from Azure Storage
- Upload a binary file to an Azure container
- Create a blob from a URL (server-side copy)
- List all blobs in a container
- Create a new Azure Storage container
- Delete a blob from Azure Storage
- Get container properties
- List all containers in a storage account

## Example Configuration

Upload binary data from an upstream node, with metadata and tags:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "blob",
    "operation": "create",
    "containerName": "uploads",
    "blobName": "{{ $json.filename }}",
    "from": "binary",
    "binaryPropertyName": "data",
    "options": {
      "accessTier": "Hot",
      "contentType": "{{ $json.mimeType }}",
      "metadata": {
        "metadataValues": [
          { "fieldName": "uploadedBy", "fieldValue": "{{ $json.userId }}" }
        ]
      },
      "tags": {
        "tagValues": [
          { "tagName": "category", "tagValue": "user-upload" }
        ]
      }
    }
  }
}
```

Have Azure copy a blob straight from a public URL:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "blob",
    "operation": "create",
    "containerName": "my-container",
    "blobName": "copied-file.jpg",
    "from": "url",
    "url": "https://example.com/source-image.jpg",
    "options": {
      "accessTier": "Cool",
      "contentType": "image/jpeg"
    }
  }
}
```

Download a blob into a named binary property:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "blob",
    "operation": "get",
    "containerName": "my-container",
    "blobName": "{{ $json.name }}",
    "binaryPropertyName": "downloadedData",
    "options": {
      "simplify": true
    }
  }
}
```

List every blob in a container, including metadata and snapshots:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "blob",
    "operation": "getAll",
    "containerName": "my-container",
    "returnAll": true,
    "options": {
      "simplify": true,
      "fields": ["metadata", "snapshots"]
    }
  }
}
```

Delete a blob that holds an active lease:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "blob",
    "operation": "delete",
    "containerName": "my-container",
    "blobName": "unwanted-file.txt",
    "options": {
      "leaseId": "lease-id-123"
    }
  }
}
```

Create a container with public blob access and metadata:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "container",
    "operation": "create",
    "containerName": "new-container",
    "options": {
      "accessLevel": "blob",
      "metadata": {
        "metadataValues": [
          { "fieldName": "purpose", "fieldValue": "data-storage" },
          { "fieldName": "department", "fieldValue": "engineering" }
        ]
      }
    }
  }
}
```

Read a container's properties:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "container",
    "operation": "get",
    "containerName": "my-container",
    "options": {
      "simplify": true
    }
  }
}
```

List containers whose names start with a prefix:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "container",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50,
    "options": {
      "fields": ["metadata"],
      "filter": "project-"
    }
  }
}
```

Delete a container:

```json
{
  "type": "microsoft_storage",
  "parameters": {
    "resource": "container",
    "operation": "delete",
    "containerName": "old-container"
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Manage blobs and containers in Azure Blob Storage with SharedKey auth. Supports binary upload/download, container lifecycle, and blob listing with pagination.

- **Container names are strict.** Three to 63 characters, lowercase letters, digits and single hyphens — no consecutive hyphens. Create fails on anything else before the request is sent.
- **`From` decides the upload path.** `binary` reads the named binary property off the incoming item and sends the bytes; `url` hands Azure a source URL and lets the service copy it, so no data passes through the workflow.
- **Several options are binary-only.** Blob Type, Encryption Context, the immutability policy fields and Legal Hold apply only when From is `binary`.
- **Create replaces.** Writing to an existing blob name overwrites it rather than failing.
- **Leases block writes.** If a blob has an active lease, supply its Lease ID on create, delete or get, or the request is rejected.
- **Access Level governs public exposure.** Leave it unset for a private container; `blob` exposes blob contents to anonymous readers, `container` exposes the listing too.
- **Metadata and tags are different things.** Metadata is a free-form name-value bag stored with the blob; tags are indexed and searchable in Azure.
- **Get Many fans out** — each blob or container becomes its own item, so downstream nodes process them individually.