Raster

Changelog

Every notable change to the Raster GraphQL API, by version.

This page tracks every notable change to the Raster GraphQL API. The format follows Keep a Changelog, and the API follows Semantic Versioning.

The API is in Alpha. Until the Beta release, minor versions may include breaking changes. Review this page before upgrading an integration.

0.13.0-alpha — 2026-09-23

Changed

  • A variant can no longer be moved to trash on its own. A variant id in deleteAssets' assets now fails the whole mutation with BAD_USER_INPUT (400) before anything moves, matching the Raster app and transferAssets. Delete the original instead; its variants go to trash with it.

0.12.0-alpha — 2026-09-15

Added

  • Uploader.avatarUrl added. Asset.uploadedBy now carries the uploader's current avatar URL beside their name, read live from the uploader's account, so a changed avatar shows on every asset they uploaded. It is null when they have no avatar, or for an asset uploaded with an API key. Available over GraphQL, REST and MCP. See Uploader.

Deprecated

  • Library.photosCount is deprecated. It still resolves as an alias of assetsCount, so existing selections keep working; new queries should read Library.assetsCount.

0.12.0-alpha — 2026-09-14

Changed

  • assets(tags:) takes up to 50 tags. An asset matches when it carries any of them; more than 50 is rejected with BAD_USER_INPUT. Available over REST and MCP. See assets.

0.12.0-alpha — 2026-08-24

Changed

  • uploadAssets(parentId:) accepts a video asset. The uploaded file must be the same kind of media as the parent (a photo takes image variants, a video takes video variants), and a mismatch is rejected with BAD_USER_INPUT. Available over REST and MCP. See uploadAssets.
  • promoteVariant works on videos. The promoted variant's file replaces what the asset serves at the same URL, and its duration and metadata travel with it. Rejected when the asset is neither an image nor a video, when the variant is a different kind of media than the asset, or while the asset is itself still being processed (a video whose poster is not ready yet). Available over REST and MCP. See promoteVariant.

0.11.0-alpha — 2026-08-12

Added

  • AssetMetadata.capture added. A new AssetCapture type carries recordedAt, make, model, software, and latitude / longitude / altitude, read from the container's own metadata tags. It is null on containers that carry none. Coordinates are always returned as a pair. Available over REST and MCP. See AssetCapture.

0.10.0-alpha — 2026-08-07

Added

  • Asset.duration and Asset.metadata added. duration is the clip length in seconds. metadata is an AssetMetadata object whose video member carries the source's codec, frameRate, bitrate, hasAudio, audioCodec, audioLayout, and audioSampleRate. Both are null on assets uploaded before this data was captured. SearchHit carries both fields, always null. Available over REST and MCP. See Asset, AssetMetadata and VideoStream.

0.9.0-alpha — 2026-07-21

Added

  • promoteVariant mutation added. It makes a variant the asset's default. The variant's image replaces what the asset serves at the same URL, so anything already embedding that URL shows the new image without being updated. The previous default is preserved as a new variant, and the asset keeps its id and name; its description and the tags generated from its image follow the image, while tags you added yourself stay on the asset. Returns PromoteVariantResult { assetId, promotedVariantId, demotedVariantId }. Available over REST and MCP. See promoteVariant.

0.8.0-alpha — 2026-07-16

Added

  • Asset.variants added. It is the new name of the former Asset.views field. The unfiltered assets query now returns each original's live variants inline in variants; previously only the asset query populated them. See Asset and AssetVariant.

Deprecated

  • Asset.views is renamed to Asset.variants. views still resolves as a deprecated alias returning the same [AssetVariant], so existing views { … } queries keep working; new queries should select variants. The AssetView type is renamed to AssetVariant.
  • type is deprecated on Asset, AssetVariant, and SearchHit. It is always main on an asset, variant on a nested entry, and null on a search hit. It still resolves to those same values, so existing selections keep working. Read parentId instead: null on an original, the parent's id on a variant. REST and MCP have dropped the field.

0.7.0-alpha — 2026-07-08

Deprecated

  • Asset.thumbUrl and Asset.thumbHighUrl are now deprecated and derived from sizes: thumbUrl resolves to the standard size, thumbHighUrl to the largest, each falling back to url. They still resolve, so existing queries keep working, but new integrations should read Asset.sizes (the map of size to CDN URL) and blurhash for placeholders. See Asset.

