---
title: "Render the email editor canvas"
url: https://docs.gleap.ai/en/reference/rest-api/render-email-canvas
method: POST
path: "/engagement/emails/render-canvas"
api: "API Reference"
tag: "Engagement Email"
operationId: "RenderEmailCanvas"
updatedAt: "2026-11-01T18:40:15.677Z"
language: en
---

# Render the email editor canvas

`POST https://api.gleap.io/v3/engagement/emails/render-canvas`

The editor canvas of an email: the email of the look (`emailStyle`) rendered around an empty body, with `slot` marking where the body goes, and `css` that styles the editor's content (TipTap markup under the `root` selector) like the renderer styles the body. Takes the same values as `render-preview` except `message`. Nothing is stored or sent.

## Authorization

- `Authorization` (header, required): `Bearer <token>`

## Headers

- `project` (string, required)

## Request body (`application/json`, required)

- `sender` (string | object): A teammate id, or `{ id?, customSenderName? }`. Defaults to the current user.
- `lang` (string)
- `emailStyle` (string, required)
- `subject` (any)
- `preheader` (any)
- `brand` (any): Unsaved `emailBrand` values from the brand settings page.
- `emailCategory` (enum<string>): Conversational emails show no unsubscribe line. Defaults to marketing (a newsletter). One of: `conversational`, `marketing`.
- `root` (string, required): CSS selector of the editor's content element, e.g. `#email-canvas .ProseMirror`.

## Example request

```bash
curl --request POST \
  --url https://api.gleap.io/v3/engagement/emails/render-canvas \
  --header 'Authorization: Bearer <token>' \
  --header 'project: <project>' \
  --header 'Content-Type: application/json' \
  --data '{
  "emailStyle": "<emailStyle>",
  "emailCategory": "conversational",
  "root": "<root>"
}'
```

## Responses

### 200 (`application/json`)

Ok

- `slot` (string, required)
- `css` (string, required)
- `html` (string, required)

```json
{
  "slot": "string",
  "css": "string",
  "html": "string"
}
```
