← Back to Skills Marketplace
shahedkhan30

Resy Hunter

by shahedkhan30 · GitHub ↗ · v2.1.0
cross-platform ⚠ suspicious
326
Downloads
0
Stars
0
Active Installs
11
Versions
Install in OpenClaw
/install resy-hunter
Description
Monitor hard-to-get restaurant reservations on Resy, OpenTable, and Tock. Check availability, manage a watchlist, and get Telegram alerts when tables open up.
README (SKILL.md)

Resy Hunter

Monitor restaurant reservations across Resy, OpenTable, and Tock. Detect open tables and alert the user via Telegram.

When to Use

  • User asks to check if a restaurant has availability
  • User wants to find open tables at a specific restaurant on a date
  • User wants to monitor a restaurant for cancellations or new openings
  • User wants to manage their restaurant watchlist (add, remove, list)
  • User asks to set up background monitoring or alerts

Platforms Supported

Platform Script Identifier Auth Required Notes
Resy resy-check.sh venue_id (integer) Yes — RESY_API_KEY + RESY_EMAIL + RESY_PASSWORD Auto-login via API, token cached 12h
OpenTable opentable-check.js restaurant_id (integer) Yes — manual login via opentable-login.js One-time visible browser login, session persisted
Tock tock-check.js slug (URL slug) No Playwright bypasses Cloudflare

Parsing Natural Language Requests

Users speak casually. Extract these fields from every request:

Field How to parse Default
Restaurant Name mentioned, or "my list" / "my watchlist" → sweep all watchlist entries
Party size "for 2", "party of 4", "2 people", "two" Ask if missing
Date(s) "March 9" → 2026-03-09. "this Saturday" → resolve to YYYY-MM-DD. "next 30 days" → generate array of dates. "this weekend" → upcoming Sat + Sun. "any Friday in April" → all Fridays in April. Ask if missing
Time window "6-9pm" → earliest: "18:00", latest: "21:00". "7:30p" → earliest: "19:00", latest: "20:00" (±30min). "dinner" / "prime time" → earliest: "18:00", latest: "21:00". "lunch" → earliest: "11:30", latest: "14:00". "tonight" → earliest: "18:00", latest: "22:00" All times
Fallback "if nothing, check my list" → on zero results, sweep watchlist with same date/party/time constraints None
Action "book me" / "find me a res" / "get me a table" → find availability and present booking links (skill is read-only, never books). "monitor" / "alert me" / "watch for" → set up cron. "add to my list" → watchlist add. Check availability

"Book" always means "find availability." This skill never books. Always present results with a direct booking link so the user can book themselves.

Example Requests → Execution Plans


"Book me a res at Tatiana by Kwame sometime in the next 30 days between 6-9pm for 2 people"

Parsed:

  • Restaurant: Tatiana by Kwame → run resy-search-venue.sh "Tatiana by Kwame" to get venue_id
  • Dates: next 30 days → generate ["2026-03-06", "2026-03-07", ..., "2026-04-04"]
  • Time: 6-9pm → earliest: "18:00", latest: "21:00"
  • Party size: 2

Execute:

  1. bash scripts/resy-search-venue.sh "Tatiana by Kwame" → get venue_id
  2. Loop through each date: bash scripts/resy-check.sh \x3Cvenue_id> \x3Cdate> 2
  3. Filter returned slots to only those between 18:00-21:00
  4. Present all dates that have matching slots, with booking links
  5. If zero results across all 30 days, offer to add to watchlist for monitoring

"Find me a res from my list of restaurants for 3 people this Sat between 6-7:30p, alert me with which ones are available and I will pick one"

