Back to workflow skills
Efficiency toolsNotion notesPW
AuthorOpenClaw
Efficiency tools Skill

Notion notes

The Notion API is used to create and manage pages, databases, and content blocks.

61KUses36Likes45Views

What this skill does

# notion Use the Notion API to create/read/update pages, data sources (databases), and blocks. ## Setup 1. Create an integration at https://notion.so/my-integrations 2. Copy the API key (starts with `ntn_` or `secret_`) 3. Store it: ```bash mkdir -p ~/.config/notion echo "ntn_your_key_here" > ~/.config/notion/api_key ``` 4. Share target pages/databases with your integration (click "..." → "Connect to" → your integration name) ## API Basics All requests need: ```bash NOTION_KEY=$(cat ~/.config/notion/api_key) curl -X GET "https://api.notion.com/v1/..." \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" ``` > **Note:** The `Notion-Version` header is required. This skill uses `2025-09-03` (latest). In this version, databases are called "data sources" in the API. ## Common Operations **Search for pages and data sources:** ```bash curl -X POST "https://api.notion.com/v1/search" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{"query": "page title"}' ``` **Get page:** ```bash curl "https://api.notion.com/v1/pages/{page_id}" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" ``` **Get page content (blocks):** ```bash curl "https://api.notion.com/v1/blocks/{page_id}/children" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" ``` **Create page in a data source:** ```bash curl -X POST "https://api.notion.com/v1/pages" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{ "parent": {"database_id": "xxx"}, "properties": { "Name": {"title": [{"text": {"content": "New Item"}}]}, "Status": {"select": {"name": "Todo"}} } }' ``` **Query a data source (database):** ```bash curl -X POST "https://api.notion.com/v1/data_sources/{data_source_id}/query" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{ "filter": {"property": "Status", "select": {"equals": "Active"}}, "sorts": [{"property": "Date", "direction": "descending"}] }' ``` **Create a data source (database):** ```bash curl -X POST "https://api.notion.com/v1/data_sources" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{ "parent": {"page_id": "xxx"}, "title": [{"text": {"content": "My Database"}}], "properties": { "Name": {"title": {}}, "Status": {"select": {"options": [{"name": "Todo"}, {"name": "Done"}]}}, "Date": {"date": {}} } }' ``` **Update page properties:** ```bash curl -X PATCH "https://api.notion.com/v1/pages/{page_id}" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{"properties": {"Status": {"select": {"name": "Done"}}}}' ``` **Add blocks to page:** ```bash curl -X PATCH "https://api.notion.com/v1/blocks/{page_id}/children" \ -H "Authorization: Bearer $NOTION_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{ "children": [ {"object": "block", "type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "Hello"}}]}} ] }' ``` ## Property Types Common property formats for database items: - **Title:** `{"title": [{"text": {"content": "..."}}]}` - **Rich text:** `{"rich_text": [{"text": {"content": "..."}}]}` - **Select:** `{"select": {"name": "Option"}}` - **Multi-select:** `{"multi_select": [{"name": "A"}, {"name": "B"}]}` - **Date:** `{"date": {"start": "2024-01-15", "end": "2024-01-16"}}` - **Checkbox:** `{"checkbox": true}` - **Number:** `{"number": 42}` - **URL:** `{"url": "https://..."}` - **Email:** `{"email": "a@b.com"}` - **Relation:** `{"relation": [{"id": "page_id"}]}` ## Key Differences in 2025-09-03 - **Databases → Data Sources:** Use `/data_sources/` endpoints for queries and retrieval - **Two IDs:** Each database now has both a `database_id` and a `data_source_id` - Use `database_id` when creating pages (`parent: {"database_id": "..."}`) - Use `data_source_id` when querying (`POST /v1/data_sources/{id}/query`) - **Search results:** Databases return as `"object": "data_source"` with their `data_source_id` - **Parent in responses:** Pages show `parent.data_source_id` alongside `parent.database_id` - **Finding the data_source_id:** Search for the database, or call `GET /v1/data_sources/{data_source_id}` ## Notes - Page/database IDs are UUIDs (with or without dashes) - The API cannot set database view filters — that's UI-only - Rate limit: ~3 requests/second average, with `429 rate_limited` responses using `Retry-After` - Append block children: up to 100 children per request, up to two levels of nesting in a single append request - Payload size limits: up to 1000 block elements and 500KB overall - Use `is_inline: true` when creating data sources to embed them in pages

  • Clarifies goals, inputs, and success criteria
  • Preserves evidence and marks uncertain boundaries
  • Produces structured, editable results
Installationnpx clawhub@latest install notionView source