---
title: "Send for inbox previews"
method: POST
path: "/v1/design_studio/emails/{id}/inbox_previews"
tags: ["Design Studio emails"]
---

# Send for inbox previews

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

Initiate one or more inbox previews for an email. This uses inbox preview credits; check your balance with [Get preview credit balance](/integrations/api/app/tag/design-studio-emails/getInboxPreviewCredits/). [**Learn how billing for inbox previews work before you call this endpoint.**](/accounts/billing/inbox-previews/)

Use [List emails](/integrations/api/app/tag/design-studio-emails/listEmails/) to get your email's ID. If the email has translations, call [List email translations](/integrations/api/app/tag/design-studio-emails/listEmailTranslations/) to get the ID of the language variant you want a preview of.

You can retrieve client IDs from [List inbox preview options](/integrations/api/app/tag/design-studio-emails/listInboxPreviewClients/).

This call does not return the preview file. It returns a `run_id`; poll [Get an inbox preview job](/integrations/api/app/tag/design-studio-emails/getInboxPreviewJob/) with it, then fetch each tile's capture URL from that response.

Submitting the same email, content, and devices again on the same UTC day returns the existing run instead of starting a new one, with `replayed` set to `true` and no second charge. The same happens the next day if that run is still processing, or if a concurrent identical request gets there first. Resubmitting a stuck run is safe and free—it hands you the same run back rather than starting a second one.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `client_ids` string[], required — The identifiers of the preview options you want. You can retrieve client IDs from [List inbox preview options](/integrations/api/app/tag/design-studio-emails/listInboxPreviewClients/).
  - `sample_data` object — Liquid variables to render with, as a JSON object—any shape is accepted, from flat variables like `{"first_name": "Janine"}` to nested ones like `{"customer": {"first_name": "Janine"}}`. Defaults to none, which fails the render on any variable the content needs beyond the ones a preview already sets for you. Set `lax_mode` to render missing variables as blank instead. Limited to 128 KB.
  - `name` string — A label for the batch of previews, shown in [preview history](/integrations/api/app/tag/design-studio-emails/listInboxPreviewJobs/).
  - `lax_mode` boolean — Set to `true` to render liquid variables missing from `sample_data` as blank instead of failing the job.

## Response `200`

Preview job submitted

- object
  - `run_id` integer — ID of the preview job. Check when it's complete with [Get an inbox preview job](/integrations/api/app/tag/design-studio-emails/getInboxPreviewJob/).
  - `replayed` boolean — `true` when this call returned an existing run instead of starting a new one, and you weren't charged a second time for it. This happens for an identical request (same email, content, and devices) submitted again on the same UTC day, an identical request from the day before that's still processing, or a concurrent identical request that got there first. The run may belong to another client in your workspace, including the Journeys UI—`created_at` is that run's, and a `name` you send is applied to it.

## Other responses

- `400` — Bad request
- `401` — Unauthorized - missing or invalid API key
- `403` — Your account can't be charged for inbox preview credits right now. Credits are account-level—every workspace on the account draws from the same pools, so this isn't specific to the workspace in your credentials.
- `404` — Resource not found
- `409` — A retry crossed an interrupted charge for this batch. This means one of two things: - The batch was already charged and settled today. - An earlier attempt at the same batch is still being reconciled. Change the devices or nodes you're previewing, or retry later. Either way, you weren't double-charged.
- `422` — Not enough inbox preview credits to cover every device in `client_ids`. The message names both figures, so you can size a top-up without a separate call to [Get preview credit balance](/integrations/api/app/tag/design-studio-emails/getInboxPreviewCredits/).
- `429` — Rate limited to 5 requests per second per workspace—a bucket shared with the Design Studio link, publish, render, preview, and review endpoints, and tighter than the 10 per second reads get, because each call starts a server-side render before it reaches the vendor. The response carries a `Retry-After` header.
- `503` — The email or Liquid renderer couldn't be reached. This is transient—retry in a moment.

## Changes

- **2026-09-17** `b2a806105969` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/customer/apis/customer-io-journeys-api-reference/changes/v1/design_studio/emails/:id/inbox_previews/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)
