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"
}