Every docs endpoint reads and writes the article body as markdown. The body is stored as HTML and converted back on read, so what you send is what the next GET returns.
Two block types need a tag, because markdown has no syntax for them: tabs and code groups. Both use the same shape Mintlify uses, so a body written for one renders in the other.
Tabs
Wrap the panels in `` a title. The reader sees one panel at a time. <Tabs> <Tab title="First tab"> Content only the first tab shows.Content only the second tab shows.
Each tab takes one required prop, `title`, which is the label the reader clicks.
A tab holds any markdown: paragraphs, lists, images, tables, code blocks, even another tabs block. Indent the inner markdown under the tag; the indentation is stripped before parsing.
---
## Code groups
Wrap fenced code blocks in `<!--pl-panel-1-->The word after the language is the tab label. Leave it out and the label falls back to the language.
Matching labels move together
Tabs and code groups with the same label stay in sync across the page. A reader who picks python in one code group sees python selected in every other group that offers it.
Images
To put an uploaded image in a draft, first upload it with the upload-files or import-file endpoint in the Files section of the API reference. The response returns a file_url. Use that URL in a standard markdown image in the article body:
Replace <file_url> with the value the upload returned.
What round-trips and what does not
GET /docs/articles/{id} returns the body as markdown, with tabs and code groups written back as the same tags. Reading a body, changing one line, and writing it back keeps every panel intact.
Blocks markdown cannot express travel as raw HTML instead: accordions, image galleries, embeds, and merged-cell tables. Leave that HTML as you found it.
PATCH /docs/articles/{id} replaces the whole body. Carry over every panel the article already has.
