v1.0.0
OpenAPI 3.1.0

Review an email

US region

Client Libraries

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.

Path Parameters
  • id
    Type: string Format: uuid
    required

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

Responses
  • application/json
  • application/json
  • application/json
  • application/json
Request Example for get/v1/design_studio/emails/{id}/review
curl https://api.customer.io/v1/design_studio/emails/123e4567-e89b-12d3-a456-426614174000/review
{
  "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": [
    {
      "check": "unsubscribe",
      "details": "Add {% unsubscribe %} or use {% unsubscribe_url %} as the href.",
      "id": "unsubscribe",
      "severity": "warning",
      "state": "fail",
      "title": "No unsubscribe link"
    },
    {
      "check": "preheader",
      "details": "Add a short preheader to improve open rates.",
      "id": "preheader",
      "severity": "tip",
      "state": "fail",
      "title": "No preheader text"
    }
  ],
  "node_id": "887d804e-9199-4a65-ae26-315e825344bc",
  "score": {
    "counts": {
      "error": 0,
      "tip": 1,
      "warning": 1
    },
    "score": 86
  },
  "status": "complete"
}