Documentation Index Fetch the complete documentation index at: https://api.simkl.org/llms.txt
Use this file to discover all available pages before exploring further.
Simkl returns image paths (not full URLs) inside poster, fanart, episode, and avatar fields. You build the final URL by combining the simkl.in domain, a category prefix, the image path, a size suffix, and a file extension.
Anatomy of a URL
Part Example Notes Domain https://simkl.inAlways start with this. Category /posters/One of /posters/, /fanart/, /episodes/, /avatars/. Image path 74/74415673dcdc9cddThe value from the API field (poster, fanart, etc.). Size suffix _wDetermines pixel size — see each section below. Extension .webpAlways .webp for posters, episodes, and every fanart size except _d. Two exceptions: fanart _d is .jpg only (details ), avatars are .jpg only (details ).
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.
Code samples
Each tab covers a different real-world scenario. All samples handle missing/null paths by falling back to the placeholders documented in Fallback when images are missing .
Single helper covering all four kinds, with null-safe fallback for posters. Node / TypeScript
Python
Swift
Kotlin
Go
const SIMKL_IMG_BASE = 'https://simkl.in' ;
function imageUrl ( path , kind = 'posters' , size = '_w' , ext = '.webp' ) {
if ( ! path) {
if (kind !== 'posters' ) return null ; // hide fanart/episode/avatar — no placeholder
const ph = size === '_s' ? '_s' : '_c' ;
return `${ SIMKL_IMG_BASE }/poster_no_pic${ ph }.png` ;
}
return `${ SIMKL_IMG_BASE }/${ kind }/${ path }${ size }${ ext }` ;
}
imageUrl ( '74/74415673dcdc9cdd' , 'posters' , '_w' );
// → https://simkl.in/posters/74/74415673dcdc9cdd_w.webp
imageUrl ( null , 'posters' , '_c' );
// → https://simkl.in/poster_no_pic_c.png
Generate a <img srcset> so the browser picks the right size for the user’s screen. The src falls back to the placeholder when poster is null. < img
src = "https://simkl.in/posters/74/74415673dcdc9cdd_c.webp"
srcset = "
https://simkl.in/posters/74/74415673dcdc9cdd_s.webp 40w,
https://simkl.in/posters/74/74415673dcdc9cdd_cm.webp 84w,
https://simkl.in/posters/74/74415673dcdc9cdd_c.webp 170w,
https://simkl.in/posters/74/74415673dcdc9cdd_ca.webp 190w,
https://simkl.in/posters/74/74415673dcdc9cdd_m.webp 340w
"
sizes = "(max-width: 480px) 170px, 190px"
width = "170" height = "250" loading = "lazy"
onerror = " this . onerror = null ; this . src = 'https : //simkl.in/poster_no_pic_c.png';this.removeAttribute('srcset'); "
alt = "Poster"
/>
Always set explicit width / height so the browser reserves layout space and avoids cumulative layout shift (CLS).
A component with built-in fallback and onError recovery for stale paths. import { useState } from 'react' ;
const SIMKL_IMG_BASE = 'https://simkl.in' ;
const PLACEHOLDER = `${ SIMKL_IMG_BASE }/poster_no_pic_c.png` ;
export function Poster ({ path , size = '_c' , alt = '' }) {
const initial = path ? `${ SIMKL_IMG_BASE }/posters/${ path }${ size }.webp` : PLACEHOLDER ;
const [ src , setSrc ] = useState (initial);
return (
< img
src = { src }
alt = { alt }
width = "170"
height = "250"
loading = "lazy"
onError = { () => setSrc ( PLACEHOLDER ) }
/>
);
}
onError falls back if the image 404s for any reason (e.g. the title was merged and the path is stale).
Show a tiny _s48 fanart thumbnail upscaled with a CSS blur, then swap in the full image when loaded. Fanart has no placeholder — if path is null, render nothing. import { useState } from 'react' ;
const SIMKL_IMG_BASE = 'https://simkl.in' ;
export function Fanart ({ path }) {
const [ loaded , setLoaded ] = useState ( false );
if ( ! path) return null ;
const tiny = `${ SIMKL_IMG_BASE }/fanart/${ path }_s48.webp` ;
const full = `${ SIMKL_IMG_BASE }/fanart/${ path }_medium.webp` ;
return (
< div style = { { position: 'relative' } }>
< img src = { tiny } alt = "" aria-hidden
style = { {
filter: 'blur(20px)' , transform: 'scale(1.1)' ,
width: '100%' , position: 'absolute' , inset: 0 ,
} }
/>
< img src = { full } alt = "" onLoad = { () => setLoaded ( true ) }
style = { {
width: '100%' , opacity: loaded ? 1 : 0 ,
transition: 'opacity 300ms' , position: 'relative' ,
} }
/>
</ div >
);
}
Use a remote placeholder URL or a bundled image — both work. import SDWebImage
let url = SimklImage. url ( path : poster, kind : "posters" , size : "_c" )
. flatMap (URL. init ( string: ))
let placeholderURL = URL ( string : "https://simkl.in/poster_no_pic_c.png" ) !
imageView. sd_setImage ( with : url, placeholderImage : nil ) { image, _ , _ , _ in
if image == nil {
imageView. sd_setImage ( with : placeholderURL)
}
}
Or with Kingfisher : import Kingfisher
let url = SimklImage. url ( path : poster, kind : "posters" , size : "_c" )
. flatMap (URL. init ( string: ))
imageView.kf. setImage (
with : url,
options : [
. onFailureImage ( UIImage ( named : "poster_placeholder" )),
// …or fetch the placeholder remotely:
// .alternativeSources([.network(URL(string:
// "https://simkl.in/poster_no_pic_c.png")!)])
]
)
Loading via Coil on Android Compose, with the placeholder used both as placeholder and error: import coil.compose.AsyncImage
import coil.request.ImageRequest
AsyncImage (
model = ImageRequest. Builder (LocalContext.current)
. data (SimklImage. url (path = poster, size = "_c" ))
. crossfade ( true )
. build (),
contentDescription = title,
placeholder = rememberAsyncImagePainter (
"https://simkl.in/poster_no_pic_c.png"
),
error = rememberAsyncImagePainter (
"https://simkl.in/poster_no_pic_c.png"
),
contentScale = ContentScale.Crop,
modifier = Modifier. size (width = 170 .dp, height = 250 .dp),
)
Posters
Six sizes, ranging from cinematic landscape (_w) down to a 40-pixel sliver (_s).
_w — 600 × 338, landscape, cropped_m — 340 × *, medium portrait_ca — 190 × 279 (or 285), card aspect_c — 170 × 250 (or 256), compact card_cm — 84 × 124, card mini_s — 40 × 57, smallest thumbnailSuffix Size File size Notes Example _w600 × 338 ~33 KB Landscape, cropped. Hero/header banners. View _m340 × * ~40 KB Medium portrait. Detail screens. View _ca190 × 279 (or 285) ~17 KB Card aspect. Grids. View _c170 × 250 (or 256) ~15 KB Compact card. Lists. View _cm84 × 124 ~5 KB Card mini. Dense lists. View _s40 × 57 ~1.4 KB Smallest. Inline / autocomplete. View
Fanart
Wide background art — the cinematic still you typically use behind the title on a detail screen.
Suffix Size File size Notes Example _medium1920 × 1080 ~375 KB Full HD. Detail-screen hero. View _mobile960 × 540 ~100 KB Mobile-optimized hero. View _w600 × 338 ~23 KB Card-friendly. View _doriginal ~100 KB Darker, smaller filesize. JPG only — the one fanart size that isn’t .webp. View _s4848 × 27 ~1 KB Tiny placeholder for blur-up effects. View
Episodes
Suffix Size File size Example _w600 × 338 ~23 KB View _c210 × 118 ~6.5 KB View _m112 × 63 ~2.4 KB View
Avatars
_24 — 24 × 24_100 — 100 × 100(none) — 200 × 200_256 — 256 × 256_512 — 512 × 512Suffix Size File size Example _2424 × 24 ~0.7 KB View _100100 × 100 ~5.6 KB View (none) 200 × 200 ~17 KB View _256256 × 256 ~26 KB View _512512 × 512 ~79 KB View
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:
URL Use for File size Example https://simkl.in/poster_no_pic.pngDefault — full-size missing-poster ~25 KB View https://simkl.in/poster_no_pic_c.pngMatch _c posters (170 × 250) ~9 KB View https://simkl.in/poster_no_pic_c_grey.pngMatch _c with a softer grey tone ~24 KB View https://simkl.in/poster_no_pic_s.pngMatch _s posters (40 × 57) ~1.7 KB View
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.