{
  "openapi": "3.0.1",
  "info": {
    "title": "Yelp Scraper - Businesses & Reviews via Yelp API",
    "description": "Scrape Yelp businesses and reviews through Yelp's official Fusion API. Yelp gives only three reviews per business. We cannot change that. The rest arrives whole: name, rating, review count, price, phone and address. Categories, GPS and review text are included too. Bring your own free Yelp key.",
    "version": "0.1",
    "x-build-id": "A1zrt1XMXX1cPRk8C"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~yelp-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-yelp-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/dami_studio~yelp-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-yelp-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/dami_studio~yelp-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-yelp-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": {
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Listing searches. Each entry is \"{term} in {location}\", e.g. \"coffee in San Francisco\", \"plumbers in Austin, TX\". Use this OR the single query + location fields below.",
            "items": {
              "type": "string"
            }
          },
          "query": {
            "title": "Search term (single)",
            "type": "string",
            "description": "A single search term, e.g. \"coffee\", \"dentist\", \"pizza\". Combine with the Location field below. Ignored if Search queries is used."
          },
          "location": {
            "title": "Location (single)",
            "type": "string",
            "description": "City / area for the single search term above, e.g. \"San Francisco\", \"Austin, TX\", \"10001\"."
          },
          "businessUrls": {
            "title": "Business URLs",
            "type": "array",
            "description": "Yelp business page URLs (https://www.yelp.com/biz/...) to scrape for full detail + reviews. Use this for detail mode.",
            "items": {
              "type": "string"
            }
          },
          "businessSlugs": {
            "title": "Business slugs",
            "type": "array",
            "description": "Yelp business slugs (the part after /biz/, e.g. \"blue-bottle-coffee-san-francisco-7\") to scrape for full detail + reviews.",
            "items": {
              "type": "string"
            }
          },
          "countryCode": {
            "title": "Proxy country",
            "type": "string",
            "description": "Residential proxy country (2-letter ISO). Yelp is geo-aware; use US for US searches, GB/CA/etc. for other Yelp regions.",
            "default": "US"
          },
          "maxItems": {
            "title": "Max businesses",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of businesses to collect across all inputs (search paginates in batches of 10). Note: on a search row, only name, yelpUrl and slug are guaranteed — rating, reviewCount, category, price, phone, address, city, state, zip, lat and lng can be null when Yelp's structured data is missing and the DOM fallback is used. Use businessUrls/businessSlugs (detail mode) for complete records.",
            "default": 50
          },
          "maxReviews": {
            "title": "Max reviews per business",
            "minimum": 0,
            "maximum": 2000,
            "type": "integer",
            "description": "For business URL/slug detail mode: how many reviews to include per business (author, rating, text, date). 0 = no reviews. Listing search rows never include reviews.",
            "default": 0
          },
          "slackConnector": {
            "title": "Slack connector (optional)",
            "type": "string",
            "description": "Optional. Post a summary of the scrape (count + top 5 businesses + dataset link) to Slack when the run finishes. Authorize a Slack connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default) — results are always saved to the dataset regardless."
          },
          "slackChannel": {
            "title": "Slack channel",
            "type": "string",
            "description": "Channel for the Slack summary (only used if a Slack connector is set), e.g. \"#leads\". Defaults to #general."
          },
          "notionConnector": {
            "title": "Notion connector (optional)",
            "type": "string",
            "description": "Optional. Write each scraped business as a page into your Notion when the run finishes — great for turning leads into a CRM. Authorize a Notion connector once in Settings → API & Integrations → MCP connectors, then pick it here. Leave empty to skip (default) — results are always saved to the dataset regardless."
          },
          "notionParentId": {
            "title": "Notion target data source ID",
            "type": "string",
            "description": "Optional. The Notion data source ID of the database to write businesses into (only used if a Notion connector is set). Leave empty to create the pages privately in your workspace instead."
          },
          "yelpApiKey": {
            "title": "Yelp Fusion API key",
            "type": "string",
            "description": "Your free Yelp Fusion API key (create one at https://www.yelp.com/developers/v3/manage_app and paste the API Key, not the Client ID). Yelp's public pages are protected by DataDome and cannot be scraped reliably, so the API is the only way to get real results. Without a key the run returns one labelled sample row and is not charged."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Apify Proxy or your own proxy servers. This Actor returns data through the official Yelp Fusion API (add a free key in \"yelpApiKey\"), so a proxy is not required. Metered proxy groups (RESIDENTIAL) are not offered and are served from rotating datacenter addresses instead; your own proxyUrls are always used as given.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}