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
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
- ○
endpoint added
endpoint-added
- ○