Skip to content
Integrations

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 typeWhat is written
Title, TextThe value as text (long text is kept in full, in pieces of 2,000 characters)
NumberNumbers, and text that is a number; anything else is left empty
Select, StatusThe value as an option (a new option is added when it doesn't exist)
Multi-selectEach item of a list, or each comma-separated part of a text
DateDates and timestamps; anything else is left empty
Checkboxtrue, yes, or 1 checks it
URL, Email, PhoneThe value as is (URLs only when they start with http)
Files & mediaEach 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.