Skip to main content
Notion API + ntn CLI: pages, databases, markdown, Workers.

Skill metadata

Reference: full SKILL.md

The following is the complete skill definition that Mibyan loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.

Notion

Talk to Notion two ways. Same integration token works for both — pick by what’s available. ◆ ntn CLI — Notion’s official CLI. Shorter syntax, one-line file uploads, required for Workers. macOS + Linux only as of May 2026 (Windows support “coming soon”). Default when installed. ◆ HTTP + curl — works everywhere including Windows. Default fallback when ntn isn’t installed.

Setup

1. Get an integration token (required for both paths)

  1. Create an integration at https://notion.so/my-integrations
  2. Copy the API key (starts with ntn_ or secret_)
  3. Store in ${mibyan_HOME:-~/.mibyan}/.env:
  4. Share target pages/databases with the integration in Notion: page menu ... → Connect to → your integration name. Without this, the API returns 404 for that page even though it exists.

2. Install ntn (preferred path on macOS / Linux)

Skip ntn login — use the integration token instead. This works headlessly, no browser needed:
Add those exports to your shell profile (or to ${mibyan_HOME:-~/.mibyan}/.env) so every session inherits them.

3. Choose path at runtime

Windows users: skip step 2 entirely until native ntn ships — Path B works fine. If you want CLI ergonomics now, install ntn inside WSL2.

API Basics

Notion-Version: 2025-09-03 is required on all HTTP requests. ntn handles this for you. In this version, what users call “databases” are called data sources in the API.

Path A — ntn CLI (preferred, macOS / Linux)

Raw API calls (shorthand for curl)

Syntax notes:
  • key=value — string fields
  • key[nested]=value — nested object fields
  • key:=value — typed assignment (booleans, numbers, null, arrays)

Read page metadata

Read page as Markdown (agent-friendly)

Read page content as blocks

Create page from Markdown

Patch a page with Markdown

Query a database (data source)

For complex queries with sorts, multiple filter clauses, or compound logic, pipe JSON in:

File uploads (one-liner — biggest CLI win)

Compare to the 3-step HTTP flow (create upload → PUT bytes → reference).

Useful env vars

Path B — HTTP + curl (cross-platform, default on Windows)

All requests share this pattern:
On Windows the curl shipped with Windows 10+ works as-is. PowerShell users can also use Invoke-RestMethod.

Search

Read page metadata

Read page as Markdown (agent-friendly)

Easier to feed to a model than block JSON.

Read page content as blocks (when you need structure)

Create page from Markdown

POST /v1/pages accepts a markdown body param.

Patch a page with Markdown

Create page in a database (typed properties)

Query a database (data source)

Create a database

Update page properties

Append blocks to a page

File uploads (3-step flow)

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"}]}

API Version 2025-09-03 — Databases vs Data Sources

  • Databases became data sources. Use /data_sources/ endpoints for queries and retrieval.
  • Two IDs per database: database_id and data_source_id.
    • database_id when creating pages: parent: {"database_id": "..."}
    • data_source_id when querying: POST /v1/data_sources/{id}/query
  • Search returns databases as "object": "data_source" with the data_source_id field.

Notion Workers (advanced, requires ntn)

Workers are TypeScript programs Notion hosts for you. One worker can expose any combination of:
  • Syncs — pull data from external APIs into a Notion database on a schedule (default 30 min).
  • Tools — appear as callable tools inside Notion’s Custom Agents.
  • Webhooks — receive HTTP events from external services (GitHub, Stripe, etc.) and act in Notion.
Plan / platform gating:
  • CLI works on all plans. Deploying Workers requires Business or Enterprise.
  • ntn is macOS/Linux only as of May 2026. Windows users need WSL2 or to wait for native support.
  • Free through August 11, 2026; metered on Notion credits after.

Minimal Worker

src/index.ts:

Webhook capability

After deploy: ntn workers webhooks list shows the URL Notion generates. Treat that URL as a secret — anyone with it can POST events unless you add signature verification.

Worker lifecycle commands

When asked to build a Worker, scaffold with ntn workers new, write the code in src/index.ts, set any secrets with ntn workers env set, and deploy. Notion’s docs at https://developers.notion.com/workers cover the full API surface.

Notion-Flavored Markdown (used by /markdown endpoints)

Standard CommonMark plus XML-like tags for Notion-specific blocks. Use tabs for indentation. Blocks beyond CommonMark:
Inline:
  • Mentions: <mention-user url="..."/>, <mention-page url="...">Title</mention-page>, <mention-date start="2026-05-15"/>
  • Underline: <span underline="true">text</span>
  • Color: <span color="blue">text</span> or block-level {color="blue"} on the first line
  • Math: inline $x^2$, block $$ ... $$
  • Citations: [^https://example.com]
Colors: gray brown orange yellow green blue purple pink red, plus *_bg variants for backgrounds. Headings 5/6 collapse to H4. Multiple > lines render as separate quote blocks — use <br> inside a single > for multi-line quotes.

Choosing the Right Path

Notes

  • Page/database IDs are UUIDs (with or without dashes — both accepted).
  • Rate limit: ~3 requests/second average. The CLI doesn’t bypass this.
  • The API cannot set database view filters — that’s UI-only.
  • Use "is_inline": true when creating data sources to embed them in a page.
  • Always pass -s to curl to suppress progress bars (cleaner agent output).
  • Pipe JSON through jq when reading: ... | jq '.results[0].properties'.
  • Notion also ships an MCP server now (Notion MCP, ~91% more token-efficient on DB ops than the previous version) — wire it via Mibyan’ MCP support if you want streaming Notion access from inside a session, but the paths above are enough for most one-shot tasks.