{
  "openapi": "3.0.1",
  "info": {
    "title": "DuckDuckGo Scraper - Local Business Data, Yelp, Apple Maps",
    "description": "Local businesses Google Maps misses: 82 of 164 businesses returned here were not in Google Maps at all, measured on 10 category and city pairs. Website filled for 97.9% of rows, 44 fields per business, from Yelp and Apple Maps data. DuckDuckGo local business data API, Yelp data scraper.",
    "version": "0.1",
    "x-build-id": "Oe4lXRWZEAQGQoOFw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~duckduckgo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-duckduckgo-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/snow_leo_data~duckduckgo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-duckduckgo-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/snow_leo_data~duckduckgo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-duckduckgo-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",
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "What kind of business to look for: 'coffee', 'dentist', 'plumber', 'hair salon'. Every term is combined with every location below.",
            "default": [
              "coffee"
            ],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "City, region or postcode - 'Austin, TX', 'London', '78704'. Leave empty and the source answers with businesses near the datacentre this Actor runs in, which is almost never what you want.",
            "default": [
              "Austin, TX"
            ],
            "items": {
              "type": "string"
            }
          },
          "expandQueries": {
            "title": "Deep search (12 extra wordings per search)",
            "type": "boolean",
            "description": "The source has no paging: one search returns about 20 businesses and there is no page 2. Rewording the same search surfaces different businesses, so this option repeats every search with 12 measured prefixes ('cheap', 'top rated', 'open now', 'independent' and so on). Measured with the shipped list: coffee in Austin went from 18 businesses to 67, plumbers in Denver from 19 to 123. Costs 13x the requests.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum businesses to deliver",
            "minimum": 0,
            "type": "integer",
            "description": "Counts rows you actually RECEIVE, not rows looked at. Filters are applied before this limit and before you are charged, so a limit of 100 with filters on still delivers up to 100 matching businesses. 0 means no limit.",
            "default": 100
          },
          "areas": {
            "title": "Districts, suburbs or postcodes",
            "type": "array",
            "description": "Optional. Each one is added in front of every location to dig deeper into the same city: 'downtown', 'south', '78704'. This is the other way past the ~20-per-search ceiling.",
            "items": {
              "type": "string"
            }
          },
          "maxQueries": {
            "title": "Maximum searches per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "A guard on your own input: 20 terms x 20 cities x deep search is 5200 searches and over two hours of compute. Cheapest combinations run first, so cutting here costs you depth, not breadth.",
            "default": 120
          },
          "customQueries": {
            "title": "Raw searches",
            "type": "array",
            "description": "Advanced. Sent to the source word for word, ahead of everything else, exactly as typed - 'vegan bakery Brooklyn'. The location check cannot be applied to these, because there is no separate location to check against.",
            "items": {
              "type": "string"
            }
          },
          "verifyLocation": {
            "title": "Verify the location (recommended)",
            "type": "boolean",
            "description": "The source lies quietly in two ways. Give it a city it does not know and it answers HTTP 200 with businesses near the machine that sent the request - measured from an Apify container, a nonsense city returned 20 real coffee shops in Leesburg, Virginia, and nothing about that dataset looks wrong. Second, 'bakery mexico city' is understood and still returns a bakery in Oklahoma City. With this on, both kinds of row are dropped and counted in the REPORT record instead of being handed to you as yours.",
            "default": true
          },
          "reviewsPerBusiness": {
            "title": "Reviews per business",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "The source carries up to 5 review excerpts per business, with star rating, author and date. Measured on 517 live businesses: 3 reviews for 265 of them, 5 for 121, none for 92. Set to 0 to leave review text out.",
            "default": 3
          },
          "onlyWithWebsite": {
            "title": "Only businesses with a website",
            "type": "boolean",
            "description": "A website is carried for 97.9% of businesses in a 375-row sample - it is where you go next for an email address.",
            "default": false
          },
          "onlyWithoutWebsite": {
            "title": "Only businesses WITHOUT a website",
            "type": "boolean",
            "description": "The classic lead list for anyone selling web design.",
            "default": false
          },
          "onlyWithPhone": {
            "title": "Only businesses with a phone number",
            "type": "boolean",
            "description": "A phone number is carried for 94.7% of businesses in a 375-row sample.",
            "default": false
          },
          "onlyWithReviewText": {
            "title": "Only businesses with review text",
            "type": "boolean",
            "description": "Needs 'Reviews per business' above 0.",
            "default": false
          },
          "skipPermanentlyClosed": {
            "title": "Skip permanently closed businesses",
            "type": "boolean",
            "description": "Drops businesses the source marks as closed for good. A business whose status is unknown is kept.",
            "default": false
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Ratings run 1 to 5. A business with no rating at all is kept, not dropped."
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "type": "integer",
            "description": "A business with no review count at all is kept, not dropped."
          },
          "minPriceLevel": {
            "title": "Minimum price level",
            "minimum": 0,
            "maximum": 4,
            "type": "integer",
            "description": "1 is $, 4 is $$$$. Carried for 32.3% of businesses worldwide and 57.7% of US restaurants and bars."
          },
          "maxPriceLevel": {
            "title": "Maximum price level",
            "minimum": 0,
            "maximum": 4,
            "type": "integer",
            "description": "1 is $, 4 is $$$$. Leave at 0 for no upper bound."
          },
          "categoryContains": {
            "title": "Category contains",
            "type": "string",
            "description": "Case-insensitive substring, matched against every category the business carries."
          },
          "nameContains": {
            "title": "Name contains",
            "type": "string",
            "description": "Case-insensitive substring of the business name."
          },
          "websiteDomainContains": {
            "title": "Website domain contains",
            "type": "string",
            "description": "Find the businesses on one platform - 'squarespace.com', 'wixsite.com'."
          },
          "countryCodes": {
            "title": "Keep only these countries",
            "type": "array",
            "description": "Two-letter codes: US, GB, DE, FR, NL, IN, AE.",
            "items": {
              "type": "string"
            }
          },
          "requiredAmenities": {
            "title": "Required amenities",
            "type": "array",
            "description": "A business whose amenities are unknown is kept, not dropped.",
            "items": {
              "type": "string",
              "enum": [
                "wifi_free",
                "wifi_paid",
                "parking",
                "parking_valet",
                "outdoor_seating",
                "wheelchair_accessible",
                "dogs_allowed",
                "restaurant_takeout",
                "restaurant_delivery"
              ],
              "enumTitles": [
                "Free wifi",
                "Paid wifi",
                "Parking",
                "Valet parking",
                "Outdoor seating",
                "Wheelchair accessible",
                "Dogs allowed",
                "Takeout",
                "Delivery"
              ]
            }
          },
          "incremental": {
            "title": "Monitor mode: only new and changed businesses",
            "type": "boolean",
            "description": "Remembers what it already gave you in a named key-value store and labels every row NEW, UPDATED or UNCHANGED. The fingerprint covers name, category, address, phone, website, rating, review count, opening hours, price level and closure - not 'open right now', which changes by the minute and would mark half the city as changed on every run.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Emit unchanged businesses too",
            "type": "boolean",
            "description": "Only matters in monitor mode. Off, an unchanged business is not written and not charged.",
            "default": false
          },
          "compactOutput": {
            "title": "Compact output: drop empty fields",
            "type": "boolean",
            "description": "For AI agents and anyone paying for volume. Name, id, address, city and country stay even when empty, so a consumer reading by schema does not trip over a missing column.",
            "default": false
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for one request. The source answers in about 2 seconds; raise this only if you see timeouts in the log.",
            "default": 30
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}