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:
| Detail | Value |
|---|---|
| Token exchange | Basic auth header: Authorization: Basic base64(client_id:client_secret) |
| API version | Notion-Version: 2022-06-28 (sent on every request) |
| Token expiration | Notion access tokens do not expire — there is no refresh flow. |
Setup guide
- 1Open the dashboard — navigate to Dashboard → Integrations → Notion.
- 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.
- 3Choose the workspace — Notion will ask which workspace to grant access to. Pick the one whose pages you want synced.
- 4Share pages with MemorySync — in Notion, open each page or database you want to sync and click Share → Invite, then select the MemorySync connection.
- 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:
- 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.
- 2Filter to root items — an item is a "root" if its
parent_idis 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 type | Markdown output |
|---|---|
heading_1 / heading_2 / heading_3 | # / ## / ### headings |
paragraph | Plain paragraph text |
bulleted_list_item | • bullet points |
numbered_list_item | 1. numbered items |
to_do | ☑ / ☐ checkboxes |
code | Fenced code block with language tag |
quote / callout | > blockquote |
divider | --- horizontal rule |
table | Pipe-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:
| Field | Description |
|---|---|
parent_type | The type of the item's parent: workspace, page_id, or database_id. |
parent_id | The ID of the parent object. |
archived | Whether the Notion page is archived. |
properties | Simplified page/database properties (for databases). |
url | Direct 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.