Parsed:

  • Restaurant: "from my list" → sweep entire watchlist
  • Date: "this Sat" → resolve to upcoming Saturday YYYY-MM-DD
  • Time: 6-7:30p → earliest: "18:00", latest: "19:30"
  • Party size: 3 (override each entry's party_size for this check)

Execute:

  1. bash scripts/watchlist.sh list → get all entries
  2. For each entry, run the platform check script with the resolved Saturday date and party_size=3
  3. Filter slots to 18:00-19:30 window
  4. Present results grouped by restaurant, with booking links
  5. Let the user pick — do not choose for them

"Book me at Carbone for 2 on March 9 5-9pm, if no availability find something else from my list"

Parsed:

  • Restaurant: Carbone → search venue_id
  • Date: March 9 → 2026-03-09
  • Time: 5-9pm → earliest: "17:00", latest: "21:00"
  • Party size: 2
  • Fallback: sweep watchlist

Execute:

  1. bash scripts/resy-search-venue.sh "Carbone" → get venue_id
  2. bash scripts/resy-check.sh \x3Cvenue_id> 2026-03-09 2
  3. Filter slots to 17:00-21:00
  4. If slots found → present with booking link, done
  5. If no slots → bash scripts/watchlist.sh list, then check each entry for 2026-03-09 party_size=2 with 17:00-21:00 filter
  6. Present any alternatives found from the watchlist

"Any openings at Don Angie tonight for 4?"

Parsed:

  • Restaurant: Don Angie → search venue_id
  • Date: tonight → today's date
  • Time: (tonight implies dinner) → earliest: "18:00", latest: "22:00"
  • Party size: 4

Execute:

  1. bash scripts/resy-search-venue.sh "Don Angie" → get venue_id
  2. bash scripts/resy-check.sh \x3Cvenue_id> \x3Ctoday> 4
  3. Filter to 18:00-22:00, present results

"Set up alerts for Atomix, party of 2, any Friday or Saturday in April between 7-9"

Parsed:

  • Restaurant: Atomix → search venue_id
  • Dates: every Fri + Sat in April 2026 → ["2026-04-03", "2026-04-04", "2026-04-10", "2026-04-11", ...]
  • Time: 7-9 → earliest: "19:00", latest: "21:00"
  • Party size: 2
  • Action: set up monitoring

Execute:

  1. bash scripts/resy-search-venue.sh "Atomix" → get venue_id
  2. bash scripts/watchlist.sh add '{"name":"Atomix","platform":"resy","venue_id":\x3Cid>,"party_size":2,"dates":["2026-04-03","2026-04-04",...],"preferred_times":{"earliest":"19:00","latest":"21:00"}}'
  3. Set up cron if not already running:
openclaw cron add --name "resy-hunter-sweep" --every "15m" --session isolated --message "Run resy-hunter monitor..." --announce
  1. Confirm to user: "Monitoring Atomix for Friday/Saturday openings in April, 7-9 PM, party of 2. I'll alert you on Telegram when something opens."

"What's available this weekend from my list?"

Parsed:

  • Restaurant: "from my list" → sweep watchlist
  • Date: "this weekend" → upcoming Saturday + Sunday
  • Time: not specified → all times
  • Party size: not specified → use each entry's configured party_size

Execute:

  1. bash scripts/watchlist.sh list → get all entries
  2. For each entry, check both Saturday and Sunday dates using the entry's own party_size
  3. Present all results grouped by restaurant and date

"Check everything on my list for tomorrow night"

Parsed:

  • Restaurant: "everything on my list" → sweep watchlist
  • Date: tomorrow → resolve to YYYY-MM-DD
  • Time: "night" → earliest: "18:00", latest: "22:00"
  • Party size: use each entry's configured party_size

Execute: same as watchlist sweep pattern above


"Monitor Torrisi for cancellations, party of 4, March 15, prime time"

Parsed:

  • Restaurant: Torrisi → search venue_id
  • Date: March 15 → 2026-03-15
  • Time: "prime time" → earliest: "18:00", latest: "21:00"
  • Party size: 4
  • Action: "monitor for cancellations" → add to watchlist + set up cron

Execute:

  1. Search venue_id, add to watchlist, set up cron
  2. Confirm monitoring is active

"Add Lilia to my watchlist, 2 people, next three Saturdays, dinner time"

Parsed:

  • Restaurant: Lilia → search venue_id
  • Dates: next 3 Saturdays → resolve to specific YYYY-MM-DD values
  • Time: "dinner time" → earliest: "18:00", latest: "21:00"
  • Party size: 2
  • Action: watchlist add only (no cron unless asked)

Execute:

  1. bash scripts/resy-search-venue.sh "Lilia" → get venue_id
  2. bash scripts/watchlist.sh add '{"name":"Lilia","platform":"resy","venue_id":\x3Cid>,"party_size":2,"dates":["\x3Csat1>","\x3Csat2>","\x3Csat3>"],"preferred_times":{"earliest":"18:00","latest":"21:00"}}'

"Is there anything at 4 Charles or Via Carota for 2 this Thursday?"

Parsed:

  • Restaurants: two separate — "4 Charles" and "Via Carota"
  • Date: this Thursday → resolve
  • Party size: 2

Execute:

  1. Search venue_ids for both restaurants
  2. Check both for the resolved Thursday date with party_size=2
  3. Present results side by side

"Cancel monitoring for Carbone"

Parsed:

  • Action: remove from watchlist

Execute:

  1. bash scripts/watchlist.sh list → find Carbone's id
  2. bash scripts/watchlist.sh remove \x3Cid>
  3. If watchlist is now empty, suggest removing the cron job too

How to Run Checks

  1. Determine the platform (ask the user if unclear)
  2. Get the restaurant identifier:
    • Resy: If the user doesn't know the venue_id, run scripts/resy-search-venue.sh "\x3Cname>" [lat] [long] to find it
    • OpenTable: The restaurant_id is in the OpenTable URL (e.g., opentable.com/r/restaurant-name-city?rid=123456 → rid is 123456)
    • Tock: The slug is in the URL (e.g., exploretock.com/alinea → slug is alinea)
  3. Run the appropriate check script:
    • Resy: bash ~/.openclaw/skills/resy-hunter/scripts/resy-check.sh \x3Cvenue_id> \x3Cdate> \x3Cparty_size>
    • OpenTable: node ~/.openclaw/skills/resy-hunter/scripts/opentable-check.js \x3Crestaurant_id> \x3Cdate> \x3Cparty_size>
    • Tock: node ~/.openclaw/skills/resy-hunter/scripts/tock-check.js \x3Cslug> \x3Cdate> \x3Cparty_size>
  4. Parse the JSON output and present available slots in a clean table format:
    Restaurant | Date | Time | Type | Platform
    
  5. If no slots found, offer to add to the watchlist for background monitoring

Watchlist Management

The watchlist lives at ~/.openclaw/data/resy-hunter/watchlist.json (separate from the skill directory so reinstalls don't wipe user data).

  • List: bash ~/.openclaw/skills/resy-hunter/scripts/watchlist.sh list
  • Add: bash ~/.openclaw/skills/resy-hunter/scripts/watchlist.sh add '\x3Cjson>'
    • JSON must include: name, platform (resy/opentable/tock), platform identifier (venue_id/restaurant_id/slug), party_size, dates array
    • Optional: preferred_times object with earliest and latest in HH:MM format
  • Remove: bash ~/.openclaw/skills/resy-hunter/scripts/watchlist.sh remove \x3Cid>
  • Set Priority: bash ~/.openclaw/skills/resy-hunter/scripts/watchlist.sh set-priority \x3Cid> \x3Chigh|low>

Priority Levels

  • high — Telegram alerts fire immediately when new slots appear
  • low — Slots are tracked (dedup works) but Telegram alerts only when the user explicitly asks for a sweep

Default priority is low when adding entries. Set it to high for restaurants the user actively wants alerts on. The JSON report from monitor.sh always includes all priorities.

Default Time Window

All entries default to a 6:00 PM – 10:00 PM time window. Slots outside this window are filtered out. Override per restaurant via preferred_times when adding:

Example add:

bash ~/.openclaw/skills/resy-hunter/scripts/watchlist.sh add '{
  "name": "Carbone",
  "platform": "resy",
  "venue_id": 5286,
  "party_size": 2,
  "dates": ["2026-03-15", "2026-03-22"],
  "preferred_times": {"earliest": "18:00", "latest": "21:30"},
  "priority": "high"
}'

Background Monitoring

The monitor runs checks in parallel and staggers platforms by frequency:

  • Resy (curl): checked every sweep, up to 8 concurrent
  • Tock (Playwright): checked once per hour, up to 2 concurrent
  • OpenTable (Playwright): checked once per hour, up to 2 concurrent

To set up cron monitoring, run:

openclaw cron add \
  --name "resy-hunter-sweep" \
  --every "15m" \
  --session isolated \
  --message "Run resy-hunter monitor. Execute bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh. If new availability is found in the output JSON (new_availability array is non-empty), format a clear alert listing each restaurant name, platform, date, available time slots, and party size. Include a direct booking link. If nothing new, respond only: No new availability." \
  --announce

The 15-minute cron means Resy is checked every 15 minutes while Tock and OpenTable are automatically checked once per hour (the monitor tracks timestamps and skips platforms checked less than 60 minutes ago).

For high-frequency sniping on a specific date (e.g., when reservations drop):

openclaw cron add \
  --name "resy-hunter-snipe" \
  --every "2m" \
  --session isolated \
  --message "Snipe mode: run bash ~/.openclaw/skills/resy-hunter/scripts/resy-check.sh \x3Cvenue_id> \x3Cdate> \x3Cparty_size>. Report immediately if any slot appears." \
  --announce

To stop monitoring: openclaw cron remove --name "resy-hunter-sweep"

Manual Monitor Sweep

To run a one-time sweep of the entire watchlist:

bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh

To check only a specific platform (bypasses the hourly interval timer):

bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh --platform resy
bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh --platform tock
bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh --platform opentable

Multiple platforms can be combined:

bash ~/.openclaw/skills/resy-hunter/scripts/monitor.sh --platform resy --platform tock

Interpret the output JSON:

  • new_availability array: newly detected slots since last sweep
  • total_checked: number of restaurant+date combinations checked
  • total_with_availability: how many had open slots

Sending Notifications Manually

bash ~/.openclaw/skills/resy-hunter/scripts/notify.sh "Your message here"

This sends a Telegram message. The bot token is pulled from OpenClaw's Telegram channel config (channels.telegram.botToken). Falls back to TELEGRAM_BOT_TOKEN env var if config not found.

Booking Links

When reporting availability, always include a direct booking link:

  • Resy: https://resy.com/cities/\x3Ccity>-\x3Cregion>/venues/\x3Cslug>?date=\x3CYYYY-MM-DD>&seats=\x3Cparty_size>
  • OpenTable: https://www.opentable.com/booking/widget?rid=\x3Crestaurant_id>&datetime=\x3CISO>&covers=\x3Cparty_size>
  • Tock: https://www.exploretock.com/\x3Cslug>/search?date=\x3CYYYY-MM-DD>&size=\x3Cparty_size>

Error Handling

  • If a Resy request returns HTTP 419, the script automatically clears the cached token and re-authenticates. No manual action needed.
  • If Resy login fails (HTTP 401/403), check RESY_EMAIL and RESY_PASSWORD.
  • If OpenTable returns session_expired: true, run node ~/.openclaw/skills/resy-hunter/scripts/opentable-login.js to re-authenticate manually. The monitor will send a Telegram alert when this happens.
  • If Tock returns blocked: true in output, Cloudflare blocked even the Playwright browser. Return the URL for the user to check manually. This is rare — retrying usually works.

Credential Setup

Resy (auto-login via API):

  1. RESY_API_KEY — one-time extraction from browser DevTools (static, never expires):
    • Log into resy.com → DevTools → Network tab
    • Find any request to api.resy.com
    • Authorization header → value after ResyAPI api_key= is the API key
  2. RESY_EMAIL — your Resy account email
  3. RESY_PASSWORD — your Resy account password
  4. Auth tokens are fetched and cached automatically (12-hour TTL). No manual token extraction needed.

OpenTable (manual login via Playwright):

  1. Run once: node ~/.openclaw/skills/resy-hunter/scripts/opentable-login.js
  2. A visible browser opens to OpenTable's login page
  3. Log in with your email + OTP code manually
  4. The script detects login and saves session cookies to ~/.openclaw/data/resy-hunter/opentable-session.json
  5. Future runs use the saved session headlessly. If it expires, the monitor sends a Telegram alert telling you to re-run opentable-login.js.

Tock (no credentials): No credentials needed. Playwright uses a real browser that passes Cloudflare Turnstile challenges automatically.

First-Time Setup

After installing the skill, run once to install dependencies:

cd ~/.openclaw/skills/resy-hunter
npm install
npx playwright install chromium

Important

  • This skill is read-only. Never attempt to book a reservation. The user books manually.
  • Respect rate limits. Do not run checks more frequently than every 2 minutes.
  • Dates in the past should be skipped automatically by the monitor script.
Usage Guidance
This skill appears to perform reservation monitoring as described, but it does a few things you should be aware of before installing or running it: (1) It caches Resy auth tokens and saves Playwright/OpenTable session state in your home directory (~/.openclaw/data/resy-hunter). That is expected for this use but means tokens and session cookies will be stored on disk. (2) notify.sh will attempt to find a Telegram bot token by reading multiple OpenClaw config files in your home directory; if a token exists there it will be used automatically — review notify.sh and consider setting TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID explicitly rather than leaving a token sitting in config files. (3) The package includes Playwright, which requires npm install and will download browser binaries; run this in an isolated environment (container/VM) if you want to limit side effects. (4) The manifest does not list all env vars the code can use (Telegram and possible OpenTable creds); only provide credentials that are necessary. Recommended steps before use: review notify.sh and remove or modify the config-file search if you don't want cross-config access; inspect and, if desired, relocate or encrypt cached token/session files; run Playwright scripts in a sandbox; and only provide RESY_* (and Telegram) credentials if you trust the skill source. If you can obtain the skill from a known source/repo or the author documents the config-file lookup behavior explicitly, that would increase confidence.
Capability Analysis
Type: OpenClaw Skill Name: resy-hunter Version: 2.1.0 The resy-hunter skill bundle is a legitimate tool for monitoring restaurant reservations on Resy, OpenTable, and Tock. It uses standard API calls (via curl) for Resy and browser automation (via Playwright) for OpenTable and Tock to handle Cloudflare challenges and session-based authentication. The SKILL.md instructions explicitly direct the AI agent to treat 'booking' requests as 'availability checks' only, ensuring the skill remains read-only as intended. Sensitive credentials (RESY_EMAIL, RESY_PASSWORD, and Telegram tokens) are handled appropriately for their stated purposes, with local caching and communication only to official service endpoints (api.resy.com and api.telegram.org).
Capability Assessment
Purpose & Capability
Name/description match the included scripts: Resy, OpenTable, and Tock checkers are present and use curl/Playwright as expected. Requiring RESY_API_KEY/RESY_EMAIL/RESY_PASSWORD for Resy is coherent. However the skill uses Playwright (heavy browser automation) and package.json includes playwright, which is more than a simple shell-monitor; that is explainable but worth noting. Also the SKILL.md and manifest do not declare environment variables referenced in the code (e.g., TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID, OPENTABLE_*), creating a mismatch between stated requirements and actual code.
Instruction Scope
Runtime scripts do what the doc describes (search, check, monitor). However notify.sh explicitly searches the user's OpenClaw config files under $HOME/.openclaw and $HOME/.config/openclaw for a Telegram bot token (channels.telegram.botToken) and will use it if found — this reads potentially sensitive configuration belonging to the user's agent or other skills. Playwright scripts intercept network responses and persist session state (~/.openclaw/data/resy-hunter/.playwright-state and opentable-session.json), which is expected for browser automation but can capture session cookies or JSON payloads. The instructions/scripts also cache auth tokens and session files in the user's home directory.
Install Mechanism
There is no install spec (instruction-only), so nothing is automatically downloaded by the skill. The repo includes package.json/package-lock with a Playwright dependency; running npm install will fetch Playwright and (typically) browser binaries. That is not executed automatically here but is required for the Playwright scripts to run — it introduces additional installation cost and local artifacts (browsers) if the user chooses to use the skill.
Credentials
Declared required env vars are only the Resy credentials (RESY_API_KEY, RESY_EMAIL, RESY_PASSWORD). In practice, scripts also use or expect TELEGRAM_CHAT_ID and TELEGRAM_BOT_TOKEN (notify.sh) and references mention OPENTABLE_EMAIL/OPENTABLE_PASSWORD; none of these are declared in the manifest. notify.sh's fallback behavior of scanning multiple OpenClaw config files to discover a Telegram bot token is disproportionate to the nominal purpose (it reads other config files that may contain unrelated secrets).
Persistence & Privilege
The skill writes persistent state under the user's home (~/.openclaw/data/resy-hunter and skill dir), caches Resy auth tokens, and saves Playwright/OpenTable session files. That is expected for a monitor. The concern is that notify.sh reads other OpenClaw config files to extract a bot token (cross-config access to other credentials), which is a privileged action beyond purely storing its own state. The skill does not set always:true.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install resy-hunter
  3. After installation, invoke the skill by name or use /resy-hunter
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v2.1.0
Add --platform flag to monitor.sh for running specific platforms on demand (bypasses interval timer). Supports --platform resy, --platform tock, --platform opentable, and combinations.
v2.0.0
Priority levels (high/low), default 6-10PM time window, capped Telegram alerts (5 slots sorted by prime time), OpenTable manual login flow, session expiry alerts
v1.2.0
Parallel checks (Resy 8x, Tock 2x, OpenTable 2x). Resy every sweep, Tock/OpenTable hourly. Progress indicator. 5-10x faster sweeps.
v1.1.1
Fix deposit fee display (show $250 not $250.0)
v1.1.0
12h AM/PM times, deposit fees in alerts, booking URLs use venue pages, user data moved to ~/.openclaw/data/ to survive reinstalls
v1.0.5
monitor.sh now calls notify.sh to send Telegram alerts when new availability is found
v1.0.4
Fix: remove local keyword outside function in resy-search-venue.sh
v1.0.3
Fix Resy HTTP 400: match exact curl header/body quoting format. Strip extra headers.
v1.0.2
Remove hardcoded chat ID from notify.sh, use TELEGRAM_CHAT_ID env var instead
v1.0.1
Fix Resy /4/find: use POST with JSON body, extract deposit_fee from payment object
v1.0.0
Monitor hard-to-get restaurant reservations on Resy, OpenTable, and Tock. Auto-login, background monitoring, Telegram alerts.
Metadata
Slug resy-hunter
Version 2.1.0
License
All-time Installs 0
Active Installs 0
Total Versions 11
Frequently Asked Questions

What is Resy Hunter?

Monitor hard-to-get restaurant reservations on Resy, OpenTable, and Tock. Check availability, manage a watchlist, and get Telegram alerts when tables open up. It is an AI Agent Skill for Claude Code / OpenClaw, with 326 downloads so far.

How do I install Resy Hunter?

Run "/install resy-hunter" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Resy Hunter free?

Yes, Resy Hunter is completely free (open-source). You can download, install and use it at no cost.

Which platforms does Resy Hunter support?

Resy Hunter is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Resy Hunter?

It is built and maintained by shahedkhan30 (@shahedkhan30); the current version is v2.1.0.

💬 Comments