{
  "openapi": "3.0.1",
  "info": {
    "title": "Dentist & Doctor Lead Scraper — Dental Practice Contacts",
    "description": "Find dentists, orthodontists, doctors and clinics by city. Collect public business emails, phones, websites and source links. Multi-city searches, exclusions and verification evidence. Export CSV or use the n8n Google Sheets template. Store-tier discounts available.",
    "version": "1.8",
    "x-build-id": "MQdEOwtQBXMDDFFpw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/samstorm~dentist-lead-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-samstorm-dentist-lead-scraper",
        "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/samstorm~dentist-lead-scraper/runs": {
      "post": {
        "operationId": "runs-sync-samstorm-dentist-lead-scraper",
        "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/samstorm~dentist-lead-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-samstorm-dentist-lead-scraper",
        "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",
        "required": [
          "businessType",
          "location"
        ],
        "properties": {
          "businessType": {
            "title": "Business Type",
            "enum": [
              "Dentist",
              "Doctor",
              "Clinic",
              "Orthodontist",
              "Chiropractor",
              "Veterinarian",
              "Pharmacy",
              "Physical Therapist",
              "Custom"
            ],
            "type": "string",
            "description": "Select the type of healthcare provider to find on Google Maps. The actor automatically constructs the search using this type plus your location — for example, selecting 'Dentist' searches for dentist offices in the city you specify, while 'Orthodontist' targets orthodontic practices. Choose 'Custom' to write your own search query instead (e.g., 'pediatric dentists near downtown Chicago').",
            "default": "Dentist"
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "The city, state, or region to search for dental and healthcare practices in. Use 'City, ST' format for US locations (e.g., 'Chicago, IL' or 'Houston, TX'). You can also use zip codes ('60601'), neighborhoods ('Lincoln Park Chicago'), or broader regions ('Greater Boston'). The actor searches Google Maps within this area. For US 'City, ST' searches, returned records must have that city and state in their Maps address; nearby municipalities are excluded. Other location formats use Google's area matching. A Custom query must include the location to enable this address check."
          },
          "searchQuery": {
            "title": "Custom Search Query",
            "type": "string",
            "description": "A raw Google Maps search query, used only when Business Type is set to 'Custom'. For all other business types, the search is built automatically from Business Type + Location. Write queries the same way you would type them into Google Maps (e.g., 'pediatric dentists in Chicago, IL' or 'dental offices in 60601')."
          },
          "maxResults": {
            "title": "Max Results",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum business records returned across all locations combined (1–500). The default is 3. Start with 3–10 records to validate coverage and data quality. Maps may return fewer matching businesses.",
            "default": 3
          },
          "enrichEmails": {
            "title": "Find Email Addresses",
            "type": "boolean",
            "description": "When enabled, the actor visits each practice website and scans contact pages, footers, and about pages to extract email addresses. Disable this option if you only need phone numbers and addresses, or want faster results without website crawling.",
            "default": true
          },
          "verifyEmails": {
            "title": "Check email verification status",
            "type": "boolean",
            "description": "Optional DNS and SMTP checks. Off by default to reduce waiting; enable when you need verification evidence. True emailVerified requires recipient acceptance plus rejection of a random recipient. MX records, catch-all servers and inconclusive checks do not confirm a mailbox. Delivery is not guaranteed.",
            "default": false
          },
          "enrichSocials": {
            "title": "Find Social Media Links",
            "type": "boolean",
            "description": "Optional collection of public social profile links from business websites. Off by default; enable when social links are useful for your research.",
            "default": false
          },
          "outputFormat": {
            "title": "Output Format",
            "enum": [
              "full",
              "hubspot",
              "salesforce"
            ],
            "type": "string",
            "description": "Full preserves source URLs, email verification status and domain evidence. HubSpot and Salesforce provide column mappings; review destination fields and custom properties before import. CSV, JSON and Excel exports are available from the dataset.",
            "default": "full"
          },
          "proxyUrl": {
            "title": "Custom Proxy URL (optional)",
            "type": "string",
            "description": "Optional HTTP proxy URL for using third-party residential proxies instead of Apify's built-in proxies. Format: http://username:password@host:port. Compatible with IPRoyal, Smartproxy, Bright Data, and other rotating proxy services. Leave empty to use Apify's default residential proxies."
          },
          "locations": {
            "title": "Multiple locations (optional)",
            "type": "array",
            "description": "Up to 20 cities or regions. Overrides Location when supplied. Max Results is a total cap across all locations. For a Custom query, include {location} in the query.",
            "items": {
              "type": "string"
            }
          },
          "excludeMapsUrls": {
            "title": "Previously collected Maps URLs (optional)",
            "type": "array",
            "description": "Exclude previously collected businesses by their Maps URL. Supply up to 5000 URLs from an earlier export to collect new records without automatically sharing data across runs.",
            "items": {
              "type": "string"
            }
          },
          "maxRuntimeSeconds": {
            "title": "Processing time budget (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Stop starting new work after this time budget. An in-progress scrape or enrichment batch may take additional time. Use Apify run timeout and spending controls for hard limits.",
            "default": 600
          },
          "maxCandidatesPerLocation": {
            "title": "Candidate scan limit per location (optional)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Maximum unique Maps listings scanned per location, including previously collected listings (1–500). Exclusions are checked before fetching details. When omitted, the scan limit is the remaining result count plus the number of excluded URLs, capped at 500. Increase it when many candidates are excluded or outside the requested city. maxResults still caps returned records; source and time limits can produce fewer matches."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}