# Yelp Leads & Business Scraper + AI + Emails + Unlimited Reviews (`memo23/yelp-scraper`) Actor

Yelp scraper with business emails — the only Yelp tool built for lead-gen. Scrape any search or business URL for name, rating, phone, website, hours, categories, price level + unlimited reviews (past the 3-review cap). Optional contact-email enrichment. Bulk JSON or CSV, pure HTTP.

- **URL**: https://apify.com/memo23/yelp-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, AI, Agents
- **Stats:** 325 total users, 53 monthly users, 99.7% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.75 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Yelp Leads & Business Scraper — Emails + Unlimited Reviews

### How It Works

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/yelp-how-it-works.png" alt="How the Yelp Leads & Business Scraper works" width="760" />
</p>

**The only Yelp scraper built for lead generation.** Paste any Yelp search or business URL and get a clean, per-business row — name, rating, phone, website, address, hours, categories, price level — plus an optional **verified contact email** and **unlimited customer reviews** (no 3-review API cap). Bulk export to JSON or CSV. Pure HTTP, no headless browser to babysit.

> Built for sales teams, agencies, and market researchers who need Yelp turned into an actionable B2B contact list — not just another business dump.

### Why Use This Scraper?

- 📧 **Contact emails nobody else returns** — opt-in email enrichment reads each business's own website and attaches a real `contactEmail`, so your Yelp export is a ready-to-use lead list.
- ⭐ **Unlimited reviews** — pull every review per business, well past the 3-review limit of Yelp's official API, with full reviewer profiles and feedback counts.
- 🏢 **25+ business fields** — rating, review count, claim status, price level, categories, full address, phone, website, hours, owner info, amenities, photos, and the Yelp business ID.
- 🔗 **Any URL works** — Yelp search result pages *and* individual business pages, mixed freely in one run.
- ⚡ **Bulk and fast** — pure HTTP pipeline with configurable concurrency; scales from one business to thousands.
- 📤 **Clean JSON or CSV** — flat, predictable rows ready for your CRM, spreadsheet, or data warehouse.

### Overview

The Yelp Leads & Business Scraper extracts three things in one run, each opt-in so you only pay for what you need:

1. **Business profile** (always) — the core record for every business found.
2. **Customer reviews** (toggle `scrapeReviews`) — a nested `reviews[]` array per business.
3. **Contact email** (toggle `enrichEmails`) — a `contactEmail` + full enrichment object per business.

Output is **one row per business**. Reviews and email data are attached to that business row, so you never have to join datasets afterward.

### Supported Inputs

Provide one or more of these as `startUrls`. You can mix both kinds in a single run.

| Input type | Example | What you get |
|---|---|---|
| **Search URL** | `https://www.yelp.com/search?find_desc=grill&find_loc=Los+Angeles%2C+CA` | Every business across all result pages (auto-paginated) |
| **Business URL** | `https://www.yelp.com/biz/fresh-corn-grill-west-hollywood` | The full profile for that single business |

**Not supported:** Yelp user profiles, Yelp Collections/lists, and the Yelp events directory. Provide search or business URLs only.

### Use Cases

| Audience | What they do with it |
|---|---|
| **Sales & lead-gen teams** | Build targeted B2B contact lists (business + email + phone) by city and category |
| **Marketing agencies** | Prospect local businesses for outreach campaigns |
| **Market researchers** | Analyze ratings, categories, and price levels across a market |
| **Reputation / CX analysts** | Pull full review histories for sentiment and trend analysis |
| **Data teams** | Feed Yelp business and review data into a CRM, BI tool, or warehouse |

1. **Paste URLs** — drop any mix of Yelp search and business URLs into `startUrls`.
2. **Discover** — search URLs are paginated automatically; every business found is queued.
3. **Extract** — each business profile is parsed into 25+ flat fields.
4. **Enrich (optional)** — if enabled, the scraper pulls the full review history and looks up a contact email from the business's own website.
5. **Emit** — one clean row per business is pushed to your dataset, exportable as JSON or CSV.

Pure HTTP throughout — there's no headless browser or CAPTCHA solver for you to configure.

### Input Configuration

