Design Studio emails

Review an email

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 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 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.

get/v1/design_studio/emails/{id}/review

Path parameters

idstring uuid required

The UUID of the email node. This can be the default-language node or a specific translation node.

Response

Successful response

node_idstring 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.
checksobject

Per-check status, keyed by check name. See the endpoint description for the full list of checks.

Example response

{
  "node_id": "887d804e-9199-4a65-ae26-315e825344bc",
  "status": "complete",
  "score": {
    "score": 86,
    "counts": {
      "error": 0,
      "warning": 1,
      "tip": 1
    }
  },
  "checks": {
    "liquid": {
      "status": "complete"
    },
    "failed-components": {
      "status": "skipped"
    },
    "source": {
      "status": "complete"
    },
    "links": {
      "status": "complete"
    },
    "images": {
      "status": "complete"
    },
    "accessibility": {
      "status": "complete"
    },
    "spam": {
      "status": "complete"
    },
    "unsubscribe": {
      "status": "complete"
    },
    "implied-links": {
      "status": "complete"
    },
    "html-clip": {
      "status": "complete"
    },
    "preheader": {
      "status": "complete"
    }
  },
  "findings": [
    {
      "id": "unsubscribe",
      "check": "unsubscribe",
      "severity": "warning",
      "state": "fail",
      "title": "No unsubscribe link",
      "details": "Add {% unsubscribe %} or use {% unsubscribe_url %} as the href."
    },
    {
      "id": "preheader",
      "check": "preheader",
      "severity": "tip",
      "state": "fail",
      "title": "No preheader text",
      "details": "Add a short preheader to improve open rates."
    }
  ]
}

Changes

Changed in 1 of the 13 revisions of this API.1