AutomationFlowsData & Sheets › Track Software Security Patents with Scrapegraphai, Notion, and Pushover Alerts

Track Software Security Patents with Scrapegraphai, Notion, and Pushover Alerts

Byvinci-king-01 @vinci-king-01 on n8n.io

⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n instance before using this template.

Cron / scheduled trigger★★★★☆ complexity17 nodesN8N Nodes ScrapegraphaiHTTP RequestNotionPushover
Data & Sheets Trigger: Cron / scheduled Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #11635 — we link there as the canonical source.

This workflow follows the HTTP Request → Notion recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "y0Yk7da21T4u9zlp",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Software Vulnerability Tracker with Pushover and Notion",
  "tags": [],
  "nodes": [
    {
      "id": "f066b658-896a-4921-95c3-3092dd50ce47",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        208
      ],
      "parameters": {
        "width": 550,
        "height": 770,
        "content": "## How it works\n\nEvery Monday at 08:00, the Schedule Trigger wakes this workflow and hands a list of technology-focused keyword queries to the downstream nodes. Each keyword is turned into a USPTO or Google Patents search URL, then processed one at a time so we stay within polite rate limits. ScrapeGraphAI opens each result page and uses its LLM brain to pull out fresh patent records, giving us clean JSON containing title, application number, publication date, abstract and link. A HTTP call to the PatentView API enriches every record with classifications and inventor details. We run a quick transformation, mark anything security-related as important, drop the data into a Notion database and finally push an alert to your phone whenever a high-priority patent appears.\n\n## Setup steps\n\n1. Add your ScrapeGraphAI API key inside n8n credentials  \n2. Add a PatentView or external patent API credential if required  \n3. Paste your Notion database ID in the Notion node and authorize access  \n4. Create a Pushover application and add its credential in n8n  \n5. Adjust the keyword list in the \u201cBuild Query URLs\u201d code node  \n6. Enable the workflow, run once manually to confirm mappings  \n7. Relax and let the weekly automation watch the patent landscape"
      },
      "typeVersion": 1
    },
    {
      "id": "2200b8e9-7cda-43c2-aca1-4bd7f67e80ad",
      "name": "Section \u2013 Data Collection",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 450,
        "height": 702,
        "content": "## Data Collection\n\nThe three nodes beneath this note create the raw material that fuels the entire workflow. The Schedule Trigger fires once a week, guaranteeing a predictable crawl cadence that patent offices are happy with. Immediately afterwards the \u201cBuild Query URLs\u201d code node constructs a list of search URLs by combining the keywords you supply with a canned patent-search endpoint. Because the node outputs one item per URL, the Split In Batches node can throttle the job to a single request at a time, avoiding both HTTP 429 responses and unnecessary compute spikes. The JSON that leaves this mini-section is extremely simple: `{ url: '<search-url>' }`. Keeping it minimal ensures our downstream ScrapeGraphAI node can focus on extracting patent metadata without wrestling with extraneous fields."
      },
      "typeVersion": 1
    },
    {
      "id": "7e472c0d-2957-404d-9486-0b16a6521b9c",
      "name": "Section \u2013 Scraping",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 450,
        "height": 702,
        "content": "## AI-Powered Scraping\n\nScrapeGraphAI sits at the heart of the workflow. It receives each search URL, renders the page, and uses an LLM prompt that you can tweak to capture the first twenty patents that were published or granted within the past thirty days. Instead of brittle CSS selectors, the node understands natural language such as \u201creturn a JSON array of patents with title, applicationNumber, publicationDate, abstract and detailUrl.\u201d The result is far more resilient to the frequent UI tweaks that patent databases make. Right after scraping, the \u201cFlatten Patent List\u201d code node explodes the array into one item per patent so that later stages\u2014like the enrichment API call\u2014operate in a clean, predictable, one-record context."
      },
      "typeVersion": 1
    },
    {
      "id": "8cf370e1-09e3-4aef-b3fa-522a4a5a1e86",
      "name": "Section \u2013 Enrichment",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 450,
        "height": 702,
        "content": "## Enrichment & Quality Control\n\nRaw metadata is useful, but R&D teams need deeper insight. The Patent Details API node queries the public PatentView service using each patent\u2019s application number and returns inventor information, Cooperative Patent Classification (CPC) codes and legal status. The subsequent code node merges the two data sets, normalises field names, converts dates to ISO-8601 and performs a quick text test looking for words like \u201cvulnerability,\u201d \u201coverflow\u201d or \u201csecurity.\u201d When a match is found we set `important: true`; otherwise it stays false. This stage also strips hidden line breaks and trims strings so the Notion database receives clean data. By performing the heavy lifting here we keep both storage and notification logic lightweight."
      },
      "typeVersion": 1
    },
    {
      "id": "482fd79e-2973-4af9-a821-68f12c609e7c",
      "name": "Section \u2013 Storage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1808,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 450,
        "height": 702,
        "content": "## Notion Storage\n\nThe \u201cStore in Notion\u201d node drops every processed patent into a dedicated Notion database that your whole team can browse, filter and comment on. We map the title to the database\u2019s Name property, place the application number and CPC codes in rich-text or multi-select columns and store the link so readers can jump straight to the official patent page. Notion\u2019s version history gives you instant audit trails, while its collaboration features mean patent attorneys can leave inline notes without leaving the platform. Because the node runs after the transformation step the payload is already deduplicated and clean, which keeps the database free of repeated entries and confusing partial records."
      },
      "typeVersion": 1
    },
    {
      "id": "fb484b00-99ef-4afc-985a-692f6b216731",
      "name": "Section \u2013 Notification",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2256,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 450,
        "height": 702,
        "content": "## Mobile Alerts\n\nBusy researchers do not want to sift through every single filing, so the workflow finishes with a lightweight decision gate. The IF node checks the `important` flag set earlier; only items marked true continue to the Pushover node. Pushover delivers a concise mobile push notification that includes the patent title and publication date, meaning you know about critical security-related filings within seconds of them appearing in Notion. You can adjust the alert format or priority directly in the node settings. Because the system already throttles scraping and runs on a weekly cadence, you will receive a manageable stream of actionable alerts instead of an overwhelming flood."
      },
      "typeVersion": 1
    },
    {
      "id": "3b72ad83-d034-4fef-9d96-83031be66422",
      "name": "Weekly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        528,
        608
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 168
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "035d30d5-9491-42cb-b1c0-8bbcc7287c91",
      "name": "Build Query URLs",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        608
      ],
      "parameters": {
        "jsCode": "const keywords = [\n  'software vulnerability',\n  'cybersecurity',\n  'memory safety'\n];\n\nreturn keywords.map(k => ({\n  json: {\n    url: `https://patents.google.com/?q=${encodeURIComponent(k)}&oq=${encodeURIComponent(k)}&sort=new`,\n    keyword: k\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "2dde3041-4855-4a24-8922-6aafa5c72335",
      "name": "Split URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        720,
        816
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "e3a73d2d-297e-419d-9239-2e45b184939e",
      "name": "Scrape Patent Listings",
      "type": "n8n-nodes-scrapegraphai.scrapegraphAi",
      "position": [
        976,
        688
      ],
      "parameters": {
        "userPrompt": "Extract the 20 most recent patents from this search result. Return an array called patents where each element contains: title, applicationNumber, publicationDate, abstract, url.",
        "websiteUrl": "={{ $json.url }}"
      },
      "typeVersion": 1
    },
    {
      "id": "0a776de7-9de6-4331-9426-040413c07ecb",
      "name": "Flatten Patent List",
      "type": "n8n-nodes-base.code",
      "position": [
        1168,
        672
      ],
      "parameters": {
        "jsCode": "const results = [];\n$input.all().forEach(item => {\n  if (Array.isArray(item.json.patents)) {\n    item.json.patents.forEach(patent => results.push({json: patent}));\n  }\n});\nreturn results;"
      },
      "typeVersion": 2
    },
    {
      "id": "8014ec35-153c-49e7-b688-d37e84ecf06e",
      "name": "Split Patents",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1472,
        720
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "baae8763-1dbb-48ac-8d29-b12e19d546aa",
      "name": "Patent Details API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1648,
        688
      ],
      "parameters": {
        "url": "={{ 'https://www.patentsview.org/api/patents/query?q=%7B%22patent_number%22:%22' + $json.applicationNumber + '%22%7D&f=%5B%22patent_number%22,%22inventors%22,%22cpcs%22,%22assignee_organization%22%5D' }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "7f7b2aed-6b47-4e13-b4ce-df1468d68f7b",
      "name": "Transform & Deduplicate",
      "type": "n8n-nodes-base.code",
      "position": [
        1872,
        688
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\nreturn items.map(item => {\n  const api = item.json;\n  const enriched = api.patents && api.patents[0] ? api.patents[0] : {};\n  const abstract = item.json.abstract || '';\n  const important = /security|vulnerability|overflow/i.test(abstract) || (enriched.cpcs || []).some(c => /g06f/i.test(c.cpc_subgroup_id || ''));\n  return {\n    json: {\n      title: item.json.title,\n      applicationNumber: item.json.applicationNumber,\n      publicationDate: item.json.publicationDate,\n      abstract,\n      url: item.json.url,\n      cpc: (enriched.cpcs || []).map(c => c.cpc_subgroup_id).join(', '),\n      inventors: (enriched.inventors || []).map(i => i.name_first + ' ' + i.name_last),\n      important\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "c93850cb-48cc-4ac8-9754-87c8a78a5b0e",
      "name": "Store in Notion",
      "type": "n8n-nodes-base.notion",
      "position": [
        2048,
        672
      ],
      "parameters": {
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_NOTION_DATABASE_ID"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Name",
              "title": "={{ $json.title }}"
            },
            {
              "key": "Application Number"
            },
            {
              "key": "Publication Date",
              "date": "={{ $json.publicationDate }}"
            },
            {
              "key": "URL"
            },
            {
              "key": "CPC"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b8394d00-be33-4dc4-a117-80f7c284112f",
      "name": "Important Patent?",
      "type": "n8n-nodes-base.if",
      "position": [
        2320,
        688
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "boolean": [
            {
              "value1": "={{ $json.important }}",
              "operation": "true"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "9781a06e-f6dc-4946-be47-31cce0a5194c",
      "name": "Pushover Alert",
      "type": "n8n-nodes-base.pushover",
      "position": [
        2480,
        624
      ],
      "parameters": {
        "message": "={{ $json.title + ' \u2014 published ' + $json.publicationDate }}",
        "priority": 0,
        "additionalFields": {}
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a78ec8f1-d69d-463f-bb12-97aa8115d873",
  "connections": {
    "Split URLs": {
      "main": [
        [
          {
            "node": "Scrape Patent Listings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Patents": {
      "main": [
        [
          {
            "node": "Patent Details API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Trigger": {
      "main": [
        [
          {
            "node": "Build Query URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store in Notion": {
      "main": [
        [
          {
            "node": "Important Patent?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Query URLs": {
      "main": [
        [
          {
            "node": "Split URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Important Patent?": {
      "main": [
        [
          {
            "node": "Pushover Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Patent Details API": {
      "main": [
        [
          {
            "node": "Transform & Deduplicate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Flatten Patent List": {
      "main": [
        [
          {
            "node": "Split Patents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Patent Listings": {
      "main": [
        [
          {
            "node": "Flatten Patent List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transform & Deduplicate": {
      "main": [
        [
          {
            "node": "Store in Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

⚠️ COMMUNITY TEMPLATE DISCLAIMER: This is a community-contributed template that uses ScrapeGraphAI (a community node). Please ensure you have the ScrapeGraphAI community node installed in your n8n instance before using this template.

Source: https://n8n.io/workflows/11635/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

This template is designed for social media managers, content creators, data analysts, and anyone who wants to automatically save and analyze their Meta Threads posts in Notion.

HTTP Request, Notion
Data & Sheets

&gt; Transform your content strategy with automated competitor intelligence

HTTP Request, Airtable, Notion +2
Data & Sheets

Raindrop Knowledge Management. Uses httpRequest, notion. Scheduled trigger; 11 nodes.

HTTP Request, Notion
Data & Sheets

n8n workflows can go out of hand when you're automating as much as we do at n8n. We needed a place to document them and keep track of who owns and maintains them. To facilitate this we use this n8n wo

n8n, HTTP Request, Notion
Data & Sheets

Opportunity Radar Weekly. Uses httpRequest, notion. Scheduled trigger; 8 nodes.

HTTP Request, Notion