| Field | Type | Default | Notes |
|---|---|---|---|
| `startUrls` | array | — (required) | Yelp search and/or business URLs |
| `maxItems` | integer | `1000` | Cap total businesses scraped |
| `fetchBusinessDetails` | boolean | `true` | Visit each profile for the full field set (off = lightweight search rows) |
| `scrapeReviews` | boolean | `false` | Attach the full `reviews[]` array per business (requires `fetchBusinessDetails`) |
| `maxReviews` | integer | `1000` | Max reviews per business when `scrapeReviews` is on |
| `enrichEmails` | boolean | `false` | Look up a contact email per business (opt-in, billed per email found) |
| `maxConcurrency` | integer | `20` | Upper bound on parallel requests |
| `proxy` | object | Apify Residential | Proxy configuration |

#### Example input

```json
{
  "startUrls": [
    "https://www.yelp.com/search?find_desc=coffee&find_loc=Seattle%2C+WA"
  ],
  "maxItems": 50,
  "fetchBusinessDetails": true,
  "scrapeReviews": true,
  "maxReviews": 100,
  "enrichEmails": true,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output Overview

Each row is a single business. The base fields are always present. When `scrapeReviews` is on, a `reviews[]` array is added. When `enrichEmails` is on, `contactEmail`, `contactWebsite`, and an `emailEnrichment` object are added.

### Output Samples

#### Business row (base)

```jsonc
{
  "title": "Angie's Restaurant",
  "rating": 4.2,
  "reviewCount": "509 reviews",
  "isClaimed": true,
  "priceLevel": "$$",
  "categories": "Breakfast & Brunch,American",
  "fullAddress": "690 N Main St, Logan, UT 84321",
  "city": "Logan",
  "state": "UT",
  "zipcode": "84321",
  "phoneNumber": "(435) 752-9252",
  "website": "http://www.angiesrest.com/",
  "hours": { "Mon": "7:00 AM - 9:00 PM", "Tue": "7:00 AM - 9:00 PM" },
  "businessServices": ["Takeout", "Delivery", "Outdoor seating"],
  "photoCount": 312,
  "yelp_biz_id": "k0v1lBFP4vL8xQ2pXn3tZw",
  "url": "https://www.yelp.com/biz/angies-restaurant-logan",
  "timezone": "America/Denver",
  "timestamp": "2026-06-21T09:14:00Z"
}
```

#### With `scrapeReviews: true`

```jsonc
{
  "title": "Carmine's",
  "rating": 4.5,
  "reviews": [
    {
      "reviewId": "hK2MnjQdsxxVz6eCTbNdMA",
      "rating": 5,
      "text": "Old school Italian on a rainy cold night? Yes, please…",
      "createdAt": "2026-05-05T16:26:51Z",
      "user": {
        "id": "ZE6P_jaDtrBHWNkEKVm2LQ",
        "displayName": "Safia S.",
        "displayLocation": "Cleveland, OH",
        "reviewCount": 407,
        "friendCount": 42,
        "photo": "https://s3-media0.fl.yelpcdn.com/photo/%E2%80%A6/60s.jpg"
      },
      "feedback": { "usefulCount": 2, "funnyCount": 0, "coolCount": 2 },
      "hasOwnerResponse": true,
      "ownerResponse": {
        "id": "Gs3B1GLoEDegfff9YkRt4g",
        "text": "Thanks for taking the time to share your experience — I'll reach out privately…",
        "createdAtLocal": "2026-08-21T15:47:36-07:00",
        "ownerName": "Paulo Ed A.",
        "ownerRole": "MANAGER",
        "ownerPhoto": "https://s3-media0.fl.yelpcdn.com/buphoto/%E2%80%A6/30s.jpg"
      }
    }
  ]
}
```

#### With `enrichEmails: true`

```jsonc
{
  "title": "Angie's Restaurant",
  "website": "http://www.angiesrest.com/",
  "contactEmail": "info@angiesrest.com",
  "contactWebsite": "http://www.angiesrest.com/",
  "emailEnrichment": {
    "emails": ["info@angiesrest.com"],
    "emailDomains": ["angiesrest.com"],
    "website": "http://www.angiesrest.com/"
  }
}
```

### Key Output Fields

**Business** — `title`, `rating`, `reviewCount`, `isClaimed`, `priceLevel`, `categories`, `fullAddress`, `city`, `state`, `zipcode`, `phoneNumber`, `website`, `hours`, `about`, `businessOwnerName`, `businessServices`, `reviewhighlights`, `images`, `photoCount`, `yelp_biz_id`, `url`, `timezone`.

**Reviews** (`scrapeReviews`) — `reviews[].reviewId`, `rating`, `text`, `createdAt`, `user` (id, displayName, displayLocation, reviewCount, friendCount, photo), `photos`, `feedback` (usefulCount, funnyCount, coolCount), `hasOwnerResponse`, `ownerResponse` (id, text, createdAtLocal, ownerName, ownerRole, ownerPhoto — `null` when the owner never replied).

**Email enrichment** (`enrichEmails`) — `contactEmail`, `contactWebsite`, `emailEnrichment.emails`, `emailEnrichment.emailDomains`.

### How This Compares

| Capability | Most Yelp scrapers | This Actor |
|---|---|---|
| Business contact emails | ✗ | ✅ opt-in enrichment |
| Reviews per business | often capped (3, like the official API) | ✅ unlimited |
| Search **and** business URLs | one or the other | ✅ both, mixed in one run |
| Fields per business | 10–15 | ✅ 25+ |
| Reviews + emails on the same row | separate datasets | ✅ merged per business |
| Owner's public reply to a review | ✗ | ✅ text, manager name, role and date |
| Runtime | often headless browser | ✅ pure HTTP |

### FAQ

**Does it really return business emails?**
Yes — when `enrichEmails` is on, the scraper visits each business's own website (the one listed on its Yelp profile) and extracts a contact email. Coverage depends on the business publishing an email; not every business has one, and you're only billed per email actually found.

**How is this different from Yelp's official API?**
Yelp's Fusion API caps reviews at three per business and exposes no contact emails. This actor returns the full review history and adds email enrichment — neither of which the official API offers.

**Do I get the business owner's replies to reviews?**
Yes. Every review carries `ownerResponse` with the reply text, the replying manager's name and role, and the date — plus a flat `hasOwnerResponse` boolean so you can filter to reviews the business answered (or pointedly did not). Reviews with no reply return `null`, never an empty object. It costs nothing extra: the reply travels in the same request as the review.

**Can I scrape just business data without reviews or emails?**
Yes. Both `scrapeReviews` and `enrichEmails` default to **off** — leave them off for a fast, business-only run.

**Do I need to handle pagination?**
No. Search URLs are paginated automatically up to your `maxItems` limit.

**Can I mix search and business URLs in one run?**
Yes — put any combination in `startUrls`.

**What export formats are supported?**
JSON, CSV, Excel, and the other standard Apify dataset formats.

**Is a browser or CAPTCHA solver required?**
No. The actor runs over pure HTTP with no headless browser to configure.

### Support

Found a bug or need a field that isn't here? Open an issue on the actor's **Issues** tab, or contact the maintainer through the Apify Store profile. Reports with the input URL and run ID are resolved fastest.

### Additional Services

Need a custom Yelp workflow — scheduled monitoring, a specific field, webhook delivery into your CRM, or a tailored lead pipeline? Reach out via the Apify Store profile for custom scraping work.

### Explore More Scrapers

- **Google Maps Leads Scraper** — local business data and emails beyond Yelp
- **Trustpilot Scraper** — reviews and ratings at scale
- **Capterra / TrustRadius Scrapers** — B2B software reviews
- **LinkedIn Posts Scraper** — social and professional content
- Browse the full portfolio on the Apify Store profile.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/yelp-scraper`).

