Render HTML emails across real email clients and capture pixel-accurate screenshots — in one API call.
…or drop a .eml file onto the box, or .
We render in the actual email client, never an engine approximation. Gmail, Outlook, and Yahoo Mail are live today — each has its own preview page if you only need one. The rest are landing soon.
The strictest client. Renders in a live, logged-in Gmail session — strips flexbox, grid, position, box-shadow, and animations.
Renders in a live, logged-in Outlook.com web session — its own quirks around positioning, spacing, and transforms.
Renders in a live, logged-in Yahoo Mail session — its own CSS handling, and a tabbed inbox that sorts mail differently.
Rendered on a real iOS Simulator over an iPhone/iPad device profile. WebKit engine, true-to-device pixel scale.
The Gmail mobile apps, where most email is actually opened — real device widths and the mobile app's own rendering quirks.
Dark mode, images-disabled, and custom viewport widths. Want a specific client or setup sooner? Get in touch.
Clients don’t just dim their chrome in dark mode — they rewrite your email. Backgrounds invert, text gets recolored, logos vanish into the void. We flip the client’s true dark mode and screenshot what it did to your message — not a CSS filter over a light render.
OWA transforms message content aggressively in dark mode — the client most likely to repaint a design that looked fine in light.
Yahoo recolors message backgrounds and text in dark mode, with transforms of its own — passing Outlook’s dark pass doesn’t mean passing Yahoo’s.
Gmail’s theme is an account setting, and message content renders light either way. A dark Gmail render would be an approximation, so we don’t fake one.
One spec per render — request dark alongside light and compare: { "client": "outlook", "color_scheme": "dark" }. The trial above includes dark automatically for every client that supports it.
Every client strips different CSS. Gmail kills flexbox. Outlook breaks your spacing. Dark mode inverts your logo. An agent writing email HTML is flying blind — there's no way to see the result.
Gmail strips flexbox, grid, position, box-shadow, and animations. Outlook, Yahoo, and Apple Mail each have their own quirks. "Works in my browser" means nothing.
An LLM can write email HTML, but it has no feedback loop. It can't open Gmail, can't check dark mode, can't tell if images got blocked. It guesses — and ships broken email.
Humans paste HTML into test tools, eyeball a dozen screenshots, and hunt for what broke. It's slow, repetitive, and exactly the kind of work that should be automated.
Post your email HTML to a single endpoint. We render it in parallel across real, logged-in email clients, screenshot each one at the viewport widths you specify, and return images an agent can look at directly.
# Submit an email for preview curl -X POST https://api.powerline.ai/v1/jobs \ -H "Content-Type: application/json" \ -d '{ "html": "<html>…</html>", "subject": "Welcome aboard", "include_previews": true, "renders": [ { "client": "gmail", "viewport_width": 600 }, { "client": "outlook", "viewport_width": 600 }, { "client": "outlook", "viewport_width": 600, "color_scheme": "dark" }, { "client": "yahoo", "viewport_width": 600, "images_disabled": true } ] }' # → 202 { "job_id": "j_…", "poll_url": "…" } # poll that until status is "completed" # include_previews adds the inbox row + subject heading (off by default) { "status": "completed", "progress": { "total_renders": 4, "completed_renders": 4 }, "results": { "renders": [{ "client": "gmail", "viewport_width": 600, "color_scheme": "light", "images_disabled": false, "screenshot_url": "…/screenshots/gmail-600-light.png", "screenshot_dimensions": { "width": 860, "height": 146 }, "device_scale_factor": 2, "subject_preview": { "screenshot_url": "…-subject.png" }, "inbox_preview": { "screenshot_url": "…-inbox.png" }, "render_duration_ms": 17878 }], // a client that errored appears here, not in renders "failed_renders": [] } }
However you work — pasting HTML, calling the API, or wiring up an agent — there's a native path in. No glue code required.
Drop your email HTML into the box above and get a preview on the spot. Nothing to install.
A clean /v1/jobs JSON API with an OpenAPI spec. Submit, poll, fetch screenshots. Works from any language.
A hosted MCP endpoint at /v1/mcp — point Claude Code, Claude Desktop, Cursor, or any MCP client at it and call four preview tools directly. Nothing to install.
A drop-in agent skill doc served at /v1/skills.md — point your agent at it and it knows the whole workflow.
Send your email to an inbox and get a preview link back by reply. Works from any mail client, with nothing to wire up.