Markdown to Notion Converter
Paste, upload, or drag & drop Markdown and get clean, Notion API-compatible Block JSON instantly — with nested lists, checklists, tables, callouts, code blocks, toggles, and equations. Nothing ever leaves your browser.
Convert Markdown to Notion Block JSON
Paste Markdown, upload a file, or drag & drop — the preview and Notion JSON update live as you type.
Markdown Input
Live Preview
Notion Block JSON
How This Markdown to Notion Converter Works
This tool parses your Markdown into an intermediate block tree, then maps every node onto the exact JSON shape the Notion API expects — entirely in your browser, with no server round-trip. The same parse also powers the live preview, so what you see on the left is what gets converted on the right.
What is Markdown?
Markdown is a lightweight plain-text formatting syntax — headings with #, lists with -, bold with ** — designed to be readable as-is and easy to convert into richer formats. It's the default authoring format for READMEs, technical documentation, and wikis.
What is Notion?
Notion is a workspace and documentation tool built around a block-based content model: every piece of content — a paragraph, a heading, a to-do item, a table row — is its own structured block object, not a flat stream of formatted text. Notion's public API lets you create and update pages by sending exactly that block structure as JSON.
What Are Notion Blocks?
A Notion block is a JSON object with an object field (always "block"), a type field naming the block kind (paragraph, heading_1, to_do, and so on), and a type-specific object holding that block's content — most commonly a rich_text array. Blocks that can contain other blocks (lists, quotes, callouts, toggles, tables) nest them in a children array inside that same type-specific object.
Markdown vs. Notion: The Core Difference
Markdown describes formatting inline, as characters within a text stream. Notion describes structure explicitly, as a tree of typed objects. Converting between them means turning implicit formatting markers (**bold**) into explicit annotation objects, and turning implicit nesting (indentation) into explicit children arrays — that structural translation is the entire job of this converter.
How the Converter Works
Parsing happens in two passes: first, Markdown is split into block-level elements (headings, paragraphs, lists, tables, code fences, blockquotes) using a line-based scanner; then, each block's inline text is parsed a second time into "runs" — spans of text with bold/italic/strikethrough/code/link/equation flags attached. Runs become Notion rich text objects, and blocks become Notion block objects.
Rich Text Objects
Every piece of readable text in the Notion API is an array of rich text objects, each with a type (usually text or equation), the content itself, an annotations object (bold, italic, strikethrough, underline, code, color), and an optional href for links. A single Markdown sentence with mixed formatting becomes multiple rich text objects concatenated together.
// "Some **bold** text" becomes:
[
{ "type": "text", "text": { "content": "Some " }, "annotations": { "bold": false, ... } },
{ "type": "text", "text": { "content": "bold" }, "annotations": { "bold": true, ... } },
{ "type": "text", "text": { "content": " text" }, "annotations": { "bold": false, ... } }
]
Block Objects & Nested Blocks
Blocks that can contain other blocks — quote, callout, toggle, bulleted_list_item, numbered_list_item, to_do, and table — carry a children array inside their own type object (for example callout.children, not a top-level block.children). A nested Markdown list under a list item becomes exactly that: child list-item blocks nested inside the parent's children array, at any depth.
Lists & Checklists
Unordered list items (-, *, +) become bulleted_list_item blocks, ordered items (1.) become numbered_list_item blocks, and GitHub-style task items (- [ ] / - [x]) become to_do blocks with a boolean checked property — Notion has no separate "checklist" container, a to-do list is simply consecutive to_do blocks.
Tables
A Markdown table becomes a table block whose children array holds one table_row block per row (including the header row), with table_width set to the column count and has_column_header set to true — matching the exact shape the Notion API requires when creating a table.
Callouts (via GitHub Alert Syntax)
Markdown has no native callout syntax, so this converter recognizes GitHub's blockquote-based alert convention — > [!NOTE], [!TIP], [!IMPORTANT], [!WARNING], and [!CAUTION] — and maps each to a Notion callout block with a matching emoji icon and background color, which is the same convention many GitHub-to-Notion migration scripts already rely on.
Code Blocks
Fenced code blocks (```js ... ```) become Notion code blocks, with the fence's language tag normalized to one of Notion's recognized language identifiers where possible (js → javascript, py → python, sh → shell). Because Notion caps each rich text segment at 2,000 characters, long code is automatically split across multiple text objects so nothing gets silently truncated.
Equations
Inline LaTeX ($E=mc^2$) becomes an equation-type rich text object inside a paragraph's rich text array; block-level LaTeX ($$ ... $$) becomes a standalone Notion equation block.
Toggle Blocks
Notion's collapsible toggle has no standard Markdown syntax, so this converter recognizes the common <details><summary>Title</summary>...</details> HTML idiom — widely supported by GitHub, GitLab, and most Markdown renderers — and converts it into a Notion toggle block with the summary text as the title and everything else as nested children.
Embeds, Bookmarks & Videos
A line containing nothing but a bare URL is converted to a Notion bookmark block, or a video block automatically when the URL points to YouTube or Vimeo — a lightweight way to carry over reference links from a Markdown doc without losing them.
API Integration
The generated array is ready to drop into the children field of a Notion API Create a page or Append block children request, alongside your integration token and a parent page or database ID that your integration has been shared with.
// Node.js — send the generated blocks to Notion
const res = await fetch('https://api.notion.com/v1/blocks/' + parentBlockId + '/children', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer ' + process.env.NOTION_TOKEN,
'Notion-Version': '2022-06-28',
'Content-Type': 'application/json',
},
body: JSON.stringify({ children: generatedBlocks }),
});
Documentation Automation & Knowledge Base Workflows
Teams that write documentation in Markdown (READMEs, ADRs, runbooks) but collaborate in Notion often end up manually re-typing or copy-pasting content, which drifts out of sync. Generating Block JSON here — then scripting the Notion API call — turns that into a repeatable sync step: edit the Markdown source, regenerate, push.
DevOps Documentation & Engineering Wikis
Runbooks, incident postmortems, and API references frequently live in a Git repository as Markdown so they're versioned alongside code. Converting them to Notion Block JSON as part of a CI step keeps an internal engineering wiki current without a human manually reformatting every update.
Common Conversion Issues & Best Practices
- Inline images — Notion's rich text objects don't support an image embedded mid-sentence; only a paragraph containing just an image becomes an image block. Keep images on their own line for a clean conversion.
- Footnotes — Notion has no footnote block type, so footnote references and definitions are preserved as literal paragraph text rather than silently dropped, and flagged in the warnings panel.
- Deep heading levels — Notion supports only
heading_1throughheading_3; Markdown headings deeper than###are generated asheading_3. - 2,000-character rich text limit — the Notion API rejects a single rich text segment longer than 2,000 characters; this converter chunks long code blocks and paragraphs automatically so a single API call won't be rejected.
- Test against a real integration first — always send a small sample through your actual Notion integration before running a large document through production automation.
Enterprise Use Cases
Beyond individual docs, this same block-mapping logic is useful for migrating an entire GitHub Wiki or Docusaurus site into Notion page-by-page, generating meeting notes templates from a Markdown skeleton, or building an internal "Markdown-in, Notion-out" publishing pipeline for a content or support team.
Privacy & Security
Parsing and block generation run entirely inside your browser's JavaScript engine. No Markdown or generated JSON is ever transmitted to ToolAdda's servers, which makes this safe to use even with private documentation, internal runbooks, or content containing credentials-adjacent context (though secrets should never be committed to Markdown in the first place).
Markdown vs. Notion Blocks
| Aspect | Markdown | Notion Blocks |
|---|---|---|
| Structure | Flat text with inline markers | Explicit tree of typed block objects |
| Nesting | Implicit, via indentation | Explicit children arrays |
| Formatting | Character markers (**, _) | Annotation objects on rich text |
| Portability | Plain text, tool-agnostic | Requires the Notion API/app |
| Editability | Any text editor | Notion's block editor or API |
Markdown vs. HTML
| Markdown | HTML | |
|---|---|---|
| Readability as source | High — reads like plain text | Low — tags dominate the source |
| Expressiveness | Common formatting only | Full document semantics |
| Notion block support | Maps closely to Notion's block set | No standard Notion mapping; needs conversion |
GitHub Markdown vs. Notion Markdown
| Feature | GitHub Flavored Markdown | Notion's Markdown import |
|---|---|---|
| Task lists | Yes (- [ ]) | Yes, imports as to_do blocks |
| Alert callouts | Yes ([!NOTE] etc.) | No native syntax — needs mapping (this tool does it) |
| Tables | Yes (pipe tables) | Yes, imports as table blocks |
| Toggle/collapsible sections | Via raw <details> HTML | Native toggle block, mapped by this tool |
ToolAdda vs. Other Conversion Tools
| Feature | ToolAdda | Generic Markdown/HTML converters |
|---|---|---|
| Outputs Notion Block API JSON | Yes, directly usable | No — most output HTML or plain text only |
Nested block children structure | Yes, schema-accurate | N/A |
| GFM alert → callout mapping | Yes, automatic | N/A |
| Live preview alongside JSON | Yes | Varies |
| Runs fully client-side, free | Yes | Varies |
Frequently Asked Questions
What is a Markdown to Notion converter?
A Markdown to Notion converter parses Markdown text and outputs Notion Block API JSON — the exact structure Notion's API expects when creating a page or appending blocks — so you can move documentation from Markdown source files into Notion programmatically instead of copy-pasting by hand.
Is the output compatible with the Notion API?
Yes. The generated JSON follows the Notion Block API schema used by the Create Page and Append Block Children endpoints — each block has an object and type field, a type-specific payload with rich_text where applicable, and nested children for blocks that support them.
Does it support nested blocks?
Yes. Nested lists, blockquote/callout content beyond the first paragraph, and toggle contents are all placed in a children array inside the parent block's type-specific object, exactly as the Notion API expects.
Can I convert tables?
Yes. A Markdown table becomes a table block containing table_row child blocks, with table_width set to the column count and has_column_header set to true.
Are checklists supported?
Yes. Markdown task list items (- [ ] and - [x]) become to_do blocks with the checked property set to true or false.
Can I convert code blocks?
Yes. Fenced code blocks become code blocks with the fence's language tag normalized to a Notion-recognized language (for example js becomes javascript), and long code is automatically split across multiple rich text segments to respect Notion's 2,000-character limit per segment.
Does it support images?
Yes. A paragraph containing only a single Markdown image becomes an image block with an external file source and the alt text as its caption. Images mixed inline with other text stay as a linked text reference, since Notion's rich text objects don't support inline images.
Does it support equations?
Yes. Inline LaTeX ($E=mc^2$) becomes an equation rich text object inside a paragraph, and block LaTeX ($$ ... $$) becomes a standalone equation block.
Can I export JSON?
Yes. Click Download to save the generated Block JSON as a .json file, or Copy to copy it directly to your clipboard.
Is my Markdown uploaded?
No. Parsing and block generation run entirely in your browser using JavaScript. Nothing you paste, upload, or drag and drop is ever sent to ToolAdda's servers.
Does it work offline?
Once the page is loaded, all conversion logic runs in your browser's JavaScript engine with no network calls, so it keeps working even if your connection drops.
Is it free?
Yes. It's completely free, has no usage limits, and requires no account or sign-up.
Can I use it with the Notion API?
Yes. Copy the generated blocks array directly into the children field of a Notion API "Create a page" or "Append block children" request body, alongside a valid integration token and parent page or database ID.
Does it support GitHub Markdown?
Yes. GitHub Flavored Markdown extensions — task lists, tables, strikethrough, and GitHub's blockquote-based alert syntax ([!NOTE], [!TIP], [!WARNING], [!IMPORTANT], [!CAUTION]) — are all supported and the alerts map directly to Notion callout blocks with matching icons and colors.
Can I customize the block output?
Yes. Toggle Include Block IDs to add stub UUIDs to each block (useful for local reference, though Notion assigns real IDs on creation), and toggle Minify JSON to switch between pretty-printed and compact output.
What happens to unsupported Markdown elements?
Elements without a direct Notion block equivalent — such as footnote definitions or uncommon raw HTML — are converted to plain paragraph text containing the original syntax, and listed in the warnings panel so nothing silently disappears.
Does it preserve formatting?
Yes. Bold, italic, strikethrough, inline code, and links are converted into Notion rich text annotation objects, and combinations like bold-and-italic or a link containing bold text are preserved correctly.
Can I convert large Markdown files?
Yes. Smaller and mid-sized documents convert live as you type; very large files (roughly 300KB+) pause live conversion and wait for you to click Convert, so the browser tab stays responsive.
Is the JSON validated against the Notion Block schema?
The generator builds JSON that follows the documented Notion Block API structure for each supported block type, but it doesn't call Notion's API to validate it live — always test a real request against your integration before relying on it in production automation.
Can I integrate this into automation?
The conversion logic runs entirely client-side in the browser, so it isn't exposed as a hosted API — but the same Markdown-to-Notion mapping rules described in this page's documentation can be re-implemented in a Node.js script that calls the official Notion API.
Does it support callouts?
Yes. GitHub-style blockquote alerts (> [!NOTE], [!TIP], [!IMPORTANT], [!WARNING], [!CAUTION]) are converted to Notion callout blocks with a matching emoji icon and background color.
Does it support toggle blocks?
Yes. Wrap content in an HTML <details><summary>Title</summary>...</details> block in your Markdown, and it converts to a Notion toggle block with the summary text as the toggle title and the rest as nested children.
Does it support bookmarks, embeds, and videos?
Yes. A line containing only a bare URL becomes a bookmark block, or a video block if the URL points to YouTube or Vimeo.
Can I control heading levels?
Markdown headings # through ###### map to Notion's heading_1, heading_2, and heading_3 block types; since Notion only supports three heading levels, Markdown headings deeper than H3 are generated as heading_3.
Does this work on mobile devices?
Yes. The editor, live preview, and JSON output are fully responsive, and a sticky Convert button keeps the workflow accessible on small screens.
Related Developer Tools
Live Markdown editor with instant HTML preview and export.
{ } JSON Formatter & ValidatorFormat, validate, minify, and sort JSON in your browser.
🧬 JSON to TypeScriptGenerate TypeScript interfaces, types, and enums from JSON.
📄 JSON to YAML ConverterTurn JSON configs into clean, readable YAML.
📈 JSON to CSV ConverterConvert JSON arrays into spreadsheet-ready CSV.
🔁 XML to JSON ConverterConvert XML markup into structured JSON.
🪪 JWT DebuggerDecode and inspect JSON Web Tokens for API debugging.
🆔 UUID GeneratorGenerate unique IDs for sample data and fixtures.
🔐 Base64 Encoder/DecoderEncode or decode Base64 strings and files instantly.
Ready to Send Your Docs to Notion?
Paste, upload, or drop your Markdown and get clean, API-ready Notion Block JSON in seconds — free, private, and built for real documentation workflows.
⚡ Convert Markdown to Notion Now