Text on Image API: Render Copy at Scale
A text on image API renders copy into a fixed design and hands back the finished picture. You build the layout once, mark which text can change, then send a different string per call. One endpoint, image in the response, no webhook.
If you just need one image right now, the text on image generator does it free in the browser. This post is about the other case: when you need five thousand of them.
Why the box doesnt moveWhy the box doesn't move
A design's width and height are set when you build it and can't be changed in a render call. That sounds like a limitation until you're generating at volume, and then it's the whole point: a headline twice as long as you planned can't push the logo off the canvas or reflow the layout into something you've never seen.
What you do control is how the type behaves inside its box.
Auto resize which is the part people missAuto-resize, which is the part people miss
Set minFontSize and maxFontSize on a text layer and the renderer shrinks the type until the string fits. No clipping, no overflow, no ellipsis you didn't ask for.
This matters more than it sounds. Pull product titles from a real catalogue and you'll find some at 12 characters and some at 90. Without auto-resize you're choosing between a font size that looks lost on the short ones and one that clips the long ones. With it, both render clean from the same design.
curl -X POST 'https://render.imejis.io/v1/YOUR_DESIGN_ID' \
-H 'dma-api-key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{
"headline": { "text": "Summer sale, 30% off everything" },
"subhead": { "text": "Ends Sunday" }
}'The response is the image itself. Write it to a file, stream it to a user, or point an <img> tag at the GET form of the same URL.
Only what you mark can changeOnly what you mark can change
A layer's properties are baked in unless you mark them dynamic. That's the safety rail: mark text and the copy varies, leave color alone and every render keeps the brand color whatever the caller sends.
If you want the color to vary too, mark it, and then it's yours to control:
{
"headline": {
"text": "Back in stock",
"color": "#0F172A"
}
}Keep the dynamic set as small as the job needs. Every property you open up is one more thing a bad caller can make ugly.
Right to left works but test it anywayRight-to-left works, but test it anyway
Arabic and Hebrew render correctly, including strings that mix RTL and Latin characters. The W3C's script notes are worth a read if you're supporting these for the first time.
The advice we'd give: test with real copy, not مرحبا. Mixed-direction strings are where layout problems actually surface, and a placeholder that's uniformly RTL won't show them to you.
What it costsWhat it costs
Every render costs one render, including a GET URL sitting in an <img> tag, which re-renders each time the page loads. For an email or a high-traffic page, generate once and host the result unless the data genuinely needs to be live.
As of August 2026 the free tier is 100 renders a month, free, forever, and paid plans start at $14.99. Full numbers are on the pricing page.
Where to go nextWhere to go next
Start with the free generator to get the design right, then move the same layout to the API. If your images need charts or tables rather than headlines, the sankey diagram generator covers that path, and dynamic fields explains marking properties in more detail.