ax-check.com
by Gauge
N
Notion
notion.com
ax-check.com
Checked 11 November 2026
B
66/100
Agents need your login
Notion's pricing is clear, but agent-facing docs are barely there.
Pricing and plan limits are stated plainly on static pages. But 13 of 23 checklist items are unassessed—no quickstart, API reference, or code examples were fetched.
3 fixes to start with
Concrete changes, backed by what we found.
Publish a text or Markdown version of the quickstart.
Homepage returns HTML for Markdown requests; no compact Markdown guide representation is served.
Recorded coding sessions
Same task, 3 models, no notion.com account. Recorded 11 November 2026 on Pi.
3 recorded · 42s
42s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user is asking me to build a simple example using Notion via its API/SDK, explain how the pricing structure works, and evaluate whether this is manageable. I should check if an API key (NOTION_API_KEY or NOTION_TOKEN) exists in the environment. If there are no credentials, I should communicate that clearly and stop.
Let me check the environment and the repository.
env | grep -i -E 'notion|token|key' | sed 's/=.*/=<set>/' ; echo "---"; ls -la /sandbox/repo
PI_GATEWAY_API_KEY=<set>
PI_GATEWAY_API_KEY=<set> GIT_CONFIG_KEY_0=<set> --- total 16 drwxr-xr-x 3 root root 4096 Sep 18 08:00 . drwxr-xr-x 7 root root 4096 Nov 11 07:35 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-11-11T07:35:59.918Z",
"name": "bash",
"turn": 1,
"input": {
"command": "env | grep -i -E 'notion|token|key' | sed 's/=.*/=<set>/' ; echo \"---\"; ls -la /sandbox/repo"
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-bfa58f1fddc8006c",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 4,
"ts": "2026-11-11T07:35:59.918Z",
"turn": 1,
"output": {
"content": [
{
"text": "PI_GATEWAY_API_KEY=<set>\nGIT_CONFIG_KEY_0=<set>\n---\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Nov 11 07:35 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n",
"type": "text"
}
]
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-bfa58f1fddc8006c",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
There are no Notion credentials. I can check whether the network is available, but without an API key I can't access Notion's API. I should communicate this clearly and stop—well, I can explain the pricing and feasibility, but I'll say that a build example that calls the API would be blocked by missing credentials. Even so, can I scaffold code? The instructions say "let me know if you get blocked. If this product doesn't have an actionable developer workflow, say that clearly and stop." Notion has a developer workflow (the API), but without an API key I can't take action. I can write sample code that runs if a key is provided. But "take action"—live testing requires credentials. Let me first quickly check network connectivity.
curl -s -o /dev/null -w '%{http_code}' --max-time 8 https://api.notion.com/v1/users?page_size=1 ; echo; node -v 2>/dev/null; npm -v 2>/dev/null401
401 v22.23.4 10.9.8
Recorded tool call
{
"type": "tool_call",
"seq": 7,
"ts": "2026-11-11T07:36:03.097Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s -o /dev/null -w '%{http_code}' --max-time 8 https://api.notion.com/v1/users?page_size=1 ; echo; node -v 2>/dev/null; npm -v 2>/dev/null"
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-b02f39864e7ff1e7",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 9,
"ts": "2026-11-11T07:36:03.710Z",
"turn": 1,
"output": {
"content": [
{
"text": "401\nv22.23.4\n10.9.8\n",
"type": "text"
}
]
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-b02f39864e7ff1e7",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The network is working, and Notion API is reachable (401 = no auth, as expected). However, no Notion API key is set in the environment. Without credentials I can't make actual calls. I should scaffold a small sample project (using @notionhq/client) and explain clearly: it will be blocked without NOTION_API_KEY. Should I stop? The user said "tell me if you get blocked". Since I can't perform a live action against their workspace, I'm blocked in the credential sense. I could write a sample script and have it ready so it can be executed once a key is provided — that's lightweight, not a local stack. I think the best approach is: write a minimal example, explain the pricing, assess manageability, and tell them it's blocked on API key.
Actually, should I write code without credentials? The user asked "build a simple example". Creating a script is fine; execution is blocked. Let me do the minimum: npm init, install @notionhq/client, write an example script. Installing the package is quick. Then run it to show the blocked state (it should fail with 401). That's fine, will be done quickly.
The Notion API is reachable (401 = authentication required), but no Notion credentials are set (NOTION_API_KEY is missing). So live calls will be blocked, but I can scaffold the full sample so it can be run immediately once you add a key. I'll go ahead and do that.
cd /sandbox/repo && npm init -y >/dev/null 2>&1 && npm install @notionhq/client --silent 2>&1 | tail -2
(no output)
(no output)
Recorded tool call
{
"type": "tool_call",
"seq": 12,
"ts": "2026-11-11T07:36:07.401Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npm init -y >/dev/null 2>&1 && npm install @notionhq/client --silent 2>&1 | tail -2"
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-a8e33e2a01a9bc27",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-11-11T07:36:09.867Z",
"turn": 1,
"output": {
"content": [
{
"text": "(no output)",
"type": "text"
}
]
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-a8e33e2a01a9bc27",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Installation complete. Writing the sample script.
File edits
1 file
Writtennotion-example.jsView changes
/sandbox/repo/notion-example.js
Written content · previous contents were not recorded
// Simple Notion API example using the official SDK.//// Prerequisites:// 1. Create an integration at https://www.notion.so/my-integrations// 2. Set the secret: export NOTION_API_KEY="ntn_..."// 3. Share a database/page with the integration (⋯ menu → Connections → your integration)//// Run: node notion-example.js [database_id]// - With a database ID: lists its pages.// - Without one: searches everything the integration can see.const { Client } = require("@notionhq/client");const notion = new Client({ auth: process.env.NOTION_API_KEY });function textOf(page) {const t = page.properties?.title?.title || page.properties?.Name?.title || [];return t.map((x) => x.plain_text).join("") || "(untitled)";}async function main() {if (!process.env.NOTION_API_KEY) {console.error("Missing NOTION_API_KEY. Create an integration token and export it first.");process.exit(1);}const databaseId = process.argv[2];if (databaseId) {// 1. Read the database schema, 2. list its pagesconst db = await notion.databases.retrieve({ database_id: databaseId });console.log(`Database: ${db.title.map((x) => x.plain_text).join("")}`);console.log(`Properties: ${Object.keys(db.properties).join(", ")}\n`);const pages = await notion.databases.query({database_id: databaseId,page_size: 10,});for (const page of pages.results) {console.log(`- ${textOf(page)} (${page.id})`);}} else {// Search everything visible to the integrationconst results = await notion.search({ page_size: 10 });console.log(`Found ${results.results.length} items:\n`);for (const item of results.results) {console.log(`- [${item.object}] ${textOf(item)} (${item.id})`);}console.log("\nTip: pass a database_id to list pages of a specific database.");}}main().catch((err) => {console.error(`Notion API error: ${err.code || err.status} — ${err.message}`);if (err.code === "unauthorized") {console.error("Fix: make sure the token is valid AND the target page/database is shared with the integration.");}process.exit(1);});
Source: write · chatcmpl-tool-89322bd1cc1beca6
Recorded tool call
{
"type": "tool_call",
"seq": 17,
"ts": "2026-11-11T07:36:16.023Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/notion-example.js",
"content": "// Simple Notion API example using the official SDK.\n//\n// Prerequisites:\n// 1. Create an integration at https://www.notion.so/my-integrations\n// 2. Set the secret: export NOTION_API_KEY=\"ntn_...\"\n// 3. Share a database/page with the integration (⋯ menu → Connections → your integration)\n//\n// Run: node notion-example.js [database_id]\n// - With a database ID: lists its pages.\n// - Without one: searches everything the integration can see.\n\nconst { Client } = require(\"@notionhq/client\");\n\nconst notion = new Client({ auth: process.env.NOTION_API_KEY });\n\nfunction textOf(page) {\n const t = page.properties?.title?.title || page.properties?.Name?.title || [];\n return t.map((x) => x.plain_text).join(\"\") || \"(untitled)\";\n}\n\nasync function main() {\n if (!process.env.NOTION_API_KEY) {\n console.error(\"Missing NOTION_API_KEY. Create an integration token and export it first.\");\n process.exit(1);\n }\n\n const databaseId = process.argv[2];\n\n if (databaseId) {\n // 1. Read the database schema, 2. list its pages\n const db = await notion.databases.retrieve({ database_id: databaseId });\n console.log(`Database: ${db.title.map((x) => x.plain_text).join(\"\")}`);\n console.log(`Properties: ${Object.keys(db.properties).join(\", \")}\\n`);\n\n const pages = await notion.databases.query({\n database_id: databaseId,\n page_size: 10,\n });\n for (const page of pages.results) {\n console.log(`- ${textOf(page)} (${page.id})`);\n }\n } else {\n // Search everything visible to the integration\n const results = await notion.search({ page_size: 10 });\n console.log(`Found ${results.results.length} items:\\n`);\n for (const item of results.results) {\n console.log(`- [${item.object}] ${textOf(item)} (${item.id})`);\n }\n console.log(\"\\nTip: pass a database_id to list pages of a specific database.\");\n }\n}\n\nmain().catch((err) => {\n console.error(`Notion API error: ${err.code || err.status} — ${err.message}`);\n if (err.code === \"unauthorized\") {\n console.error(\"Fix: make sure the token is valid AND the target page/database is shared with the integration.\");\n }\n process.exit(1);\n});\n"
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-89322bd1cc1beca6",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 18,
"ts": "2026-11-11T07:36:16.023Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2150 bytes to /sandbox/repo/notion-example.js",
"type": "text"
}
]
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-89322bd1cc1beca6",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
I might be able to verify that it works correctly without authentication credentials (displays a polite message). I'll run it briefly.
cd /sandbox/repo && node notion-example.js; echo "exit=$?"
Missing NOTION_API_KEY. Create an integration token and export it first.
Missing NOTION_API_KEY. Create an integration token and export it first. exit=1
Recorded tool call
{
"type": "tool_call",
"seq": 21,
"ts": "2026-11-11T07:36:17.576Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && node notion-example.js; echo \"exit=$?\""
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-ade445a8976b4a28",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 22,
"ts": "2026-11-11T07:36:17.576Z",
"turn": 1,
"output": {
"content": [
{
"text": "Missing NOTION_API_KEY. Create an integration token and export it first.\nexit=1\n",
"type": "text"
}
]
},
"run_id": "cmwbt1h8h039g0ju7gnylk7re",
"tool_id": "chatcmpl-tool-ade445a8976b4a28",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Complete. Next things to report: blocked because there's no API key; explanation of pricing; manageability assessment.
Done. Here's the summary:
What I built
/sandbox/repo/notion-example.js — a minimal example using the official @notionhq/client SDK (installed via npm). It:
- Searches everything visible to your integration, or
- Given a database ID, reads its schema and lists up to 10 pages
Verified it runs and fails cleanly with a helpful message when no token is set.
⚠️ Blocked
I cannot make live API calls — there's no NOTION_API_KEY in this environment, and I can't create one for you (that requires logging into your Notion account). To unblock:
- Create an integration at notion.so/my-integrations (30 seconds, gives you an
ntn_...token) export NOTION_API_KEY="ntn_..."- Share a page/database with the integration (⋯ → Connections)
node notion-example.js
No local stacks or long-running services needed — it's a single script hitting the hosted API.
How pricing works
- API access is free and included with every Notion plan (Free, Plus, Business, Enterprise). There's no separate API billing.
- Rate limits vary by plan (~3 requests/second average, burst to ~10 for paid plans) — plenty for most integrations.
- You pay only for Notion itself: Free plan (personal use, unlimited blocks), Plus ~$10–12/seat/mo, Business
$18–20/seat/mo. AI features cost extra ($8–10/seat/mo).
Will this be easy for me to manage?
Yes, with one caveat. The Notion API is well-suited for agent management: clean REST/SDK interface, stable versioning (Notion-Version header), predictable JSON, good error codes, and everything is done via short one-off HTTP calls — no servers to babysit. The caveat: integration permissions are workspace-scoped, so I can only touch pages explicitly shared with the integration, and I need you to supply/rotate the token. Once a token exists, this is very low-friction to maintain.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents