---
title: "Preview an email"
method: POST
path: "/v1/design_studio/emails/{id}/preview"
tags: ["Design Studio emails"]
---

# Preview an email

`POST /v1/design_studio/emails/{id}/preview`

Returns an email with liquid fully evaluated against data you provide. The response includes the final HTML as a recipient would see it, along with liquid errors.

Omit the body or send `{}` to render your fallback values: a variable with a `default` filter renders its fallback, and each variable without one reports an error in the response's `errors` object.

The render, preview, review, link, and publish endpoints share a rate limit of 5 requests per second per workspace.

## Path parameters

- `id` string, uuid, required

## Request body

- EmailPreviewRequest
  - `customer` object — Customer profile attributes for `{{customer.*}}` variables.
  - `event` object — Event attributes for `{{event.*}}`.
  - `trigger` object — Trigger data for `{{trigger.*}}`.
  - `campaign` object — Campaign metadata for `{{campaign.*}}`.
  - `message` object — Message metadata for `{{message.*}}`.
  - `journey` object — Journey metadata for `{{journey.*}}`.
  - `objects` object — Related objects for `{{objects.*}}`.
  - `lax` boolean — Set to `true` if you want undefined variables to resolve to an empty string instead of reporting an error; this can help you focus on more important errors when you don't provide sample data or fallback values. Liquid *syntax* errors (like broken tags and invalid filters) are always reported as errors.

## Response `200`

Successful response

- EmailPreviewResponse
  - `node_id` string, uuid — The UUID of the previewed email node.
  - `node_type` 'EMAIL' — Always `"EMAIL"`.
  - `language` string — Language code if the node is a translation. Omitted for default-language nodes.
  - `subject` string — Evaluated subject line.
  - `html` string — Final HTML with Liquid evaluated, the preheader injected, and dangerous tags removed.
  - `amp` string — AMP HTML variant with liquid evaluated. Omitted if the email doesn't have an AMP version.
  - `text` string — Plain-text body with liquid evaluated. Omitted if the email doesn't have a plain text version.
  - `plaintext_body` string — The plain-text part a recipient would get—your plain text version with HTML tags stripped, or text generated from the final HTML if the email doesn't have one. Omitted when empty.
  - `from` string — Resolved from address, for example `"Name <email>"`. Omitted when the email doesn't include a from address.
  - `preheader_text` string — Evaluated preheader text. Omitted when the email doesn't include preheaders.
  - `errors` EmailPreviewErrors — Per-field Liquid error arrays. All 15 fields are always present; an empty array means no errors for that field.
    - `subject` string[] — Subject line Liquid errors.
    - `body` string[] — HTML body Liquid errors.
    - `body_amp` string[] — AMP body Liquid errors.
    - `body_plain` string[] — Plain-text body Liquid errors.
    - `from` string[] — From address Liquid errors.
    - `reply_to` string[] — Reply-to address Liquid errors.
    - `bcc` string[] — BCC field Liquid errors.
    - `cc` string[] — CC field Liquid errors.
    - `to` string[] — Recipient field Liquid errors, for example `"undefined variable: customer.email"`.
    - `preheader_text` string[] — Preheader Liquid errors.
    - `layout` string[] — Layout template errors.
    - `message` string[] — Message-level errors.
    - `snippets` string[] — Snippet rendering errors.
    - `event` string[] — Event data Liquid errors.
    - `trigger` string[] — Trigger data Liquid errors.
  - `headers` EmailPreviewHeaderError[] — One entry per custom header that has Liquid errors. Omitted when there are none.
    - `name` string[] — Errors in the header name.
    - `value` string[] — Errors in the header value.
  - `links` EmailPreviewLink[] — Every link in the evaluated HTML body, with any per-link problems.
    - `url` string — The link URL after liquid evaluation.
    - `text` string — The link's visible text.
    - `tracked` boolean — Whether Customer.io rewrites this link for click tracking when you send the email.
    - `errors` string[] — Problems with this link, like a relative URL or liquid tags that were URL-encoded. Empty when the link is fine.

## Other responses

- `400` — Bad request
- `401` — Unauthorized - missing or invalid API key
- `404` — Possible reasons: - The `design_studio_api_manage` feature isn't enabled for this workspace - The email node doesn't exist

## Changes

- **2026-09-11** `367edfd26dbd` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/changes/v1/design_studio/emails/:id/preview/post.md)

---

[API](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference.md) · [All operations](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/llms.txt) · [OpenAPI document](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/revisions/d9edec5f938c?raw)
