openclaw/skills/opentable/SKILL.md
Read upcoming OpenTable reservations or handle attended ad-hoc OpenTable availability and exact-approval booking. Use for OpenTable account reads, attended restaurant searches, or a user-confirmed one-off reservation; route canonical recurring date-night, double-date, and quarterly-group jobs to the restaurant-book skill instead.
npx skillsauth add Dbochman/dotfiles opentableInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use opentable-reservations for a fail-closed read of upcoming reservations
and the approval-gated opentable-book command for attended ad-hoc
availability or booking. Route every canonical recurring date-night,
double-date, or quarterly-group job to restaurant-book; its deployed scope
is the standing authorization and its coordinator owns both providers. Direct
OpenTable CLI access is intentionally outside this skill because its mutation
commands do not enforce the one-use approval binding below.
opentable-reservations --json
This read-only command uses the dedicated authenticated opentable PinchTab
profile. It succeeds only when that browser token matches the protected
expected-account binding and the page proves the entire upcoming list is
loaded. Pagination, virtualization, opaque cards, count mismatches, login
overlays, and parsing uncertainty fail closed. A successful response contains
only provider, checked_at, and normalized platform, restaurant, date, time,
party-size, status, and optional-location facts; reservation IDs remain
internal for duplicate detection. It never invokes op, exposes page text or
URLs, or prints browser, identity, or authentication data.
The opentable-book.sh script uses Pinchtab (headless browser automation) for
an attended, approval-gated OpenTable flow. It proceeds only when the search
renderer exposes an inspectable timeslot control. Current OpenTable result
cards can render visually inside an opaque component; when that happens the
wrapper returns availability_renderer_unavailable before any mutation. It
does not use coordinate clicks, infer availability from pixels, or silently
switch providers.
Preview is the default. It may open OpenTable's booking-details page, but it cannot click Complete reservation. A complete preview creates a protected, short-lived, one-use approval ID bound to the exact restaurant, location, date, time, party size, seating, payment, cancellation, no-show, venue, and form facts.
# Preview only (same behavior with an explicit --dry-run)
opentable-book \
[--dry-run] [--max-time-delta MINUTES] \
"<search_term>" <date> [time] [party_size]
# Commit only the exact approved preview; do not repeat the search arguments
opentable-book \
--confirm "<approval_id>"
The default maximum difference from the requested time is 30 minutes. Override
it during preview with --max-time-delta MINUTES or set
OPENTABLE_MAX_TIME_DELTA_MINUTES. Accepted values are 0-720 minutes. Approval
IDs expire after five minutes by default and are consumed on the first commit
attempt, including a rejected changed-facts attempt.
# Preview by cuisine + area
opentable-book "Italian brookline newton" 2026-08-15 19:00 2
# Commit the approval ID returned by that preview
opentable-book \
--confirm "<approval_id>"
Preview and commit each emit exactly one JSON object. Output is restricted to reservation facts; it never includes page bodies, raw browser responses, checkout data, booking URLs, cookies, or authentication tokens.
{"success":true,"mode":"preview","status":"ready_to_confirm","approvable":true,"approval_id":"...","restaurant":"Example Restaurant","location":"123 Main St, Boston, MA","seating":"Standard","selected_date":"2026-08-15","selected_time":"7:15 PM","selected_party_size":2,"payment_required":"no","payment_terms":"No payment required at booking","cancellation_policy":"...","no_show_policy":"..."}
{"success":true,"mode":"preview","status":"terms_unknown","approvable":false,"approval_id":"","payment_required":"unknown","cancellation_policy":"unknown","no_show_policy":"unknown"}
{"success":true,"mode":"commit","status":"confirmed","approval_id":"...","confirmation_id":"...","restaurant":"Example Restaurant","confirmed_date":"2026-08-15","confirmed_time":"7:15 PM","party_size":2}
{"success":false,"mode":"commit","status":"unknown","error_code":"reservation_status_unknown","non_retryable":true,"mutation_attempted":true,"reservation_may_exist":true}
{"success":false,"mode":"preview","error_code":"outside_time_window","message":"Closest available time exceeds the configured maximum delta","requested_time":"19:00","closest_time":"8:00 PM","time_delta_minutes":60,"max_time_delta_minutes":30}
{"success":false,"mode":"preview","error_code":"availability_renderer_unavailable","message":"OpenTable result cards could not be safely inspected"}
opentable profile as a managed headless Pinchtab instance and opens an isolated tab0700 cache with mode-0600 state--confirm <approval-id>, consumes the ID and revalidates every bound factmutation_attempted before clicking the single verified final buttonno_available_times as an inspectable empty result; never reinterpret availability_renderer_unavailable as no availability--confirm; never construct, reuse, or log itrestaurant-book; otherwise preview with opentable-book "cuisine area" DATE TIME PARTYapprovable is true; if any detail is unsuitable or unknown, change the request and preview againopentable-reservations --json and stop if the complete account read fails or already contains a conflicting reservation--confirm <approval-id> with no other argumentsFor a specific restaurant, use its exact name and location as the search term. Do not switch to the direct CLI when the search is inconvenient or incomplete.
--confirm is invalid — commit accepts only --confirm <approval-id>restaurant-snipe — do not bypass this gate with direct CLI or cron bookingopentable-reservations result; a failed lookup is never an empty account--max-time-deltaUse the restaurant-snipe skill for cancellation monitoring, polling, or
pre-authorized background work. Resy scopes may auto-book when explicitly
authorized; the current OpenTable snipe adapter remains notification-only even
though this skill has a standalone reservations reader. Do not create ad-hoc
background loops from this skill.
~/.openclaw/workspace/scripts/opentable-book.sh~/.openclaw/bin/opentable-reservationstools
Use exact configured Reolink cameras through the local Home Hub for availability and power status, fresh stills, visual commentary, protected Dylan/Julia/household sharing, and reversible spotlight control. Supports trusted owner tasks and explicitly scoped proactive automations; not for Nest or Ring cameras, arbitrary recipients, recordings, account changes, or raw camera APIs.
data-ai
Privately manage Dylan and Julia's household plant inventory and care history by physical location, bed, and exact Flower Cam view. Use for confirmed plant onboarding from camera conversations, camera- or bed-filtered inventory, record corrections, individual or whole-bed care, and private filtered exports. Pair with reolink-camera when an owner asks about plants visible in Flower Cam images.
testing
Inspect and control the physically secured Reachy Mini at Crosstown through ClawBody. Use for requests to check Reachy, look around, express an emotion, play any official emotion or dance preset, speak proactively, mute or unmute its microphone, stop movement, or describe what its camera sees.
tools
Handle Reachy/iMessage handoffs, selective durable memory, forgetting, and diagnostics; automatic context comes from the gateway plugin.