---
title: "Render sequence step HTML"
method: POST
path: "/sequences/{sequenceId}/nodes/{nodeId}/render"
tags: ["Sequences"]
---

# Render sequence step HTML

`POST /sequences/{sequenceId}/nodes/{nodeId}/render`

Render one sequence email step to the exact email-safe HTML that would be sent, for embedding a visual preview. Read-only: this never sends or modifies anything, and uses POST only so personalization input can travel in a request body.

## Path parameters

- `sequenceId` string, required
- `nodeId` string, required

## Request body

- RenderEmailRequest — Personalization and output options for a render. Omit every field to render for a sample contact with clean links.
  - `subscriberId` string — Personalize as this stored subscriber. Mutually exclusive with subscriber. The rendered HTML then carries that subscriber's details, so this field additionally requires the subscribers:read scope.
  - `subscriber` object — Personalize as an ad-hoc contact. Mutually exclusive with subscriberId.
    - `email` string, email, required
    - `firstName` string, nullable
    - `lastName` string, nullable
    - `customAttributes` object
  - `variables` object — Extra merge variables layered over the contact's attributes.
  - `locale` string — Force a localization locale instead of deriving it from the contact.
  - `variantId` string — Render a specific A/B test variant. Ignored for templates.
  - `tracking` boolean — Apply the company's auto-UTM link decoration as a real send would. Per-send click redirects and the open pixel need a real email send record and are never present in a render.

## Response `200`

Email rendered successfully

- RenderEmailResponse
  - `success` boolean, required
  - `html` string, required — Email-safe HTML document, rendered exactly as it would be sent.
  - `subject` string, required — Subject line with merge tags resolved.
  - `previewText` string, nullable, required — Inbox preview text with merge tags resolved.
  - `locale` string, required — Localization locale the render resolved to.
  - `personalized` boolean, required — False means no contact was supplied, so a sample contact was used and merge tags resolved to empty values.
  - `trackingApplied` boolean, required — Whether auto-UTM link decoration was applied.
  - `entity` object, required
    - `type` 'campaign' | 'sequence_step' | 'template', required
    - `id` string, required
    - `variantId` string, nullable, required

## Other responses

- `400` — Validation error
- `401` — Unauthorized
- `403` — API key is missing the required read scope, or is missing subscribers:read while subscriberId was supplied
- `404` — Sequence or step not found

## Changes

- **2026-07-25** `b58891ac1cde` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/sequences/:sequenceId/nodes/:nodeId/render/post.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/revisions/b58891ac1cde/schema)
