---
title: asset_register
description: Register an Asset into the provider library of one advertiser, so that an ad of that advertiser can use it. The call returns at once, and asset_get gives the state.
---

Ask to register a file with one advertiser, so that an ad of that advertiser can use it. The Registration runs in the background.

> "Put the spring sale video in the Acme Meta account."

The agent finds the advertiser with [`list_advertisers`](/mcp/tools/list-advertisers), and then calls this tool. The call returns at once, and the Registration runs. The agent then reads the Asset with [`asset_get`](/mcp/tools/asset-get) until the Registration settles. You see the result: the file is ready, with the id that the provider gave it, or the Registration failed, with the reason.

While a Registration of a file with an advertiser runs, or after it succeeds, AdCrunch refuses a second one, so a retry makes no copy. After a failed Registration, the agent can register the file again. [What each provider supports](/connect/providers#register-creative) states which providers take a Registration.

This tool is part of the job [Bring your own creative](/mcp/tools/bring-your-own-creative).

## Reference

**Available on:** [![Meta](/providers/meta.svg)](https://docs.adcrunch.dev/connect/providers) [![TikTok](/providers/tiktok.svg)](https://docs.adcrunch.dev/connect/providers)

Place an Asset in one **advertiser's** provider-side library, so ads in that account can use it.

Registration targets an advertiser, not a provider — an organization usually has several ad accounts. Use list_advertisers to find the right id.

Returns immediately; poll asset_get to see when the Registration becomes `ready`. Video can stay `running` for several minutes while the provider processes it, which is normal and not a failure. Registering the same Asset to the same advertiser twice is refused rather than duplicated, so a retry is safe.

### Input

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `advertiser_id` | string | yes | The advertiser (ad account) id — acc_…. |
| `asset_id` | string | yes | The Asset id (ast_…). |

### Output

A successful call returns this object in `structuredContent`.

| Field | Type | Always present | Description |
| --- | --- | --- | --- |
| `registration` | object | yes | The Registration, at `running`, with no `providerIdentifier` yet. Poll asset_get until the Registration is `ready` or `failed`. |
| `registration.advertiserId` | string | yes | The advertiser whose provider library gets the Asset. |
| `registration.assetId` | string | yes | The Asset that the Registration places. |
| `registration.createdAt` | number | yes | Milliseconds since the Unix epoch, UTC. |
| `registration.deletedAt` | number or null | yes | Always `null` here. When a retry replaces a failed Registration, AdCrunch sets this time on the old one and answers it no more. |
| `registration.failureReason` | string or null | yes | Why the Registration failed, as a sentence: the words of the provider, or the words of AdCrunch. `null` unless `status` is `failed`. |
| `registration.id` | string | yes | The id of the Registration, `reg_…`. |
| `registration.organizationId` | string | yes | The organization that owns the Asset. |
| `registration.provider` | one of `meta`, `gads`, `tiktok`, `x`, `openai`, `snapchat`, `dv360` | yes | The provider that owns the advertiser. |
| `registration.providerIdentifier` | string or null | yes | The id that the provider gave the file: a Meta image hash, or the id of the image or the video at the provider. `null` until the provider gives it, and `null` on a `failed` Registration. An image gets its id when the Registration becomes `ready`. A video gets its id earlier, while the Registration is `running`, because the provider gives the id before it has processed the file. Build a creative from a `ready` Registration only. |
| `registration.status` | one of `running`, `ready`, `failed` | yes | Video can stay `running` for several minutes while the provider processes it. That is normal, and not a failure. |
| `registration.updatedAt` | number or null | yes | When the Registration last changed, in milliseconds since the Unix epoch, UTC. `null` until its first change. |
| `registration.uploadSessionId` | string or null | yes | An in-flight provider upload session, where the protocol has one. `null` for every image. |
| `registration.workflowId` | string | yes | The durable execution that runs the Registration. |

### Failure codes

A failed call has `isError` set, and `structuredContent.error` holds one of these codes. [Errors](/mcp/errors) describes the shape of a failed call.

- `not_found`
- `already_registered`
- `forbidden`
- `invalid_request`
- `internal_error`

### Scope

The token must hold `asset:write`. [Auth & scopes](/mcp/auth) lists each scope.

### Annotations

A client reads these hints. A hint that the tool does not declare has the default value of the MCP specification.

- **Writes.** The tool can change data.
- **Not destructive.** The tool makes only additive changes.
- **Idempotent.** A second call with the same arguments changes nothing more.
- **Open world.** The tool reaches a system outside AdCrunch, such as an ad platform.

### Example

The arguments:

```json
{
  "advertiser_id": "acc_1203456789012345",
  "asset_id": "ast_7c1e9a"
}
```

The result, in `structuredContent`:

```json
{
  "registration": {
    "advertiserId": "acc_1203456789012345",
    "assetId": "ast_7c1e9a",
    "createdAt": 1790000121000,
    "deletedAt": null,
    "failureReason": null,
    "id": "reg_4b81d2",
    "organizationId": "org_3a7f10",
    "provider": "meta",
    "providerIdentifier": null,
    "status": "running",
    "updatedAt": null,
    "uploadSessionId": null,
    "workflowId": "reg_4b81d2"
  }
}
```
