> ## Documentation Index
> Fetch the complete documentation index at: https://docs.60db.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirm Upload

> Tell 60db a file is uploaded so it can be checked

After the storage upload succeeds, send the `upload_id`. 60db inspects the stored file itself. The row becomes ready for analysis once the file passes. Sending it again returns `200` and changes nothing.

> [!NOTE]
>
> Needs `manage` on the analyzer.

## Request

### Headers

**Authorization** `string` *required*

Bearer token with your API key: `Bearer sk_...`

**Content-Type** `string` *required*

application/json

### Path

**batchId** `string` *required*

Batch ID (UUID)

**itemId** `string` *required*

Batch row ID (UUID). Get it from [List batch rows](https://docs.60db.ai/api-reference/call-analysis/list-batch-items.md)

### Body

**receipt\_ref** `string` *required*

The `upload_id` from the upload slot (1–500 characters)

## Response

**201 Created (200 on repeat)**

```json theme={null}
{
  "success": true,
  "data": {
    "replayed": false,
    "job_created": false,
    "waiting_for": []
  }
}
```

## Errors

Errors use `{ "success": false, "message": "...", "code": "..." }`. See the [overview](https://docs.60db.ai/api-reference/call-analysis/overview.md#errors) for the codes every route can return.

### This endpoint

| Status | Code | When |
| - | - | - |
| 400 | `INVALID_RECEIPT` | `receipt_ref` is malformed |
| 409 | `ASSET_NOT_UPLOADED` | No file in storage yet |
| 409 | `UPLOAD_SUPERSEDED` | A newer slot replaced this one |
| 409 | `UPLOAD_REJECTED` | This upload was rejected earlier |
| 422 | `ASSET_TYPE_MISMATCH` | The content is not the type you declared |
| 422 | `ASSET_TOO_LARGE` | The stored file is over 100 MiB |
| 422 | `ASSET_EMPTY` | The file is empty |
| 422 | `ASSET_UNDECODABLE` | Audio cannot be read |
| 422 | `ASSET_CHANGED` | The file changed while it was checked |

## Example

```bash cURL theme={null}
curl -X POST 'https://api.60db.ai/deep-analytics/imports/batches/9b7e6d5c-4b3a-4291-8f0e-1d2c3b4a5968/items/c1d2e3f4-a5b6-4c7d-9e8f-7a6b5c4d3e2f/asset-receipt' \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"receipt_ref": "<upload-id>"}'
```

```javascript JavaScript theme={null}
const res = await fetch('https://api.60db.ai/deep-analytics/imports/batches/9b7e6d5c-4b3a-4291-8f0e-1d2c3b4a5968/items/c1d2e3f4-a5b6-4c7d-9e8f-7a6b5c4d3e2f/asset-receipt', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer your-api-key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "receipt_ref": "<upload-id>"
  }),
});
const { success, data, message, code } = await res.json();
if (!success) throw new Error(`${code}: ${message}`);
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.