---
title: "Dynamic Placeholder Image API: Branded, Not Generic"
description: "A dynamic placeholder image api gives you branded mockups from one URL. It will not replace placehold.co, and here are the two measured reasons why."
url: "https://www.imejis.io/blogs/tutorials/dynamic-placeholder-image-api"
image: "https://www.imejis.io/images/tools/placeholder-image.png"
published: "2026-11-03"
---

# Dynamic Placeholder Image API: Branded, Not Generic

Search for a dynamic placeholder image api and you'll find services that hand
back a grey box from a URL like `/600x400`. Our
[placeholder image generator](/tools/placeholder-image) does the same job in
your browser: pick a size, a colour and some text, download a PNG. Ten presets
cover the usual suspects, from 150x150 up to 1920x1080, plus OG image and
Instagram post sizes.

That's the right tool for a grey box, and it doesn't touch your quota. This post
is about the other case, where the placeholder has to look like your actual
product, and what happens when you try to serve those from a render API.

## Two things a render URL will not do

Worth getting these out of the way, because most "placeholder API" advice
ignores both.

### Size is not a URL parameter

Generic placeholder services encode dimensions in the path. You ask for
`/600x400` and you get 600x400. A render URL doesn't work that way, because an
imejis design has its dimensions fixed when you create it.

Appending `?width=600&height=400` to a render URL doesn't resize anything. The
response is byte for byte the same image you get without them, because those
parameters address no field and are ignored.

If you need several sizes, that is what variations are for: add the sizes to the
design, then pick one per request with `?variation=<id>`. It's a short, fixed
list you defined, not arbitrary numbers from a URL.

### Every load costs a render

This one bites. A render URL renders fresh on every request. Drop it
into an [`<img>` tag](ref:developer.mozilla.org) on a page you refresh fifty
times while styling it, and that is fifty renders against your quota, for an
image that never changed.

Generic placeholder services are free and unmetered. A render API isn't, and it isn't trying to be.

## Where a render URL is the better answer

The case it wins is the one where "placeholder" is the wrong word, because the
image isn't a stand-in. It's real, branded output with provisional data.

- **Demo and staging environments** that should look like the product, not like
  a wireframe. Seed twenty product cards that match your real template.
- **Design review and screenshots.** Stakeholders respond to something that
  looks shipped. A grey box invites comments about the grey box.
- **Empty states and first-run screens**, where the sample content is part of
  the design and ships to real users.

In all three, the image is generated once and reused. That changes the cost
picture completely.

## Doing it without burning quota

Render once, store the result, serve the stored URL:

```text
https://render.imejis.io/v1/<designId>?delivery=hosted
```

That returns JSON with a permanent public `url` rather than raw bytes. Put that
URL in your markup. Every later page load fetches a stored file and costs
nothing.

Vary the content per image with dot-path parameters, which do work:

```text
?title.text=Quarterly%20report&category.text=FINANCE
```

Each distinct combination is a render. The same combination served from a stored
URL afterwards is not.

## The cost, concretely

Twenty seeded screens for a staging environment, each rendered once and stored,
is twenty renders. The free tier is 100 renders a month, so that fits with room
to spare, and paid plans start at $14.99 for 1,000 (as of November 2026). Check
the [pricing page](/pricing) for current allowances.

The same twenty images served from live render URLs on a page a developer
refreshes all afternoon is a different number entirely, and it's why the
store-once pattern above isn't optional advice.

## Getting started

Build the design at the size you need, mark the text layers dynamic, then render
each variant once with `?delivery=hosted` and keep the URLs.

For a genuine grey box, the [placeholder image generator](/tools/placeholder-image)
is free, instant and does not touch your quota. Use the right one for the job.

The [component reference](/components) lists every property you can override per
render, and the [API docs](/apis) cover authentication and output formats.
