{
  "openapi": "3.0.1",
  "info": {
    "title": "Remove Duplicate Leads - Google Maps & Apollo-style Lists",
    "description": "Your Google Maps and Apollo exports are full of duplicates. Fuzzy-match name, phone, domain, address and map location, merge each group into one richest record and see exactly why. Also normalizes addresses and links records across sources. No login, no API key.",
    "version": "2.0",
    "x-build-id": "LQycYr3EWL1WmVuTy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/that_red_bird~lead-list-deduplicator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-that_red_bird-lead-list-deduplicator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/that_red_bird~lead-list-deduplicator/runs": {
      "post": {
        "operationId": "runs-sync-that_red_bird-lead-list-deduplicator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/that_red_bird~lead-list-deduplicator/run-sync": {
      "post": {
        "operationId": "run-sync-that_red_bird-lead-list-deduplicator",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "What to do",
            "enum": [
              "dedupe",
              "resolve",
              "normalize"
            ],
            "type": "string",
            "description": "dedupe = merge duplicate leads into one clean row each (default). resolve = keep every row but tag rows that are the same business/person with a shared entity id (link several sources). normalize = standardise addresses, phones, e-mails and websites without merging anything.",
            "default": "dedupe"
          },
          "records": {
            "title": "Leads (JSON rows)",
            "type": "array",
            "description": "Your leads as an array of row objects: paste Google Maps scraper items, an Apollo-style export, a LinkedIn / Sales Navigator export or any CRM rows. Nested objects such as location.lat are understood. The default is a small Google Maps sample so an empty run shows real output.",
            "default": [
              {
                "title": "Blue Door Dental Care",
                "categoryName": "Dentist",
                "address": "120 Main St, Austin, TX 78701",
                "street": "120 Main St",
                "city": "Austin",
                "state": "Texas",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "(512) 555-0134",
                "website": "https://www.bluedoordental.com/",
                "totalScore": 4.8,
                "reviewsCount": 212,
                "location": {
                  "lat": 30.26721,
                  "lng": -97.74312
                },
                "placeId": "ChIJ_bluedoor_A"
              },
              {
                "title": "Blue Door Dental",
                "categoryName": "Dental clinic",
                "address": "120 Main Street, Austin, TX 78701",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "+1 512-555-0134",
                "website": "http://bluedoordental.com/?utm_source=google",
                "reviewsCount": 0,
                "placeId": "ChIJ_bluedoor_B"
              },
              {
                "title": "Lakeside Pizza & Pasta",
                "categoryName": "Pizza restaurant",
                "address": "45 Lake Ave, Austin, TX 78702",
                "street": "45 Lake Ave",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78702",
                "countryCode": "US",
                "phone": "(512) 555-0178",
                "totalScore": 4.4,
                "reviewsCount": 891,
                "location": {
                  "lat": 30.2601,
                  "lng": -97.7102
                },
                "placeId": "ChIJ_lakeside_1"
              },
              {
                "title": "Lakeside Pizza and Pasta LLC",
                "categoryName": "Restaurant",
                "address": "45 Lake Avenue, Austin, TX 78702",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78702",
                "countryCode": "US",
                "phone": "512.555.0178",
                "website": "https://lakesidepizzaatx.com",
                "totalScore": 4.4,
                "reviewsCount": 893,
                "location": {
                  "lat": 30.26012,
                  "lng": -97.71021
                },
                "placeId": "ChIJ_lakeside_1"
              },
              {
                "title": "Hill Country Coffee",
                "categoryName": "Coffee shop",
                "address": "900 Congress Ave, Austin, TX 78701",
                "street": "900 Congress Ave",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "(512) 555-0102",
                "website": "https://hillcountrycoffee.com",
                "totalScore": 4.6,
                "reviewsCount": 540,
                "location": {
                  "lat": 30.2712,
                  "lng": -97.7431
                },
                "placeId": "ChIJ_hcc_congress"
              },
              {
                "title": "Hill Country Coffee",
                "categoryName": "Coffee shop",
                "address": "2100 S Lamar Blvd, Austin, TX 78704",
                "street": "2100 S Lamar Blvd",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78704",
                "countryCode": "US",
                "phone": "(512) 555-0166",
                "website": "https://hillcountrycoffee.com",
                "totalScore": 4.5,
                "reviewsCount": 377,
                "location": {
                  "lat": 30.2453,
                  "lng": -97.769
                },
                "placeId": "ChIJ_hcc_lamar"
              },
              {
                "title": "Hill Country Coffee Roasters",
                "categoryName": "Coffee roaster",
                "address": "900 Congress Avenue, Austin, TX 78701",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "512.555.0102",
                "totalScore": 4.1,
                "reviewsCount": 12,
                "placeId": "ChIJ_hcc_roasters_old"
              },
              {
                "title": "Greenleaf Plumbing Co.",
                "categoryName": "Plumber",
                "address": "77 Industrial Blvd, Round Rock, TX 78664",
                "street": "77 Industrial Blvd",
                "city": "Round Rock",
                "state": "TX",
                "postalCode": "78664",
                "countryCode": "US",
                "phone": "(512) 555-0190",
                "totalScore": 4.9,
                "reviewsCount": 64,
                "placeId": "ChIJ_greenleaf_1"
              },
              {
                "title": "Green Leaf Plumbing",
                "categoryName": "Plumbing service",
                "address": "77 Industrial Boulevard, Round Rock, TX 78664",
                "city": "Round Rock",
                "state": "TX",
                "postalCode": "78664",
                "countryCode": "US",
                "website": "https://greenleafplumbing.net",
                "totalScore": 4.9,
                "reviewsCount": 61,
                "placeId": "ChIJ_greenleaf_2"
              },
              {
                "title": "Austin Bike Works",
                "categoryName": "Bicycle shop",
                "address": "301 E 6th St, Austin, TX 78701",
                "street": "301 E 6th St",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "(512) 555-0155",
                "website": "https://austinbikeworks.com",
                "totalScore": 4.7,
                "reviewsCount": 158,
                "placeId": "ChIJ_bike_1"
              },
              {
                "title": "Austin Bike Workshop",
                "categoryName": "Bicycle repair shop",
                "address": "1802 Barton Springs Rd, Austin, TX 78704",
                "street": "1802 Barton Springs Rd",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78704",
                "countryCode": "US",
                "phone": "(512) 555-0121",
                "website": "https://austinbikeworkshop.org",
                "totalScore": 4.3,
                "reviewsCount": 90,
                "placeId": "ChIJ_bike_2"
              },
              {
                "title": "Maria's Taqueria",
                "categoryName": "Mexican restaurant",
                "address": "15 Cesar Chavez St, Austin, TX 78701",
                "street": "15 Cesar Chavez St",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "(512) 555-0143",
                "totalScore": 4.5,
                "reviewsCount": 1210,
                "placeId": "ChIJ_maria_1"
              },
              {
                "title": "Marias Taqueria",
                "categoryName": "Taco restaurant",
                "address": "15 Cesar Chavez Street, Austin, TX 78701",
                "city": "Austin",
                "state": "TX",
                "postalCode": "78701",
                "countryCode": "US",
                "phone": "+15125550143",
                "website": "https://mariastaqueriaatx.com",
                "totalScore": 4.5,
                "reviewsCount": 1208,
                "placeId": "ChIJ_maria_2"
              },
              {
                "title": "Oak Street Veterinary Clinic",
                "categoryName": "Veterinarian",
                "address": "8 Oak St, Cedar Park, TX 78613",
                "street": "8 Oak St",
                "city": "Cedar Park",
                "state": "TX",
                "postalCode": "78613",
                "countryCode": "US",
                "phone": "(512) 555-0111",
                "website": "https://oakstreetvet.com",
                "totalScore": 4.8,
                "reviewsCount": 300,
                "placeId": "ChIJ_oak_1"
              }
            ]
          },
          "datasetIds": {
            "title": "Apify datasets",
            "type": "array",
            "description": "Optional. Datasets (pick from your storage or pass dataset IDs) to pull rows from, for example the dataset of a Google Maps scraper run. Rows from every dataset are combined with the rows above. Several datasets let you de-duplicate across runs and sources. Use the picker rather than typing an ID: it gives this Actor permission to read your dataset."
          },
          "sourceUrl": {
            "title": "CSV or JSON file URL",
            "type": "string",
            "description": "Optional. A public URL to a CSV, JSON or NDJSON file (Google Sheets \"publish to web\" CSV, S3 link, Apify dataset items URL). Leave empty to skip.",
            "default": ""
          },
          "csvText": {
            "title": "Pasted CSV text",
            "type": "string",
            "description": "Optional. Paste CSV text with a header row (comma, semicolon or tab separated). Leave empty to skip.",
            "default": ""
          },
          "schema": {
            "title": "Lead format",
            "enum": [
              "auto",
              "googleMaps",
              "leadFinder",
              "generic"
            ],
            "type": "string",
            "description": "How to read your columns. Auto-detect works for most lists. Pick Google Maps if \"title\" is the business name; pick Lead finder if \"title\" is a job title.",
            "default": "auto"
          },
          "fieldMap": {
            "title": "Column overrides",
            "type": "object",
            "description": "Optional. Tell the Actor which column holds what when auto-detection guesses wrong, e.g. {\"name\":\"Company Name\",\"phone\":\"Tel\",\"website\":\"Site\",\"address\":\"Street\",\"city\":\"Town\",\"postcode\":\"ZIP\",\"email\":\"Contact Email\"}. Supported keys: name, firstName, lastName, company, jobTitle, email, phone, website, linkedin, address, city, region, postcode, country, placeId, lat, lng.",
            "default": {}
          },
          "matchThreshold": {
            "title": "Merge threshold (0-100)",
            "minimum": 50,
            "maximum": 100,
            "type": "integer",
            "description": "Pairs scoring at or above this are merged automatically. Higher is safer (fewer wrong merges) but misses more duplicates. 85 is a good start; shared Google place IDs, LinkedIn URLs and personal e-mails always merge.",
            "default": 85
          },
          "reviewThreshold": {
            "title": "Review threshold (0-100)",
            "minimum": 30,
            "maximum": 100,
            "type": "integer",
            "description": "Pairs scoring between this and the merge threshold are NOT merged but listed in the REVIEW_PAIRS record so you can decide. Must be at or below the merge threshold.",
            "default": 70
          },
          "mergePolicy": {
            "title": "Which value wins on conflict",
            "enum": [
              "richest",
              "longest",
              "mostCommon",
              "first"
            ],
            "type": "string",
            "description": "When duplicates disagree on a field (two different websites, say), this picks the value kept. Empty fields are always filled from the other duplicates, and every conflict is listed in the cluster report.",
            "default": "richest"
          },
          "outputMode": {
            "title": "Dataset contents",
            "enum": [
              "clean",
              "clusters",
              "all"
            ],
            "type": "string",
            "description": "clean = only the de-duplicated leads (ready to re-import). clusters = only the merge report, one row per merged group with the reasons. all = clean leads plus the report rows. Review pairs and a CLEAN.csv file are always saved to the key-value store.",
            "default": "clean"
          },
          "addDedupeFields": {
            "title": "Add _dedupe columns",
            "type": "boolean",
            "description": "Add _dedupeClusterId, _dedupeSize, _dedupeConfidence, _dedupeSourceRows and _dedupeMatchedOn to each clean row so you can trace it back to the original rows. Turn off for a pristine re-import file.",
            "default": true
          },
          "defaultCountry": {
            "title": "Default country for addresses",
            "enum": [
              "auto",
              "US",
              "GB",
              "DE",
              "FR"
            ],
            "type": "string",
            "description": "Used by address parsing when the country cannot be told from the text. Parsing supports US, UK, German and French formats; other countries still match on city, postcode and street text.",
            "default": "auto"
          },
          "maxClusterSize": {
            "title": "Largest allowed duplicate group",
            "minimum": 2,
            "maximum": 1000,
            "type": "integer",
            "description": "Safety brake against chain reactions: a merge that would build a group larger than this is held back and listed for review instead.",
            "default": 25
          },
          "maxBlockSize": {
            "title": "Max candidate group size (advanced)",
            "minimum": 10,
            "maximum": 20000,
            "type": "integer",
            "description": "Records are first grouped by cheap keys (phone, domain, name + city, map cell) and only compared inside a group. Groups larger than this (for example 900 records sharing one common name) are skipped for speed.",
            "default": 500
          },
          "maxRecords": {
            "title": "Max rows to process",
            "minimum": 1,
            "maximum": 500000,
            "type": "integer",
            "description": "Upper limit of rows read from all sources. Extra rows are ignored and noted in the run summary.",
            "default": 200000
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}