The Productive Document Format describes the elements supported in rich text fields like pages.body. It defines what you can write through the Markdown and HTML proxy endpoints documented in Importing Docs via API.
It's currently used in the following resources:
| Resource | Property | Description |
|---|---|---|
pages |
body |
Productive Docs are represented by the pages resource and its body is written and read in this format |
The content shown in this guide goes into the markdown or html field of a proxy endpoint request. For example, to append the content to a page:
Markdown path:
PATCH /api/v2/pages/:id/append_markdown
{
"markdown": "## Daily standup\n\n- Build is green"
}
HTML path:
PATCH /api/v2/pages/:id/append_html
{
"html": "<h2>Daily standup</h2><ul><li>Build is green</li></ul>"
}
When creating a page, the field lives inside the standard JSON:API envelope alongside the other page attributes (title, project_id, …):
POST /api/v2/pages/create_with_markdown
{
"data": {
"type": "pages",
"attributes": {
"title": "Sprint planning",
"project_id": 12345,
"markdown": "# Sprint 42\n\n- Ship the dashboard"
}
}
}
For full request examples (headers, response shapes, append vs replace, error pitfalls), see Importing Docs via API. The rest of this guide describes what you can put inside the markdown and html strings.
Block elements: paragraph, blockquote, heading, codeblock, ol, ul, checklist, table, divider, banner, columns
Inline elements: text, image, file, mention, var, br
Marks (text formatting): link, em, strike, underline, strong, code, discussion, styles
Paragraph
Plain text separated by blank lines. The Markdown form is the default — no syntax. The HTML form supports optional style="text-align: left|center|right|justify".
<p>Hello world.</p>
<p style="text-align: center">Centered text.</p>
Blockquote
Markdown: > Hello world
HTML: <blockquote><p>Hello world</p></blockquote>
Heading
Three levels are supported. Markdown: #, ##, ###. HTML: <h1>, <h2>, <h3>. Higher levels (#### / <h4> and below) are not rendered.
Codeblock
A fenced code block with an optional language hint. The HTML form uses the codeblock-language attribute.
```ruby
puts 'hello'
```
<pre codeblock-language="ruby"><code>puts 'hello'</code></pre>
Ordered list
Markdown: 1. item. HTML: <ol> of <li> items. The HTML form supports <ol start="N"> to change the starting number.
Unordered list
Markdown: - item. HTML: <ul> of <li> items.
Checklist
Markdown uses GFM task list syntax inside list items:
- [ ] To do
- [x] Done
HTML uses dedicated attributes:
<ul type="checklist">
<li type="checklist_item" checked="false"><p>To do</p></li>
<li type="checklist_item" checked="true"><p>Done</p></li>
</ul>
Table
Markdown supports the standard GFM table form (header row + delimiter row + body rows). HTML is required for cell colspan, rowspan, alignment, and background color.
<table>
<tr>
<th>Item</th>
<th colspan="2">Range</th>
</tr>
<tr>
<td>A</td>
<td style="text-align: right">10</td>
<td style="background-color: #fef3c7">20</td>
</tr>
</table>
Divider
Markdown: --- on its own line. HTML: <hr>.
Banner
A callout block. HTML only — Markdown has no equivalent. Supported type values: info, warning, success, critical.
<banner type="warning"><p>This is a banner</p></banner>
Columns
Multi-column layout, 2 to 5 columns. HTML only.
<div data-columns data-column-count="2" style="grid-template-columns: 1fr 1fr;">
<div data-column><p>Left</p></div>
<div data-column><p>Right</p></div>
</div>
Image
Markdown: . HTML form additionally supports width:
<img src="https://example.com/image.png" alt="alt text" title="title" width="100">
File
A link to an uploaded file. HTML only.
<span file-type="application/pdf"
url="https://files.productive.io/.../report.pdf"
name="Q1 report.pdf">Q1 report.pdf</span>
Mention
A reference to a Productive object — a person, task, page, project, etc. — that renders as a mention pill and triggers notifications when applicable. HTML only; Markdown stores @username as literal text.
<p>Hi <span mention-type="user" mention-id="12345" mention-label="John Doe">John Doe</span>, please review.</p>
| Attribute | Required | Description |
|---|---|---|
mention-type |
✓ | user, task, page, project, deal, company, … |
mention-id |
✓ | Numeric id of the referenced object |
mention-label |
✓ | Display text shown inside the pill |
mention-avatar-url |
Avatar URL (used for user mentions) |
The HTML path also accepts a compact shorthand that is expanded into the structured node automatically:
@[type:id:label]
For example, @[user:12345:John Doe] is equivalent to the <span> form above.
Variable
An inline placeholder rendered as {var_name} in the editor and resolved by other parts of Productive at display time. HTML only.
<p>Hello <span var="customer_name"></span>, your invoice is ready.</p>
Line break
A line break inside a paragraph (as opposed to a paragraph break). Markdown: end the line with two trailing spaces. HTML: <br>.
Bold, italic, strike-through, inline code, and link use standard Markdown / HTML syntax — **bold** / <strong>, *italic* / <em>, ~~strike~~ / <del>, `code` / <code>, [text](url) / <a href>. No Productive-specific quirks.
Underline
HTML only — Markdown has no syntax for underline.
<u>Hello world</u>
Discussion
Highlights text and links it to a discussion thread. HTML only.
<span discussion-id="1" resolved-id="">world</span>
Styles
Inline styling such as text color, background color, or font weight. HTML only.
<span style="color: #ef4444; background-color: #fef3c7">Highlighted</span>