Image API docs
MintRender turns a template and your data into a PNG, JPEG, WebP, SVG or PDF file. This page takes you from no account to your first image in five steps, then lists every docs page.
Quick start
Sign up. Open the editor and sign in with your email. The Free plan has 100 credits a month. One image or one PDF page is one credit.
Make a template. Start from one of the starter templates, or a blank page. Turn on "Changeable" for each layer your data will change (a title, a photo, a price) and give it a name, like
title. That name is the key indata.Publish. The API and signed links use the published version. You can change the draft later. Your users see no change until you publish again.
Make an API key. Open Account, API keys. A test key (
mr_test_…) renders with a watermark and costs nothing. See API keys.Render. Send the template id and your values, as below. The template id starts with
tpl_. The editor shows it in the Code panel.
The first call
Put your key in the environment variable MINTRENDER_KEY, then send one of these. The JavaScript runs in Node 18 or newer as an ES module. The Python needs the requests package.
curl
curl -X POST "https://mintrender.com/v1/render" \ -H "Authorization: Bearer $MINTRENDER_KEY" \ -H "Content-Type: application/json" \ -d '{"template":"tpl_3k2jQ8xLm0P4nB7vR2sT","data":{"title":"Ten ways to sell more"},"format":"png"}'JavaScript
const res = await fetch("https://mintrender.com/v1/render", { method: "POST", headers: { Authorization: `Bearer ${process.env.MINTRENDER_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ template: "tpl_3k2jQ8xLm0P4nB7vR2sT", data: { title: "Ten ways to sell more", }, format: "png", }),});const body = await res.json();if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message} (${body.error.request_id})`);console.log(body);Python
import os import requests res = requests.post( "https://mintrender.com/v1/render", headers={"Authorization": f"Bearer {os.environ['MINTRENDER_KEY']}"}, json={ "template": "tpl_3k2jQ8xLm0P4nB7vR2sT", "data": { "title": "Ten ways to sell more", }, "format": "png", }, timeout=120,)body = res.json()if not res.ok: raise RuntimeError(f"{body['error']['code']}: {body['error']['message']} ({body['error']['request_id']})")print(body)The answer holds the file's URL in outputs[0].url. Anyone with the URL can open the file. The same template version and the same data again give the same file at no cost, and the answer says "cached": true.
{ "id": "rnd_9x7Lm2Qp8sT4vB0nC6kR", "status": "succeeded", "outputs": [ { "size": "main", "url": "https://files.mintrender.com/r/ws_…/a1b2….png", "width": 1200, "height": 630, "bytes": 84211, "format": "png" } ], "credits": 1, "cached": false, "took_ms": 212, "created": "2026-11-01T09:30:00.000Z"}Every field of this call and of its answer is on the Render API page.
How the API works
| Thing | Value |
|---|---|
| Base URL | https://mintrender.com/v1 |
| Auth | Authorization: Bearer mr_live_… or mr_test_… on every call |
| Body | JSON in and JSON out, except uploads (multipart), ?inline=1 and the preview (the file itself) |
| Request id | Every answer has an MR-Request-Id header. Errors carry the same id as request_id. |
| Machine-readable API | /v1/openapi.json (OpenAPI 3.1), /llms.txt and /llms-full.txt |
| Code for one template | The editor's Code panel shows the call for each template in curl, JavaScript, Python, PHP and Go, with its own fields. |
There are four ways to make a file. Pick the one that fits where your data is.
| Way | Use it when | Page |
|---|---|---|
| POST /v1/render | Your server has the data and wants the file URL or the file itself. | Render API |
| POST /v1/batch | You have many rows: a list, a CSV file or a Google Sheet. | Batches and CSV |
| Signed link | A page needs an image URL now (og:image, an email, an img tag), and the file is made on the first view. | Signed links |
| MCP, n8n, Make | An AI assistant or a no-code tool sends the values. | MCP, n8n, Make |
All docs pages
Start
- API keys: Live keys, test keys with a watermark, where to make them and how to send them.
- Errors: The error format, every HTTP status and every error code of the API.
Make files
- Render API: POST /v1/render: every field, sync and async answers, the file in the answer, previews.
- Formats, sizes, PDF: PNG, JPEG, WebP, SVG and PDF; extra sizes; scale and quality; PDF pages; pixel limits.
- Batches and CSV: One file per row from JSON rows, an uploaded CSV or a CSV link, with one ZIP at the end.
- Jobs and webhooks: Async jobs, polling, webhook events, the signature check and retries.
- Signed links: Image URLs that render when they are opened, signed in your own code.
- Idempotency: Send a request again without a second charge.
Templates
- Templates and JSON: Drafts, versions and the scene JSON: every layer type and every field.
- Template data: How the values in data change a template: short values, objects, pages, errors.
- Text and fonts: Text fit, line limits, markup, Google Fonts, languages and emoji.
- Images and assets: Upload images and CSV files, or use image URLs in data.
- AI templates: Make a draft template from a short description.
Account
- Credits: What costs a credit, what is free, the credit period, plan changes, overage and GET /v1/usage.
- Limits: Rate limits, plan limits and the size limit of every request and file.
- Files and keeping: Where files live, who can open them and how long we keep them.
Connect
- AI assistants (MCP): Connect Claude, ChatGPT or another MCP client.
- n8n: The HTTP Request node, with workflow files to import.
- Make: The HTTP module settings for one image and for one file per sheet row.
Reference
- API reference: Every route, made from the OpenAPI file.
- HTML to image: A headless browser, Satori or a template API: what each one takes.
Errors
Every error is JSON with a code, a message in plain English, the field it is about (when there is one) and a request_id. Send the request id when you write to support. Every code is on the Errors page.
{"error": {"code": "invalid_param", "message": "must be a hex colour like #0f172a, or transparent", "field": "data.title.color", "request_id": "req_AW2J9HmisYTi"}}Seen MintRender used for content that breaks our terms? Report it. Questions about the API: support@mintrender.com, with the request id.