json_content field in the Multiplai Source API. The schema is defined by the extensions loaded in EditorProvider.vue.type: "doc" and a content array:{
"type": "doc",
"content": [ /* block nodes */ ]
}content must contain block nodes only (not inline nodes or text directly).paragraph, heading, and blockquote nodes.| Attribute | Type | Description |
|---|---|---|
textAlign | "left" | "center" | "right" | "justify" | Text alignment (from TextAlign) |
indent | number (0–10) | Text indent level — each level = 40 px text-indent |
blockIndent | number (0–10) | Block indent level — each level = 40 px padding-left |
paragraph{ "type": "paragraph" }
{
"type": "paragraph",
"attrs": { "textAlign": "left", "indent": 0, "blockIndent": 0 },
"content": [{ "type": "text", "text": "Hello world" }]
}headingattrs.level is required (1–6).{
"type": "heading",
"attrs": { "level": 1, "textAlign": "left" },
"content": [{ "type": "text", "text": "Section title" }]
}blockquote{
"type": "blockquote",
"attrs": { "blockIndent": 0 },
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "A quote." }] }
]
}bulletListlistItem nodes.{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "Item one" }] }
]
}
]
}orderedListattrs.start (default 1).{
"type": "orderedList",
"attrs": { "start": 1 },
"content": [
{
"type": "listItem",
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "First step" }] }
]
}
]
}listItembulletList or orderedList. Contains block content.{
"type": "listItem",
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "Item" }] }
]
}codeBlocklowlight). Set attrs.language to any highlight.js language identifier or omit for plain text.{
"type": "codeBlock",
"attrs": { "language": "javascript" },
"content": [{ "type": "text", "text": "const x = 1;" }]
}horizontalRule{ "type": "horizontalRule" }message-banner| Attribute | Type | Default | Values |
|---|---|---|---|
type | string | "info" | "info", "warning", "success", "error" |
color | string | "#F2F2FD" | Any CSS hex color |
emoji | string | "" | Any emoji character |
{
"type": "message-banner",
"attrs": { "type": "warning", "color": "#FFF7E6", "emoji": "⚠️" },
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "This is a warning." }] }
]
}iframevideo for video files).| Attribute | Type | Default | Notes |
|---|---|---|---|
src | string | null | The embed URL |
width | number | 720 | Width in pixels |
height | number | 405 | Height in pixels |
frameborder | number | 0 | |
allowfullscreen | boolean | true | |
float | "none" | "left" | "right" | "none" | |
video | boolean | false | Set true if embedding a video URL |
originalUrl | string | null | Original URL before embed conversion |
type | string | null | Embed provider type (e.g. "youtube") |
{
"type": "iframe",
"attrs": {
"src": "https://www.youtube.com/embed/dQw4w9WgXcQ",
"width": 720,
"height": 405,
"frameborder": 0,
"allowfullscreen": true,
"float": "none",
"video": true,
"type": "youtube"
}
}videoiframe).| Attribute | Type | Default | Notes |
|---|---|---|---|
src | string | "" | URL of the video file |
width | number | 720 | Width in pixels |
height | number | 405 | Height in pixels |
float | "none" | "left" | "right" | "none" | |
uploadId | number | null | Internal upload record ID |
{
"type": "video",
"attrs": {
"src": "https://cdn.example.com/video.mp4",
"width": 720,
"height": 405,
"float": "none",
"uploadId": 42
}
}table → tableRow → tableCell / tableHeader.table{
"type": "table",
"content": [
{
"type": "tableRow",
"content": [
{
"type": "tableHeader",
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": null },
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Name" }] }]
},
{
"type": "tableHeader",
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": null },
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Role" }] }]
}
]
},
{
"type": "tableRow",
"content": [
{
"type": "tableCell",
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": null },
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Jane" }] }]
},
{
"type": "tableCell",
"attrs": { "colspan": 1, "rowspan": 1, "colwidth": null },
"content": [{ "type": "paragraph", "content": [{ "type": "text", "text": "Engineer" }] }]
}
]
}
]
}tableCell / tableHeader attributes:| Attribute | Type | Default | Notes |
|---|---|---|---|
colspan | number | 1 | |
rowspan | number | 1 | |
colwidth | number[] | null | null | Column widths in pixels |
content arrays, alongside text nodes.text{ "type": "text", "text": "Hello " }
{
"type": "text",
"text": "bold text",
"marks": [{ "type": "bold" }]
}hardBreak<br/>). No attrs.{ "type": "hardBreak" }resizable-image| Attribute | Type | Default | Notes |
|---|---|---|---|
src | string | "" | Image URL |
alt | string | null | Alt text |
title | string | null | Title |
width | number | 300 | Width in pixels |
height | number | 200 | Height in pixels |
float | "none" | "left" | "right" | "none" | |
href | string | null | Optional link URL |
uploadId | number | null | Internal upload record ID |
{
"type": "resizable-image",
"attrs": {
"src": "https://cdn.example.com/photo.jpg",
"alt": "A photo",
"width": 600,
"height": 400,
"float": "none",
"uploadId": 99
}
}mention@user). Renders as a clickable chip.| Attribute | Type | Notes |
|---|---|---|
id | number | string | The user's ID |
label | string | The user's display name |
{
"type": "mention",
"attrs": { "id": 7, "label": "Jane Doe" }
}date| Attribute | Type | Notes |
|---|---|---|
date | string | ISO 8601 date string (e.g. "2026-03-16") |
{
"type": "date",
"attrs": { "date": "2026-03-16" }
}page| Attribute | Type | Notes |
|---|---|---|
pageId | string | number | The target source item ID |
{
"type": "page",
"attrs": { "pageId": 42 }
}status-chip| Attribute | Type | Default | Values |
|---|---|---|---|
color | string | "info" | "info", "success", "warning", "error" or a hex color |
text | string | — | The label text displayed in the chip |
{
"type": "status-chip",
"attrs": { "color": "success", "text": "Approved" }
}emoji@tiptap/extension-emoji).| Attribute | Type | Notes |
|---|---|---|
name | string | The emoji shortcode name (e.g. "smile") |
{
"type": "emoji",
"attrs": { "name": "rocket" }
}text nodes via the marks array.bold{ "type": "bold" }italic{ "type": "italic" }strike{ "type": "strike" }code{ "type": "code" }underline{ "type": "underline" }link| Attribute | Type | Notes |
|---|---|---|
href | string | The URL |
target | string | "_blank" for new tab |
rel | string | e.g. "noopener noreferrer nofollow" |
class | string | CSS class |
{
"type": "link",
"attrs": {
"href": "https://example.com",
"target": "_blank",
"rel": "noopener noreferrer nofollow",
"class": null
}
}highlightmulticolor: true).| Attribute | Type | Default | Notes |
|---|---|---|---|
color | string | null | CSS color value |
{ "type": "highlight", "attrs": { "color": "#ffd666" } }textStyleTextStyleKit (font size, font family, color, line height, letter spacing, etc.). Only include the attributes you are setting.| Attribute | Type | Notes |
|---|---|---|
color | string | CSS color |
fontSize | string | e.g. "16px" |
fontFamily | string | e.g. "Inter" |
lineHeight | string | e.g. "1.5" |
letterSpacing | string | e.g. "0.02em" |
{ "type": "textStyle", "attrs": { "color": "#1890ff", "fontSize": "18px" } }superscript / subscript{ "type": "superscript" }
{ "type": "subscript" }{
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 1, "textAlign": "left" },
"content": [{ "type": "text", "text": "Getting Started" }]
},
{
"type": "paragraph",
"attrs": { "textAlign": "left" },
"content": [
{ "type": "text", "text": "Welcome to the guide. See " },
{
"type": "text",
"text": "our website",
"marks": [
{
"type": "link",
"attrs": { "href": "https://example.com", "target": "_blank", "rel": "noopener noreferrer nofollow", "class": null }
}
]
},
{ "type": "text", "text": " for more info." }
]
},
{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "First item with " },
{ "type": "text", "text": "bold", "marks": [{ "type": "bold" }] },
{ "type": "text", "text": " text" }
]
}
]
},
{
"type": "listItem",
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "Second item" }] }
]
}
]
},
{
"type": "codeBlock",
"attrs": { "language": "typescript" },
"content": [{ "type": "text", "text": "const greeting = 'Hello';" }]
},
{
"type": "message-banner",
"attrs": { "type": "info", "color": "#F2F2FD", "emoji": "ℹ️" },
"content": [
{ "type": "paragraph", "content": [{ "type": "text", "text": "This is an informational callout." }] }
]
},
{
"type": "resizable-image",
"attrs": { "src": "https://cdn.example.com/logo.png", "alt": "Logo", "width": 300, "height": 100, "float": "none", "uploadId": null }
},
{ "type": "horizontalRule" },
{
"type": "paragraph",
"content": [
{ "type": "text", "text": "Assigned to " },
{ "type": "mention", "attrs": { "id": 3, "label": "Jane Doe" } },
{ "type": "text", "text": " — due " },
{ "type": "date", "attrs": { "date": "2026-04-01" } }
]
}
]
}json_content via the API (content_type: "json" on creation), the backend validates:"type": "doc"."content" key whose value is an array.| Node type | Category | Container for |
|---|---|---|
doc | Root | block nodes |
paragraph | Block | inline nodes, text |
heading | Block | inline nodes, text |
blockquote | Block | block nodes |
bulletList | Block | listItem |
orderedList | Block | listItem |
listItem | Block | block nodes |
codeBlock | Block | text |
horizontalRule | Block | — |
message-banner | Block | block nodes |
iframe | Block | — |
video | Block | — |
table | Block | tableRow |
tableRow | Block | tableCell, tableHeader |
tableCell | Block | block nodes |
tableHeader | Block | block nodes |
text | Inline | — |
hardBreak | Inline | — |
resizable-image | Inline | — |
mention | Inline | — |
date | Inline | — |
page | Inline | — |
status-chip | Inline | — |
emoji | Inline | — |