---
title: "List assets (paginated, optional tag filter)."
method: GET
path: "/organizations/{organizationId}/libraries/{libraryId}/assets"
tags: ["Assets"]
---

# List assets (paginated, optional tag filter).

`GET /organizations/{organizationId}/libraries/{libraryId}/assets`

## Request

- Base URL: `https://api.raster.app`
- URL: `https://api.raster.app/organizations/{organizationId}/libraries/{libraryId}/assets`
- Auth: HTTP bearer

Pages through one library's assets, newest first, optionally narrowed to assets carrying every tag in the `tags` filter. Each asset carries a permanent public CDN `url` you can embed directly. To find an asset by what it depicts rather than by tag, use searchAssets instead.

## Path parameters

- `organizationId` string, required
- `libraryId` string, required

## Query parameters

- `page` integer
- `pageSize` integer
- `tags` string

## Headers

- `Api-Version` string, required

## Response `200`

OK

- object
  - `data` Asset[], required
    - `id` string, required
    - `width` integer, nullable, required
    - `height` integer, nullable, required
    - `name` string, nullable, required
    - `libraryId` string, nullable, required
    - `blurhash` string, nullable, required
    - `url` string, uri, nullable, required: Permanent, public CDN URL for the full-resolution asset. It needs no authentication and never expires, so reference it directly as the source URL rather than downloading and re-hosting the file.
    - `thumbUrlBlurred` string, uri, nullable, required
    - `sizes` string, nullable, required: JSON-encoded map of size (the image's longest edge, in pixels) to the CDN URL of the image at that size (parse before use). Each URL carries the same permanent, public, embed-directly semantics as `url`; pick the size closest to your display target.
    - `appUrl` string, uri, nullable, required: Absolute link that opens this asset in the Raster app, for a person to view, edit, or manage it. Give it to the user as a link; the source URL is `url`.
    - `variants` AssetVariant[], nullable, required: Non-destructive variants of the asset. Each entry carries its own `parentId` pointing back to this asset.
      - `id` string, required
      - `parentId` string, nullable, required
      - `width` integer, nullable, required
      - `height` integer, nullable, required
      - `name` string, nullable, required
      - `url` string, uri, nullable, required
      - `sizes` string, nullable, required
      - `appUrl` string, uri, nullable, required
    - `parentId` string, nullable, required: `null` on a top-level original, the parent asset's id on a variant. A variant is a first-class Asset — tag-filtered and search queries return it as its own entry — and `parentId` relates it back to its original.
    - `description` string, nullable, required
    - `tags` string[], nullable, required
    - `contentType` string, nullable, required: MIME content type of the asset (e.g. `image/jpeg`, `image/png`).
    - `size` number, nullable, required: File size in bytes. May be `null` for older assets with no recorded size.
    - `duration` number, nullable, required: Length of the asset in seconds, for video. `null` on images and on videos still being processed.
    - `metadata` AssetMetadata, required: Details read from the asset's own bytes — how it was captured, and its technical format.
      - `capture` AssetCapture, required: How an asset was captured — when, on what device, and where.
        - `recordedAt` string, nullable, required: When the asset says it was recorded, as written by the device. On a re-encoded file this is the time of that encode rather than the original recording, so treat it as a hint rather than a reliable capture date.
        - `make` string, nullable, required: Device maker, e.g. `Apple`.
        - `model` string, nullable, required: Device model, e.g. `iPhone 17 Pro`.
        - `software` string, nullable, required: Capture software or OS version reported by the device.
        - `latitude` number, nullable, required: Signed decimal degrees. Present only alongside `longitude`.
        - `longitude` number, nullable, required: Signed decimal degrees.
        - `altitude` number, nullable, required: Metres above sea level, when the container recorded one.
      - `video` VideoStream, required: A video's technical stream details — codec, frame rate, bitrate, and audio.
        - `codec` string, required: Video codec, e.g. `h264`, `hevc`, `vp9`, `av1`.
        - `frameRate` number, nullable, required: Frames per second, e.g. `30` or `23.98`.
        - `bitrate` number, nullable, required: Overall bitrate in bits per second, across all streams.
        - `hasAudio` boolean, required: Whether the video carries an audio track.
        - `audioCodec` string, nullable, required: Audio codec, e.g. `aac`, `opus`. `null` when there is no audio track.
        - `audioLayout` string, nullable, required: Audio channel layout, e.g. `mono`, `stereo`, `5.1`.
        - `audioSampleRate` integer, nullable, required: Audio sample rate in hertz, e.g. `48000`.
    - `created` number, nullable, required: Creation time as unix milliseconds. May be `null` for some older assets.
    - `updated` number, nullable, required: Last-modified time as unix milliseconds. Bumped on any field change (rename, tag edit, variant-edit save). Useful for cache invalidation and "sort by recently updated" UX.
    - `contentVersion` integer, nullable, required: Counter bumped each time the asset's BYTES are replaced at an unchanged url — a promoted variant, an edit re-save. Append it to any `url` or `sizes` entry as `?v=` to render the current pixels. Null on an asset whose bytes have never been replaced — render the bare url there.
    - `uploadedBy` Uploader, required: Attribution metadata for the user or system that uploaded an asset.
      - `name` string, nullable, required: Display name of the uploader. May be `null`.
      - `avatarUrl` string, uri, nullable, required: URL of the uploader's current avatar, read live from their account. May be `null`.
    - `approval` Approval, required: An asset's approval (delivery) state — who set it, when, and why.
      - `state` string, required
      - `setBy` string, nullable, required: Email address of the person who set the approval. `null` when their account has no email address.
      - `setAt` number, nullable, required
      - `note` string

## Other responses

- `400`: Invalid input (BAD_USER_INPUT), quota, or API-version error.
- `401`: Missing or invalid API key or access token.
- `403`: The credential may not perform this operation, or the organization's plan does not allow it. A key without access to a library gets 404, not 403.
- `404`: Resource not found, or the credential is not authorized for it.
- `429`: Rate limit exceeded. Wait for the number of seconds in `Retry-After` before retrying.
- `500`: Unexpected server fault (INTERNAL_SERVER_ERROR). Safe to retry an idempotent operation.

---

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