v1.0.0
OpenAPI 3.1.0
Review an email
Client Libraries
US region
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.
The UUID of the email node. This can be the default-language node or a specific translation node.
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"
}Successful response