Most free placeholder services default to SVG โ and SVG is the right default for the web: crisp at any size, tiny, cheap to render. But a placeholder that only exists as SVG is useless in a surprising number of places: HTML email (Gmail and most clients won't render SVG in <img>), og:image social cards (crawlers want raster โ see the dedicated OG image API guide), React Native's <Image> and Flutter's Image.network (no SVG without an extra package), native iOS/Android image views, and any test pipeline that actually decodes the image (Pillow, sharp, OpenCV โ none of them open SVG out of the box).
Mockbird serves placeholders as real PNG bytes โ 8-bit RGBA, standard non-interlaced PNG, decodes anywhere PNG does. No signup, no key, CORS on, and deterministic: the same URL always returns byte-identical output, so image-diff tests don't flake.
# a 300x200 PNG placeholder โ this URL works right now
curl -o p.png https://mockbird.mockbird.workers.dev/m/demo/img/300x200.png
# custom text + colors, 640x360, via ?format=png
curl -o hero.png "https://mockbird.mockbird.workers.dev/m/demo/img/640x360?format=png&text=Hero&bg=1e293b&fg=f8fafc"
# avatars too โ 128x128 PNG initials for "Ada Lovelace"
curl -o ada.png "https://mockbird.mockbird.workers.dev/m/demo/avatar/128.png?name=Ada+Lovelace"
Prefer clicking to typing? The live playground builds any of these URLs interactively with an instant preview.
| How | Example | Notes |
|---|---|---|
.png path suffix | /m/demo/img/300x200.png | the readable one โ use this in docs and seeds |
?format=png | /m/demo/img/300x200?format=png | same bytes, param form โ easy to toggle programmatically |
.jpg / .jpeg suffix | /m/demo/img/200/300.jpg | accepted for drop-in compatibility with picsum-shaped URLs; serves PNG bytes (every consumer of a placeholder accepts PNG) |
Without any of these, /img returns SVG โ the better choice wherever SVG renders.
The PNG renderer is a raster twin of the SVG one โ same layout, same colors, same determinism. All of these compose:
| Param | Example (all live URLs) |
|---|---|
?text= | /m/demo/img/300x200.png?text=Coming+soon |
?bg= / ?fg= (hex) | /m/demo/img/300x200.png?bg=1e293b&fg=f8fafc |
?seed= (deterministic colors) | /m/demo/img/100x100.png?seed=cats โ byte-identical on every request |
?round=1 (circle crop) | /m/demo/img/100x100.png?round=1 |
?grayscale | /m/demo/img/300x200.png?grayscale |
?blur=1-10 | /m/demo/img/40x30.png?blur=5&seed=hero โ the classic LQIP: ship a tiny blurred PNG, swap in the real image on load |
Avatars have the same twin: /avatar/128.png?name=Ada+Lovelace works in all three styles (initials, identicon, shapes) with the same params as the SVG avatar API, and the initials style is ui-avatars-compatible.
<img> tags. Seeding a mock newsletter or testing an email template? Point the images at .png URLs and they render in the real inbox preview.og:image / social cards. Facebook, Twitter/X, Slack and Discord crawlers expect raster images for link previews. An SVG og:image simply doesn't show.<Image source={{uri}}>, Flutter's Image.network(), iOS UIImage, Android BitmapFactory โ none decode SVG without an extra dependency. PNG placeholder URLs work in all of them unchanged.?blur on PNG is capped at 512ร512 (blur is the expensive raster op; LQIP images are tiny anyway). SVG blurs at any size..jpg suffix is accepted but serves PNG bytes โ if you need actual JPEG/WebP/AVIF encoding (smaller files for photo-like content), placehold.co does that and we don't.| placehold.co | dummyimage | picsum.photos | Mockbird /img | |
|---|---|---|---|---|
| PNG output | โ | โ | โ (photos, jpg/webp) | โ (.png / ?format=png) |
| Other raster formats | โ JPEG/WebP/AVIF | โ GIF/JPG | โ jpg/webp | โ PNG only |
| Deterministic bytes by URL | โ | โ | โ via /seed/ | โ byte-identical |
| Grayscale / blur effects | โ | โ | โ | โ same params as picsum |
| PNG avatars / initials | partial (text) | partial (text) | โ | โ 3 styles, ui-avatars-compatible |
| Comes with a mock data API | โ | โ | โ | โ โ same base URL serves full CRUD REST + GraphQL |
| Signup | none | none | none | none |
Written by the Mockbird maker โ bias disclosed. Where the others genuinely win: placehold.co encodes real JPEG/WebP/AVIF, retina variants and custom fonts; picsum.photos serves real photographs, which look far better in any read-only grid. Use them there. Use Mockbird when the placeholder should live at the same base URL as the rest of your fake backend โ one host to swap when the real backend lands โ or when you specifically need deterministic PNG bytes next to mock JSON. Uptime of all of them is tracked live here.
The placeholder endpoint exists because mock records need images that render in whatever consumes them. Create a seeded e-commerce backend and every product can carry a PNG URL that works in an email template, a React Native screen, and a Pillow-based test alike:
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
-H 'content-type: application/json' \
-d '{"preset":"ecommerce"}'
# โ live REST API with products/orders/customers/reviews
# image fields: https://mockbird.mockbird.workers.dev/m/<id>/img/640x480?seed=โฆ
# (SVG by default โ append .png before the ? wherever raster is required)
Full parameter reference in the docs. More guides: free placeholder image API ยท picsum alternative ยท avatar placeholder API ยท identicon API ยท testing loading & error states. Create your API โ