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 <Tabs> and give each <Tab> a title. The reader sees one panel at a time.
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 <CodeGroup>. Each fence becomes one tab.
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.
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.