AutomationFlowsWeb Scraping › Audit Digital Identities with Apify Breachhound and Pdf.co

Audit Digital Identities with Apify Breachhound and Pdf.co

ByBlukaze Automations @hellopaul on n8n.io

This workflow starts from an n8n form submission, runs the BreachHound actor on Apify to discover where an email address is registered, then summarizes the results into an HTML audit report and converts it to a downloadable PDF using PDF.co. Receives an email address (and…

Event trigger★★★★☆ complexity13 nodesForm Trigger@Apify/N8N Nodes ApifyHTTP Request
Web Scraping Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

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

This workflow follows the Form Trigger → HTTP Request 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": "2uqaucla0FCQwajQ",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Digital Identity Audit",
  "tags": [],
  "nodes": [
    {
      "id": "e3409c2d-f3e8-4620-8275-c4220efe19ac",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -704,
        -240
      ],
      "parameters": {
        "width": 464,
        "height": 576,
        "content": "# Digital Identity Audit\n## This workflow automates digital identity discovery using the BreachHound Apify Actor. Enter an email address, and the workflow performs a comprehensive audit across 120+ online services to identify associated accounts and generate a professional, shareable report.\n### What this workflow does\n\ud83d\udd0d Audits an email address across 120+ online platforms\n\ud83d\udcca Retrieves structured account discovery results from BreachHound\n\ud83d\udcc8 Summarizes key findings and audit statistics\n\ud83d\udcc4 Generates a clean HTML report\n\ud83d\udcd1 Converts the report into a downloadable PDF\n\n## \ud83d\udfe5 Red Nodes \u2014 Configuration Required\n\n\nFor tailored solutions, visit Blukaze.com"
      },
      "typeVersion": 1
    },
    {
      "id": "3ed874f6-721d-42e5-bfa4-ecb565e28648",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -32,
        -64
      ],
      "parameters": {
        "options": {},
        "formTitle": "Digital Identity Audit",
        "formFields": {
          "values": [
            {
              "fieldType": "email",
              "fieldLabel": "Email Address"
            },
            {
              "fieldType": "checkbox",
              "fieldLabel": "Return Only Found Accounts",
              "fieldOptions": {
                "values": [
                  {}
                ]
              }
            },
            {
              "fieldType": "checkbox",
              "fieldLabel": "Use Residential Proxy",
              "fieldOptions": {
                "values": [
                  {}
                ]
              }
            }
          ]
        },
        "formDescription": "Enter an email address to discover where it is registered across 120+ online services. A professional audit report will be generated automatically."
      },
      "typeVersion": 2.6
    },
    {
      "id": "b00c0058-ed05-4dbf-8a34-f7a30276f067",
      "name": "Run an Actor",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        416,
        -64
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "",
          "cachedResultName": ""
        },
        "customBody": "={\n    \"email\": \"{{ $json.email }}\",\n    \"onlyUsed\": {{ $json.onlyUsed }},\n    \"useResidentialProxy\": {{ $json.useResidentialProxy }}\n}",
        "actorSource": "store"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4046332b-c050-4f95-b206-f6415fa2be61",
      "name": "Get dataset items",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        640,
        -64
      ],
      "parameters": {
        "limit": 300,
        "options": {},
        "resource": "Datasets",
        "datasetId": "={{ $json.storageIds.datasets.default }}"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d4c86c3d-15c0-45d2-a2ce-3b8f65b417ce",
      "name": "HTML to PDF",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1312,
        -64
      ],
      "parameters": {
        "url": "https://api.pdf.co/v1/pdf/convert/from/html",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "sendBody": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "html",
              "value": "={{ $json.html }}"
            },
            {
              "name": "async",
              "value": "false"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "YOUR_API_KEY_HERE"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "9abc482d-a43c-4bbd-9b63-065b7289e742",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1536,
        -64
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "0db8789f-ef93-4b6d-b23f-e48db68e4f2d",
      "name": "Set Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        192,
        -64
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "35247700-b119-4817-a0eb-d9cb98456743",
              "name": "email",
              "type": "string",
              "value": "={{ $json['Email Address'] }}"
            },
            {
              "id": "288f9833-55ba-4f7c-a680-7a00b0b42f08",
              "name": "onlyUsed",
              "type": "boolean",
              "value": "=true"
            },
            {
              "id": "f6f44c22-292d-4a27-995e-7279a54708df",
              "name": "useResidentialProxy",
              "type": "boolean",
              "value": true
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "35344a6c-4a52-44af-8ecf-7546baadba27",
      "name": "Data Extraction",
      "type": "n8n-nodes-base.code",
      "position": [
        864,
        -64
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nconst found = items.filter(i => i.json.status === \"found\");\nconst notFound = items.filter(i => i.json.status === \"not_found\");\nconst rateLimited = items.filter(i => i.json.status === \"rate_limited\");\n\nreturn [{\n  json: {\n    email: found[0]?.json.email ?? \"\",\n    total: items.length,\n    found: found.length,\n    notFound: notFound.length,\n    rateLimited: rateLimited.length,\n    foundAccounts: found.map(x => ({\n      name: x.json.name,\n      website: x.json.website\n    }))\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "3bfb8748-9fbb-4185-be0a-763e272975e2",
      "name": "Convert to HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        1088,
        -64
      ],
      "parameters": {
        "jsCode": "const data = $json;\n\nconst rows = data.foundAccounts.map(account => `\n<tr>\n  <td>${account.name}</td>\n  <td>${account.website}</td>\n</tr>\n`).join(\"\");\n\nconst html = `\n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<style>\nbody{\n    font-family:Arial;\n    padding:40px;\n}\n\ntable{\n    width:100%;\n    border-collapse:collapse;\n}\n\nth,td{\n    border:1px solid #ddd;\n    padding:8px;\n}\n\nth{\n    background:#2563eb;\n    color:white;\n}\n</style>\n</head>\n\n<body>\n\n<h1>Digital Identity Audit</h1>\n\n<p><strong>Email:</strong> ${data.email}</p>\n\n<p><strong>Accounts Found:</strong> ${data.found}</p>\n\n<p><strong>Not Found:</strong> ${data.notFound}</p>\n\n<p><strong>Rate Limited:</strong> ${data.rateLimited}</p>\n\n<p><strong>Total Checked:</strong> ${data.total}</p>\n\n<h2>Accounts Found</h2>\n\n<table>\n\n<tr>\n\n<th>Platform</th>\n\n<th>Website</th>\n\n</tr>\n\n${rows}\n\n</table>\n\n</body>\n\n</html>\n`;\n\nreturn [{\n  json: {\n    html\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "58644ea1-4a97-498c-804a-e3bc1b3768a1",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 512,
        "content": "# Form & Input\n\n\n\n\n\n\n\n\n\n\n\nStarts the workflow whenever a user submits the audit form.\n### User Action Required\n Input Email Address"
      },
      "typeVersion": 1
    },
    {
      "id": "e85f8c6a-1c9f-4dc5-9a35-5fc36418be3c",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -192
      ],
      "parameters": {
        "color": 3,
        "width": 400,
        "height": 512,
        "content": "# Digital Identity Discovery\n\n\n\n\n\n\n\n\n\n\n\nRuns the BreachHound Apify Actor to audit the supplied email address.\n\n### User Action Required\nConnect your Apify API credential before running the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "766fe5fc-595b-4ebe-8add-326093b9becc",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 512,
        "content": "# Report Generation\n\n\n\n\n\n\n\n\n\n\n\nProcesses the dataset returned by BreachHound.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1138d8ce-8fc3-4927-bf47-09550226c0a2",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1280,
        -192
      ],
      "parameters": {
        "color": 3,
        "width": 416,
        "height": 512,
        "content": "# PDF Generation & Delivery\n\n\n\n\n\n\n\n\n\n\nConverts the HTML report into a professional PDF.\nThen delivers the report using your configured output method.\n\n### User Action Required\nConnect your PDF.co API credential by using your API key from https://app.pdf.co/login."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "bc60f2e4-7e73-4f1b-9415-876c6fda8c7b",
  "nodeGroups": [],
  "connections": {
    "Set Fields": {
      "main": [
        [
          {
            "node": "Run an Actor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML to PDF": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run an Actor": {
      "main": [
        [
          {
            "node": "Get dataset items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to HTML": {
      "main": [
        [
          {
            "node": "HTML to PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Extraction": {
      "main": [
        [
          {
            "node": "Convert to HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get dataset items": {
      "main": [
        [
          {
            "node": "Data Extraction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Set Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

This workflow starts from an n8n form submission, runs the BreachHound actor on Apify to discover where an email address is registered, then summarizes the results into an HTML audit report and converts it to a downloadable PDF using PDF.co. Receives an email address (and…

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

This n8n workflow collects leads from Google Maps, scrapes their websites via direct HTTP requests, and extracts valid email addresses — all while mimicking real user behavior to improve scraping reli

Form Trigger, @Apify/N8N Nodes Apify, HTTP Request +1
Web Scraping

This n8n template demonstrates how to automatically clone and adapt competitor Facebook ads for your own product using AI. Simply provide a Facebook Ad Library URL and your product image, and the work

Form Trigger, HTTP Request, Google Drive +1
Web Scraping

Agency Sales Deck Automation: Meta Ad Audit → Gemini Analysis → Gamma Deck. Uses formTrigger, httpRequest, @apify/n8n-nodes-apify. Event-driven trigger; 16 nodes.

Form Trigger, HTTP Request, @Apify/N8N Nodes Apify
Web Scraping

viral-cat-video-creator. Uses formTrigger, chainLlm, lmChatMistralCloud, outputParserStructured. Event-driven trigger; 22 nodes.

Form Trigger, Chain Llm, Lm Chat Mistral Cloud +4
Web Scraping

[VICTOR] Google Maps Extractor. Uses formTrigger, outputParserStructured, lmChatOpenAi, httpRequest. Event-driven trigger; 21 nodes.

Form Trigger, Output Parser Structured, OpenAI Chat +5