> This is a page from the ElevenLabs documentation. For an index of the documentation, fetch https://elevenlabs.io/docs/llms.txt.

# Notion

Your receptionist can search your Notion workspace, read a page, and look through a database, such as a price list, a product table, or a list of open jobs, to answer callers. Reading goes through [webhook tools](/docs/reception-ai/integrations/webhooks) with a Notion internal connection, which works on every Notion plan and only sees the pages you share with it. Adding entries to a database also works with a webhook tool, through a second connection that can only add content. You can use [Zapier](/docs/reception-ai/integrations/zapier) for that instead, but the webhook tool is recommended: it doesn't need a Zapier account or use your Zapier tasks, and each request goes straight to Notion. The webhook tool can't fill the title property, though, so if your entries need a real title, use Zapier.

> **Note**
>
> If your Notion content rarely changes, you may not need an integration. Export the page from
> Notion and [upload it to your knowledge base](#use-the-knowledge-base-instead) instead.

> **Warning**
>
> Your receptionist can read everything you share with the connection and repeat it to callers.
> Share only pages that callers may hear about, and add a
> [rule](/docs/reception-ai/receptionist/rules-and-procedures) that your receptionist never reads
> private records, such as client details, back to callers.

## Set up

### Create an internal connection

You need to be a workspace owner. Go to [app.notion.com/developers/connections](https://app.notion.com/developers/connections), select **Internal connections**, then **Create a new connection**. Name it `Reception.ai` and choose your workspace. On the **Configuration** tab, allow reading content only, and copy the **API token**.

### Share pages with the connection

Open the connection's **Content access** tab, select **Edit access**, and choose the pages and databases your receptionist should read. You can also open a page in Notion, select **•••** → **Connections** → **+ Add connection**, and pick `Reception.ai`. Child pages are shared too.

### Find the data source ID

To let your receptionist read a database, open the database's settings in Notion, select **Manage data sources**, open the **•••** menu next to the data source, and select **Copy data source ID**.

### Create the webhook tools

Create the [tools below](#tools). For each one, go to **Integrations**, select **Add integration**, and choose **Webhook Tool**.

### Test it

[Test your receptionist](/docs/reception-ai/receptionist/testing) by asking a question that one of your shared pages answers.

## Tools

Every tool sends these request headers:

| Header           | Type   | Value                                         |
| ---------------- | ------ | --------------------------------------------- |
| `Authorization`  | Secret | `Bearer ` followed by your connection's token |
| `Notion-Version` | Value  | `2026-03-11`                                  |

Set **Assign to agents** to **Receptionist** on each tool, and select **Enable**.

### Search pages

| Field               | Value                                                                                                                                                 |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Name**            | `search_notion`                                                                                                                                       |
| **Description**     | "Search our Notion pages by title. Use it when a caller asks something our documents might answer, then read the best match with `read_notion_page`." |
| **Method**          | POST                                                                                                                                                  |
| **URL**             | `https://api.notion.com/v1/search`                                                                                                                    |
| **Body Parameters** | `query` (string, required): "A short title to search for, such as `pricing` or `opening hours`."  `page_size` (number, fixed value): `10`             |

### Read a page

| Field                | Value                                                                           |
| -------------------- | ------------------------------------------------------------------------------- |
| **Name**             | `read_notion_page`                                                              |
| **Description**      | "Read the full text of a Notion page found with `search_notion`."               |
| **Method**           | GET                                                                             |
| **URL**              | `https://api.notion.com/v1/pages/{page_id}/markdown`                            |
| **Path Parameters**  | `page_id` (string, required): "The `id` of a page returned by `search_notion`." |
| **Query Parameters** | `markdown_version` (string, fixed value): `v2`                                  |

### Read a database

| Field               | Value                                                                                                                             |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| **Name**            | `read_notion_table`                                                                                                               |
| **Description**     | "List the rows of our price list. Use it when a caller asks about prices or what we offer." Describe your own table here instead. |
| **Method**          | POST                                                                                                                              |
| **URL**             | `https://api.notion.com/v1/data_sources/DATA_SOURCE_ID/query`                                                                     |
| **Body Parameters** | `page_size` (number, fixed value): `100`                                                                                          |

Replace `DATA_SOURCE_ID` with the ID you copied. Create one tool per database, each with its own name and description.

## Add database entries with a webhook tool (recommended)

To save something from a call to a Notion database, such as a lead or a callback request, create a tool that adds an entry.

### Create a connection for new entries

Create a second internal connection, for example `Reception.ai entries`, the same way as the first. On the **Configuration** tab, allow inserting content only, and copy its **API token**. On **Content access**, share only the database it adds entries to. This connection can't read anything back, so the entries stay private.

### Prepare the database

Copy the database's data source ID, as in [Set up](#set-up). Each property the tool fills is a key in the request, and keys can't contain spaces, so give those properties one-word names, such as `Phone`, `Email`, and `Status`.

### Create the webhook tool

Go to **Integrations**, select **Add integration**, and choose **Webhook Tool**.

| Field                | Value                                                                                                                       |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **Name**             | `add_notion_entry`                                                                                                          |
| **Description**      | "Save a new lead to our leads database when a caller wants a quote or a callback." Describe your own database here instead. |
| **Method**           | POST                                                                                                                        |
| **URL**              | `https://api.notion.com/v1/pages`                                                                                           |
| **Request Headers**  | `Authorization` (Secret): `Bearer ` followed by the new connection's token  `Notion-Version` (Value): `2026-03-11`          |
| **Body Parameters**  | `parent` (object, required)  `markdown` (string, required)  `markdown_version` (string)  `properties` (object, required)    |
| **Assign to agents** | **Receptionist**                                                                                                            |

Set up the body parameters like this:

* `parent`: one field, `data_source_id` (string, fixed value): your data source ID.
* `markdown` (from the conversation): "The entry as Markdown. Start with a line `# ` followed by the caller's name and what they need, for example `# Jane Doe: quote for a new boiler`. Then add a blank line and the details of the request."
* `markdown_version` (fixed value): `v2`
* `properties`: select **Add field** once for each property to fill. Each one is an object named exactly like the property, with one field for its value:
  * `Phone` (object): `phone_number` (string, from the conversation): "The caller's phone number."
  * `Email` (object): `email` (string, from the conversation): "The caller's email address, spelled back to them. Leave it out if they didn't give one."
  * `Status` (object, required): `select` (object, required), with one field, `name` (string, fixed value): `New`

Notion documents that when the title property is left out, the first `#` heading becomes the page's title; its docs only show this for pages created inside a page, so check that it works for your database. Either way, the heading and details are saved as the entry's content, and the phone, email, and status properties are filled in. Leave the title property out of `properties`: Notion nests title and text values six levels deep, one more than webhook tools allow. Phone number, email, URL, number, checkbox, select, and date properties fit. A Status-type property takes `status` instead of `select`.

Select **Enable**, then [test your receptionist](/docs/reception-ai/receptionist/testing) by asking for a callback. The entry appears in the database.

## Add database entries with Zapier

To add entries through Zapier instead, connect [Zapier](/docs/reception-ai/integrations/zapier). In your Zapier MCP server at [mcp.zapier.com](https://mcp.zapier.com), add the Notion **Create Data Source Item** action, set the database to a fixed value, and let the AI fill in the fields. In Reception.ai, open the Zapier integration's **Tools** tab, select **Refresh tools**, and assign the action to the **Client** (receptionist).

## Use the knowledge base instead

For content that doesn't change often, the [knowledge base](/docs/reception-ai/knowledge-base/overview) is simpler and faster than live lookups. In Notion, open the page's **•••** menu, choose **More** → **Export**, and pick **PDF**, **HTML**, or **Markdown & CSV**. HTML and Markdown exports download as a zip file, so unzip it first. Then [upload the file](/docs/reception-ai/knowledge-base/file-uploads). Databases export to CSV, which the knowledge base doesn't accept, so export databases as PDF. Export and upload again when the content changes.

## Limitations

* Notion's search matches page and database titles, not the text inside pages. Give pages clear titles, such as "Cancellation policy".
* `read_notion_table` returns the first 100 rows and only their properties, not the content inside each row's page. Keep tables your receptionist reads small.
* Notion's hosted MCP server needs a browser sign-in, except on Business and Enterprise plans, where a workspace owner can create an MCP token. The webhook tools above work on every plan.
* `add_notion_entry` can't fill title or text properties. Put names and notes in the heading and content instead.
* If you add entries through Zapier, each Zapier action your receptionist runs uses tasks from your Zapier plan. Zapier currently counts two tasks per successful call.

## Troubleshooting

| Problem                                      | What to check                                                                                                                                                                                                      |
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 401 from Notion                              | The `Authorization` header must be `Bearer ` followed by the connection's token.                                                                                                                                   |
| 400 about the version                        | Set `Notion-Version` to `2026-03-11`.                                                                                                                                                                              |
| 404 or `object_not_found`                    | Share the page or database with the connection, and use the data source ID, not the database ID.                                                                                                                   |
| 403 on `read_notion_page`                    | The connection needs permission to read content.                                                                                                                                                                   |
| 403 on `add_notion_entry`                    | The entries connection needs permission to insert content, and access to the database.                                                                                                                             |
| 400 `validation_error` on `add_notion_entry` | Each key in `properties` must match a property name exactly, and its field must match the property's type.                                                                                                         |
| New entries show as **Untitled**             | Notion didn't take the `#` heading as the title for your database. The heading is still at the top of each entry's page, and you can find entries by their phone or status. To get a title, use the Zapier option. |
| Search finds nothing                         | Search only matches titles, and only of pages shared with the connection.                                                                                                                                          |
| The receptionist is slow on a large table    | Large tables return a lot of data. Split the table, or move the content to the knowledge base.                                                                                                                     |