Notion Scraper - Markdown Export & RAG Sync avatar

Notion Scraper - Markdown Export & RAG Sync

Pricing

from $11.00 / 1,000 page exports

Go to Apify Store
Notion Scraper - Markdown Export & RAG Sync

Notion Scraper - Markdown Export & RAG Sync

[🔄 Incremental sync] Export public Notion pages and databases to Markdown, JSON, HTML or RAG chunks. Crawl subpages and sync only changed content. Public pages need no login; connected private pages use your read-only Notion integration token.

Pricing

from $11.00 / 1,000 page exports

Rating

0.0

(0)

Developer

Fetch Finch

Fetch Finch

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

a day ago

Last modified

Share

No API key required Pricing Export Public tasks HTTP API

Extract public Notion pages, wikis, and databases into clean, useful data—without a login. Add a read-only Notion integration token when you need to access connected private content.

Use the Actor to:

  • export pages as Markdown, plain text, HTML, or structured block JSON;
  • crawl linked pages and database row pages;
  • export typed database properties for CSV, spreadsheets, and ETL workflows;
  • create stable RAG-ready chunks with heading paths and source block IDs;
  • optionally download images and files into private Apify storage; and
  • run incremental syncs that emit only new or changed pages.

Try the examples

These public Notion pages are used in the examples below. They are third-party pages and may change or become unavailable over time.

ExamplePublic taskPublic sourceWhat it demonstrates
Single pageRun the exampleGetting StartedRich text, headings, lists, todos, toggles, and links
Wiki crawlRun the exampleGetting Started with child pagesNested pages and knowledge-base crawling
Database rowsRun the exampleSnipd podcast highlights databaseDatabase views and typed row properties
RAG chunksRun the exampleGetting Started with child pagesSemantic chunks, heading paths, and stable source IDs

Quick start

For a public page, provide one URL:

{
"startUrls": [
{
"url": "https://darshgupta.notion.site/Getting-Started-1236ce47943c43fd8bbe8a236a25b9a6"
}
]
}

Run it in the Apify Console, or locally with:

$apify run --input '{"startUrls":[{"url":"https://darshgupta.notion.site/Getting-Started-1236ce47943c43fd8bbe8a236a25b9a6"}]}'

No token is required for public pages.

Four useful examples

1. Export one page

Source: Getting Started

Run it directly with the public page export task.

The default pages mode produces one dataset item with the page URL, title, hierarchy, change state, hashes, and selected content formats.

{
"startUrls": [
{
"url": "https://darshgupta.notion.site/Getting-Started-1236ce47943c43fd8bbe8a236a25b9a6"
}
],
"outputMode": "pages",
"formats": ["markdown", "text", "html"]
}

2. Crawl a public wiki

Source: Getting Started with child pages

Run it directly with the public wiki crawl task.

Follow child pages while retaining each page’s depth and path. Duplicate links and cycles are handled by page ID, and the limits keep large wikis bounded.

{
"startUrls": [
{
"url": "https://darshgupta.notion.site/Getting-Started-1236ce47943c43fd8bbe8a236a25b9a6"
}
],
"crawlSubpages": true,
"maxDepth": 5,
"maxPages": 100,
"outputMode": "pages",
"formats": ["markdown", "text"]
}

3. Export database rows

Source: Snipd podcast highlights database

Run it directly with the public database rows task.

Use databaseRows when you need one flat record per row rather than the body of every row page. Values such as dates, checkboxes, selects, people, relations, and files are normalized into predictable fields.

{
"startUrls": [
{
"url": "https://snipd.notion.site/Example-Synced-podcast-highlights-database-with-Snipd-s-integration-4874d50a445e49ad9af370da3dd54574"
}
],
"outputMode": "databaseRows",
"maxDatabaseRows": 100,
"includeRawProperties": false
}

Set crawlDatabasePages to true in pages, blocks, or chunks mode when you also need the body of each row page.

4. Build a RAG-ready knowledge base

Source: Getting Started with child pages

Run it directly with the public RAG chunks task.

