Skip to content

Brandcenter image URLs

Every image asset in Brandcenter can be transformed on the fly by describing the result in the URL. There is nothing to install and no API call to make — the URL is the API.

https://img.brandcenter.io/i/{brand}/{fileId}/{rev}/{ops}.{ext}
SegmentMeaning
brandYour brand slug (e.g. nova)
fileIdThe asset’s file version id (the picker and API hand this to you)
revThe preview revision — a cache key; a new upload version mints a new one
opsComma-separated transformations in canonical order (below)
extOutput format, always explicit: webp, jpg, png, or avif
a brand preset — the primary surface for embeds
p:sq128.webp — a brand preset — the primary surface for embeds
https://img.brandcenter.io/i/bc/aHVFd2tZTjRGZW5lTlh5T09RVHJmRXNFZUVobjEzdkQ/1/p:sq128.webp

Operations are key:value pairs, comma-separated, in one fixed order — one derivative has exactly one URL (and one cache entry, and one signature payload):

p | c , w , h , fit , q , dpr , fx… , s
OpWhat it does
p:{preset}A named, brand-managed rendition — the primary surface for embeds
c:{x}:{y}:{w}:{h}Normalized editorial crop rectangle (6 decimals)
w:{1..7200}Width / bounding size (ladder sizes are the pre-generated fast path)
h:{1..7200}Height; with w it defines an explicit box
fit:{cover|contain|fill}How a box is filled (default: fit inside)
q:{eco|std|hi}Quality tier (default std)
dpr:{1|2}Device pixel ratio
fx:{name}[:{arg}]Effects, repeatable, applied in order
s:{kid}:{hmac}Optional signature — unlocks the durable tier

Brand presets carry the styling decisions (sizes, padding, backgrounds, smart cropping) as managed data — retune a preset and every embedded URL updates without changing. The URL grammar itself stays deliberately small: what’s editorial (c:), what’s delivery (q:, dpr:), and raw access to renditions that already exist (w:).

Two rules you’ll never have to think about again:

  • Height never appears. It’s derived from the source aspect ratio, the crop rectangle, or the preset. One dimension, no stretching, ever.
  • Grammar is lowercase-only and order is fixed. An equivalent URL written differently would be a second cache entry and a second signature payload — so it simply isn’t valid.

Anywhere. /i/ URLs are plain, stateless GETs served from Cloudflare’s edge — embed them in <img> tags, emails, CMS documents (our Sanity and Payload plugins mint them for you), or fetch them from your backend. Plain resizes and presets resolve onto pre-generated renditions; crops and effects render on demand and cache at the edge. If you plan to store a crop/effect URL long-term, sign it to move it to the durable tier.