---
title: "Review an email"
method: GET
path: "/v1/design_studio/emails/{id}/review"
tags: ["Design Studio emails"]
---

# Review an email

`GET /v1/design_studio/emails/{id}/review`

Checks an email's saved content for errors and suggests how to improve accessibility, styling, and more. This runs the same process as the [*Review* panel in Design Studio](/messaging/design-studio/emails/qa-in-design-studio/) and returns a readiness score, a status per check, and how to fix issues.

This endpoint reviews **a single translation** based on the `:id` you pass. Call this endpoint for each language variant to review each translation.

**Checks**
  - `liquid` — Liquid syntax: broken tags, invalid filters, unclosed blocks. Does not report missing variables; use the [preview endpoint](/integrations/api/app/tag/design-studio-emails/previewEmail/) with sample data to validate variable resolution.
  - `failed-components` — Custom components that fail to compile. Always `skipped` on the API; it's a browser-runtime-only signal.
  - `source` — Raw markup the editor stores, before liquid rendering. Checks for reserved internal HTML attributes, multiple root elements, and design-token clashes.
  - `links` — Broken URLs, validated over HTTP (capped at 100 links per review).
  - `images` — Broken image URLs and missing alt text (capped at 100 images per review).
  - `accessibility` — WCAG accessibility issues.
  - `spam` — SpamAssassin score.
  - `unsubscribe` — Presence of an unsubscribe link.
  - `implied-links` — Bare URLs or email addresses that should be wrapped in `<a>` tags.
  - `html-clip` — Gmail's 102 KB clipping threshold.
  - `preheader` — Preheader text presence and quality.

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

## Response `200`

Successful response

- EmailReviewResponse
  - `node_id` string, uuid — The UUID of the reviewed email node.
  - `status` 'complete' | 'partial' | 'render_failed' — - `complete`: every check ran to completion. - `partial`: at least one check errored, ran on reduced input, or was skipped. `failed-components` is always skipped and doesn't [affect this status. If you get a `partial` status, send the request again after a few seconds to try to get a complete set of findings. - `render_failed`: the underlying render failed; no checks ran, `score` is omitted, and `findings` is empty. If it's a timeout, send the request again after a few seconds. If it's a content or compilation error, fix the email before sending the request again.
  - `score` EmailReviewScore — Readiness score. Omitted when `status` is `render_failed`.
    - `score` integer — 0–100 readiness estimate. Starts at 100 and is reduced per failing finding. An error drops the score to 60 or below; fix all errors to make sure your recipients get your email and you follow compliance requirements. See **findings** to locate errors.
    - `counts` object — Finding counts by severity across all checks.
      - `error` integer — The number of failing `error` findings.
      - `warning` integer — The number of failing `warning` findings.
      - `tip` integer — The number of failing `tip` findings.
  - `checks` object — Per-check status, keyed by check name. See the endpoint description for the full list of checks.
  - `findings` EmailReviewFinding[]
    - `id` string — Identifier for this finding, unique within the response.
    - `check` string — Which check produced this finding.
    - `severity` 'error' | 'warning' | 'tip' — Fix all errors to make sure your recipients get your email and you follow compliance requirements. Review warnings and tips to improve the quality of your email.
    - `state` 'pass' | 'fail' — Whether this finding represents an issue. Passing findings don't affect the score.
    - `title` string — Short human-readable title.
    - `summary` string — Location context, for example "In the email body". Omitted when there's no additional context.
    - `details` string — Explanation and suggested fix. Omitted when there's nothing more to add beyond the title.

## 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/review/get.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)
