Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Notion API for creating and managing pages, databases, and blocks via curl. Search, create, update, and query Notion workspaces directly from the terminal.
.claude/skills/graniet-notion/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 190% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 193% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 170% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 58% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 95% | 0% |
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 => bashweb_extract => web_fetch, plus web_search when discovery is neededsearch_files => grep_search and glob_searchbrowser_* tools require a browser-capable surfaced tool or MCP; if none is available, use the closest available surface and say so explicitlyWhen the instructions mention local helper files, resolve them from ${KHEISH_SKILL_DIR}.
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.
ntn_ or secret_)~/.kheish/.env: NOTION_API_KEY=ntn_your_key_here
All requests use this pattern:
bashcurl -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.
bashcurl -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"}'
bashcurl -s "https://api.notion.com/v1/pages/{page_id}" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03"
bashcurl -s "https://api.notion.com/v1/blocks/{page_id}/children" \ -H "Authorization: Bearer $NOTION_API_KEY" \ -H "Notion-Version: 2025-09-03"
bashcurl -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"}} } }'
bashcurl -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"}] }'
bashcurl -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": {}} } }'
bashcurl -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"}}}}'
bashcurl -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!"}}]}} ] }'
Common property formats for database items:
{"title": [{"text": {"content": "..."}}]}{"rich_text": [{"text": {"content": "..."}}]}{"select": {"name": "Option"}}{"multi_select": [{"name": "A"}, {"name": "B"}]}{"date": {"start": "2026-01-15", "end": "2026-01-16"}}{"checkbox": true}{"number": 42}{"url": "https://..."}{"email": "user@example.com"}{"relation": [{"id": "page_id"}]}/data_sources/ endpoints for queries and retrievaldatabase_id and a data_source_iddatabase_id when creating pages (parent: {"database_id": "..."})data_source_id when querying (POST /v1/data_sources/{id}/query)"object": "data_source" with their data_source_idis_inline: true when creating data sources to embed them in pages-s flag to curl to suppress progress bars (cleaner output for Kheish)jq for readable JSON: ... | jq '.results[0].properties'| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | pass→pass | 8,633 | 4,699 | -46% | 1 | 1 | 0% | 1,671 | 2,639 | +58% | 0 | 0 | — |
case-06 | pass→pass | 8,006 | 5,833 | -27% | 1 | 1 | 0% | 1,388 | 2,709 | +95% | 0 | 0 | — |
case-01 | fail→fail | 9,743 | 21,541 | +121% | 1 | 1 | 0% | 2,072 | 2,512 | +21% | 0 | 0 | — |
case-02 | fail→fail | 13,367 | 7,048 | -47% | 1 | 1 | 0% | 2,792 | 2,389 | -14% | 0 | 0 | — |
case-03 | fail→fail | 2,758 | 7,904 | +187% | 1 | 1 | 0% | 379 | 2,457 | +548% | 0 | 0 | — |
case-04 | pass→pass | 7,011 | 4,297 | -39% | 1 | 1 | 0% | 1,250 | 2,698 | +116% | 0 | 0 | — |
case-07 | pass→pass | 6,468 | 2,911 | -55% | 1 | 1 | 0% | 1,319 | 2,509 | +90% | 0 | 0 | — |
case-08 | pass→pass | 3,766 | 2,318 | -38% | 1 | 1 | 0% | 744 | 2,292 | +208% | 0 | 0 | — |
case-09 | pass→pass | 4,164 | 2,089 | -50% | 1 | 1 | 0% | 810 | 2,309 | +185% | 0 | 0 | — |
case-10 | fail→pass | 4,091 | 3,481 | -15% | 1 | 1 | 0% | 909 | 2,640 | +190% | 0 | 0 | — |
case-11 | fail→pass | 3,772 | 2,775 | -26% | 1 | 1 | 0% | 821 | 2,404 | +193% | 0 | 0 | — |
case-12 | pass→pass | 3,420 | 3,403 | -0% | 1 | 1 | 0% | 726 | 2,634 | +263% | 0 | 0 | — |
case-13 | pass→pass | 4,038 | 3,513 | -13% | 1 | 1 | 0% | 817 | 2,624 | +221% | 0 | 0 | — |
case-14 | pass→pass | 7,182 | 2,201 | -69% | 1 | 1 | 0% | 1,405 | 2,329 | +66% | 0 | 0 | — |
case-15 | fail→pass | 4,540 | 2,157 | -52% | 1 | 1 | 0% | 838 | 2,263 | +170% | 0 | 0 | — |
case-16 | pass→pass | 3,364 | 2,410 | -28% | 1 | 1 | 0% | 619 | 2,223 | +259% | 0 | 0 | — |
case-17 | pass→pass | 4,804 | 1,683 | -65% | 1 | 1 | 0% | 1,002 | 2,181 | +118% | 0 | 0 | — |
case-18 | pass→pass | 2,868 | 1,980 | -31% | 1 | 1 | 0% | 537 | 2,220 | +313% | 0 | 0 | — |
case-19 | pass→pass | 4,783 | 1,686 | -65% | 1 | 1 | 0% | 889 | 2,190 | +146% | 0 | 0 | — |
case-20 | pass→pass | 3,834 | 1,713 | -55% | 1 | 1 | 0% | 734 | 2,210 | +201% | 0 | 0 | — |
case-21 | pass→pass | 3,742 | 2,760 | -26% | 1 | 1 | 0% | 754 | 2,542 | +237% | 0 | 0 | — |
case-22 | pass→pass | 7,503 | 2,247 | -70% | 1 | 1 | 0% | 1,349 | 2,227 | +65% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +14 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.