Free tool · open source

Export every comment on a Notion page.

Notion has no export button for comments — they're left behind by .zip exports, by Markdown exports, by everything. This one command pulls whole threads out to Markdown or CSV, including the inline comments attached to individual blocks, not just the ones on the page itself. MIT-licensed, runs on your machine with your own Notion token.

Run it

# → Markdown, threads grouped
npx @restora/cli export-comments <page-url>

# → CSV, for a spreadsheet
npx @restora/cli export-comments <page-url> --format csv

Get the URL from Notion: ••• → Copy link on the page. First run walks you through connecting a Notion integration (about 30 seconds) — after that it's one command.

Two limits nobody tells you about

Both are Notion API facts, not tool bugs — but most write-ups skip them, so you find out after you've already trusted the file. This command prints both on every export.

1. Resolved comments can't be exported. By anything.

Notion's list-comments endpoint returns unresolved comments only. Anything you or a teammate marked resolved is invisible to every tool built on the API, including this one. If you need a resolved thread, un-resolve it in Notion first, then export.

2. Asking for "the page" misses your inline comments.

Querying a page id returns only comments left on the page as a whole. The comments you leave on a specific sentence live on that block, and have to be fetched block by block. This command walks the entire block tree and asks for each one — that's why a long page takes a minute, and why it finds threads a naive script won't.

What comes out

Markdown

# Comments — Q3 Roadmap

Exported 2026-08-07 · 12 comments in 5 threads ·
Unresolved comments only — Notion's API does not
return comments that were marked resolved, to any tool.

## On: "Ship the billing rewrite by August"
- **Priya Raman** · 2026-07-14 09:12 UTC — Can we
  split this? The migration is the risky half.
- **Alex Chen** · 2026-07-14 09:40 UTC — Agreed,
  splitting it.

## On the page
- **Dana Okafor** · 2026-07-15 16:03 UTC — Numbers
  updated after the finance review.

CSV

thread,anchor_type,anchor,author,created_utc,
comment,attachments

d41a…,paragraph,"Ship the billing rewrite by
August",Priya Raman,2026-07-14T09:12:00.000Z,
"Can we split this? The migration is the risky
half.",0

UTF-8 with a byte-order mark, so Arabic, Hebrew and CJK open correctly in Excel — and cells starting with = are escaped so a comment can't execute as a formula.

Setup, once

  1. Create a Notion integration at notion.so/profile/integrationsNew integration. Copy the internal token.
  2. Tick “Read comments” on that integration's Capabilities tab. Without it the API returns nothing for comments — the command tells you exactly this if it's missing. Tick “Read user information” too if you want real author names instead of ids.
  3. Share the page with it: open the page in Notion → ••• → Connections → add your integration.
  4. Run npx @restora/cli export-comments <url> and paste the token when asked. It's stored locally, in your home directory, and never sent anywhere but Notion.

Questions

Does Notion's built-in export include comments?

No. Exporting a page or workspace to Markdown, HTML or PDF drops comments entirely — they aren't in the .zip at all. The API is the only way to get them out, which is what this command uses.

Can I export resolved comments?

Not through any tool. Notion's API only returns unresolved comments, so resolved threads are unreachable — there's no flag or workaround. Un-resolve the thread in Notion and it becomes exportable.

Does it get inline comments, or just page comments?

Both. Inline comments are attached to individual blocks rather than the page, so this walks the whole block tree and asks each block for its comments. Each thread is labeled with the text it's anchored to, so you can tell what a reply was about.

Does it work on a whole workspace, or one page at a time?

One page per run — sub-pages and databases inside it are separate pages with their own comments, so they get their own export. If you want everything protected on an ongoing basis, a Restora backup captures comments across the workspace as part of the backup file.

Do the comment attachments come out too?

No — the API exposes that an attachment exists but not a way to download it. The export notes how many attachments a comment had so nothing disappears silently.

Does my content go through your servers?

No. The command runs on your machine and talks directly to Notion's API with your own token. Nothing touches a Restora server — the whole CLI is MIT-licensed on npm if you want to read it.

Comments are one part of what an export leaves behind.

Notion's .zip also drops relations, rollups and views — so a restore can't rebuild anything. A Restora backup keeps all of it, free.

Back up Notion free