Skip to main content
Simkl returns image paths (not full URLs) inside poster, fanart, episode, and avatar fields. You build the final URL by combining a domain prefix, a category prefix, the image path, a size suffix, and a file extension. We strongly recommend serving images through wsrv.nl, a free image proxy that caches, resizes, and converts on the fly. This minimizes load on Simkl’s servers and gives you free image transformations. All examples below append &q=90 to the wsrv URL — this matches origin image quality. Without it, wsrv’s default &q=80 re-encodes images at noticeably smaller filesize and lower quality. Setting &q= above 90 is rarely useful — sizes balloon past origin without visible quality gain.

Anatomy of a URL

Image URL anatomy: category, image path, size, extension
Use .webp for posters, episodes, and fanart.Two .jpg exceptions:
  • Fanart _d — original-resolution, darker tone, smaller filesize than _medium.webp. JPG only.
  • Avatars — small enough that the format doesn’t matter; served as JPG without the wsrv.nl proxy.

Code samples

Each tab covers a different real-world scenario. All samples handle missing/null paths by falling back to the wsrv-proxied placeholders documented in Fallback when images are missing.
Single helper covering all four kinds, with null-safe fallback for posters.

Posters

Six sizes, ranging from cinematic landscape (_w) down to a 40-pixel sliver (_s).
_w_w — 600 × 338, landscape, cropped
_m_m — 340 × *, medium portrait
_ca_ca — 190 × 279 (or 285), card aspect
_c_c — 170 × 250 (or 256), compact card
_cm_cm — 84 × 124, card mini
_s_s — 40 × 57, smallest thumbnail

Choosing a size for high-DPI screens

The Notes column above suggests a size by layout slot. That assumes a 1x display. Phones run at 2x or 3x, and most laptop screens are 2x, so a _c poster in a 170px slot gets upscaled by the browser and looks soft. The rule: multiply your CSS slot width by the device pixel ratio, then pick the smallest suffix whose width is greater than or equal to that number. Poster widths are _s 40, _cm 84, _c 170, _ca 190, _m 340. The practical takeaway: any poster rendered at up to roughly 170 CSS pixels should use _m on a high-DPI screen, not _c. _m at 340px covers a 113px slot at 3x and a 170px slot at 2x. That covers the common phone case, so _m is a sensible default for mobile poster art. It is also the largest portrait poster, so above those widths you are already at the ceiling. _w is not an alternative here, it is a 600 × 338 landscape crop for banners.
No poster size has a guaranteed height, and _m is the loosest of all._m is a width-only resize to 340px. It never crops, so its height is purely whatever the source aspect ratio gives. That is why the table lists it as 340 × *. Measured across 30 trending titles, _m came back between 480px and 513px tall._c, _ca, _cm and _s are also width-first, but each caps the height at its listed maximum. Titles under the cap keep their own aspect ratio, titles over it are centre-cropped vertically. Their heights vary too, just in a narrower band: the same 30 titles returned _c at 241, 250, 255 and 256 pixels tall. _w is the one true fixed size, always 600 × 338.The consequence: if your layout constrains only one dimension, for example an img with a width but no height, or a fixed-height grid cell, your rows will change size per title. This is already true today with _c. Switching to _m makes it obvious, because the height spread is wider.Pin both dimensions (or set aspect-ratio) and add object-fit: cover. For background images use background-size: cover. That reproduces the same centre-crop the capped sizes do server-side, so the result is visually identical to _c, just at higher resolution.
For a background image:

Let users cap image quality on mobile

Defaulting to _m on phones triples the bytes per poster versus _c. On a metered connection that is a real cost, so make it a user choice rather than a hard default. Ship a setting with three options: full quality, reduce on cellular only, and always reduce. “Reduce” means step down one suffix, so _m becomes _c and _c becomes _cm. Default to reducing on cellular. Also respect the OS-level signal, which users set once and expect every app to honour: Cache each size under its own key so toggling the setting does not evict the images the user already has. See Caching.

Fanart

Wide background art — the cinematic still you typically use behind the title on a detail screen.
_medium

_medium — 1920 × 1080, full HD

_mobile

_mobile — 960 × 540

_w

_w — 600 × 338

_d

_d.jpg — original size, darker, smaller filesize. JPG only — the one fanart size that isn't .webp.

_s48

_s48 — 48 × 27, blur-up placeholder

Episodes

_w

_w — 600 × 338

_c

_c — 210 × 118

_m

_m — 112 × 63

Avatars

_24_24 — 24 × 24
_100_100 — 100 × 100
default(none) — 200 × 200
_256_256 — 256 × 256
_512_512 — 512 × 512
Avatars are JPG-only and served directly from simkl.in (no wsrv.nl proxy needed for these — they’re already small).

Fallback when images are missing

When a poster, fanart, or episode field is null (or the path is empty), use these built-in placeholders. They live at the root of simkl.in and are served through wsrv.nl just like the other images:
default placeholder

default — full size

_c placeholder

_c — 170 × 250

_c grey placeholder

_c grey

_s placeholder

_s — 40 × 57

Fanart has no dedicated placeholder. When fanart is null, hide the fanart element rather than showing a broken/empty image — most apps render a solid color or use the poster’s blurred-up _s48 thumbnail behind a tint instead.

Caching

Cache images by URL forever. The image at a given URL never changes — once you’ve downloaded it, don’t fetch it again. Re-downloading wastes your users’ bandwidth and ours.