{
  "name": "Skip trace property owners with ScraperCity and sync contacts to Airtable",
  "nodes": [
    {
      "id": "a1000000-0000-0000-0000-000000000001",
      "name": "When clicking 'Execute workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2000,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000002",
      "name": "Configure Search Inputs",
      "type": "n8n-nodes-base.set",
      "position": [
        -1750,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000003",
      "name": "Submit Skip Trace Job",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1500,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000004",
      "name": "Store Run ID",
      "type": "n8n-nodes-base.set",
      "position": [
        -1250,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000005",
      "name": "Wait 60 Seconds Before Poll",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1000,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000006",
      "name": "Check Scrape Status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -750,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000007",
      "name": "Is Scrape Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        -500,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000008",
      "name": "Wait 60 Seconds Before Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        -250,
        592
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000009",
      "name": "Pass Run ID to Retry",
      "type": "n8n-nodes-base.set",
      "position": [
        -500,
        592
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000010",
      "name": "Download Trace Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -250,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000011",
      "name": "Parse Contact Records",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000012",
      "name": "Remove Duplicate Contacts",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        250,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000013",
      "name": "Filter Records with Contact Info",
      "type": "n8n-nodes-base.filter",
      "position": [
        500,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000014",
      "name": "Sync Contacts to Airtable",
      "type": "n8n-nodes-base.airtable",
      "position": [
        750,
        400
      ]
    },
    {
      "id": "a1000000-0000-0000-0000-000000000020",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2600,
        100
      ],
      "parameters": {
        "width": 450,
        "height": 580,
        "content": "## How it works\n1. **Configure Search Inputs** -- set the property owner name, phone, or email you want to trace.\n2. **Submit Skip Trace Job** posts the lookup to ScraperCity People Finder and receive"
      }
    },
    {
      "id": "a1000000-0000-0000-0000-000000000021",
      "name": "Section - Configuration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2040,
        -160
      ],
      "parameters": {
        "width": 980,
        "height": 330,
        "content": "## Configuration\n**Configure Search Inputs** is the only node you need to edit before running. Set `ownerName`, `ownerPhone`, or `ownerEmail` -- at least one is required. Adjust `maxResults` (default "
      }
    },
    {
      "id": "a1000000-0000-0000-0000-000000000022",
      "name": "Section - Job Submission",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1040,
        -160
      ],
      "parameters": {
        "width": 730,
        "height": 530,
        "content": "## Job Submission\n**Submit Skip Trace Job** sends the lookup payload to the ScraperCity People Finder endpoint and receives a `runId`. **Store Run ID** saves that ID so the polling loop can reference "
      }
    },
    {
      "id": "a1000000-0000-0000-0000-000000000023",
      "name": "Section - Async Polling Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -290,
        -160
      ],
      "parameters": {
        "width": 730,
        "height": 530,
        "content": "## Async Polling Loop\nScraperCity jobs run asynchronously and may take several minutes. **Wait 60 Seconds Before Poll** pauses execution. **Check Scrape Status** queries the job. **Is Scrape Complete?"
      }
    },
    {
      "id": "a1000000-0000-0000-0000-000000000024",
      "name": "Section - Results Processing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        460,
        -160
      ],
      "parameters": {
        "width": 480,
        "height": 330,
        "content": "## Results Processing\n**Download Trace Results** fetches the completed CSV/JSON payload. **Parse Contact Records** normalises fields into a consistent schema (name, phone, email, address). **Remove Du"
      }
    }
  ],
  "connections": {
    "Store Run ID": {
      "main": [
        [
          {
            "node": "Wait 60 Seconds Before Poll",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Scrape Status": {
      "main": [
        [
          {
            "node": "Is Scrape Complete?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Scrape Complete?": {
      "main": [
        [
          {
            "node": "Download Trace Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Pass Run ID to Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pass Run ID to Retry": {
      "main": [
        [
          {
            "node": "Wait 60 Seconds Before Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Contact Records": {
      "main": [
        [
          {
            "node": "Remove Duplicate Contacts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Skip Trace Job": {
      "main": [
        [
          {
            "node": "Store Run ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Trace Results": {
      "main": [
        [
          {
            "node": "Parse Contact Records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configure Search Inputs": {
      "main": [
        [
          {
            "node": "Submit Skip Trace Job",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicate Contacts": {
      "main": [
        [
          {
            "node": "Filter Records with Contact Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 60 Seconds Before Poll": {
      "main": [
        [
          {
            "node": "Check Scrape Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 60 Seconds Before Retry": {
      "main": [
        [
          {
            "node": "Check Scrape Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Records with Contact Info": {
      "main": [
        [
          {
            "node": "Sync Contacts to Airtable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "Configure Search Inputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}