Notion integration

Generate PDFs from Notion

Connect Quaterio to your Notion workspace, query a database, and render the records into a paginated PDF. Properties, rich text and inline media all flow through.

The problem

Notion exports to PDF page by page, which loses your block-based templating and means every export is a one-off. Most teams want a repeatable shape: pull rows from a database, render them with your brand, and ship the PDF, without exporting each Notion page by hand or maintaining a separate static layout in code.

How Quaterio handles it

Quaterio's Notion connector POSTs to the Notion database query API with the Notion-Version header set, and drops the response into a Quaterio template via a Remote Content block. Properties, rich text fields and even attachment URLs are addressable by dot-notation path. The PDF re-renders against the latest Notion data at every generation.

How it works

  1. 1

    Create a Notion integration and copy the token

    Visit notion.so/my-integrations, click New integration, name it, save and copy the Internal Integration Secret (starts with secret_).

  2. 2

    Share the database with your integration

    In Notion, open the database, click "..." → Connections → add your integration by name. Without this step, the API returns 404 even with a valid token. This is the most common first-time failure.

  3. 3

    Pick the Notion preset in Connections

    Settings → Connections → New Connection → "Notion". The URL template, POST method, Notion-Version header and empty {} body are filled in for you. Replace the placeholder database ID and paste your token.

  4. 4

    Bind to a template and generate

    Use Detect Fields to navigate to the property you want to render (e.g. results.0.properties.Name.title.0.plain_text). Add a Remote Content block to a template and bind it. Export from the editor or call POST /api/v1/generate/template with your template ID.

What the connector handles

  • Official Notion API (POST /v1/databases/{id}/query) with Notion-Version 2022-06-28
  • Integration token (secret_...) sent as Authorization: Bearer
  • Database properties (title, rich_text, number, date, status, multi_select, ...) all addressable
  • Detect Fields button discovers every property path your database returns
  • Filter and sort bodies supported via the Advanced section of the connection form
  • Inline media (file URLs, hosted images) resolved at PDF render time
  • Refresh on demand from the editor, or via API before batch generation
  • 15 second fetch timeout, cached on the block when Notion is slow

Generate via API

# After creating the Notion connection and binding it to a template: curl -X POST https://quaterio.com/api/v1/generate/template \ -H "Authorization: Bearer q_your_token" \ -H "Content-Type: application/json" \ -d '{ "templateId": "notion_status_report" }' # → { # "ok": true, # "data": { "downloadUrl": ".../notion-status_en_a7f3b2c1.pdf" } # } # At generation time Quaterio POSTs to your Notion database # (with Notion-Version 2022-06-28) and drops the results into # the bound template block.

Available on Business plan and above.

Notion and PDF: the real questions

The Notion preset queries the official Notion database API (POST /v1/databases/{id}/query). It needs an integration token and that integration has to be invited to the database. Once that is wired up, posts, properties, rich text and inline media all flow into Quaterio templates.

Creating the integration and getting a token

Visit notion.so/my-integrations, click "New integration", give it a name and copy the Internal Integration Secret. That string is what you paste into the Token field on the Quaterio connection. The token starts with "secret_".

Open the Notion database you want to render, click "..." in the top right, choose Connections and add your integration by name. Without this share step Notion returns 404 on every query, even with a valid token. This trips up most first-time users.

Why this preset uses POST and the Notion-Version header

The Notion database query endpoint is POST /v1/databases/{databaseId}/query and the Notion-Version header is required on every request. Quaterio sends both automatically when you pick the Notion preset, including the current stable version 2022-06-28. You do not need to set them manually.

The request body is JSON. Empty {} returns the first page of results; you can also pass filter and sort objects from the Notion docs to narrow the result set. Edit the body in the Advanced section of the connection form.

Pulling specific properties out of a page

Notion responses are deeply nested. A query returns results[0..n], each result has properties keyed by your property names, and each property has a type wrapper (title, rich_text, number, etc.). The default Response Field results.0.properties returns the whole properties object as JSON for inspection.

To pull a single property as a string, navigate further down. For a title property called "Name", the path is results.0.properties.Name.title.0.plain_text. For a rich text property called "Body", it is results.0.properties.Body.rich_text.0.plain_text. Use the Detect Fields button to walk the structure interactively.

Blocks API for full page content

The database query returns properties only, not the block contents inside a page. If you want the full body of a Notion page rendered into your PDF, you need a second connection pointing at /v1/blocks/{block_id}/children. Quaterio will fetch the block tree at PDF generation time.

Rendering arbitrary Notion blocks into clean HTML is non-trivial, Notion does not return ready-to-use HTML and instead returns its own block tree. Most teams use Notion for structured data (titles, dates, statuses, numbers) and pair Notion-driven properties with templated layout in Quaterio. Full page-body rendering is on the roadmap but not first-party today.

Rate limits and request size

Notion enforces an average of 3 requests per second per integration. Each PDF generation runs one connector fetch, so a batch of 100 PDFs translates to 100 sequential Notion requests. The default Quaterio batch concurrency is 5; lower it if you start seeing 429 responses.

The query endpoint returns up to 100 results per page. For larger result sets, paginate with page_size and start_cursor in the request body. Quaterio does not auto-paginate the connector; each fetch returns the first page only. For full-database PDFs prefer the batch endpoint with one PDF per row.

Pricing and plan tier

CMS connections are part of the Business plan and above ($30/mo). The Notion integration is a standard REST API connection, not a special-tier feature inside Quaterio. You only pay for the Quaterio plan, plus whatever Notion charges for their workspace (free for personal use, paid for team plans).

Try the Notion connector free

Set up the connection in two minutes. No credit card required to start.