MintRender
All docs pages

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

  1. 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.

  2. 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 in data.

  3. 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.

  4. Make an API key. Open Account, API keys. A test key (mr_test_…) renders with a watermark and costs nothing. See API keys.

  5. 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

ThingValue
Base URLhttps://mintrender.com/v1
AuthAuthorization: Bearer mr_live_… or mr_test_… on every call
BodyJSON in and JSON out, except uploads (multipart), ?inline=1 and the preview (the file itself)
Request idEvery 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 templateThe 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.

WayUse it whenPage
POST /v1/renderYour server has the data and wants the file URL or the file itself.Render API
POST /v1/batchYou have many rows: a list, a CSV file or a Google Sheet.Batches and CSV
Signed linkA 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, MakeAn 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.