{
  "openapi": "3.0.1",
  "info": {
    "title": "Yelp Scraper - Businesses & Reviews via Yelp API",
    "description": "Pull Yelp businesses and reviews reliably through Yelp's official Fusion API - name, rating, review count, price, phone, address, GPS, categories and review text. Bring your own free Yelp API key (60 seconds to create). No blocked runs, no captchas. Runs without a key are never charged.",
    "version": "0.1",
    "x-build-id": "9NBgTlggSb8NZseCs"
  },
  "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"
            }
          },
          "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."
          },
          "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"
            }
          },
          "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
          },
          "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"
          },
          "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."
          },
          "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}