Given a Yelp business URL, alias slug, or natural-language reference, return structured hours of operation — per-day open/close ranges, special-hours overrides, IANA timezone, current open/closed state, freshness signal, canonical URL, and a top-level status (open / temporarily_closed / permanently_closed / unknown). Read-only.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionget-business-hoursExecute the skills CLI command in your project's root directory to begin installation:
Fetches get-business-hours from yelp.com/get-business-hours-jjy16i 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 get-business-hours. Access via /get-business-hours 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 | get-business-hours |
| title | Yelp Business Hours Lookup |
| description | >- Given a Yelp business URL, alias slug, or natural-language reference, return structured hours of operation — per-day open/close ranges, special-hours overrides, IANA timezone, current open/closed state, freshness signal, canonical URL, and a top-level status (open / temporarily_closed / permanently_closed / unknown). Read-only. |
| website | yelp.com |
| category | local-business |
| tags | - yelp - hours - local-business - datadome - read-only - fusion-api |
| source | 'browserbase: agent-runtime 2026-05-18' |
| updated | '2026-05-18' |
| recommended_method | hybrid |
| alternative_methods | - method: api rationale: >- Yelp Fusion API (api.yelp.com/v3/businesses/{alias}) is the cheapest path when an agent has an OAuth2 bearer token — one HTTP call, no anti-bot, no JS rendering. Free tier: 5,000 calls/day. Not gated by DataDome (confirmed: returns 400 VALIDATION_ERROR without auth, clean JSON with auth). - method: browser rationale: >- Public Yelp site is DataDome-protected; --verified + --proxies Browserbase session is mandatory to read the rendered hours module. Required when no Fusion API key is available, when you need to disambiguate user-flagged 'temporarily_closed' from 'permanently_closed' (Fusion collapses both to is_closed: true), or when the business surfaces special holiday hours that Fusion omits. |
| verified | true |
| proxies | true |
Given a Yelp business URL, alias slug, or natural-language reference ("Gary Danko, San Francisco"), return structured hours of operation: per-day open/close ranges, special-hours overrides, IANA timezone, current "open now" state, freshness signal, canonical URL, and a top-level status discriminating open / temporarily_closed / permanently_closed / unknown. Read-only — never clicks Write a Review, Bookmark, Send to Friend, Sign In, Add to Collection, or any mutation control.
Yelp has DataDome anti-bot in front of every page in www.yelp.com/biz/* and www.yelp.com/search. Naïve fetches — including residential-proxied fetches without a real browser fingerprint — return HTTP 403 with the DataDome captcha redirect HTML. Two viable paths:
If you have a Yelp Fusion API key (free tier — 5,000 calls/day; sign up at https://docs.developer.yelp.com/), this is one HTTP call, no anti-bot, no JS rendering, no proxies.
Resolve the alias (skip if the user provided a /biz/{alias} URL — the last path segment is the alias):
GET https://api.yelp.com/v3/businesses/search?term=<name>&location=<city>&limit=3
Authorization: Bearer <YELP_FUSION_KEY>
Pick businesses[0] when its name matches the requested name (case-insensitive substring) AND location.city matches the requested city. If businesses[] is empty → status: "unknown", error_reasoning: "not_found". If multiple top matches share the same name in the same city, surface them as ambiguous candidates rather than guessing.
Fetch business details + hours:
GET https://api.yelp.com/v3/businesses/{alias_or_id}
Authorization: Bearer <YELP_FUSION_KEY>
Response includes:
name, alias, url (canonical Yelp URL), is_closed (permanently closed flag), location.display_address[], location.country, location.state, location.zip_codecoordinates.{latitude, longitude} — derive IANA timezone via a static state → tz table (US states map 1:1 except for the multi-tz states AZ/IN/KY/TN/ND/SD/NE/KS/TX/OR/MI/ID — fall back to a coord lookup for those).hours: [{ hours_type: "REGULAR", open: [{ is_overnight, start: "HHMM", end: "HHMM", day: 0-6 }], is_open_now }] — day: 0 is Monday through day: 6 Sunday. start/end are 4-char strings like "1700" — split into "HH:MM" on emit. hours may also include a hours_type: "SPECIAL" entry for holiday hours.is_open_now field on the REGULAR hours object reflects Yelp's server-side timezone-aware computation — use it as the authoritative open_now.Map to output schema: index open[].day (0-6) → Mon-Sun labels, format start/end to HH:MM, carry is_overnight through. Status: is_closed === true → permanently_closed; otherwise open (or unknown if hours array is empty/null but is_closed === false).
browse open against the public site)When no Fusion API key is available, drive a stealthed Browserbase session and parse the rendered HTML / accessibility tree.
Create the session — verified + proxies are both required. A bare session gets DataDome 403'd; a --proxies-only session is captcha-walled on most runs.
SID=$(browse cloud sessions create --keep-alive --verified --proxies --timeout 600 | jq -r .id)
export BROWSE_SESSION="$SID"
Resolve alias if needed — if the input is already a /biz/{alias} URL, skip to step 3. Otherwise, search:
browse open "https://www.yelp.com/search?find_desc=$(urlenc <name>)&find_loc=$(urlenc <city,state-or-zip>)" --remote
browse wait load
browse wait timeout 2500
browse snapshot
The first organic result is a card with the business name as a link; the href is /biz/{alias}. Click that link rather than browse open-ing a hand-built /biz/{alias} URL — the click carries the DataDome cookie and search-referer warmth, which materially reduces second-page block rate.
Land on the biz page:
browse wait load
browse wait timeout 3000 # hours module is React-rendered ~1-3s after `load`
browse snapshot # accessibility tree for the Location & Hours region
browse get html body # raw HTML — fastest path to the ld+json block
Prefer the application/ld+json block — it's the most structured source and survives DOM refactors. Look for <script type="application/ld+json"> containing "@type":"Restaurant" (or LocalBusiness, Store, MedicalBusiness, etc.). Parse the JSON; extract:
name, address.{streetAddress, addressLocality, addressRegion, postalCode}, urlopeningHoursSpecification: [{ dayOfWeek: ["Monday"], opens: "17:00", closes: "22:00" }] — note dayOfWeek can be a string OR an array; normalize. Multiple entries per day → multiple ranges. If closes < opens (e.g. opens: "22:00", closes: "02:00") → is_overnight: true.geo.{latitude, longitude} — feed to a state/coord → IANA tz table.Fall back to the DOM "Location & Hours" table when ld+json is missing (some non-restaurant business types omit it). The accessibility tree has rows shaped Mon | 5:00 PM - 10:00 PM | (Closes in 2 hours) under the heading Location & Hours. Time strings are 12h H:MM AM|PM — convert to 24h. Multi-range days render with multiple <p> elements in the same row (e.g. lunch + dinner): 11:30 AM - 2:30 PM, 5:30 PM - 10:00 PM. Parse each as a separate { open, close }.
Extract supplementary signals from the same region (still read-only):
status: "temporarily_closed". Text "Permanently closed" or a strikethrough Closed indicator in the header → status: "permanently_closed".open_now boolean.hours_updated.special_hours[] with { date_range, note, hours }. These are common around US federal holidays and are often shown for the next 7 days only.Timezone: parse address.addressRegion (state code) — for US single-tz states use a fixed table (CA → America/Los_Angeles, NY → America/New_York, etc.). For multi-tz states or non-US addresses, prefer the geo coords from ld+json against a coord→tz lookup (e.g. tz-lookup, @geo-tz/data). Yelp does NOT expose IANA tz directly in markup.
Release the session:
browse cloud sessions update "$SID" --status REQUEST_RELEASE
www.yelp.com/biz/* and www.yelp.com/search request goes through DataDome. Bare browse cloud fetch returns HTTP 403 with Server: DataDome, X-Datadome: protected, and a captcha-delivery HTML payload — confirmed with and without --proxies. The mobile origin m.yelp.com is identically gated (also 403). --verified --proxies browser sessions are the only consistently working path; document this if you encounter a fresh wall and stop retrying the bare fetch path.robots.txt explicitly disallows AI/LLM crawlers. Yelp lists ClaudeBot, anthropic-ai, Claude-Web, Claude-User, Claude-SearchBot, ChatGPT-User, GPTBot, Google-Extended, PerplexityBot, CCBot, Meta-ExternalAgent with Disallow: /. DataDome enforces UA-level rules — never set a Claude/GPT/Perplexity UA in any request to Yelp; the default Chrome UA from a Browserbase verified session is what passes.https://api.yelp.com/v3/businesses/{alias_or_id} is NOT DataDome-gated (verified: returns 400 VALIDATION_ERROR: Authorization is a required parameter without a bearer; clean JSON with one). Free tier: 5,000 calls/day, 5 QPS. Use this whenever an agent has YELP_FUSION_API_KEY available — it's ~100× cheaper than a browser session.hours.open[].day is 0-indexed from Monday, not Sunday. (0=Mon, 1=Tue, ..., 6=Sun.) Don't confuse with the ISO weekday convention which starts at Sunday in some libraries.start/end are 4-digit strings, not HH:MM — "1700" not "17:00". Split on emit.is_overnight: true semantics (both surfaces): the close time is on the next calendar day. When deriving open_now, an overnight range that started yesterday is still active early today (e.g. a bar that closes at 02:00 on Sunday is open at 00:30 Sunday morning under the Saturday row).11:30-14:30, 17:30-22:00). Both the ld+json block and the DOM table render these as separate entries — never collapse them.dayOfWeek polymorphism: sometimes a string ("Monday"), sometimes an array (["Monday","Tuesday","Wednesday"]) when a business has the same hours across consecutive days. Normalize to one entry per day before emitting.wait load. Snapshot too early and the Location & Hours region is empty. Always wait timeout 3000 (or wait selector "Location & Hours") before snapshotting./search resolution is more reliable than constructed /biz/{alias} URLs. Yelp aliases include a disambiguation suffix (-2, -san-francisco-3) for businesses with the same name in different neighborhoods or under new ownership. The search-result click sets the DataDome cookie + provides a referer that materially lowers second-page block rate vs. a cold browse open https://www.yelp.com/biz/{alias}.temporarily_closed; explicit "Permanently closed" / strikethrough name in header → permanently_closed. The Fusion API collapses both into is_closed: true — when you need to disambiguate, you must use the browser path.US-state → IANA table for single-tz states (covers ~80% of US queries) and a coord→tz lookup for AZ/IN/KY/TN/ND/SD/NE/KS/TX/OR/MI/ID and non-US.browse snapshot + browse get html body without any click after landing on the biz page.https://www.yelp.com/biz/{alias}.json → 404; https://m.yelp.com/biz/{alias} → 403 DataDome; https://www.yelp.com/gql/batch → 404; https://www.yelp.com/sitemap.xml → 404. The PWA's internal GraphQL endpoints are not publicly addressable.Six distinct outcome shapes:
// Open business with regular hours (most common)
{
"success": true,
"status": "open",
"name": "Gary Danko",
"alias": "gary-danko-san-francisco",
"url": "https://www.yelp.com/biz/gary-danko-san-francisco",
"address": "800 N Point St, San Francisco, CA 94109",
"timezone": "America/Los_Angeles",
"hours": [
{ "day": "Mon", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Tue", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Wed", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Thu", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Fri", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Sat", "open": "17:00", "close": "22:00", "is_overnight": false },
{ "day": "Sun", "open": "17:00", "close": "22:00", "is_overnight": false }
],
"special_hours": [],
"open_now": false,
"hours_updated": "3 months ago",
"source": "fusion_api"
}
// Open with multi-range day (lunch + dinner)
{
"success": true,
"status": "open",
"name": "State Bird Provisions",
"alias": "state-bird-provisions-san-francisco",
"hours": [
{ "day": "Wed", "open": "11:30", "close": "14:30", "is_overnight": false },
{ "day": "Wed", "open": "17:30", "close": "22:00", "is_overnight": false }
],
"open_now": true,
"source": "browser"
}
// Open with overnight close (bar / late-night)
{
"success": true,
"status": "open",
"name": "Comstock Saloon",
"hours": [
{ "day": "Fri", "open": "16:00", "close": "02:00", "is_overnight": true }
],
"open_now": true
}
// Holiday / special hours surfaced
{
"success": true,
"status": "open",
"name": "Some Cafe",
"hours": [ /* regular hours */ ],
"special_hours": [
{ "date": "2026-07-04", "note": "Independence Day", "open": null, "close": null, "closed": true },
{ "date_range": ["2026-12-24", "2026-12-25"], "note": "Christmas Eve / Christmas Day", "closed": true }
],
"open_now": false
}
// Temporarily closed (user-flagged)
{
"success": true,
"status": "temporarily_closed",
"name": "Joe's Diner",
"alias": "joes-diner-oakland",
"url": "https://www.yelp.com/biz/joes-diner-oakland",
"address": "...",
"timezone": "America/Los_Angeles",
"hours": [],
"open_now": false,
"closure_note": "Yelp users report this location has closed"
}
// Permanently closed
{
"success": true,
"status": "permanently_closed",
"name": "Old Restaurant",
"alias": "old-restaurant-sf",
"hours": [],
"open_now": false
}
// Not found / DataDome wall / ambiguous
{ "success": false, "status": "unknown", "error_reasoning": "not_found" }
{ "success": false, "status": "unknown", "error_reasoning": "datadome_blocked" }
{ "success": false, "status": "unknown", "error_reasoning": "ambiguous_name", "candidates": [/* top 3 alias+address */] }
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.
cargurus.com/search-listings-3jv4hk
booking.com/search-hotels-asq6cc
aliexpress.com/search-product-p0h8a7
nav.com/get-smb-funding-2s1rpm
shopee.com.my/search-products-5epzg0
google.com/search-flights-ts4g1f
get-business-hours fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
We added get-business-hours from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
Registry listing for get-business-hours matched our evaluation — installs cleanly and behaves as described in the markdown.
get-business-hours is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
I recommend get-business-hours for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Keeps context tight: get-business-hours is the kind of skill you can hand to a new teammate without a long onboarding doc.
Useful defaults in get-business-hours — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Registry listing for get-business-hours matched our evaluation — installs cleanly and behaves as described in the markdown.
get-business-hours fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Registry listing for get-business-hours matched our evaluation — installs cleanly and behaves as described in the markdown.
showing 1-10 of 53