MemorySyncMemorySync
Integrations

Notion

The Notion integration syncs pages and databases that are shared with your Notion integration into MemorySync as queryable memories. Content is fetched via the Notion API, blocks are converted to Markdown, and only root-level items (not their descendants) become individual memories.

What gets synced

The Notion provider creates one memory per root-level shared item:

  • Pages — the full block content of each page is fetched, converted to Markdown, and stored as the memory's text content.
  • Databases — the database's title and description are stored. Individual database items (rows) are not synced as separate memories.

Only root-level items appear as memories — if a page is nested inside another shared page, only the top-level parent becomes a memory. This is achieved through the provider's unique 2-phase root-item filtering (see below).

Authentication model

Notion uses OAuth 2.0 with some specific behaviors:

DetailValue
Token exchangeBasic auth header: Authorization: Basic base64(client_id:client_secret)
API versionNotion-Version: 2022-06-28 (sent on every request)
Token expirationNotion access tokens do not expire — there is no refresh flow.

Setup guide

  1. 1Open the dashboard — navigate to Dashboard → Integrations → Notion.
  2. 2Click Connect — you will be redirected to Notion's OAuth consent screen. MemorySync already has the Notion app registered; no provider-side configuration is required on your side.
  3. 3Choose the workspace — Notion will ask which workspace to grant access to. Pick the one whose pages you want synced.
  4. 4Share pages with MemorySync — in Notion, open each page or database you want to sync and click Share → Invite, then select the MemorySync connection.
  5. 5Initial sync begins — MemorySync fetches all shared pages and databases. Large workspaces may take several minutes.

Root-item filtering

Notion shares can result in deeply nested hierarchies. The provider uses a unique 2-phase algorithm to ensure only top-level items become memories:

  1. 1Collect all accessible IDs — the provider calls the Notion Search API to fetch every page and database the integration can see, building a set of all accessible item IDs.
  2. 2Filter to root items — an item is a "root" if its parent_id is not in the accessible set. This means the item's parent is either the workspace itself or a page that was not shared with the integration.

This ensures that if you share a top-level page that contains 10 child pages, only the top-level page becomes a memory (with all child content included in its Markdown rendering).

Content rendering

Notion blocks are converted to Markdown using the following mapping:

Notion block typeMarkdown output
heading_1 / heading_2 / heading_3# / ## / ### headings
paragraphPlain paragraph text
bulleted_list_item bullet points
numbered_list_item1. numbered items
to_do / checkboxes
codeFenced code block with language tag
quote / callout> blockquote
divider--- horizontal rule
tablePipe-delimited Markdown table

Database properties are simplified: title properties extract their text, select/multi_select extract the option names, date properties extract start/end dates, and other complex types are serialized to their string representation.

Memory structure

Each Notion page or database becomes a memory with these metadata fields:

FieldDescription
parent_typeThe type of the item's parent: workspace, page_id, or database_id.
parent_idThe ID of the parent object.
archivedWhether the Notion page is archived.
propertiesSimplified page/database properties (for databases).
urlDirect link to the Notion page or database.

Known limitations

  • Rate limit of 3 requests per second — Notion enforces a strict average rate limit. The provider respects this and spaces requests accordingly. Large workspaces with many pages may take longer to sync.
  • Notion's webhook API is still in beta — real-time sync via webhooks is not yet reliable. The provider uses pull-based sync instead.
  • No byte acquisition — the provider does not download binary file attachments from Notion pages. Only text block content is extracted.
  • Blocks must be re-fetched for updates — the Notion API does not support delta queries for block content. On each sync, the full block tree for each modified page is re-fetched.
  • Sync is one-way — MemorySync never writes back to Notion. All data flows from Notion into MemorySync.