find-pizza▌
yelp.com/find-pizza-4dq9l8 · updated May 21, 2026
MDX-style export adds YAML metadata + attribution linking explainx.ai and this canonical listing URL.
Search Yelp for pizza in San Francisco, extract the ranked search-results list, then open the top-ranked business page and extract its full profile (address, phone, hours by day, rating, review count, neighborhood, categories, photo count). Read-only.
| name | find-pizza |
| title | Find Pizza on Yelp in San Francisco |
| description | >- Search Yelp for pizza in San Francisco, extract the ranked search-results list, then open the top-ranked business page and extract its full profile (address, phone, hours by day, rating, review count, neighborhood, categories, photo count). Read-only. |
| website | yelp.com |
| category | restaurants |
| tags | - restaurants - yelp - search - pizza - datadome - read-only |
| source | 'browserbase: agent-runtime 2026-05-20' |
| updated | '2026-05-20' |
| recommended_method | browser |
| alternative_methods | - method: api rationale: >- Yelp Fusion API (api.yelp.com/v3) returns the same data more cheaply but requires an API key (OAuth bearer) that the calling agent must supply. Without a key, all endpoints return 401. If a key is available, prefer it — the browser path exists because most callers do not have one. - method: fetch rationale: >- Direct HTTP fetch (`browse cloud fetch` with or without `--proxies`) is fully blocked by DataDome — returns 403 with the slider-challenge HTML on /search, /biz/*, m.yelp.com, and the homepage. Do not waste turns retrying this path. |
| verified | true |
| proxies | true |
Yelp Find Pizza in San Francisco
Purpose
Search Yelp for pizza restaurants in San Francisco, extract the ranked search-results list (name, rank, rating, review count, neighborhood, categories, price tier, biz URL), then open the top-ranked business page and extract the full business profile (address, phone, hours-by-day, neighborhood, categories, photo count, rating, review count). Read-only — never writes a review, never books, never claims a listing.
When to Use
- "What's the highest-rated pizza place in SF on Yelp right now?"
- Daily / weekly monitoring of Yelp ranking for a category in a city.
- Building a structured snapshot (address + phone + hours) of a specific top-ranked business.
- Any flow where you need Yelp's ranking (not Google SERP, not Maps) — Yelp's house ranking algorithm differs from Google's and from raw star-rating sort.
Workflow
Yelp is fully gated behind DataDome (slider CAPTCHA on first page-load, IP-based fingerprinting, no public unauthenticated API surface that returns the same data). The only reliable path is a Browserbase remote session with stealth + residential proxies + a one-time manual mouse-drag slider solve. The drag mints a datadome cookie that the rest of the session can reuse for all subsequent /search and /biz/* navigations — including click-through from search → biz page — without re-solving.
-
Create a stealth Browserbase session. All three flags are mandatory; a bare or single-flag session is rejected at page-load.
SID=$(browse cloud sessions create --keep-alive --verified --proxies --solve-captchas \ | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>{const m=s.match(/\"id\":\\s*\"([0-9a-f-]+)\"/);process.stdout.write(m?m[1]:'')})") export BROWSE_SESSION="$SID"Region:
us-west-2(default) andus-east-1both hit the same wall — region selection does not change DataDome outcome.--solve-captchasdoes not clear the DataDome slider on its own (verified — 30s+ wait with the flag set still shows the CAPTCHA), but leave it enabled in case Yelp swaps challenge types. -
Navigate directly to the search URL.
browse open "https://www.yelp.com/search?find_desc=pizza&find_loc=San+Francisco%2C+CA" \ --remote --session "$SID" browse wait load --remote --session "$SID" browse wait timeout 3000 --remote --session "$SID"Expected first state: a
[2-21] Iframe: DataDome Device Checksnapshot, NOT the results page. Don't try to extract data yet. -
Solve the DataDome slider by mouse-drag. The slider button sits roughly at viewport
(528, 372); drag it to roughly(750, 372)over ~30 steps with a ~50ms delay between steps. This produces a human-enough motion profile that DataDome accepts.browse mouse drag 528 372 750 372 --steps 30 --delay 50 --remote --session "$SID" browse wait timeout 5000 --remote --session "$SID"Verify success by checking the URL changed to include
&dd_referrer=(DataDome's post-solve marker) — for example…/search?find_desc=pizza&find_loc=…&dd_referrer=. If the URL did not change, the drag failed; retry with slightly differenttoX(try 720, 770) or re-snapshot to read the iframe coordinates and recompute. -
Screenshot + snapshot the search results page.
browse screenshot --remote --session "$SID" --path search-results.png browse snapshot --remote --session "$SID" > snapshot.jsonThe page heading reads
Top 10 Best pizza Near San Francisco, California. The ranked list begins with the listitem containing heading1. Tony's Pizza Napoletana, then2. Rose Pizzeria, etc. (Sponsored "Takeout options" cards appear above the ranked list — those are ads, not ranked results; ignore them.) -
Parse the ranked list from the a11y tree. For each listitem under the
All "pizza" results near me…list, capture:heading: N. <Name>— the ranking number is the literal prefix on the heading text. StripN.to get the bare name.- The contained
link: <Name>— itsurlMapentry is the canonical/biz/<slug>URL (strip?osq=pizzaquery if you want the bare slug). - The
image: <X.Y> star ratingaccessible-name on the siblingimagenode — parse the leading float. - The
StaticText: (<N> reviews)or(<N>k reviews)— parse the integer;kmeans thousands (e.g.8.7k→ 8700). - The trailing
LayoutTablewithlink: <category>entries — categories likePizza,Italian,Cocktail Bars. - The neighborhood string appears under the location section (e.g.
North Beach/Telegraph Hill) for cards that have it.
-
Open the top-ranked business page by clicking the heading link.
# The link ref for "1. Tony's Pizza Napoletana" was [2-1736] in our run; # find yours in snapshot.json by matching heading "1. " + name → contained link ref browse click "@2-1736" --remote --session "$SID" browse wait load --remote --session "$SID" browse wait timeout 5000 --remote --session "$SID"Click-through preserves the DataDome cookie — the biz page renders directly, no second CAPTCHA. URL lands at
https://www.yelp.com/biz/<slug>?osq=pizza&q=pizza. -
Extract business data from the biz page. Snapshot once, then read:
RootWebAreatitle:<NAME> - Updated <Month Year> - <N> Photos & <N> Reviews - <Street>, <City>, <State> - <Category> - Restaurant Reviews - Phone Number - Yelp— this single string yields photo count, review count, full address, and category in one parse.heading: <Name>near top of page (also at[4-60]-style ref in our run).image: <X.Y> star rating→ numeric rating.StaticText: (<N>k reviews)or(<N> reviews)→ review count.StaticText: $,$$,$$$,$$$$→ price tier.StaticText: Claimed(present) vs.Unclaimed(absent) → whether the owner has claimed the listing.link: <Category>×3 nearby → category list (e.g. Pizza / Italian / Cocktail Bars).region: Location & Hoursblock contains:link: <Street Address>+StaticText: <City>, <State> <ZIP>StaticText: <Neighborhood>(e.g.North Beach/Telegraph Hill)- 7 rows of
columnheader: Mon|Tue|…|Sunpaired withcell: <hh:mm AM> - <hh:mm PM>(orcell: Closed). - One row's cell also reads
Open nowwhen within hours.
link: Business website→ website URL inurlMap.StaticText: (XXX) XXX-XXXXnear theimage: Business phone number→ formatted phone.link: See all <N>k photos→ total photo count (matches title-string count).
-
Release the session.
browse cloud sessions update "$SID" --status REQUEST_RELEASE
Site-Specific Gotchas
- DataDome wall is the default, not the exception. Yelp serves a slider CAPTCHA on first page-load every time, on every fresh session — including the homepage
/, the search page/search, individual business pages/biz/*, and the mobile sitem.yelp.com. Plan for the solve step, don't treat it as a failure mode. browse cloud fetchis fully blocked. Direct HTTP fetch (with or without--proxies) returns403withX-Datadome: protectedheaders and the standard DataDome challenge HTML. There is no "raw HTML" shortcut. The browser session is the only working path.--solve-captchasdoes not handle the DataDome slider. Verified — 30+ second wait with the flag set still shows the slider. The flag is for hCaptcha / reCAPTCHA. Always plan a manual drag step for DataDome.- The slider coordinate is viewport-relative. Default viewport is ~1280×720, slider at
(528, 372)→(750, 372). If you set a custom--viewport, recompute by snapshotting the iframe and reading the canvas position. Use--steps 30 --delay 50minimum — fewer steps or no delay reads as a bot motion profile and DataDome rejects the solve. - The slider solve mints a
datadomecookie that survives navigations within the session. Click-through from/searchto/biz/<slug>works without re-solving. But a fresh session needs a fresh solve —--keep-alivekeeps the session alive across CLI invocations but every newsessions createstarts at the slider. - The IP shown on the CAPTCHA page is always an AWS us-west-2 / us-east-1 IP (e.g.
52.13.106.180,44.248.86.34,52.27.44.164), never a residential proxy IP, even with--proxiesenabled. Browserbase's residential proxy does not appear to apply to Yelp page-loads in our testing. Despite this, the slider-drag path still works — Yelp/DataDome's primary check is the human-motion profile of the drag, not the IP class. - Region does not change DataDome behavior.
--region us-east-1produced the same slider asus-west-2. Don't waste iterations on region-hopping. - Google referrer click-through does not bypass. Clicking through from a Google SERP entry to the Yelp
/searchpage still lands on the slider — DataDome ignores theRefererheader for first-visit decisions. - Yelp Fusion API requires an API key the agent likely doesn't have.
api.yelp.com/v3/businesses/searchreturns 401 without a key. Don't suggest it as a fallback unless the user supplies a key. - Browserbase Search (
browse cloud search "query site:yelp.com") returns biz URLs but NOT Yelp's house ranking. The search engine's ranking ≠ Yelp's/search?find_desc=…ranking. For the canonical "Top 10 Best pizza Near…" order, only the browser path produces correct data. - Sponsored "Takeout options" cards appear ABOVE the ranked list with heading like "Frotelli Pizza" + Order buttons. These are ads, not ranked results. The actual ranked list begins under the
heading: All "<query>" results near me in <City>, <State> - <Month Year>marker. Filter on this heading marker to find the start of the ranked list deterministically. - Review counts use
ksuffix when ≥ 1000.(8.7k reviews)= 8700;(669 reviews)= 669;(311 reviews)= 311. The biz-pageRootWebAreatitle has the exact integer (8732 Reviews), the search results card has the roundedkform. Prefer the title-string integer when on the biz page. - The biz-page title string is the richest single source of structured data:
TONY'S PIZZA NAPOLETANA - Updated May 2026 - 9825 Photos & 8732 Reviews - 1570 Stockton St, San Francisco, California - Pizza - Restaurant Reviews - Phone Number - Yelp. Regex this once and you have name + photo count + review count + address + primary category in one shot. - Hours are positional in a 7-row table Mon→Sun. Each row has either a
cell: <HH:MM AM> - <HH:MM PM>value orcell: Closed. Exactly one row also bears thecell: Open nowmarker — use that to derive today-of-week if you don't trust the session clock. - READ-ONLY discipline. Don't click "Write a Review", "Add photos/videos", "Make a reservation", "Order Takeout" buttons. The skill ends at extraction. Reservations / orders are a different skill.
- The page renders slowly after the slider solve. A
wait timeout 5000after the drag is mandatory; a 2000ms wait sometimes catches a partially-rendered DOM with missing review counts.
Expected Output
The skill returns two JSON objects: a search_results list (ranked) and a top_business detail object.
{
"query": "pizza",
"location": "San Francisco, CA",
"result_heading": "Top 10 Best pizza Near San Francisco, California",
"search_results": [
{
"rank": 1,
"name": "Tony's Pizza Napoletana",
"biz_url": "https://www.yelp.com/biz/tonys-pizza-napoletana-san-francisco",
"rating": 4.2,
"review_count": 8700,
"review_count_display": "8.7k",
"price_tier": "$$",
"categories": ["Pizza", "Italian", "Cocktail Bars"]
},
{
"rank": 2,
"name": "Rose Pizzeria",
"biz_url": "https://www.yelp.com/biz/rose-pizzeria-san-francisco",
"rating": 3.9,
"review_count": null,
"categories": []
},
{
"rank": 3,
"name": "Golden Boy Pizza",
"biz_url": "https://www.yelp.com/biz/golden-boy-pizza-san-francisco-5",
"rating": null,
"review_count": null,
"categories": []
}
],
"top_business": {
"name": "Tony's Pizza Napoletana",
"biz_url": "https://www.yelp.com/biz/tonys-pizza-napoletana-san-francisco",
"rating": 4.2,
"review_count": 8732,
"photo_count": 9825,
"price_tier": "$$",
"claimed": true,
"categories": ["Pizza", "Italian", "Cocktail Bars"],
"address": {
"street": "1570 Stockton St",
"city": "San Francisco",
"state": "CA",
"zip": "94133"
},
"neighborhood": "North Beach/Telegraph Hill",
"phone": "(415) 835-9888",
"hours": {
"Mon": "12:00 PM - 10:00 PM",
"Tue": "12:00 PM - 10:00 PM",
"Wed": "12:00 PM - 10:00 PM",
"Thu": "12:00 PM - 10:00 PM",
"Fri": "12:00 PM - 11:00 PM",
"Sat": "12:00 PM - 11:00 PM",
"Sun": "12:00 PM - 11:00 PM"
},
"open_now": true,
"today_hours": "12:00 PM - 10:00 PM"
}
}
If the slider solve fails (URL never picks up &dd_referrer=), return a structured failure:
{
"success": false,
"reason": "datadome_slider_unsolved",
"attempts": 3,
"last_url": "https://www.yelp.com/search?find_desc=pizza&find_loc=San+Francisco%2C+CA"
}
How to use find-pizza on Cursor
AI-first code editor with Composer
Prerequisites
Before installing skills in Cursor, ensure your development environment meets these requirements:
- ›Cursor installed and configured on your development machine
- ›Node.js version 16.0+ with npm package manager (verify with
node --version) - ›Active project directory or workspace where you want to add find-pizza
Execute installation command
Execute the skills CLI command in your project's root directory to begin installation:
The skills CLI fetches find-pizza from GitHub repository yelp.com/find-pizza-4dq9l8 and configures it for Cursor.
Select Cursor when prompted
The CLI will show a list of available agents. Use arrow keys to navigate and space to select Cursor:
Verify installation
Confirm successful installation by checking the skill directory location:
Reload or restart Cursor to activate find-pizza. Access the skill through slash commands (e.g., /find-pizza) or your agent's skill management interface.
Security & Verification Notice
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your development environment. Always verify the publisher's identity, review recent commits, and test in isolated environments before production deployment.
List & Monetize Your Skill
Submit your Claude Code skill and start earning
Use Cases▌
Task Automation & Efficiency
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Knowledge Enhancement
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Quality Improvement
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Implementation Guide▌
Prerequisites
- ›Claude Desktop or compatible AI client with skill support
- ›Clear understanding of task or problem to solve
- ›Willingness to iterate and refine outputs
Time Estimate
15-45 minutes depending on use case complexity
Installation Steps
- 1.Install skill using provided installation command
- 2.Test with simple use case relevant to your work
- 3.Evaluate output quality and relevance
- 4.Iterate on prompts to improve results
- 5.Integrate into regular workflow if valuable
Common Pitfalls
- ⚠Expecting perfect results without iteration
- ⚠Not providing enough context in prompts
- ⚠Using skill for tasks outside its intended scope
- ⚠Accepting outputs without review and validation
Best Practices▌
✓ Do
- +Start with clear, specific prompts
- +Provide relevant context and constraints
- +Review and refine all outputs before using
- +Iterate to improve output quality
- +Document successful prompt patterns
✗ Don't
- −Don't use without understanding skill limitations
- −Don't skip validation of outputs
- −Don't share sensitive information in prompts
- −Don't expect skill to replace human judgment
💡 Pro Tips
- ★Be specific about desired format and style
- ★Ask for multiple options to choose from
- ★Request explanations to understand reasoning
- ★Combine AI efficiency with human expertise
When to Use This▌
✓ Use When
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid When
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
Learning Path▌
- 1Familiarize yourself with skill capabilities and limitations
- 2Start with low-risk, non-critical tasks
- 3Progress to more complex and valuable use cases
- 4Build expertise through regular use and experimentation
Discussion
Product Hunt–style comments (not star reviews)- No comments yet — start the thread.
Ratings
4.7★★★★★35 reviews- ★★★★★Mia Singh· Dec 24, 2024
Keeps context tight: find-pizza is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Mia Reddy· Dec 20, 2024
We added find-pizza from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Pratham Ware· Dec 12, 2024
Keeps context tight: find-pizza is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Dev Gill· Dec 12, 2024
I recommend find-pizza for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Layla Verma· Nov 15, 2024
Registry listing for find-pizza matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Sakshi Patil· Nov 3, 2024
Registry listing for find-pizza matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Isabella White· Nov 3, 2024
Solid pick for teams standardizing on skills: find-pizza is focused, and the summary matches what you get after install.
- ★★★★★Chaitanya Patil· Oct 22, 2024
find-pizza reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Arjun Kim· Oct 22, 2024
find-pizza has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Mia Huang· Oct 6, 2024
find-pizza reduced setup friction for our internal harness; good balance of opinion and flexibility.
showing 1-10 of 35