Free PNG placeholder API โ€” real PNG bytes at a URL, no signup

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.

The 10-second version

# 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"

basic PNG placeholder custom colors PNG seeded PNG PNG avatar grayscale PNG

Prefer clicking to typing? The live playground builds any of these URLs interactively with an instant preview.

Three ways to ask for PNG

HowExampleNotes
.png path suffix/m/demo/img/300x200.pngthe readable one โ€” use this in docs and seeds
?format=png/m/demo/img/300x200?format=pngsame bytes, param form โ€” easy to toggle programmatically
.jpg / .jpeg suffix/m/demo/img/200/300.jpgaccepted 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.

Every parameter works in PNG

The PNG renderer is a raster twin of the SVG one โ€” same layout, same colors, same determinism. All of these compose:

ParamExample (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.

Where PNG (not SVG) is the requirement

Limits โ€” stated plainly

Honest comparison

placehold.codummyimagepicsum.photosMockbird /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 / initialspartial (text)partial (text)โœ˜โœ” 3 styles, ui-avatars-compatible
Comes with a mock data APIโœ˜โœ˜โœ˜โœ” โ€” same base URL serves full CRUD REST + GraphQL
Signupnonenonenonenone

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 actual point: mock data whose image URLs decode anywhere

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)
โšก Skip the terminal: this link creates the same seeded backend in the dashboard in one click โ€” real URL, data browser open, no signup. Or build image URLs visually in the placeholder playground.

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 โ†’