Real client captures, not simulations.
Every preview is your email opened in an actual copy of the client and device, then screenshotted. No CSS transforms, no browser emulation: the image you get is what a subscriber on that client sees.
Render raw HTML, an email you send us or a finished test in 50+ real clients and devices over REST, and read back a screenshot of each as JSON.
Every preview is your email opened in an actual copy of the client and device, then screenshotted. No CSS transforms, no browser emulation: the image you get is what a subscriber on that client sees.
Clients we capture in dark mode get a separate dark render with its own device key, so the inverted logo or unreadable dark-mode text shows up in your pipeline, not in production.
Pass devices with keys from the catalog to render only the clients you care about (just iOS Mail, just every Outlook), or omit it for every device on your plan. Newly requested devices come back pending; poll until each is completed or failed.
The preview endpoints ship as MCP tools (create_client_preview, list_client_preview_devices) on the Unspam MCP server, so Claude, Cursor, or any MCP client can pull real client renders mid-conversation.
Real client screenshots as JSON: one entry per device, with a full-size image, a thumbnail and a download link.
Set email_source to spam-check or inbox-placement and pass the test id as source_id, to raw-data with your own subject and body HTML, or to email to get a draft with an inbox_address and send the message there.
The body of a raw-data preview has to be the full HTML of a designed email, at least 1,000 characters and 10 HTML elements, or it is refused with 422. A message sent to a draft with no HTML or too little of it is not rendered or charged: the draft keeps its address and sets rejection_reason.
GET /client-previews/{id} returns a top-level status and a previews[] array with one entry per device: device_key, device_name, its category, per-device status, and URLs for the original, thumbnail and download.
The image URLs stay null until that device is completed, so a simple poll loop drains the whole set. A device can also end as failed, so stop on that as well. GET /client-previews lists your raw-data and email previews; test previews are reached through the test's client_preview_id.
GET /client-preview-devices lists every renderable client with its device_key, display name, and client-family category, such as Gmail, iPhone / iPad, or Outlook desktop (Windows). Cache it, show it in your own UI, or use it to build the devices filter for the render call.
Filtering is about signal and quota: each device in a request spends one device preview, so a CI job that runs on every template change can render just the three Outlook versions it cares about, spend three previews and review only those.
Connect the Unspam MCP server over OAuth and your assistant gets the preview tools next to spam checks and inbox placement. Ask it to render the campaign and flag anything broken in Outlook dark mode, and it chains the calls itself.
MCP support means your agent workflows can check renders from real clients without a human opening a dashboard.
Previews are asynchronous: choose where the email comes from, create the preview, then read the renders per device.
A finished spam or inbox test, your own subject and HTML, or a message you send to a draft address.
POST /ext/v2/client-previews with email_source and what that source needs. The 201 response carries the preview id, plus the inbox_address to send to for the email source.
Poll GET /ext/v2/client-previews/{id} on a back-off. Each device moves from pending to completed or failed, and its image URLs appear as it completes.
Pull the catalog from GET /ext/v2/client-preview-devices and pass devices in the POST body to render a subset. Unknown keys are ignored, and the call answers 422 only when none of them is available.
4 endpoints, on the same token as the rest of the API. The OpenAPI document has every parameter and response code.
OpenAPI document/client-preview-devices/client-previews/client-previews/client-previews/{id}Integration, device filtering, MCP access for AI agents, and how the preview endpoints behave.
POST /ext/v2/client-previews: raw-data with a subject and body for HTML you have not sent, email for a draft address you send a message to, or spam-check or inbox-placement with the test id as source_id. Then GET /ext/v2/client-previews/{id} returns one entry per device with per-device status and image URLs. Devices complete independently, so poll until the set you need has finished.devices in the POST /ext/v2/client-previews body with keys from GET /ext/v2/client-preview-devices to render a subset, for example only iOS Mail or only the Outlook family. Each device in the request spends one device preview from your allowance, so scoping changes both what comes back and what it costs. On the Custom plan the catalog also lists renders from the newest devices: iPhone 18 Pro, the Gmail app on Pixel 10 and iPhone 16, the Outlook Microsoft 365 app on Windows 11 and macOS, New Outlook for Windows, and Gmail web in Chrome.create_client_preview, list_client_previews and list_client_preview_devices, next to the spam-check and inbox-placement tools. Connect Claude, Cursor, or ChatGPT over OAuth and ask for renders in plain language; no keys to paste./spam-check/{id}/screenshots returns three viewport renders (desktop, tablet, mobile) of the message. POST /client-previews renders the email inside 50+ real client applications, with dark renders for the clients we capture in dark mode, so it catches client-specific breakage like the Outlook Word engine or a dark-mode logo inversion.API access is included with the Custom plan, bought online from a $5 monthly minimum. Build it into your own product and resell it under your own brand.