---
title: "Send scraped data to a Notion database · Scrape.ly Docs"
description: "Add the results of every successful scraper run as rows in a Notion database. Connect Notion once, paste the database link, and fields fill matching columns."
url: https://scrape.ly/docs/notion
markdown: https://scrape.ly/docs/notion.md
---

# Send scraped data to Notion

> Add the results of each successful run as rows to a Notion database.

Adds the dataset items of each successful run as rows to a Notion database. You connect your Notion workspace once, and choose which pages and databases Scrape.ly may add rows to.

## Connect Notion

1. In the dashboard, open **Settings** → **Connections** and click **Connect account** next to **Notion** (or **Connect Notion** in the automation form).
2. Sign in to Notion, pick the workspace, then pick the pages and databases Scrape.ly may use, and click **Allow access**.

Scrape.ly can only add rows and read the column names of the pages and databases you picked; it can't change or delete anything in your workspace. To use another database later, click **Add pages** and pick it, or open the database in Notion, click **•••** → **Connections**, and add Scrape.ly. You stay connected: the sign-in renews itself. **Disconnect** removes the connection, and Notion automations stop until you connect again. To remove Scrape.ly from your workspace too, remove it in Notion under **Settings** → **Connections**.

## Send results to a database

1. Click **New automation**, then **Or create manually**. Under **Send**, click **Notion** (on an Actor's **Automations** tab the Actor is already chosen).
2. Pick the database under **Database**. The list shows the databases you shared with Scrape.ly; if yours is missing, click **Add pages** and pick it. You can also click **Paste a link instead** and paste the database's link from the address bar, such as `https://www.notion.so/acme/Leads-1a2b3c4d5e6f47089a1b2c3d4e5f6a7b?v=…`, or its ID.
3. Save and send a test. A `Scrapely connected ✓` row appears in the database.

**Columns**: Notion only accepts columns that exist in the database, so a result field is written when the database has a column with the same name (upper or lower case doesn't matter). Nested fields are named with dots, such as `price.amount`. Add a column for each field you want; fields without a column are skipped, and the delivery history lists them. Values are converted to the column type:

| Column type | What is written |
|---|---|
| Title, Text | The value as text (long text is kept in full, in pieces of 2,000 characters) |
| Number | Numbers, and text that is a number; anything else is left empty |
| Select, Status | The value as an option (a new option is added when it doesn't exist) |
| Multi-select | Each item of a list, or each comma-separated part of a text |
| Date | Dates and timestamps; anything else is left empty |
| Checkbox | `true`, `yes`, or `1` checks it |
| URL, Email, Phone | The value as is (URLs only when they start with `http`) |
| Files & media | Each link, as an external file |

Columns Notion fills itself, such as formulas, rollups, and created time, and columns that need Notion IDs, such as relations and people, are never written.

**When it writes**: only for succeeded runs, and only when the run returned items. **Max rows per run** (1 to 1,000, default 500) caps how many items are added. Each run adds new rows; existing rows are never changed or removed. A row Notion refuses, for example a value it can't take, is skipped and counted in the delivery history; the other rows are still written.

**Limits**: Notion takes one row per request and about 3 requests a second per connection, so 500 rows take about 3 minutes and 1,000 rows about 6. Each Notion automation of this kind writes at most 30 times an hour, and an account at most 500 exports a day (Google Sheets, S3, GitHub, Airtable, HubSpot, Notion, and Dropbox together). If Notion isn't connected, Scrape.ly has no access to the database, or none of the fields match a column, the delivery history on the automation's page says so.

## API

A webhook with a `notion` notification. Only `ACTOR.RUN.SUCCEEDED` is allowed, and Notion must be connected in the dashboard first.

```bash
curl -X POST https://api.scrape.ly/v2/webhooks \
  -H "Authorization: Bearer $SCRAPELY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "eventTypes": ["ACTOR.RUN.SUCCEEDED"],
    "condition": { "actorId": "YOUR_ACTOR_ID" },
    "description": "Results to Notion",
    "notification": {
      "channel": "notion",
      "databaseUrl": "https://www.notion.so/1a2b3c4d5e6f47089a1b2c3d4e5f6a7b",
      "maxRows": 500
    }
  }'
```

Responses carry `notification.notionSettings` with `databaseId` and `maxRows`, and `connected` says whether Notion is still connected. In an automation, use a delivery with `"channel": "notion"` and the same `databaseUrl` and `maxRows` fields. `GET https://api.scrape.ly/v2/integrations/notion/databases` lists the databases shared with the connection (`id`, `name`, `url`); any `url` from it works as `databaseUrl`.

## FAQ

### Why are some scraped fields missing from my Notion database?

Notion only accepts columns that exist in the database, so a field is written only when the database has a column with the same name. Add a column for each field you want, naming nested fields with dots, such as `price.amount`. The delivery history lists the fields that were skipped.

### Can Scrape.ly change or delete my Notion pages?

No. It can only add rows and read the column names of the pages and databases you picked when connecting. Each run adds new rows; existing rows are never changed or removed.

### How long does it take to send 1,000 rows to Notion?

About 6 minutes. Notion takes one row per request and about 3 requests a second per connection, so 500 rows take about 3 minutes.

---

- Previous: [HubSpot](https://scrape.ly/docs/hubspot.md)
- Next: [Dropbox](https://scrape.ly/docs/dropbox.md)
- All docs: [Docs index](https://scrape.ly/docs.md), [llms.txt](https://scrape.ly/llms.txt)
