{
  "name": "CyberMax chain: domains → contacts → tech stack",
  "nodes": [
    {
      "id": "be87aa07-b728-4038-a387-a7f75c98dbb7",
      "name": "Read me",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -40,
        -260
      ],
      "parameters": {
        "content": "## Lead enrichment: contacts + tech stack\nDomain list → Hollerdex (website-contacts) → DomainDNA (domain-intel) → one row per domain with primary email, phone, socials, CMS/e-commerce/analytics stack and domain age.\nReplace **YOUR_APIFY_TOKEN** in both HTTP nodes. Edit the list in \"Domain list\". Cost: about $0.004 + $0.004 per domain.",
        "width": 520,
        "height": 220
      }
    },
    {
      "id": "7e1d2338-9688-4610-aad6-62b6bc20b4e8",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "parameters": {}
    },
    {
      "id": "db968351-43ef-4abc-a541-b0f3b0874fba",
      "name": "Domain list",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        0
      ],
      "parameters": {
        "jsCode": "// One item holding the domains to enrich. Swap this node for Google Sheets, Airtable, a webhook...\nreturn [{ json: { domains: ['apify.com', 'basecamp.com', 'stripe.com'] } }];"
      }
    },
    {
      "id": "99af9e8b-77c4-4bc9-a3fc-6eb45db51b18",
      "name": "Hollerdex contacts",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        0
      ],
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/cybermax~website-contacts/run-sync-get-dataset-items",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "120"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_APIFY_TOKEN"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ domains: $json.domains, maxPagesPerDomain: 6, includePersonalEmails: false }) }}",
        "options": {
          "timeout": 300000
        }
      }
    },
    {
      "id": "0e25af51-7d8c-457d-ab22-dc66e2fe3913",
      "name": "Collect domains",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        0
      ],
      "parameters": {
        "jsCode": "// Collapse the contact cards back into one list of domains for the next call.\nconst domains = [...new Set($input.all().map((i) => i.json.domain).filter(Boolean))];\nreturn [{ json: { domains } }];"
      }
    },
    {
      "id": "07786b74-ff09-4b58-a4cb-a10f8b8b0623",
      "name": "DomainDNA tech stack",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        0
      ],
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/cybermax~domain-intel/run-sync-get-dataset-items",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "timeout",
              "value": "120"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_APIFY_TOKEN"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ domains: $json.domains }) }}",
        "options": {
          "timeout": 300000
        }
      }
    },
    {
      "id": "164d4ac2-8a0d-4253-a9d9-cf357b6fca79",
      "name": "Merge per domain",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1100,
        0
      ],
      "parameters": {
        "jsCode": "// Join both results on the domain field.\nconst contacts = Object.fromEntries($('Hollerdex contacts').all().map((i) => [i.json.domain, i.json]));\nreturn $input.all().map((i) => {\n  const c = contacts[i.json.domain] || {};\n  return { json: {\n    domain: i.json.domain,\n    company: c.companyName,\n    primaryEmail: c.primaryEmail,\n    primaryPhone: c.primaryPhone,\n    socials: c.socials,\n    contactPageUrl: c.contactPageUrl,\n    techSummary: i.json.summary,\n    technologies: i.json.technologies,\n    registration: i.json.registration,\n  } };\n});"
      }
    }
  ],
  "connections": {
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "Domain list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Domain list": {
      "main": [
        [
          {
            "node": "Hollerdex contacts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hollerdex contacts": {
      "main": [
        [
          {
            "node": "Collect domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Collect domains": {
      "main": [
        [
          {
            "node": "DomainDNA tech stack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "DomainDNA tech stack": {
      "main": [
        [
          {
            "node": "Merge per domain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "active": false,
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}