Removed

  • thumbUrl removed from AssetVariant, and thumbUrl / thumbHighUrl removed from SearchHit. Both shapes expose sizes for thumbnails instead. Clients selecting those fields must drop them. Allowed under the Alpha policy at the top of this page.

0.6.0-alpha — 2026-06-03

Added

  • viewer query: resolve your key's { organizationId, organizationName, plan, libraries } from the key alone, before any org-scoped call. See viewer.
  • asset query: fetch a single asset by id. An asset that is missing, in another library, or in trash returns a 404. See asset.
  • createLibrary mutation: create a library in an org you have a key for. The library is granted to your key and shown to the team. Needs a key with write access. See createLibrary.
  • renameLibrary mutation: rename a library. See renameLibrary.

Changed

  • deleteAssets now moves assets to trash (soft delete) instead of deleting them immediately, matching the web app. Assets leave assets / searchAssets at once but stay recoverable and are removed after 30 days. ids returns the assets actually moved (so ids.length matches the message count); the call is idempotent (re-deleting ids already in trash returns Moved 0, ids: [], success: true). See deleteAssets.

0.5.0-alpha — 2026-05-28

Added

  • Batch-tag, untag, transfer, and re-describe assets over GraphQL with four new mutations:
    • tagAssets applies up to 20 tags to up to 100 assets. It returns TagAssetsResult { taggedCount: Int! } and is idempotent on pairs the asset already carries. Reserved tags (index, trash) are rejected with BAD_USER_INPUT before anything changes. See tagAssets.
    • untagAssets removes tags the same way. It returns UntagAssetsResult { untaggedCount: Int! }. See untagAssets.
    • updateAssetDescription stores a single asset's description verbatim. It returns UpdateAssetDescriptionResult { assetId: ID!, description: String! }. See updateAssetDescription.
    • transferAssets moves up to 100 assets to another library in the same organization. It returns TransferAssetsResult { transferredCount: Int!, sourceLibraryId: ID!, targetLibraryId: ID! }. A target library outside the organization fails with 404 API_KEY_NOT_AUTHORIZED_FOR_LIBRARY. See transferAssets.
  • New result types: TagAssetsResult, UntagAssetsResult, UpdateAssetDescriptionResult, TransferAssetsResult.

0.4.0-alpha — 2026-05-27

Added

Removed

  • Uploader.integration removed from the schema. Clients selecting uploadedBy { integration } must drop the field. The Uploader type is now { name: String }. Allowed under the Alpha policy at the top of this page.

0.3.0-alpha — 2026-05-22

Added

  • Six new fields on Asset, carrying metadata recorded at upload. Existing queries are unaffected:
    • contentType: String: MIME content type (e.g. image/jpeg).
    • size: Float: file size in bytes. null for older assets.
    • created: Float: creation time as unix milliseconds.
    • updated: Float: last-modified time as unix milliseconds. Updated on a rename, a tag edit, or a saved variant edit, so it can drive cache invalidation or a "sort by recently updated" view.
    • thumbHighUrl: String: higher-resolution thumbnail CDN URL for retina / 2× displays. null for older assets.
    • uploadedBy: Uploader: attribution for the user who uploaded the asset. See the Uploader change below for the new shape.
  • Two new fields on Uploader (see Removed for the breaking part of this change):
    • name: String: display name of the uploader.
    • integration: String: the source the asset was added through. null when no source is recorded.

Changed

  • HTTP status codes on errors now match the error. Several errors that returned 400 now return their own status; for example ORGANIZATION_NOT_FOUND is 404. The same coded error now returns the same status on both the GraphQL and REST APIs. Clients dispatching on extensions.code are unaffected; only clients switching on extensions.http.status see the new values.

Removed

  • Asset.parentId removed from the schema. Clients querying assets { parentId } must drop the field. The parentId field on AssetVariant (returned inside Asset.variants[]) is unaffected.
  • Uploader.uid removed from the schema. Clients selecting uploadedBy { uid } must drop the field and select name / integration instead. Allowed under the Alpha policy at the top of this page.

0.2.0-alpha — 2024-08-13

Added

  • assets query: page and pageSize parameters for pagination.
  • assets query: tags parameter to filter by up to 5 tags.
  • Library type: a tags field returning detailed tag information.
  • New tags query for retrieving a library's tags.

Changed

  • assets now returns both user-created and AI-generated tags.

0.1.0-alpha — 2023-06-20

Added

  • Initial Alpha release of the Raster GraphQL API.
  • Queries for assets, libraries, and tags.
  • API key authentication.

Security

  • Introduced API key authentication for all queries.

On this page