Use the wiki example as a source for deterministic chunks. Each chunk includes a stable ID, approximate token count, heading path, source block IDs, Markdown, and plain text.

{
"startUrls": [
{
"url": "https://darshgupta.notion.site/Getting-Started-1236ce47943c43fd8bbe8a236a25b9a6"
}
],
"crawlSubpages": true,
"crawlDatabasePages": false,
"outputMode": "chunks",
"formats": ["markdown", "text"],
"targetChunkTokens": 700,
"maxChunkTokens": 1000,
"overlapTokens": 80
}

For recurring syncs, add "syncKey": "demo-knowledge-base" and "emitOnlyChanges": true, then run it again with the same syncKey to receive only new or changed pages. Unchanged pages are checked but omitted.

Output modes

pages

One item per page, including page identity, URL, hierarchy, change state, hashes, selected content, database summaries, and optional assets.

databaseRows

One typed item per database row. This is the most convenient mode for CSV, Excel, APIs, and data pipelines.

blocks

One item per block with its block ID, type, parent, depth, heading path, and selected formats. Use this mode when downstream systems need fine-grained citations or custom rendering.

chunks

Embedding-ready records created from semantic block boundaries. Code and table blocks remain indivisible unless they exceed the configured limit by themselves.

Content formats

Choose any combination of:

  • markdown — clean Notion content for documentation and exports;
  • text — plain text for search and language-model pipelines;
  • html — rendered HTML for downstream web views; and
  • json — typed block data for custom processing.

Private and connected pages

Create a read-only internal Notion integration, share the pages or databases with it, and enter its token in the secret notionToken input. The token is used only for Notion API requests and is not written to datasets, manifests, or error records.

Public URLs are attempted through the structured public-page path first. When a token is supplied, the Actor can fall back to Notion’s official API for connected content.

Assets and ZIP bundles

Set downloadAssets to true to preserve eligible images and files in private Apify key-value storage. Set createZip to true to create a per-page bundle containing Markdown, plain text, metadata, and downloaded assets.

Downloads are bounded by per-file, per-page, and total-run limits. Expiring source URLs are not a substitute for downloading assets when you need a durable backup.

Incremental sync

Set a stable syncKey to persist a manifest between scheduled runs. The Actor computes deterministic content and metadata hashes and classifies pages as:

  • new — not present in the previous completed run;
  • updated — content or relevant metadata changed; or
  • unchanged — both hashes match.

The manifest is committed only after a complete crawl. Page failures, scope limits, and pay-per-event budget limits do not replace the last good manifest.

Customer pricing

The Actor uses pay-per-event billing. Prices below are the current customer prices:

EventCustomer priceCharged when
Actor start$0.00005 minimumThe Actor starts; the exact start charge depends on allocated memory
Page check$0.001A page or database is successfully loaded and normalized
Page export$0.011Exported page content is emitted for one source page
Database row export$0.003One normalized database row is emitted
Asset or ZIP storage$0.002One downloaded asset or generated ZIP is successfully stored

Page checks and exports are additive. A newly exported page costs $0.012 before the Actor-start charge and any assets: $0.001 for the check plus $0.011 for the export. At the minimum start charge, 100 newly exported pages cost $1.20005 before assets.

Unchanged pages in an incremental sync still incur the $0.001 page-check charge, but are not exported when emitOnlyChanges is enabled. This is substantially cheaper than exporting unchanged content again.

pages, blocks, and chunks output each incur one Page export charge per source page, regardless of whether that page produces one record or many block/chunk records. Database-row output is charged per normalized row instead.

Invalid URLs, inaccessible pages, skipped oversized assets, and error records do not trigger result events. Subpages and database row pages count as pages.

Reliability and safety

  • Public requests use HTTPS and validate redirects and DNS destinations.
  • Crawls have page, depth, row, asset, and byte limits.
  • Pages that fail in a batch are reported as normalized error records by default.
  • Set failOnPageError to true when a run must stop at the first page error.
  • The Actor never writes to Notion or sends page content to an external AI service.