--- id: graniet/kheish/notion version: "752ef515" license: Apache-2.0 install: manual updated: 2026-07-26 --- # Notion — Control Notion directly from your terminal using curl and the Notion API. Create pages and databases, query data sources with filters and sorts, update properties, and add content to blocks—all without leaving the command line. Publisher: graniet · Stars: 264 · Updated: 2026-07-26 Install (manual): `git clone https://github.com/graniet/kheish` ## SKILL.md ## Kheish Compatibility This skill is repo-local and stays inactive until explicitly activated. When the original instructions refer to legacy tool names, use these Kheish mappings: - `terminal` => `bash` - `web_extract` => `web_fetch`, plus `web_search` when discovery is needed - `search_files` => `grep_search` and `glob_search` - `browser_*` tools require a browser-capable surfaced tool or MCP; if none is available, use the closest available surface and say so explicitly When the instructions mention local helper files, resolve them from `${KHEISH_SKILL_DIR}`. # Notion API Use the Notion API via curl to create, read, update pages, databases (data sources), and blocks. No extra tools needed — just curl and a Notion API key. ## Prerequisites 1. Create an integration at https://notion.so/my-integrations 2. Copy the API key (starts with `ntn_` or `secret_`) 3. Store it in `~/.kheish/.env`: ``` NOTION_API_KEY=ntn_your_key_here ``` 4. **Important:** Share target pages/databases with your integration in Notion (click "..." → "Connect to" → your integration name) ## API Basics All requests use this pattern: ```bash curl -s -X GET "https://api.notion.com/v1/..." \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" ``` 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 ```bash curl -s -X POST "https://api.notion.com/v1/search" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{"query": "page title"}' ``` ### Get Page ```bash curl -s "https://api.notion.com/v1/pages/{page_id}" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" ``` ### Get Page Content (blocks) ```bash curl -s "https://api.notion.com/v1/blocks/{page_id}/children" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" ``` ### Create Page in a Database ```bash curl -s -X POST "https://api.notion.com/v1/pages" \ -H "Authorization: Bearer $NOTION_API_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 Database ```bash curl -s -X POST "https://api.notion.com/v1/data_sources/{data_source_id}/query" \ -H "Authorization: Bearer $NOTION_API_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 Database ```bash curl -s -X POST "https://api.notion.com/v1/data_sources" \ -H "Authorization: Bearer $NOTION_API_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 -s -X PATCH "https://api.notion.com/v1/pages/{page_id}" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{"properties": {"Status": {"select": {"name": "Done"}}}}' ``` ### Add Content to a Page ```bash curl -s -X PATCH "https://api.notion.com/v1/blocks/{page_id}/children" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03" \ -H "Content-Type: application/json" \ -d '{ "children": [ {"object": "block", "type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "Hello from Kheish!"}}]}} ] }' ``` ## 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": "2026-01-15", "end": "2026-01-16"}}` - **Checkbox:** `{"checkbox": true}` - **Number:** `{"number": 42}` - **URL:** `{"url": "https://..."}` - **Email:** `{"email": "user@example.com"}` - **Relation:** `{"relation": [{"id": "page_id"}]}` ## Key Differences in API Version 2025-09-03 - **Databases → Data Sources:** Use `/data_sources/` endpoints for queries and retrieval - **Two IDs:** Each database 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` ## Notes - Page/database IDs are UUIDs (with or without dashes) - Rate limit: ~3 requests/second average - The API cannot set database view filters — that's UI-only - Use `is_inline: true` when creating data sources to embed them in pages - Add `-s` flag to curl to suppress progress bars (cleaner output for Kheish) - Pipe output through `jq` for readable JSON: `... | jq '.results[0].properties'` [View on SkillFed](https://skillfed.io/graniet/kheish/notion) · [View on GitHub](https://github.com/graniet/kheish)