---
title: "List the organization Assets"
method: GET
path: "/assets"
tags: ["Assets"]
---

# List the organization Assets

`GET /assets`

## Request

- Base URL: `https://api.adcrunch.dev`
- URL: `https://api.adcrunch.dev/assets`
- Auth: HTTP bearer

Lists the active organization's Assets, newest first. Each row carries its Registrations, so one read answers where every file is and what still needs registering. A reservation is excluded until finalize promotes it to `ready`, and so is a deleted Asset.

One page at a time: `limit` rows at most, 100 by default. When the answer holds `nextCursor`, more rows exist: send it back as `cursor` to get the next page. There is no filter.

## Query parameters

- `cursor` string: The `nextCursor` of the previous page. Omit it to get the first page. Send it with no change, and with the same filters as the request that answered it: a cursor from a different query gets a 400 `invalid_cursor`. Do not build or change a cursor.
- `limit` integer, required: The greatest number of rows on the page, from 1 to 500. The default is 100. A greater value gets a 400, with `error` of `invalid_request`.

## Response `200`

One page of the stored Assets of the organization, newest first, each with its Registrations. An Asset registered nowhere carries an empty array. This page is the last one, so it carries no `nextCursor`.

- object
  - `data` object[], required
    - `contentHash` string, required: AdCrunch’s own hash of the stored bytes. A hint for de-duplication, never an identity, and never a provider’s hash. Empty when the store reports none.
    - `createdAt` number, required: Milliseconds since the Unix epoch, UTC.
    - `createdBy` string, required: The user who reserved the upload.
    - `deletedAt` number, nullable, required: Always `null` here. A deleted Asset is not answered.
    - `durationMs` number, nullable, required: How long the video runs, in milliseconds, read from the header of the file at finalize. `null` for an image. For a video, `null` when the file does not state it, or for an Asset uploaded before AdCrunch read it.
    - `filename` string, required: The name the file was uploaded under. Never a lookup key.
    - `height` number, nullable, required: The height in pixels as the file is displayed, with its rotation applied, read from the header of the file at finalize. `null` when the file does not state it, or for an Asset uploaded before AdCrunch read it.
    - `id` string, required: The id of the Asset, `ast_…`.
    - `key` string, required: Where the bytes are held. Read-only, and never sent by you.
    - `kind` 'image' | 'video', required: Follows from `mimeType`, so the stored bytes verify it at finalize. It selects how a provider takes the file.
    - `mimeType` string, required: The `Content-Type` the file was uploaded with, verified against the stored bytes at finalize.
    - `name` string, nullable, required: The name a person gave this Asset, and what a provider receives at a future registration. `null` until somebody renames it, and the filename is the fallback.
    - `organizationId` string, required: The organization that owns the Asset.
    - `sizeBytes` number, required: Read from the stored object at finalize.
    - `status` 'pending' | 'ready', required: `ready` once the bytes have been inspected. A `pending` Asset is a reservation whose bytes have not arrived, and no operation here answers one.
    - `updatedAt` number, nullable, required: When the Asset last changed, in milliseconds since the Unix epoch, UTC: at finalize, or at the last rename.
    - `width` number, nullable, required: The width in pixels as the file is displayed, with its rotation applied, read from the header of the file at finalize. `null` when the file does not state it, or for an Asset uploaded before AdCrunch read it.
    - `registrations` object[], required: Each Registration of this Asset, one for each advertiser, with its state. An empty array means that the Asset has no Registration.
      - `advertiserId` string, required: The advertiser whose provider library gets the Asset.
      - `assetId` string, required: The Asset that the Registration places.
      - `createdAt` number, required: Milliseconds since the Unix epoch, UTC.
      - `deletedAt` number, nullable, required: Always `null` here. When a retry replaces a failed Registration, AdCrunch sets this time on the old one and answers it no more.
      - `failureCode` 'not_found' | 'provider_not_connected' | 'missing_write_access', nullable, required: Why AdCrunch refused the Registration before any provider call. Branch on this field, never on `failureReason`. `not_found`: your organization owns no advertiser of this provider with this id. `provider_not_connected`: the advertiser has no usable connection to the provider. Reconnect the provider, then register again. `missing_write_access`: the connection does not permit this kind of file. Reconnect the provider to grant it. `null` when the Registration did not fail, or when it failed at the provider.
      - `failureReason` string, nullable, required: Why the Registration failed, as a sentence: the words of the provider, or the words of AdCrunch. `null` unless `status` is `failed`.
      - `id` string, required: The id of the Registration, `reg_…`.
      - `organizationId` string, required: The organization that owns the Asset.
      - `provider` 'meta' | 'gads' | 'tiktok' | 'x' | 'openai' | 'snapchat' | 'dv360', required: The provider that owns the advertiser.
      - `providerIdentifier` string, nullable, required: 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.
      - `status` 'running' | 'ready' | 'failed', required: Video can stay `running` for several minutes while the provider processes it. That is normal, and not a failure.
      - `updatedAt` number, nullable, required: When the Registration last changed, in milliseconds since the Unix epoch, UTC. `null` until its first change.
      - `uploadSessionId` string, nullable, required: An in-flight provider upload session, where the protocol has one. `null` for every image.
      - `workflowId` string, required: The durable execution that runs the Registration.
  - `nextCursor` string: Send this value as `cursor` to get the next page. It is absent on the last page.

## Other responses

- `400`: The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. `error` is `invalid_request`, and `issues` names each field. Nothing was changed. Or AdCrunch cannot use the `cursor`: it cannot read it, or the cursor belongs to a different query. Then `error` is `invalid_cursor`. Send the `nextCursor` of the previous page with no change, or omit `cursor` to get the first page.
- `401`: No API key, or one that does not resolve. See the security scheme. `error` is `unauthorized`.
- `402`: The organization has no active subscription. An owner subscribes at `paywallUrl`. `error` is `organization_unentitled`.
- `403`: The caller does not hold `asset:read`. `error` is `forbidden`.

---

[API](https://skmtc.dev/adcrunch/apis/adcrunch-api.md) · [All operations](https://skmtc.dev/adcrunch/apis/adcrunch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adcrunch/apis/adcrunch-api/revisions/a420ba80914f?raw)
