5.7 KiB
Notion Sync API Reference
Detailed technical reference for all Notion sync scripts and utilities.
Environment Setup
Required Environment Variable
export NOTION_API_KEY="secret_..."
Keychain Storage (macOS)
# Store in keychain
security add-generic-password -a "$USER" -s "openclaw.notion_api_key" -w
# Load from keychain
export NOTION_API_KEY="$(security find-generic-password -a "$USER" -s "openclaw.notion_api_key" -w)"
Scripts Reference
search-notion.js
Search pages and databases by title or content.
Signature:
node scripts/search-notion.js "<query>" [--filter page|database] [--limit 10]
Options:
query(required): Search term--filter: Restrict topageordatabase--limit: Max results (default: 10)
Returns: JSON array of matching pages/databases with id, title, url, lastEdited
query-database.js
Query database contents with advanced filters and sorting.
Signature:
node scripts/query-database.js <database-id> [--filter <json>] [--sort <json>] [--limit 10]
Filter Patterns:
| Type | Example |
|---|---|
| Select equals | {"property": "Status", "select": {"equals": "Done"}} |
| Multi-select contains | {"property": "Tags", "multi_select": {"contains": "AI"}} |
| Date after | {"property": "Date", "date": {"after": "2024-01-01"}} |
| Checkbox | {"property": "Published", "checkbox": {"equals": true}} |
| Number | {"property": "Count", "number": {"greater_than": 100}} |
Sort Format:
[{"property": "Date", "direction": "descending"}]
update-page-properties.js
Update database page properties.
Signature:
node scripts/update-page-properties.js <page-id> <property-name> <value> [--type <type>]
Property Types:
select: Single selection (e.g., Status)multi_select: Multiple tags (comma-separated)checkbox: Boolean (true/false)number: Numeric valueurl: URL stringemail: Email addressdate: ISO date (YYYY-MM-DD)rich_text: Plain text
md-to-notion.js
Convert markdown to Notion page.
Signature:
node scripts/md-to-notion.js "<markdown-file>" "<parent-page-id>" "<title>"
Supported Markdown:
- Headings:
#,##,### - Bold:
**text** - Italic:
*text* - Links:
[text](url) - Lists:
- item - Code:
```lang ... ``` - Dividers:
---
Output: Notion page URL and ID
Rate Limiting: 350ms between batch uploads (100 blocks per batch)
notion-to-md.js
Convert Notion page to markdown.
Signature:
node scripts/notion-to-md.js <page-id> [output-file]
Output: Writes markdown to file or stdout
watch-notion.js
Monitor page for changes.
Signature:
node scripts/watch-notion.js
State File: memory/notion-watch-state.json
State Schema:
{
"pages": {
"<page-id>": {
"lastEditedTime": "ISO timestamp",
"lastChecked": "ISO timestamp",
"title": "Page Title"
}
}
}
Returns: JSON with hasChanges, localDiffers, actions
get-database-schema.js
Inspect database structure.
Signature:
node scripts/get-database-schema.js <database-id>
Returns: JSON with database properties and their types
delete-notion-page.js
Archive page (soft delete).
Signature:
node scripts/delete-notion-page.js <page-id>
Note: Sets archived: true, doesn't permanently delete
Notion API Utilities
notion-utils.js
Shared utilities for all scripts.
Exports:
notionRequest(path, method, body)
Makes authenticated API requests to Notion.
Parameters:
path: API endpoint (e.g.,/v1/pages)method: HTTP method (GET, POST, PATCH, DELETE)body: Optional request body (object)
Returns: Promise resolving to response JSON
Error Handling: Throws with detailed Notion API error messages
formatProperty(type, value)
Formats property values for Notion API.
Supported Types:
- select, multi_select, checkbox, number, url, email, date, rich_text
Returns: Notion API property object
extractPageId(input)
Extracts clean page ID from URL or ID string.
Input Formats:
- URL:
https://notion.so/Title-abc123... - With hyphens:
abc123-example-page-id-456def - Without hyphens:
abc123examplepageid456def
Returns: 32-char UUID with hyphens
Rate Limits
Notion API limits:
- ~3 requests/second
- Scripts implement 350ms delays between batches
- Large operations (>100 blocks) auto-batch with delays
Common Issues
Authentication Errors
Error: "Could not find page"
Solutions:
- Verify page/database is shared with your integration
- Check page ID format (32 chars, no extra characters)
- Confirm
NOTION_API_KEYis set and valid
Property Update Failures
Issue: Property updates don't persist
Cause: Database is inline (embedded in a page) rather than standalone
Solution: Create standalone database or update properties manually in Notion UI
Module Not Found
Error: Cannot find module 'https'
Solution: Ensure using Node.js v18+ (built-in modules)
Page ID Extraction
From Notion URL:
https://notion.so/Page-Title-abc123-example-page-id-456def
└─────────── Extract this part ──────────┘
Both formats work:
- With hyphens:
abc123-example-page-id-456def - Without hyphens:
abc123examplepageid456def
Integration Permissions
Required Notion integration capabilities:
- ✓ Read content
- ✓ Update content
- ✓ Insert content
- ✓ Read comments (optional)
Share settings:
- Must explicitly share each page/database with the integration
- Child pages inherit parent permissions
- Databases require explicit sharing even if parent is shared