Rendex
Recipe

Render HTML to a PNG in Make — the Correct Setup

A pre-wired Make HTTP module that renders HTML to a PNG with Rendex on the first call. Copy the exact body below and you skip the most common Make mistake: sending more than one source field and getting a 400.

Last updated 2026-06-03

The Problem

The Rendex call from Make is one HTTP module, but the request body trips people up. The endpoint accepts exactly one source per request — html, OR url, OR markdown — and nothing else. The usual Make slip is starting from a url example, switching to html, and leaving the old url field behind, so the body now has two sources. Rendex rejects that with a 400, 'Send exactly one of url, html, or markdown per request', and because Make repeats the same body on every run, the whole scenario fails every time until the leftover field is removed. The mirror mistake — pasting a body with zero of those fields — fails the same way.

The Solution

Start from a correct body instead of debugging a broken one. Set the HTTP module to POST https://api.rendex.dev/v1/screenshot, add the Authorization Bearer header, set Body type to Raw with content type application/json, and paste one of the two bodies below — html to render your own markup, or url to screenshot a live page. Each has exactly one source field, so the request passes the first time. Rendex returns the PNG as the module's binary Data output, which you map straight into a Google Drive upload or an email attachment. It runs on the free tier — 100 renders a month, no card.

How the Workflow Runs

Trigger

Any Make trigger produces a bundle — a form field, a Sheets row, a webhook payload.

Build the body

Set Body type to Raw / JSON and paste the request with exactly ONE source field (html OR url).

Rendex HTTP module

POST to /v1/screenshot with the Bearer key. Rendex returns the PNG as the module's binary Data.

Downstream

Map the Data output into Google Drive (Upload) or Email (Attachment) — no decoding step.

Input → Rendered Output

Left: a Make HTTP module JSON body with a single html field and format png, annotated 'send just ONE of url / html / markdown — two sources returns a 400'. Right: the rendered PNG output card reading 'Hello Giulia', with status chips 200 OK, PNG, and 1 source.

Rendered by Rendex

What You Need

  • A Rendex API key — the free tier includes 100 renders/month with no card required.
  • A Make account on any plan (the generic HTTP module ships on every plan).
  • A trigger that produces the value you want to render — a form field, a Sheets row, or a webhook payload.
  • A downstream module to receive the image — Google Drive (Upload a file) or Email (Send an email).

What This Recipe Uses

One-source body

The endpoint takes exactly one of html, url, or markdown. The pre-wired body has a single source field, so it passes the first time.

HTML to PNG

POST /v1/screenshot renders raw HTML to a PNG and returns it as binary — no hosted page and no headless browser inside Make.

Binary maps downstream

The module exposes the PNG as Data. Map it into Google Drive Upload or an Email attachment with no decoding step.

Template with data{}

Keep {{placeholders}} in the html and add a data object of bundle values — Rendex fills them with Mustache before rendering.

Build It

make-http-module-setup.txt
Module:        HTTP > Make a request
Method:        POST
URL:           https://api.rendex.dev/v1/screenshot
Headers:       Authorization: Bearer YOUR_API_KEY
Body type:     Raw
Content type:  application/json
Parse response: No   (the response is a binary PNG, not JSON)

# The "Request content" field gets ONE of the two JSON bodies below.
# Map a trigger value into it, e.g. {{1.name}} or {{1.url}}.
body-render-html.json
{
  "html": "<h1>Hello {{1.name}}</h1>",
  "format": "png"
}
body-screenshot-url.json
{
  "url": "{{1.url}}",
  "format": "png"
}
body-wrong-two-sources.json
// Do NOT send more than one of url / html / markdown.
// This body has both "url" and "html" and is rejected:
{
  "url": "{{1.url}}",
  "html": "<h1>Hello {{1.name}}</h1>",
  "format": "png"
}

// 400 response (Make surfaces error.message):
// {
//   "success": false,
//   "error": {
//     "code": "VALIDATION_ERROR",
//     "message": "Send exactly one of 'url', 'html', or 'markdown' per request."
//   }
// }
render-html.sh
# Make's HTTP module sends exactly this request. Run it once in a terminal
# to confirm your key works before wiring the scenario. The response is the PNG.
curl -X POST https://api.rendex.dev/v1/screenshot \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --output hello.png \
  -d '{
    "html": "<h1>Hello Giulia</h1>",
    "format": "png"
  }'

100 free API calls/month — no credit card required. Get your API key and start building.

Reach for this when you want a Make scenario to turn HTML into an image — a receipt, an OG card, a status badge, a per-record graphic — and you want it working on the first run rather than after a round of 400s. The friction is never the endpoint; it is the body. Rendex takes exactly one source field per call, and Make's editor makes it easy to leave a stale url behind when you switch to html, which is precisely the shape the API rejects. The fix is to copy a known-good body and change only the value, not the keys: html for your own markup, url for a live page, and never both. Keep the default /v1/screenshot endpoint so the response is raw PNG bytes that Make exposes as Data and a downstream Drive or email module accepts with no base64 step. If a later module instead needs a hosted image URL, switch to /v1/screenshot/json, turn on Parse response, and read data.image. Everything here is free-tier: PNG output, HTML input, and Mustache data{} templating all work on the 100-renders-a-month plan, so you can prove the scenario before you ever touch billing.

Frequently Asked Questions

Related Resources