**Purpose:** Scrapes Yelp search and business pages into one row per business, with optional full review history (past the official API's 3-review cap) and opt-in contact-email enrichment for lead lists.

**Minimal input:**

```json
{
  "startUrls": ["https://www.yelp.com/search?find_desc=coffee&find_loc=Seattle%2C+WA"],
  "maxItems": 50
}
```

Single business: `{ "startUrls": ["https://www.yelp.com/biz/fresh-corn-grill-west-hollywood"], "maxItems": 1 }`

**Output:** one dataset row per business — title, rating, reviewCount, isClaimed, priceLevel, categories, fullAddress, city, state, zipcode, phoneNumber, website, hours, about, businessOwnerName, businessServices, images, photoCount, yelp\_biz\_id, url, timezone; with `scrapeReviews` also reviews\[] {reviewId, rating, text, createdAt, user {id, displayName, displayLocation, reviewCount, friendCount, photo}, feedback {usefulCount, funnyCount, coolCount}}; with `enrichEmails` also contactEmail, contactWebsite, emailEnrichment {emails, emailDomains}.

**Behaviors an agent should know:**

- Search URLs and business URLs (`yelp.com/biz/...`) can be mixed in `startUrls`; search URLs auto-paginate up to `maxItems` (default 1000) — always set `maxItems`.
- `scrapeReviews` (default false) needs full business details and switches `fetchBusinessDetails` on automatically; `maxReviews` caps reviews per business (default 1000).
- `enrichEmails` (default false) is best-effort and billed only per contact email actually found, never for misses.
- `reviewInsights` and `painPointAnalysis` (both default false, require `scrapeReviews`) each add a per-business analysis row, billed per business analyzed; `painPointAnalysis` needs a paid Apify plan.
- Not supported: Yelp user profiles, Collections/lists, and the events directory.
- Pay-per-event billing — see the Pricing tab on the actor page.

### ⚠️ Disclaimer

This Actor accesses publicly available data on Yelp for legitimate research, market-intelligence, and business-analysis purposes. Use of this Actor must comply with Yelp Inc.'s Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The Actor's authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading Yelp's infrastructure
- Not use scraped data to violate user privacy or applicable terms
- Use contact data in compliance with anti-spam laws (CAN-SPAM, GDPR) and obtain consent where required
- Not republish scraped review content in violation of copyright

This Actor is not affiliated with, endorsed by, or sponsored by Yelp Inc. "Yelp" is a trademark of Yelp Inc. We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

### SEO Keywords

yelp scraper, yelp leads scraper, yelp email scraper, yelp business scraper, yelp reviews scraper, yelp contact extractor, yelp data extraction, yelp business emails, yelp lead generation, yelp api alternative, yelp business directory scraper, scrape yelp reviews, yelp ratings scraper, local business leads, b2b lead generation, yelp csv export, yelp json export, yelp business listings, yelp phone number scraper, sales prospecting data

***

### 🤖 Related MCP servers for AI agents

Building an AI agent, or using Claude, Cursor or ChatGPT? Skip the scraping setup — connect our hosted **MCP servers** (no API keys, billed per call):

- **[Reviews MCP Server](https://apify.com/memo23/reviews-mcp-server)** — search companies, read real Trustpilot review texts, and pull multi‑platform ratings (Trustpilot + App Store + Google Play) straight from your assistant.
- **[Reddit MCP Server](https://apify.com/memo23/reddit-mcp-server)** — search Reddit, browse subreddits, read comment threads.
- **[Email Finder & Verifier MCP](https://apify.com/memo23/email-mcp-server)** — find and verify company emails.
- **[Video Transcripts MCP](https://apify.com/memo23/transcripts-mcp-server)** — full YouTube & TikTok transcripts.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for on Yelp — e.g. `plumbers`, `coffee shops`, `dentists`. Each term is combined with **Search location** below, so 3 terms x 1 location = 3 searches. No need to build a Yelp URL yourself. Leave empty if you are passing full URLs in **Start URLs**.

## `searchLocation` (type: `string`):

City, ZIP or region the search terms apply to — e.g. `Chicago, IL`, `90210`, `London`. Required when **Search terms** is used; ignored otherwise.

## `searchSortBy` (type: `string`):

Result ordering for generated searches. Applies to **Search terms** only.

## `startUrls` (type: `array`):

Optional — use this instead of, or alongside, the search fields above. Accepts Yelp search URLs like `https://www.yelp.com/search?find_desc=grill&find_loc=Los+Angeles` and individual business URLs like `https://www.yelp.com/biz/fresh-corn-grill-west-hollywood`. Both kinds can be mixed in one run.

## `maxItems` (type: `integer`):

Maximum number of items that will be scraped. One item = one business row. Default: 1000 — set a lower cap (e.g. 50) for test runs.

## `fetchBusinessDetails` (type: `boolean`):

When <b>enabled</b> (default), the scraper visits each business profile to extract the full record: hours, website, description, amenities/services, full photo gallery, claimed status, and timezone.<br><br>When <b>disabled</b>, only the data already present in the search listing is returned: name, rating, review count, price level, categories, phone, address, and 1 hero photo. This is significantly <b>faster and cheaper</b> — useful when you only need a directory-style overview.<br><br>Note: direct business URLs (yelp.com/biz/...) in <b>Start URLs</b> are always fetched in full — they have no search listing to fall back on. Enabling <b>Scrape Reviews</b> also switches this back on automatically.

## `scrapeReviews` (type: `boolean`):

If enabled, scraper will fetch reviews for each business using GraphQL. Requires <b>Fetch full business details</b> — if that toggle is off, it is enabled automatically for the run.

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape per business (if scraping reviews is enabled).

## `reviewInsights` (type: `boolean`):

Requires scrapeReviews. Adds one `review_insights` summary row per business: rating breakdown & sentiment split, the recurring complaint themes (service, wait times, quality, cleanliness, pricing…), top negative-review terms, and request snippets. Instant, no AI/keys required. Billed per business analyzed.

## `painPointAnalysis` (type: `boolean`):

Requires scrapeReviews. Runs an AI (Claude) pass over each business's reviews and adds a `painPointAnalysis` row: clustered pain-point themes with severity & recurrence, requested improvements, quick wins, overall sentiment and a short summary — turn a pile of reviews into an operational to-do list. Requires a paid Apify plan (uses AI credits) and is billed per business analyzed. For a free, no-AI version use Review insights above.

## `useCachedData` (type: `boolean`):

When <b>enabled</b> (default), business and search pages that were already scraped recently are served from a shared cache instead of being re-fetched — noticeably faster and cheaper. Cached rows are marked with <code>servedFromCache: true</code> and a <code>dataAsOf</code> timestamp so you always know how fresh the data is. Reviews (when enabled) are always fetched fresh. Turn this <b>off</b> to force every page to be scraped live.

## `maxCacheAgeDays` (type: `integer`):

Freshness limit for cached pages. A cached record older than this many days is re-scraped live. Set <b>0</b> to always bypass the cache and fetch everything fresh. Leave empty to use sensible defaults (business details ~21 days, search listings ~14 days). Only applies when <b>Use cached data</b> is enabled.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each business by reading its own website's contact/about pages (e.g. info@, contact@). Adds contactEmail and contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time (max 20). When <b>Fetch full business details</b> is enabled, the effective value is additionally capped to what the run's memory can sustain (about 8 at 1024MB) to prevent out-of-memory failures.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.<br><br>Heads-up: selecting Apify's RESIDENTIAL group here will make the run fail before it starts unless your account has that add-on enabled.

## `proxyProviders` (type: `array`):

Paying users only. Preference list of providers from the shared proxy-pool KV store. First usable provider wins; add fallbacks like \['evomi','decodo'] for resilience. Rotation is centralised — credentials are updated in the KV store, not in this input. Defaults to \['evomi'].

## Actor input object example

```json
{
  "searchTerms": [
    "plumbers"
  ],
  "searchLocation": "Chicago, IL",
  "searchSortBy": "",
  "maxItems": 1000,
  "fetchBusinessDetails": true,
  "scrapeReviews": false,
  "maxReviews": 1000,
  "reviewInsights": false,
  "painPointAnalysis": false,
  "useCachedData": true,
  "enrichEmails": false,
  "maxConcurrency": 20,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxyProviders": [
    "evomi"
  ]
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "plumbers"
    ],
    "searchLocation": "Chicago, IL"
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/yelp-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["plumbers"],
    "searchLocation": "Chicago, IL",
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/yelp-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "plumbers"
  ],
  "searchLocation": "Chicago, IL"
}' |
apify call memo23/yelp-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/yelp-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/A0RymJXiGndkXiuxg/builds/ad7h8CXjCUd8tslwu/openapi.json
