> ## Documentation Index
> Fetch the complete documentation index at: https://learn.actionist.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Notion

> Create pages, query databases, and append blocks — turning every agent run into a structured, team-visible Notion record.

<div className="mxp-hero xc-border">
  <div className="exp-eyebrow mxp-rise">NOTION INTEGRATION</div>

  <h2 className="mxp-hero-title mxp-rise" style={{animationDelay:'0.06s'}}>
    Every agent run becomes a <span style={{background:'linear-gradient(90deg,#24A4FF,#9000FF,#E3008E)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent'}}>structured Notion record.</span>
  </h2>

  <p className="mxp-hero-dek mxp-rise" style={{animationDelay:'0.13s'}}>
    Agents stop producing ephemeral chat and start building a permanent, browsable knowledge base — databases filled automatically, pages written with the right properties, and blocks appended to running docs your whole team can see.
  </p>
</div>

<div className="w-full py-10">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Watch it happen</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Agent updating a Notion database.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Three phases, zero manual steps: query the database, find the matching page, write the updated property. The stream below loops continuously.
    </p>
  </div>

  <div className="mxp-window">
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">agent · notion tool calls</span>
      <span style={{marginLeft:'auto'}}><span className="xant-stream-phase"><span className="xant-ph-q">querying</span><span className="xant-ph-f">page found</span><span className="xant-ph-u">updated</span></span></span>
    </div>

    <div className="mxp-window-body xant-stream-wrap">
      <div className="mxp-stream-event xant-stream-event is-query xant-ev1">tool · notion:databasePages:getAll</div>

      <div className="xant-line xant-l1">
        <span className="mxp-stream-time">step 1</span>
        <span className="mxp-stream-text xant-stream-text">Query <em>Projects</em> database — filter: Status = <em>"In review"</em>, sort: Updated desc</span>
      </div>

      <div className="xant-line xant-l2">
        <span className="mxp-stream-time">step 1</span>
        <span className="mxp-stream-text xant-stream-text">3 rows returned. Top match: <em>"Q3 Strategy Brief"</em> — id: <em>3a7f...d2c9</em></span>
      </div>

      <div className="mxp-stream-event xant-stream-event is-found xant-ev2">tool · notion:databasePages:get</div>

      <div className="xant-line xant-l3">
        <span className="mxp-stream-time">step 2</span>
        <span className="mxp-stream-text xant-stream-text">Read page <em>3a7f...d2c9</em> — <em>simple: true</em> — properties extracted</span>
      </div>

      <div className="xant-line xant-l4">
        <span className="mxp-stream-time">step 2</span>
        <span className="mxp-stream-text xant-stream-text">Current Owner: <em>unassigned</em> · Due date: <em>2026-06-20</em> · Status: <em>In review</em></span>
      </div>

      <div className="mxp-stream-event xant-stream-event is-done xant-ev3">tool · notion:databasePages:update</div>

      <div className="xant-line xant-l5">
        <span className="mxp-stream-time">step 3</span>
        <span className="mxp-stream-text xant-stream-text">Update page <em>3a7f...d2c9</em> — set Owner: <em>Maya</em>, Status: <em>Approved</em></span>
      </div>

      <div className="xant-line xant-l6">
        <span className="mxp-stream-time">step 3</span>
        <span className="mxp-stream-text xant-stream-text">Properties written using display names — <em>not</em> Notion property IDs</span>
      </div>

      <div className="xant-line xant-l7">
        <span className="mxp-stream-time">step 3</span>
        <span className="mxp-stream-text xant-stream-text">Page updated successfully<span className="xant-caret" /></span>
      </div>
    </div>
  </div>

  <div className="xant-stream-caption">
    <span><i style={{background:'#24A4FF'}} />query</span>
    <span><i style={{background:'#B566FF'}} />page found</span>
    <span><i style={{background:'#6EE3B5'}} />updated</span>
    <span style={{marginLeft:'auto', opacity:0.5}}>loops every 9 s · real tool names · display-name properties</span>
  </div>

  <div className="exp-surface-grid" style={{marginTop:'22px'}}>
    <div className="exp-surface-tile">
      <strong>Query first, write second.</strong> Always call <code>databasePages:getAll</code> with a filter to find the target row before updating. Hardcoded page IDs break when databases are duplicated or moved.
    </div>

    <div className="exp-surface-tile">
      <strong>Display names, not IDs.</strong> The <code>databasePages:update</code> tool keys properties by their visible column names — case-sensitive. Run <code>databases:get</code> first to confirm the exact names.
    </div>

    <div className="exp-surface-tile">
      <strong>Simplified output is on.</strong> <code>simple: true</code> flattens Notion's nested property structure into a readable shape. Set <code>simple: false</code> only when you need raw API JSON for downstream processing.
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">15 tools</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">What Actionist can do with Notion.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      One connection unlocks 15 tools spanning every major Notion surface. Select a group to see the exact tool names and what each one does.
    </p>
  </div>

  <div className="exp-tool-shell xant-tools-shell xc-try">
    <div className="mxp-srch-chips">
      <label htmlFor="xant-blocks"><input className="mxp-r" type="radio" name="xant-tool-group" id="xant-blocks" defaultChecked />Blocks</label>
      <label htmlFor="xant-dbs"><input className="mxp-r" type="radio" name="xant-tool-group" id="xant-dbs" />Databases</label>
      <label htmlFor="xant-dbpages"><input className="mxp-r" type="radio" name="xant-tool-group" id="xant-dbpages" />Database pages</label>
      <label htmlFor="xant-pages"><input className="mxp-r" type="radio" name="xant-tool-group" id="xant-pages" />Pages</label>
      <label htmlFor="xant-users"><input className="mxp-r" type="radio" name="xant-tool-group" id="xant-users" />Users</label>
    </div>

    <div className="xant-tool-panel xant-panel-blocks">
      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:blocks:append</span>
        <span className="xant-tool-desc">Append child blocks to any existing page. Accepts a <code>blocksJson</code> array. Use this to grow a running document rather than creating new pages each run.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:blocks:getAll</span>
        <span className="xant-tool-desc">Fetch the block tree of a page. Shallow by default — set <code>fetchNestedBlocks: true</code> for deep document extraction (significantly more API calls on deeply nested pages).</span>
      </div>
    </div>

    <div className="xant-tool-panel xant-panel-dbs">
      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databases:getAll</span>
        <span className="xant-tool-desc">List all databases the integration can see. Default limit: 50. Returns titles and IDs — use to discover databases before querying them by ID.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databases:get</span>
        <span className="xant-tool-desc">Fetch the full schema of a single database — all properties, their types, and options. Run this first to confirm exact column names before creating or updating rows.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databases:search</span>
        <span className="xant-tool-desc">Search databases by name. Useful when the database ID is unknown — search by a partial name, then pick the right result to retrieve the ID.</span>
      </div>
    </div>

    <div className="xant-tool-panel xant-panel-dbpages">
      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databasePages:create</span>
        <span className="xant-tool-desc">Create a new row with full property values. Pass <code>propertiesJson</code> keyed by display name (case-sensitive). The row appears immediately in the Notion database.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databasePages:getAll</span>
        <span className="xant-tool-desc">Query rows with filters and sorts. Pass <code>filterJson</code> and <code>sortsJson</code> as Notion API filter objects. Default limit: 50. Use filtering to narrow results rather than paging large databases.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databasePages:get</span>
        <span className="xant-tool-desc">Read a single row by page ID. <code>simple: true</code> (default) flattens the property structure. Set <code>simple: false</code> for raw Notion API JSON with full rich text annotations.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:databasePages:update</span>
        <span className="xant-tool-desc">Update one or more properties on an existing row. Properties are keyed by display name — not internal Notion property IDs. Partial updates are supported; unspecified properties are unchanged.</span>
      </div>
    </div>

    <div className="xant-tool-panel xant-panel-pages">
      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:pages:create</span>
        <span className="xant-tool-desc">Create a sub-page under a parent page. Pass <code>parentPageId</code> and a <code>title</code>. Optionally include <code>content</code> to populate the body immediately.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:pages:get</span>
        <span className="xant-tool-desc">Read the content and properties of a page by ID. Returns the page title, properties, and body blocks in simplified or raw format.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:pages:search</span>
        <span className="xant-tool-desc">Search pages by title. Default limit: 50. Returns matching pages across all shared workspaces the integration can access.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:pages:archive</span>
        <span className="xant-tool-desc">Soft-delete a page by setting <code>archived: true</code> — moves it to Notion's Trash, not permanent deletion. Users can restore archived pages directly from Trash in Notion. Actionist does not expose an unarchive tool.</span>
      </div>
    </div>

    <div className="xant-tool-panel xant-panel-users">
      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:users:get</span>
        <span className="xant-tool-desc">Fetch a single user by Notion user ID. Returns name, email, and avatar URL. Use to resolve a user ID before assigning ownership or mentions.</span>
      </div>

      <div className="mxp-bm-item xant-tool-row">
        <span className="xant-tool-name">notion:users:getAll</span>
        <span className="xant-tool-desc">List all workspace users the integration can see. Default limit: 50. Useful for building a name-to-ID lookup table when creating rows with person properties.</span>
      </div>
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Setup</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Connect Notion.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      OAuth is the recommended path — it uses Notion's standard authorization flow and stores your workspace token in Actionist's encrypted credentials vault. An internal integration token is available as an alternative.
    </p>
  </div>

  <Tabs>
    <Tab title="OAuth (recommended)" icon="key-round">
      <Steps>
        <Step title="Open Apps and find Notion">
          In the Actionist sidebar, open <strong>Apps</strong>. Search for "Notion" or scroll the grid and click the tile to open the detail panel.
        </Step>

        <Step title="Click Connect Notion">
          Under the <strong>Connection methods</strong> section, click <strong>Connect Notion</strong>. A browser window opens to the Notion OAuth authorization page.
        </Step>

        <Step title="Authorise the workspace">
          Select the workspace you want to connect and click <strong>Allow Access</strong>. Actionist stores the workspace token in your encrypted credentials vault. The detail panel updates to show <strong>Connected</strong>.
        </Step>

        <Step title="Share your databases and pages">
          OAuth succeeds even if nothing is shared yet — but all queries return empty until you grant access. In Notion: open each database or page you want the agent to reach, click <strong>Share → Invite</strong>, search for your Actionist integration bot, and grant <strong>Can edit</strong> (or the appropriate permission level).
        </Step>
      </Steps>

      {/* TODO(image): notion-connected-workspace — IMAGE SPEC: The Actionist Apps detail panel for Notion after a successful OAuth flow. Show the 'Connected' status badge, the connected workspace name, the connection date, and the count of tools available (15). Dark background, Notion icon in the panel header. — replace this CSS mock with the real screenshot */}

      <div className="mxp-window xant-mock-window">
        <div className="mxp-window-bar xant-mock-bar">
          <span className="xant-mock-icon-notion">N</span>
          <span className="xant-mock-bar-title">Notion</span>
          <span className="xant-mock-badge xant-badge-connected">Connected</span>
        </div>

        <div className="xant-mock-body">
          <div className="xant-mock-row">
            <span className="xant-mock-label">Workspace</span>
            <span className="xant-mock-value">Acme Corp</span>
          </div>

          <div className="xant-mock-row">
            <span className="xant-mock-label">Connected on</span>
            <span className="xant-mock-value">Jun 10, 2026</span>
          </div>

          <div className="xant-mock-row">
            <span className="xant-mock-label">Tools available</span>
            <span className="xant-mock-value xant-mock-highlight">15 tools</span>
          </div>

          <div className="xant-mock-divider" />

          <div className="xant-mock-chip-row">
            <span className="xant-mock-chip">Blocks</span>
            <span className="xant-mock-chip">Databases</span>
            <span className="xant-mock-chip">Pages</span>
            <span className="xant-mock-chip">Users</span>
          </div>
        </div>
      </div>
    </Tab>

    <Tab title="API token" icon="terminal">
      <Steps>
        <Step title="Create an internal integration in Notion">
          In Notion: <strong>Settings → Connections → Develop or manage integrations</strong> → create a new internal integration → copy the <strong>Internal Integration Token</strong>.
        </Step>

        <Step title="Add the credential in Actionist">
          In Actionist: <strong>Settings → Credentials → Add credential</strong> → choose Notion → paste the token. Actionist recognises <code>NOTION\_API\_TOKEN</code>, <code>NOTION\_TOKEN</code>, and <code>NOTION\_API\_KEY</code> automatically.
        </Step>

        <Step title="Share your databases and pages">
          Open each target database or page in Notion, click <strong>Share → Invite</strong>, and add your integration. Nothing is visible to the API until it has been explicitly shared.
        </Step>
      </Steps>
    </Tab>
  </Tabs>

  {/* TODO(image): notion-connect-flow — IMAGE SPEC: The Actionist Apps detail panel for Notion. Show the 'Connection methods' section with the 'Connect Notion' button visible and the status badge reading 'Not connected'. Panel header shows the Notion icon and label. — replace this CSS mock with the real screenshot */}

  <div className="mxp-window xant-mock-window">
    <div className="mxp-window-bar xant-mock-bar">
      <span className="xant-mock-icon-notion">N</span>
      <span className="xant-mock-bar-title">Notion</span>
      <span className="xant-mock-badge xant-badge-disconnected">Not connected</span>
    </div>

    <div className="xant-mock-body">
      <div className="xant-mock-section-label">Connection methods</div>

      <div className="xant-mock-connect-row">
        <div className="xant-mock-connect-method">
          <span className="xant-mock-method-name">OAuth (recommended)</span>
          <span className="xant-mock-method-desc">Authorize via Notion's OAuth flow</span>
        </div>

        <span className="xant-mock-connect-btn">Connect Notion</span>
      </div>

      <div className="xant-mock-connect-row" style={{opacity:.55}}>
        <div className="xant-mock-connect-method">
          <span className="xant-mock-method-name">API token</span>
          <span className="xant-mock-method-desc">Paste an internal integration token</span>
        </div>

        <span className="xant-mock-connect-btn xant-mock-btn-ghost">Add token</span>
      </div>
    </div>
  </div>

  <Warning>
    Share every target database or page with the integration immediately after connecting. The connection shows as healthy either way — but every tool call returns empty until the Notion-side share is in place.
  </Warning>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Workflows</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Common workflows.</h2>
  </div>

  <Tabs>
    <Tab title="Knowledge base" icon="book-open">
      <strong>Daily digest to Notion.</strong> A scheduled agent pulls yesterday's unread Slack DMs and important channel mentions, summarises them, and writes a new row into a "Daily digests" database with a date property and the summary text. Every morning your team opens Notion instead of scrolling back through Slack.

      <strong>Agent run log.</strong> At the end of any workflow, write a database row recording what the agent did and what it produced. Every run becomes an auditable record the whole team can browse — no more ephemeral chat history.
    </Tab>

    <Tab title="Cross-app" icon="arrow-left-right">
      <strong>Linear → Notion sync.</strong> When a Linear issue closes, append a row to a "Shipped" database with the title, owner, and a one-sentence summary. Your Notion project tracker stays current without manual copy-paste.

      <strong>Slack digest → Notion page.</strong> Pull a structured summary from Slack, create a dated sub-page in a "Meeting notes" section, and append a block per action item. Slack conversations become durable Notion pages automatically.
    </Tab>

    <Tab title="Structured output" icon="list-checks">
      <strong>Block-level updates.</strong> Instead of creating a new page each run, use <code>notion:blocks:append</code> to add a new dated section to a running "Weekly notes" page. One document grows continuously rather than filling your workspace with one-off pages.

      <strong>Filtered database query before responding.</strong> Before answering a question, the agent calls <code>notion:databasePages:getAll</code> with a <code>filterJson</code> expression to retrieve the most relevant rows from a shared knowledge base, then incorporates the results into its reply.
    </Tab>
  </Tabs>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">In practice</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Three automations people set up on day one.</h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Real workflows built from the tools above — each one running continuously without manual steps.
    </p>
  </div>

  <div className="xc-recipes">
    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#7C5BFF,#E3008E)'}} />

        Maya · Marketing Manager
      </div>

      <div className="xc-recipe-flow">
        After every recorded team call, the agent reads the transcript, creates a dated <em>notion:pages:create</em> sub-page inside <em>Meeting Notes</em>, then uses <em>notion:blocks:append</em> to write a summary, attendee list, and numbered action items — all under the right team section. No copy-paste, no lost notes.
      </div>

      <div className="xc-recipe-save">saves \~3 hrs/wk</div>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#486EFF,#9000FF)'}} />

        Sam · Solo founder
      </div>

      <div className="xc-recipe-flow">
        Every Friday at 17:00, the agent calls <em>notion:databasePages:getAll</em> on the OKR database — filtering for the current quarter — pulls each key result's latest value, and uses <em>notion:databasePages:update</em> to write a <em>Weekly rollup</em> property with a plain-English progress summary. One row per objective, updated before the weekend.
      </div>

      <div className="xc-recipe-save">live in 10 min</div>
    </div>

    <div className="xc-recipe">
      <div className="xc-recipe-who">
        <i style={{background:'linear-gradient(135deg,#9000FF,#00DBFF)'}} />

        Omar · Agency owner
      </div>

      <div className="xc-recipe-flow">
        A shared <em>Client Status</em> database is the single source of truth sent to 12 clients each week. The agent queries the project tracker, maps each open milestone to a client row, and calls <em>notion:databasePages:update</em> to set the <em>Status</em>, <em>Next milestone</em>, and <em>Last updated</em> properties — keeping every client page current without a status-call to gather the numbers first.
      </div>

      <div className="xc-recipe-save">saves \~5 hrs/wk</div>
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Limits</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Limits and defaults.</h2>
  </div>

  <div className="mxs-limits">
    <div className="mxs-limit xant-limit"><b>50</b><span>default result limit for all list and query tools</span></div>
    <div className="mxs-limit xant-limit"><b>true</b><span>simplified output on by default — <code>simple: false</code> for raw JSON</span></div>
    <div className="mxs-limit xant-limit"><b>shallow</b><span>block fetching depth by default — enable <code>fetchNestedBlocks</code> for deep pages</span></div>
    <div className="mxs-limit xant-limit"><b>Trash</b><span>archive is a soft-delete — page moves to Trash, not permanent deletion</span></div>
    <div className="mxs-limit xant-limit"><b>\~3 rps</b><span>Notion public API rate limit per integration (from Notion docs, not verified in codebase)</span></div>
    <div className="mxs-limit xant-limit"><b>2022-06-28</b><span>Notion API version injected automatically on every call</span></div>
  </div>

  <AccordionGroup>
    <Accordion title="Default result limit is 50" icon="list" defaultOpen={true}>
      Every list and query tool — <code>blocks:getAll</code>, <code>databases:getAll</code>, <code>databases:search</code>, <code>databasePages:getAll</code>, <code>pages:search</code>, and <code>users:getAll</code> — defaults to a limit of 50 results. Use <code>filterJson</code> and <code>sortsJson</code> on <code>databasePages:getAll</code> to narrow results rather than paging large databases.
    </Accordion>

    <Accordion title="Simplified output is on by default" icon="sliders-horizontal">
      <code>simple: true</code> on database and page get tools flattens Notion's nested property structure into a readable shape. Set <code>simple: false</code> only if you need raw Notion API JSON — for example, to preserve rich text annotations or relations for downstream processing.
    </Accordion>

    <Accordion title="Block fetching is shallow by default" icon="layers">
      <code>fetchNestedBlocks</code> defaults to <code>false</code> on <code>blocks:getAll</code>. Sub-pages inside a page are not recursively fetched. Enable it for deep document extraction, but expect significantly more API calls on pages with many levels of nesting.
    </Accordion>

    <Accordion title="Archiving is a soft-delete" icon="archive">
      <code>notion:pages:archive</code> sets <code>archived: true</code> on the page — it moves to Notion's Trash, not permanent deletion. Users can restore archived pages directly from Trash in Notion. Actionist does not expose an unarchive tool; restoration must happen in Notion.
    </Accordion>

    <Accordion title="Notion API rate limit" icon="gauge">
      Notion's public API rate limit is approximately 3 requests per second per integration (from Notion's API documentation — not confirmed in the Actionist codebase). Design bulk operations accordingly and avoid sending large batches of sequential tool calls in tight loops.
    </Accordion>

    <Accordion title="Notion API version" icon="tag">
      Actionist injects the header <code>Notion-Version: 2022-06-28</code> automatically on every API call. You do not need to set this manually.
    </Accordion>
  </AccordionGroup>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Best practices</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Tips before you go live.</h2>
  </div>

  <div className="xant-tips">
    <div className="xant-tip-tile">
      <span className="xant-tip-kicker">share first</span>
      OAuth connect succeeds even if no pages are shared. The connection appears healthy but all database queries return empty. Always share the target databases with the integration immediately after connecting.
    </div>

    <div className="xant-tip-tile">
      <span className="xant-tip-kicker">strip the dashes</span>
      The URL from a Notion database looks like <code>notion.so/workspace/Title-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code>. Strip all hyphens to get the 32-character UUID required for <code>databaseId</code> parameters.
    </div>

    <div className="xant-tip-tile">
      <span className="xant-tip-kicker">use display names</span>
      The <code>databasePages:create</code> and <code>databasePages:update</code> tools key properties by their visible column names (case-sensitive), not internal Notion property IDs. Run <code>notion:databases:get</code> first to see the exact names for a database.
    </div>

    <div className="xant-tip-tile">
      <span className="xant-tip-kicker">avoid hardcoded IDs</span>
      Store database IDs as workflow variables or memory entries so agents resolve them by name. Hardcoded IDs break silently when a database is duplicated or moved.
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-cta-panel xc-border">
    <div className="relative z-10 flex flex-col items-center gap-5 max-w-2xl mx-auto">
      <span className="actionist-eyebrow">15 tools, one connection</span>

      <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-white leading-tight">
        Start writing to Notion today.
      </h2>

      <p className="text-base md:text-lg text-white/85">
        Connect Notion in the Apps panel. Share your databases with the integration. The agent does the rest — querying, writing, and updating without manual copy-paste.
      </p>

      <div className="flex flex-wrap items-center justify-center gap-3 pt-2">
        <a className="actionist-cta-btn-primary" href="https://app.actionist.ai" target="_blank" rel="noreferrer">
          Open the Dashboard

          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
            <path d="M5 12h14" />

            <path d="m12 5 7 7-7 7" />
          </svg>
        </a>

        <a className="actionist-cta-btn-secondary" href="mailto:support@actionist.ai">
          Email the team
        </a>
      </div>
    </div>
  </div>
</div>

<div className="w-full pt-2 pb-6">
  <p className="actionist-trust-line">
    15 tools across blocks, databases, pages, and users.<br />
    OAuth or API token · Encrypted credentials vault · Simplified output by default.
  </p>
</div>

<div className="w-full pb-16">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keep going</span>
    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">Related topics.</h2>
  </div>

  <Columns cols={4}>
    <Card title="Apps" icon="grid-2x2" href="/apps">
      Browse the full app catalog and see every integration available in Actionist.
    </Card>

    <Card title="Credentials" icon="key" href="/Folders/credentials">
      Store and rotate Notion API tokens in the encrypted Credentials Vault without re-editing agents.
    </Card>

    <Card title="Memory" icon="brain" href="/Folders/memory">
      Use Notion databases as a persistent memory layer agents can query and write across runs.
    </Card>

    <Card title="Slack" icon="https://cdn.simpleicons.org/slack" href="/apps/slack">
      Common pairing: pull a Slack digest and push a structured summary page into Notion automatically.
    </Card>
  </Columns>
</div>
