> This page is for Developer Documentation.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.benchling.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.benchling.com/_mcp/server.

# Upload a part of a multi-part blob

POST https://{tenant_name}.benchling.com/api/v2/blobs/{blob_id}/parts
Content-Type: application/json


Upload a part of the blob. This part must be at least 5MB, unless it's the last or only part. It's recommended to keep the part size around 10MB.

The data64 parameter is the base64-encoded part contents, and the md5 parameter is the hex-encoded MD5 hash of the part contents. For example, given the string hello, data64 is aGVsbG8= and md5 is 5d41402abc4b2a76b9719d911017c592.

## Multipart Upload

If a blob is larger than 10MB, it should be uploaded in multiple parts using the following endpoints:
- [Start a multi-part blob upload](#/Blobs/createMultipartBlob)
- [Upload a blob part](#/Blobs/createBlobPart)
- [Complete a blob upload](#/Blobs/completeMultipartBlob)

Each part has a *partNumber* and an *eTag*. The part number can be any number between 1 to 10,000, inclusive - this number should be unique and identifies the order of the part in the final blob. The eTag of a part is returned in the API response - this eTag must be specified when completing the upload in order to ensure the server has received all the expected parts.


Reference: https://docs.benchling.com/docs/api/v2/benchling-api/blobs/create-blob-part

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `blob_id` (string, required)

### Body (application/json)

This endpoint expects a BlobPartCreate.

- `data64` (string, required)
- `md5` (string, required)
- `partNumber` (integer, required) — An integer between 1 to 10,000, inclusive. The part number must be unique per part and indicates the ordering of the part inside the final blob. The part numbers do not need to be consecutive.

## Response

### 200

Created

- `eTag` (string, optional)
- `partNumber` (integer, optional)

## Errors

### 400 Bad Request Error

Bad Request

- `error` (BadRequestErrorError, optional)

## Types

### BadRequestErrorError

- `message` (string, optional)
- `type` (enum, optional)
  - Allowed values: `invalid_request_error`
- `userMessage` (string, optional)

## Examples

**Request**

```json
{
  "data64": "string",
  "md5": "string",
  "partNumber": 1
}
```

**Response**

```json
{
  "eTag": "\"6f5902ac237024bdd0c176cb93063dc4\"",
  "partNumber": 1
}
```

**SDK Code**

```python
import requests

url = "https://{tenant_name}.benchling.com/api/v2/blobs/blob_id/parts"

payload = {
    "data64": "string",
    "md5": "string",
    "partNumber": 1
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://{tenant_name}.benchling.com/api/v2/blobs/blob_id/parts';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"data64":"string","md5":"string","partNumber":1}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```