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.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionfind-pizzaExecute the skills CLI command in your project's root directory to begin installation:
Fetches find-pizza from yelp.com/find-pizza-4dq9l8 and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate find-pizza. Access via /find-pizza in your agent's command palette.
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 environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
0
total installs
0
this week
0
upvotes
Run in your terminal
0
installs
0
this week
—
stars
| 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 |
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.
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) and us-east-1 both hit the same wall — region selection does not change DataDome outcome. --solve-captchas does 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 Check snapshot, 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 different toX (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.json
The page heading reads Top 10 Best pizza Near San Francisco, California. The ranked list begins with the listitem containing heading 1. Tony's Pizza Napoletana, then 2. 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. Strip N. to get the bare name.link: <Name> — its urlMap entry is the canonical /biz/<slug> URL (strip ?osq=pizza query if you want the bare slug).image: <X.Y> star rating accessible-name on the sibling image node — parse the leading float.StaticText: (<N> reviews) or (<N>k reviews) — parse the integer; k means thousands (e.g. 8.7k → 8700).LayoutTable with link: <category> entries — categories like Pizza, Italian, Cocktail Bars.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:
RootWebArea title: <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 & Hours block contains:
link: <Street Address> + StaticText: <City>, <State> <ZIP>StaticText: <Neighborhood> (e.g. North Beach/Telegraph Hill)columnheader: Mon|Tue|…|Sun paired with cell: <hh:mm AM> - <hh:mm PM> (or cell: Closed).Open now when within hours.link: Business website → website URL in urlMap.StaticText: (XXX) XXX-XXXX near the image: 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
/, the search page /search, individual business pages /biz/*, and the mobile site m.yelp.com. Plan for the solve step, don't treat it as a failure mode.browse cloud fetch is fully blocked. Direct HTTP fetch (with or without --proxies) returns 403 with X-Datadome: protected headers and the standard DataDome challenge HTML. There is no "raw HTML" shortcut. The browser session is the only working path.--solve-captchas does 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.(528, 372) → (750, 372). If you set a custom --viewport, recompute by snapshotting the iframe and reading the canvas position. Use --steps 30 --delay 50 minimum — fewer steps or no delay reads as a bot motion profile and DataDome rejects the solve.datadome cookie that survives navigations within the session. Click-through from /search to /biz/<slug> works without re-solving. But a fresh session needs a fresh solve — --keep-alive keeps the session alive across CLI invocations but every new sessions create starts at the slider.52.13.106.180, 44.248.86.34, 52.27.44.164), never a residential proxy IP, even with --proxies enabled. 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 us-east-1 produced the same slider as us-west-2. Don't waste iterations on region-hopping./search page still lands on the slider — DataDome ignores the Referer header for first-visit decisions.api.yelp.com/v3/businesses/search returns 401 without a key. Don't suggest it as a fallback unless the user supplies a key.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.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.k suffix when ≥ 1000. (8.7k reviews) = 8700; (669 reviews) = 669; (311 reviews) = 311. The biz-page RootWebArea title has the exact integer (8732 Reviews), the search results card has the rounded k form. Prefer the title-string integer when on the biz page.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.cell: <HH:MM AM> - <HH:MM PM> value or cell: Closed. Exactly one row also bears the cell: Open now marker — use that to derive today-of-week if you don't trust the session clock.wait timeout 5000 after the drag is mandatory; a 2000ms wait sometimes catches a partially-rendered DOM with missing review counts.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"
}
Prerequisites
Time Estimate
15-45 minutes depending on use case complexity
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ 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.
aliexpress.com/search-product-p0h8a7
kostja94/marketing-skills
aaaaqwq/claude-code-skills
agentbay-ai/agentbay-skills
glebis/claude-skills
shopmeskills/mcp
Keeps context tight: find-pizza is the kind of skill you can hand to a new teammate without a long onboarding doc.
We added find-pizza from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
Keeps context tight: find-pizza is the kind of skill you can hand to a new teammate without a long onboarding doc.
I recommend find-pizza for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Registry listing for find-pizza matched our evaluation — installs cleanly and behaves as described in the markdown.
Registry listing for find-pizza matched our evaluation — installs cleanly and behaves as described in the markdown.
Solid pick for teams standardizing on skills: find-pizza is focused, and the summary matches what you get after install.
find-pizza reduced setup friction for our internal harness; good balance of opinion and flexibility.
find-pizza has been reliable in day-to-day use. Documentation quality is above average for community skills.
find-pizza reduced setup friction for our internal harness; good balance of opinion and flexibility.
showing 1-10 of 35