Operate Notion Public API through UXC with a curated OpenAPI schema for search, block traversal, page reads, content writes, and data source/database inspection. Use when tasks need recursive reads or structured writes that Notion MCP does not expose directly.
Use this skill to run Notion Public API operations through uxc + OpenAPI.
Reuse the uxc skill for shared execution, OAuth, and error-handling guidance.
uxc is installed and available in PATH.https://api.notion.com/v1.https://raw.githubusercontent.com/holon-run/uxc/main/skills/notion-openapi-skill/references/notion-public.openapi.jsonThis skill covers a read-first Notion REST surface focused on traversal plus common content writes:
in_trashThis skill does not cover:
https://api.notion.com/v1Notion-Version: 2026-03-11The schema is intentionally curated around traversal and schema discovery. It is not a full dump of the Notion API.
Notion Public API requires:
Authorization: Bearer <token>Notion-Version: 2026-03-11If you already have an internal integration token:
uxc auth credential set notion-openapi \
--auth-type api_key \
--header "Authorization=Bearer {{secret}}" \
--header "Notion-Version=2026-03-11" \
--secret-env NOTION_API_TOKEN
uxc auth binding add \
--id notion-openapi \
--host api.notion.com \
--path-prefix /v1 \
--scheme https \
--credential notion-openapi \
--priority 100
How to get the internal integration token:
Share or Connections.NOTION_API_TOKEN or pass it directly to uxc auth credential set.Without connecting the integration to the target content, REST calls may authenticate successfully but still fail with access errors or return incomplete search results.
If you want OAuth-managed tokens for the REST host:
uxc auth oauth start notion-openapi \
--endpoint https://api.notion.com/v1 \
--redirect-uri http://127.0.0.1:8788/callback \
--client-id <client_id> \
--scope read
uxc auth oauth complete notion-openapi \
--session-id <session_id> \
--authorization-response 'http://127.0.0.1:8788/callback?code=...'
uxc auth credential set notion-openapi \
--auth-type oauth \
--header "Authorization=Bearer {{secret}}" \
--header "Notion-Version=2026-03-11"
uxc auth binding add \
--id notion-openapi \
--host api.notion.com \
--path-prefix /v1 \
--scheme https \
--credential notion-openapi \
--priority 100
notion-mcpThis is technically possible in uxc if the existing credential already has a valid Notion OAuth access token.
Important:
Authorization=Bearer {{secret}} explicitlyNotion-Version=2026-03-11 on the shared credential means the same header will also be sent to mcp.notion.com/mcpShared-credential setup:
uxc auth credential set notion-mcp \
--auth-type oauth \
--header "Authorization=Bearer {{secret}}" \
--header "Notion-Version=2026-03-11"
uxc auth binding add \
--id notion-openapi-shared \
--host api.notion.com \
--path-prefix /v1 \
--scheme https \
--credential notion-mcp \
--priority 100
Validate the effective mapping when auth looks wrong:
uxc auth binding match https://api.notion.com/v1
Use the fixed link command by default:
command -v notion-openapi-cliuxc link notion-openapi-cli https://api.notion.com/v1 --schema-url https://raw.githubusercontent.com/holon-run/uxc/main/skills/notion-openapi-skill/references/notion-public.openapi.jsonnotion-openapi-cli -hInspect operation schema first:
notion-openapi-cli post:/search -hnotion-openapi-cli get:/blocks/{block_id}/children -hnotion-openapi-cli post:/pages -hnotion-openapi-cli patch:/blocks/{block_id}/children -hnotion-openapi-cli post:/data_sources/{data_source_id}/query -hPrefer read validation before broader traversal:
notion-openapi-cli get:/users/menotion-openapi-cli post:/search '{"query":"Roadmap","filter":{"property":"object","value":"page"},"page_size":10}'notion-openapi-cli get:/blocks/{block_id}/children block_id=<uuid> page_size=100Traverse recursively outside the API call boundary:
get:/blocks/{block_id}/children page by pagehas_children=true, call get:/blocks/{block_id}/children again on that child IDUse data source or legacy database reads to discover schema before property-sensitive queries:
notion-openapi-cli get:/data_sources/{data_source_id} data_source_id=<uuid>notion-openapi-cli post:/data_sources/{data_source_id}/query data_source_id=<uuid> '{"page_size":25}'notion-openapi-cli get:/databases/{database_id} database_id=<uuid>Execute writes only after explicit user confirmation:
notion-openapi-cli post:/pages '{...}'notion-openapi-cli patch:/blocks/{block_id}/children '{...}'notion-openapi-cli patch:/pages/{page_id} '{...}'notion-openapi-cli delete:/blocks/{block_id} block_id=<uuid>get:/users/mepost:/searchget:/pages/{page_id}get:/pages/{page_id}/properties/{property_id}get:/blocks/{block_id}get:/blocks/{block_id}/childrenpost:/pagespatch:/pages/{page_id}patch:/blocks/{block_id}/childrenpatch:/blocks/{block_id}delete:/blocks/{block_id}get:/data_sources/{data_source_id}post:/data_sources/{data_source_id}/queryget:/databases/{database_id}post:/databases/{database_id}/query--text.ok, kind, protocol, data, error.Notion-Version at the credential/header layer instead of requiring it as an operation argument. Keep the credential header on 2026-03-11 unless you intentionally migrate the whole skill surface.post:/pages, patch:/pages/{page_id}, patch:/blocks/{block_id}/children, patch:/blocks/{block_id}, or delete:/blocks/{block_id}.2026-03-11, archived has been replaced by in_trash for request and response semantics. Prefer in_trash in update payloads.patch:/blocks/{block_id}/children supports up to 100 new children in one request and up to two levels of nested blocks in a single payload.patch:/blocks/{block_id} updates block content, but it does not update child lists. Use patch:/blocks/{block_id}/children to append nested content.data_sources endpoints over legacy databases endpoints for new workflows. Keep legacy database reads only for compatibility with older shared links and IDs.get:/blocks/{block_id}/children returns only one nesting level at a time. Recursive traversal must be performed by repeated calls.page_size; always check has_more and next_cursor.notion-openapi-cli <operation> ... is equivalent to uxc https://api.notion.com/v1 --schema-url <notion_openapi_schema> <operation> ....references/usage-patterns.mdreferences/notion-public.openapi.json