The Design object
The design object is the root of every Unlayer design. The embedded builder reads and writes it, the Cloud API exports, converts, and validates it, and every endpoint that takes a design accepts this shape.
Shape
{
"counters": {
"u_row": 4,
"u_column": 6,
"u_content_text": 3,
"u_content_image": 2,
"u_content_button": 1
},
"body": {
"id": "body-1",
"rows": [
/* Row objects */
],
"values": {
/* body-level styling */
}
},
"schemaVersion": 21
}
Fields
| Field | Type | Required | Notes |
|---|---|---|---|
body | Body | yes | The single body of the design — rows, columns, content, body-level styling. Email designs also accept body.headers and body.footers arrays. |
counters | Record<string, number> | yes¹ | Per-type counters the editor uses to assign stable IDs to new blocks (e.g. u_content_text: 3 means the next text block will be u_content_text_4). Required in the Full schema, optional in the Simple schema. |
schemaVersion | number | no | The design-schema version the payload was authored against. Migrations apply forward when the editor loads a design from an older version. |
_conversion | { data: string, version: number} | no² | Present only on Simple-form designs that were produced with includeConversion: true on /v3/convert/full-to-simple. Pass it back to simple-to-full to round-trip cleanly. |
¹ Required in the Full schema; optional in the Simple schema.
² Only present on Simple-form designs produced with includeConversion: true.
Email-only fields
body accepts two additional arrays in email designs:
| Field | Type | Notes |
|---|---|---|
body.headers | Row[] | Rows pinned to the top of every page when the email is broken across pages (PDF / printed scenarios). |
body.footers | Row[] | Rows pinned to the bottom of every page. |
Related
- Block object — what's inside
body.rows. - Content types — what each row's columns hold.
- Validate — verify a design conforms to the schema.