---
title: "Create assets"
description: "Creates assets from Content Center files asynchronously and returns an execution ID to track progress."
contentType: "api-reference"
url: "https://developer.mindtickle.com/docs/asset-hub/assets/create-assets/"
---

## Prerequisites

1. [Authentication and setup](/docs/getting-started/authentication-and-setup/): A valid access token.
2. [Content Center](/docs/content-center/): The file must exist in Content Center and be a valid, published, supported file type.
3. [Create a hub](/docs/asset-hub/hubs/create-a-hub/): The target hubs must exist.
4. [Create attributes](/docs/asset-hub/asset-taxonomy/create-attributes/): If you tag an asset, obtain the attribute IDs first. Attributes are optional.

## Endpoint

```http
POST /api/assethub/v2/assets/async
```

Base URL: the standard REST host for your region. See [Base URLs](/docs/getting-started/authentication-and-setup/#base-urls).

Headers: `Authorization: Bearer ACCESS_TOKEN`, `Content-Type: application/json`.

## Request

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `assets` | array | Required | Array of asset objects to create. Maximum 50 assets per request. |
| `user_id` | string | Required | ID of the user performing the operation. Must have the `DEVELOP_ASSETS` permission. |
| `assets[].file_id` | string | Required | ID of the file in Content Center. Must be a valid, supported file type. |
| `assets[].hubs` | string[] | Required | List of valid hub IDs to add the asset to. |
| `assets[].properties` | object | Required | Metadata for the asset. See the properties object fields below. |

The `properties` object takes these fields:

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | Optional | Display name of the asset. Maximum 250 characters. Cannot contain `/` or `\`. Default: the file name. |
| `description` | string | Optional | Asset description. Maximum 1,000 characters, excluding HTML tags. |
| `status` | string | Required | Asset state. `REFERENCE_ASSET_STATE_PUBLISHED` or `REFERENCE_ASSET_STATE_DRAFT`. |
| `asset_owner` | string | Optional | Email of the asset owner. The user must have the necessary permissions. |
| `allow_download` | boolean | Optional | Whether users can download the asset. Default: `true`. |
| `usage` | string | Optional | Sharing type. `SHARING_TYPE_INTERNAL` or `SHARING_TYPE_EXTERNAL`. |
| `allow_mix_and_match` | boolean | Optional | Whether the asset can be mixed with others. Default: `false`. |
| `allow_edit_content` | boolean | Optional | Whether users can edit content. Default: `false`. |
| `allow_save_to_drive` | boolean | Optional | Whether users can save to external drives. Default: `false`. |
| `expiry_date` | string | Optional | Expiration date in `YYYY-MM-DD` format. Must be a future date. |
| `expiry_reminder` | string | Optional | Reminder setting for expiration. One of `EXPIRY_REMINDER_DURATION_ON_THE_DAY_OF_EXPIRY`, `EXPIRY_REMINDER_DURATION_SEVEN_DAYS_BEFORE_EXPIRY`, `EXPIRY_REMINDER_DURATION_FIFTEEN_DAYS_BEFORE_EXPIRY`. |
| `file_update_reminder` | string | Optional | Reminder setting for file updates. One of `REF_ASSET_REMINDER_RECURSIVE_DURATION_WEEKLY`, `REF_ASSET_REMINDER_RECURSIVE_DURATION_BIWEEKLY`, `REF_ASSET_REMINDER_RECURSIVE_DURATION_MONTHLY`, `REF_ASSET_REMINDER_RECURSIVE_DURATION_QUARTERLY`, `REF_ASSET_REMINDER_RECURSIVE_DURATION_HALF_YEARLY`, `REF_ASSET_REMINDER_RECURSIVE_DURATION_YEARLY`. |
| `attributes` | array | Optional | Attributes to tag the asset. Confirm the accepted array format before including this field. See [Attributes format](#notes). |

### Request example

Replace the sample IDs with your own and choose future `expiry_date` values. Review [Attributes format](#notes) before including the optional `attributes` property.

```json
{
  "assets": [
    {
      "file_id": "123456789012345101",
      "hubs": ["123456789012345102", "123456789012345103"],
      "properties": {
        "name": "Sample Asset 1",
        "description": "This is a sample asset",
        "status": "REFERENCE_ASSET_STATE_PUBLISHED",
        "asset_owner": "user@example.com",
        "allow_download": true,
        "usage": "SHARING_TYPE_INTERNAL",
        "allow_mix_and_match": false,
        "allow_edit_content": false,
        "allow_save_to_drive": false,
        "expiry_date": "2030-12-12",
        "expiry_reminder": "EXPIRY_REMINDER_DURATION_ON_THE_DAY_OF_EXPIRY",
        "file_update_reminder": "REF_ASSET_REMINDER_RECURSIVE_DURATION_WEEKLY",
        "attributes": [{ "attribute_id": "123456789012345104" }, { "attribute_id": "123456789012345105" }]
      }
    },
    {
      "file_id": "123456789012345106",
      "hubs": ["123456789012345102", "123456789012345107"],
      "properties": {
        "name": "Q4 Marketing Deck",
        "description": "External facing pitch deck",
        "status": "REFERENCE_ASSET_STATE_DRAFT",
        "asset_owner": "marketing@example.com",
        "allow_download": false,
        "usage": "SHARING_TYPE_EXTERNAL",
        "allow_mix_and_match": true,
        "allow_edit_content": true,
        "allow_save_to_drive": true,
        "expiry_date": "2031-01-01",
        "expiry_reminder": "EXPIRY_REMINDER_DURATION_ON_THE_DAY_OF_EXPIRY",
        "file_update_reminder": "REF_ASSET_REMINDER_RECURSIVE_DURATION_HALF_YEARLY",
        "attributes": [{ "attribute_id": "123456789012345108" }]
      }
    }
  ],
  "user_id": "123456789abcd109"
}
```

## Response

Returns an execution ID to track the background process.

| Field | Type | Description |
| --- | --- | --- |
| `execution_id` | string | ID to track the async operation status. |
| `request_id` | string | Unique ID for the request. |
| `message` | string | System message. Present only if it is not empty. |

### Response example

```json
{
  "execution_id": "w123436",
  "request_id": "req_101",
  "message": "Operation initiated successfully"
}
```

## Notes

- **Async processing:** This endpoint creates the assets in the background and returns an execution ID. Use it with Check status to follow the progress of each asset.
- **Limits:** Maximum 50 assets per request. Asset name 250 characters. Description 1,000 characters.
- **Validation:** The `file_id` must correspond to a valid, published file in Content Center.
- **Validation:** The asset name cannot contain `/` or `\`.
- **Synced files:** If the `file_id` is a synced file and metadata is available through the sync, that latest synced metadata is used and explicitly passed values for those properties are ignored. For non-synced properties, the explicitly passed metadata is used.
- **Defaults:** `allow_download` defaults to `true`. The other boolean flags default to `false`.
- **Dependent properties:** If a parent property is missing, for example `expiry_date`, dependent properties such as `expiry_reminder` are ignored.
- **Governance rules:** Embedded assets cannot have Allow download set to Yes. Only PPT, PDF, DOCX, and XLSX assets can have Allow customization set to Yes. PDF assets cannot have Edit content set to Yes.
- **Attributes:** Use unique attribute IDs rather than display names. To find these IDs, see the response of [Create attributes](/docs/asset-hub/asset-taxonomy/create-attributes/). Check [Attributes format](#notes) before constructing the array.
- **Feature flags:** Properties controlled by disabled feature flags are ignored.
- **Attributes format:** Confirm the accepted `attributes` format with [Mindtickle Support](mailto:support@mindtickle.com) before submitting assets. The request example uses objects such as `{ "attribute_id": "123456789012345104" }`; do not substitute ID strings without confirming the accepted format.
- **Status response:** Confirm the status response fields for your operation with [Mindtickle Support](mailto:support@mindtickle.com) before implementing polling. Do not assume creation and move or mirror operations use the same response shape because they share `GET /api/assethub/v2/assets/async/{execution_id}`.

## Check status

Fetch the progress or completion status of an async asset creation request with the `execution_id` this endpoint returns.

```http
GET /api/assethub/v2/assets/async/{execution_id}
```

Query parameters:

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `user_id` | string | Required | User ID for authorization. Must be a valid user ID. |
| `limit` | integer | Optional | Maximum number of tasks to return. Maximum 100. Default: 0. |
| `skip` | integer | Optional | Number of tasks to skip. Default: 0. |

This standalone example illustrates a status response. Its task counts are independent of the request example above:

```json
{
  "execution_id": "w123436",
  "status": "success",
  "total_tasks": 25,
  "completed_tasks": 24,
  "failed_tasks": 1,
  "tasks": [
    {
      "task_id": "t_101",
      "status": "success",
      "asset_id": "123456789012345110"
    },
    {
      "task_id": "t_102",
      "status": "failed",
      "asset_id": "",
      "error": "Asset already exists with same name in one or more hubs."
    }
  ],
  "request_id": "req_102"
}
```

Response values:

- **Execution status:** `in_progress`, `success`, `failed`, `not_dispatched`.
- **Task status:** `success`, `failed`, `in_progress`, `not_dispatched`. Check the task outcomes and `failed_tasks` count before treating the batch as successful. The example has execution status `success` even though one task failed.

:::note
`limit` cannot be greater than 100.
:::

## Related

- [Move or mirror assets](/docs/asset-hub/assets/move-or-mirror-assets/): Map an asset to more hubs after creating it.
- [Archive assets](/docs/asset-hub/assets/archive-assets/): Archive an asset that is no longer in use.
- [Delete assets](/docs/asset-hub/assets/delete-assets/): Permanently delete an asset.
