Notion
The Notion pages and databases your client chooses to share.
- Website
- notion.com
- Connects by
- Signing in with Notion
- Category
- Files and docs
- Services
- 1
- Tools
- 64
| Service | Key | Base URL |
|---|---|---|
| Notion | notion | https://api.notion.com/v1 |
Connecting
Your client presses Connect, picks a workspace if they're in more than one, then selects the pages and databases to share in Notion's page picker.
curl https://api.operate.as/v1/me/clients \ -H "Authorization: Bearer $OPERATE_AS_API_KEY"[ { "id": "6f1c2a7e-...", "name": "Miller Dental", "services": [ "notion" ] }]Good to know
Only the pages your client shares
The connection sees and edits the pages and databases your client picked, and the pages inside them. Everything else is out of reach, and Notion answers as if it doesn't exist. If a call can't find a page, the most likely reason is that it wasn't shared.
Sharing more later
Your client connects again from their link and picks more pages, or adds the connection from the page itself in Notion.
The version header is added for you
Notion requires a Notion-Version header on every request. Operate As adds Notion-Version: 2022-06-28 to every call, so you don't send it.
Permissions
| What the client reads | Permission it asks for |
|---|---|
| See and edit only the pages you choose on Notion's screen | Chosen on the provider's screen |
Tools
Install Notion's typed package for your language:
pip install operate-as-notionnotion.searchcurl -X POST https://api.operate.as/v1/actions/notion.search \ -H "Authorization: Bearer $OPERATE_AS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "clientId": "6f1c2a7e-...", "input": {} }'| Input | Type | What it is |
|---|---|---|
query | string | Words in the title |
{ "status": 200, "data": { "…": "the service's own response" }, "encoding": "json"}Pass-through
Paths continue from https://api.notion.com/v1.
See Pass-through requests for the full request and response format.
POST /v1/clients/{clientId}/notion/search
Authorization: Bearer oa_...
Content-Type: application/json
{ "query": "Content calendar" }When access ends
| How long access lasts | Set by Notion. If Notion handed over a renewal key, Operate As renews and checks the connection daily. |
| Renewal | With a renewal key, the daily check finds ended access. Without one, your next call returns Notion's 401. |
| What ends it | Your client disconnects the app in Notion's settings, under connections. |
| When it's removed | Notion has no way for an app to cancel its own access, so we delete our copy. Your client disconnects it in Notion's settings. |
See Keeping access alive and Removing access.
HTTP/1.1 409 ConflictContent-Type: application/json{ "detail": "Miller Dental's Notion access ended. Send them their link to reconnect."}{ "id": "evt_3f9a1c…", "type": "connection.expired", "createdAt": "2026-10-16T08:00:00+00:00", "data": { "clientId": "6f1c2a7e-...", "clientName": "Miller Dental", "provider": "notion", "services": [ "notion" ], "reconnectUrl": "https://…" }}