Restaurant Booking
asgeirtj/system_prompts_leaks
Find an available table and make, change, or cancel an authorized restaurant reservation.
Book restaurant tables or medical appointments via CALL-E AI voice calls.
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/call-e-booking .claude/skills/call-e-booking && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .claude/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-bookingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/call-e-booking .agents/skills/call-e-booking && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .agents/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/call-e-booking .cursor/skills/call-e-booking && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .cursor/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/CALLE-AI/awesome-phone-call-agents.git --path skills/call-e-booking--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/call-e-booking .gemini/skills/call-e-booking && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .gemini/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-bookingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/call-e-booking .github/skills/call-e-booking && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .github/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/call-e-booking .opencode/skills/call-e-booking && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "call-e-booking" agent skill from https://github.com/CALLE-AI/awesome-phone-call-agents/tree/main/skills/call-e-booking into .opencode/skills/call-e-booking/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "call-e-booking", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
call-e-bookingBook restaurant tables or medical appointments via CALL-E AI voice calls.
Call E Booking is an agent skill from CALLE-AI/awesome-phone-call-agents. Book restaurant tables or medical appointments via CALL-E AI voice calls. Load when the user wants to book, reserve, or schedule anything over the phone.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including scripts and reference files (for example `references/examples.md`, `references/live-calle-pitfalls.md` and `references/result-schemas.md`).
The repository describes itself as: Portable phone-call Agent Skills, apps, examples, adapters, and scheduler recipes for AI agents. The licence is MIT.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 38d4118. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
python3From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
heycall-e.comdashboard.heycall-e.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
CALLE_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Call E Booking loads about 6.4k tokens when it runs, and up to ~13k if it reads all its reference files. Until then it costs about 42 tokens; SKILL.md has 2,994 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
├── .env — CALLE_API_KEY + caller phoneAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from CALLE-AI/awesome-phone-call-agents at commit 38d4118, republished under its MIT licence (© CALLE-AI). 2,994 words, ~6,356 tokens.
.claude/skills/call-e-booking/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.Book restaurant tables and medical appointments via CALL-E — an AI voice agent that places real phone calls, has live conversations, adapts to unexpected responses, and returns schema-validated structured results you can feed straight into a calendar.
CALL-E is a goal-driven AI voice agent, not a rigid script bot. You give it a natural-language goal (e.g. "book a table for 2 at 7pm at the restaurant you reach") + a phone number, and it plans the call, dials, holds a live conversation, and returns a structured result with per-attempt summaries and full transcripts.
This skill wraps the calle-ai Python SDK and orchestrates booking calls: gather parameters → show plan → confirm → dial → poll → result.
Install calle-ai in a Python 3.9+ venv.
Run the following commands from skills/call-e-booking/, using that interpreter:
PY="python3" # or ./venv/bin/python3 if using venv
BOOK="scripts/calle_booking.py"
SLOTS="scripts/calendar_slots.py"
GAPI="<your-calendar-tool>"Use $PY $BOOK ..., $PY $SLOTS ..., and $PY $GAPI ... everywhere below.
The most generic entry point is --task — give it a goal + phone number and
CALL-E handles the rest. No --kind, no --name, no templates required:
# Preview
$PY $BOOK plan \
--task "Call the dentist and book a teeth cleaning for Thethela Faltein next Tuesday morning. Budget is $300." \
--phone "+12125551234"
# Execute
$PY $BOOK book --confirm \
--task "Call the dentist and book a teeth cleaning for Thethela Faltein next Tuesday morning. Budget is $300." \
--phone "+12125551234"The --task flag bypasses all templates. The task text IS the instruction
CALL-E receives. The structured template flags (--kind, --name,
--party-size, --reason, --date, --time) still work when you prefer
structured input, but --task is the simplest path for any booking type.
When the user says "book a table at [restaurant] for [N] at [time]," the agent:
calle_booking.py plan ... to build and preview the exact task + recipient + result schema. This is a dry-run with NO network call. Show it to the user.calle_booking.py book --confirm .... This calls calls.create() then calls.wait_for_result() — the explicit split preserves the call_id so a timeout doesn't lose the reference (recover with status --call-id <id>). Polls every 5s (default) until terminal. Returns machine-readable JSON with structured_result, attempts (summary + transcript per attempt), and completion_confidence.structured_result.booked is true, create a Google Calendar event via the google-workspace skill (gws CLI: $PY $GAPI calendar create ...). The result's date/time are business-local, not user-local: resolve the business timezone from the phone's area code (or add a timezone field to the result schema) and pass that offset — Google then renders it in the user's timezone automatically.PY="python3" # or ./venv/bin/python3 if using venv
SCRIPT="scripts/calle_booking.py"
SLOTS="scripts/calendar_slots.py"
# Dry-run: preview without dialing
$PY $SCRIPT plan --kind restaurant --phone "+14155551234" \
--date 2026-08-20 --time 19:00 --party-size 2 \
--name "Your Name" --caller-phone "+14155550000" --email you@email.com
# Actually dial (--confirm is required)
$PY $SCRIPT book --confirm --kind restaurant --phone "+14155551234" \
--date 2026-08-20 --time 19:00 --party-size 2 \
--name "Your Name" --caller-phone "+14155550000" --email you@email.com --pretty
# Fire-and-forget: exit immediately, poll with `status` later
$PY $SCRIPT book --confirm --kind restaurant --phone "+14155551234" \
--date 2026-08-20 --time 19:00 --party-size 2 \
--name "Your Name" --caller-phone "+14155550000" --email you@email.com --no-wait
# With webhook: CALL-E POSTs the result to your endpoint (implies --no-wait)
$PY $SCRIPT book --confirm --kind restaurant --phone "+14155551234" \
--date 2026-08-20 --time 19:00 --party-size 2 \
--name "Your Name" --caller-phone "+14155550000" --email you@email.com \
--webhook-url "https://your-server.com/call-e-webhook"
# Check an in-flight / completed call (read-only, no dialing)
$PY $SCRIPT status --call-id cal_... --events --pretty
# Free-slot availability (variant A)
$PY $SLOTS --source google --days 3 --prettyFor medical appointments, swap --kind medical and use --reason "GP visit" instead of --party-size.
--kind is optional when --task is provided (defaults to generic).
When you do pass it, it accepts any value, not just restaurant / medical:
--task "..." for the fully generic path. The task text
is the entire instruction; --kind defaults to generic and the generic
result schema is used. This is the recommended entry point for anything that
isn't a standard restaurant/medical booking.restaurant (needs --party-size) and medical
(needs --reason) produce tailored task text + result schema.--kind (e.g. salon, garage, vet,
hotel, contractor) uses a generic template:
"Book a {kind} at the business reached at {phone}…" and the generic result
schema (booked, date, time, business_name, confirmation_number,
notes, timezone_offset). Extra detail goes in --notes (or --reason).--schema-file path/to/schema.json and the
result schema becomes whatever JSON Schema you provide, for any booking type
imaginable, without editing this script.# Generic: book a vet appointment
$PY $SCRIPT plan --kind vet --phone "+141****1234" --name "Jane Doe" \
--date 2026-08-20 --time 10:00 --reason "cat annual checkup"
# Fully custom: a garage/valet booking with its own schema
$PY $SCRIPT plan --kind garage --schema-file ./valet_schema.json \
--phone "+141****1234" --name "Jane Doe" --notes "car reg CA 123-456"Skill (SKILL.md) — orchestrates the workflow:
├── Memory — user's identity (name, email, location)
├── .env — CALLE_API_KEY + caller phone
├── phone-scout → upstream research (discovers businesses, phone-verifies info)
├── scripts/calle_booking.py — wraps calle-ai SDK
│ ├── plan (dry-run, JSON preview, no network)
│ ├── book (dial + poll, requires --confirm)
│ └── status (read-only, any existing call)
├── google-workspace → gws calendar create
└── Hermes gateway → Telegram deliverycalle_booking.py is not hardcoded to any location or currency. The generic
template (--kind vet, --kind salon, etc.) works for any booking type. Key
environment variables:
| Variable | Purpose |
|---|---|
CALLE_API_KEY | CALL-E API key (required for book) |
BOOKING_PHONE | Your callback number, given to businesses |
No location-specific defaults — phone numbers are E.164, dates are ISO 8601,
and the generic booking template adapts to whatever --kind you pass.
your environment file:CALLE_API_KEY="iams_live_..." # key prefix varies (iams_live_, calle_live_, etc.)your environment file:BOOKING_PHONE="+27XXXXXXXXX"$PY $SCRIPT.google-workspace skill must be fully OAuth-authenticated (missing google_token.json or google_client_secret.json = blocked).The scripts do not automatically read an environment file. Export
CALLE_API_KEY in the process environment before a live run. If you choose to
keep exports in a private local file, source only that trusted file yourself;
do not commit it. BOOKING_PHONE is an operator convenience: pass its value
explicitly with --caller-phone. Calendar and messaging integrations above
are optional host integrations, not prerequisites for the offline plan path.
calle_booking.py book requires --confirm. The plan must be shown and approved first.--confirm will place a real outbound call to the number shown.Gather the user's identity for the current request. A host may offer consented
memory, but persistence is host-dependent; this CLI provides no identity store.
Pass the callback number explicitly with --caller-phone. Do not hardcode or
commit personal information in the skill.
⚠️ Unreadable calendar = unknown, not all-free. If the calendar source is unavailable (e.g. TCC gate, expired OAuth token), treat availability as unknown and require the user to provide explicit windows or a preferred date/time. Never assume all time is free.
⚠️ Results are advisory until confirmed. After the call returns a booked date/time/timezone, the agent MUST present it to the user for confirmation before writing it to any calendar. Do not mutate the calendar without explicit human sign-off on the specific slot/timezone.
Instead of a hard --date/--time, read the user's calendar to find free
windows and inject them into the task so CALL-E negotiates within them.
Reading the user's calendar gives the user's free times only — the business
has its own openings that only the call resolves — so inject the windows and
let CALL-E find a slot inside them (don't hard-demand one time).
scripts/calendar_slots.py --source google|apple --from <date> --days N emits {"free_slots":[{"start","end"},...]}.calle_booking.py --free-slots "$FREE" (accepts either the array or the full calendar_slots.py object).google_api.py calendar list (needs google-workspace OAuth).osascript reading Calendar.app (see TCC pitfall; degrades to "all free" if unreadable).{"start","end"}, or shorthand {"date","start","end","timezone"}.Do NOT repurpose calle_booking.py for research, availability checks, or price
inquiries. calle_booking.py makes reservations — it books things. For researching
businesses by phone (calling to ask questions without making a booking), use the
phone-scout skill instead:
# WRONG — calle_booking.py is for bookings, not research
# $PY $BOOK book --confirm --task "check availability..."
# CORRECT — phone_scout.py owns research calls
python3 phone_scout.py \
call-one --candidate-id rest-001 --phone "+27..." --name "Restaurant" \
--research-questions availability vegetarian_options priceThe two skills have clean separation:
phone-scout — researches businesses (discovers candidates, calls them for info, ranks results). Information gathering only — no reservations.call-e-booking — books businesses (makes confirmed reservations, writes to calendar). Reservations only — no research.If you find yourself writing a custom --task to calle_booking.py that asks
questions instead of making a booking, you are in the wrong skill. Load phone-scout.
The same workflow runs as a multi-turn conversation on any surface — CLI, TUI, desktop app, Telegram, Discord, etc. The agent drives the conversation; the scripts stay one-shot commands behind it.
Conversation pattern:
$PY $SLOTS --source google --days N.$PY $BOOK plan ...) and shows the user the
exact task + the number that will be dialed.$PY $BOOK book --confirm ... (blocks until terminal, or
--no-wait to background it).structured_result, writes the calendar event,
replies with the confirmation (date, time, place, reference number).Notes:
--no-wait + status --call-id (or a cron poller) so
the conversation isn't blocked for minutes.For long-running calls, parallel bookings, or keeping the parent conversation clean, delegate the execution step to a sub-agent. The parent still does the interactive gather → plan → confirm; the subagent runs the dial (and calendar write) and reports back.
Single booking:
Use the host's documented delegation API to pass a plain-language task:
run the already approved book --confirm command from this skill directory
with the selected Python interpreter and scripts/calle_booking.py; inherit
the explicitly exported private environment, then return the masked JSON
output to the parent. Include all approved arguments and do not put credentials
in the task text. Calendar writes require their own user-authorized host tool.
Parallel bookings (up to 3 concurrent by default):
Create one host task per separately approved booking only when the operator
actually wants all bookings and the provider account permits that concurrency.
There is no portable delegate_task API implemented by this skill.
Rules:
book --confirm with approval already given.context. Subagents have no memory of the
conversation — include identity, the exact command, and file paths.--no-wait + status --call-id instead.calendar list) before telling the user it worked.The structured_result and each attempts[] element tell a story. Here's the
full decision tree the agent must follow after book --confirm finishes:
The reservation or appointment was confirmed. Proceed to the calendar write.
If date/time differ from the user's original preference (the business only
had a different slot) — write that slot, note the difference, and confirm the
user is OK before creating the event.
CALL-E spoke to someone but could not make a booking. Reasons include:
attempts[].summary or
notes as "they have Tuesday 19:00" / "next available is Monday 14:00".
Report these alternatives to the user and offer to re-book at one of them.attempts[].summary + failure_message. Offer to retry with a different
approach (e.g. --notes "speak slowly, use French as fallback").If status is failed or attempts[].status is failed / canceled,
nobody picked up. Check attempts[].failure_code and failure_message:
| Signal | Meaning | Action |
|---|---|---|
failure_code = voicemail or no_answer | Unanswered / voicemail | Report: "Nobody answered. Try again later or try a different number?" |
failure_code = operator_intercept or call_blocked | Carrier/call blocking | Report; the number or region may not be reachable |
failure_code = ivr or call_screening | Automated system blocked the AI | Report; this happens often with medical clinics. Suggest calling again at a different time |
timeout occurs (--no-wait path, or wait exceeded) | Call created but never terminal | Use status --call-id <id> to inspect; the call may still be in queued or in_progress |
When the agent retries, it must change a flag so the idempotency key changes (otherwise CALL-E returns the same call). Options:
--notes "retry #2 — ask for Tuesday instead of Friday"--date 2026-08-25 --time 19:00 (hard-schedule the alternative slot)--free-slots '<updated windows>' (narrow or shift windows)If the call sits in queued indefinitely (e.g. unsupported region like +27
was), report the likely cause (region support, downstream carrier) and suggest
waiting for CALL-E to enable the region. The call will auto-cancel after
CALL-E's own timeout.
If the business has no availability and the user wants to try alternatives, the loop is:
attempts[].summary or notes.book --confirm again.--free-slots with more days.For a fully-automated retry (no user in the loop), use a cron job: --no-wait
status --call-id polling every 60s, and when booked == false, run the
retry with bumped parameters and a fresh idempotency key.Async duration — a real call takes 1–3+ minutes. The book subcommand blocks with polling. Increase --timeout (default 900s) for long hold times.
Call framing — CALL-E's task validator requires transparency from the start. The task must state upfront that this is an information-gathering call. The working pattern: "Hi, I'm calling to ask a few questions about [service] on [day] — this is just for research, I'm not making a booking today," ask the questions, then close with "As mentioned, this is just research. My client will call back if they decide to book." Identify as "an assistant" (never "AI assistant" or "bot"). The phone_scout.py task builder encodes this exact pattern. Detailed live-test data + SDK paths in references/live-calle-pitfalls.md.
Shared-line concurrency limit = 1. CALL-E's default shared line allows only ONE active outbound call at a time (shared across API, MCP, and Dashboard). Firing N parallel calls makes N-1 fail with "account concurrency limit of 1" or "call plan could not be prepared." To unlock up to 10 concurrent calls, complete KYC and purchase a dedicated number at https://dashboard.heycall-e.com/account/numbers/buy. Until then, serialize calls — one call-one or book --confirm at a time. This is the root cause of the earlier +1 parallel-call failures; they were hard concurrency limits, not transient backend errors.
+27 (South Africa) support is prefix-dependent. Confirmed working: +27 87 (Sorbet Man Sandton City, full transcript). Blocked: +27 11 (JHB landline), +27 21 (Cape Town), +27 78. Error: "Calls to South Africa in English aren't currently supported." CALL-E is in active +27 rollout — test one number first before a multi-call SA research run.
IVR / call screening may block the AI voice. Check attempts[].failure_code and failure_message when booked is false.
Idempotency — the script derives a deterministic idempotency key from the full request (SHA-256 hash). Re-running the identical command within CALL-E's key TTL returns the SAME call (no double-booking). Changing any flag creates a new key and a new call.
Phone format — E.164 with country code (+14155551234). Local numbers without + are rejected.
Timezone — always pass --timezone so CALL-E disambiguates the time. The structured result date/time are in business-local time.
Cross-timezone calendar write — when the business is in a different timezone than the user (verified: a US restaurant +1 917 booked from SAST), the business-local date/time must be written with the business offset (derive from the area code, e.g. +1 917 → America/New_York), NOT the user's location. Google Calendar converts to the user's timezone automatically. The clean fix is to add a timezone field to the result_schema so CALL-E reports the business's IANA tz instead of guessing from the number.
Structured result can be null — if CALL-E could not produce a schema-valid result, structured_result is null even if the call ran. Check attempts[].summary and task_completed as fallback signals.
datetime.fromisoformat requires seconds — "18:30" raises Invalid isoformat string; normalize HH:MM → HH:MM:00 before parsing (the --free-slots shorthand pads this automatically).
Apple Calendar via osascript is TCC-gated — on modern macOS, AppleScript automation to Calendar returns "Application isn't running" until the terminal has Automation permission (System Settings → Privacy & Security → Automation). calendar_slots.py handles this by degrading to "no events" (all free) with a stderr warning. ~/Library/Calendars/ may be empty for Google-only users.
Background environment — there is no _load_dotenv() in this script. Ensure the host passes exported CALLE_API_KEY to a live child process and supply --caller-phone explicitly. If the host does not inherit exports, configure its private environment before launching; never copy credentials into a prompt or log.
Timeout ≠ call failure — if book exits with "Timed out waiting for call", the call was created successfully (it has a call_id) but never reached a terminal state. Reasons include: unsupported destination region, voicemail, or no answer. The script prints the call_id on timeout — run $PY $BOOK status --call-id <id> to inspect the actual state. The explicit create() + wait_for_result() split (instead of the old create_and_wait one-shot) ensures call_id always survives a timeout.
references/result-schemas.md — the restaurant and medical JSON Schema specs CALL-E validates againstreferences/sdk-api.md — calle-ai SDK method signatures, call lifecycle, and model referencereferences/venv-setup.md — Python venv pattern for skills that need packages on macOS (PEP 668)references/live-calle-pitfalls.md — live CALL-E testing learnings: +27 instability, +1 parallel-call failures, task validation, SDK data paths, schema strictness, discovery data quality, disclosure patternsscripts/calle_booking.py — the main booking CLI tool (plan, book --confirm, status). Supports --free-slots (variant A), --kind <any> (any vertical — vet, salon, garage, ...), --schema-file for custom JSON Schema result schemas, --no-wait / --webhook-url for fire-and-forget, and a lazy SDK import so plan works without calle-ai/API key.scripts/calendar_slots.py — emits free time windows from Google (gws) or Apple (osascript) calendars; pipe its JSON into calle_booking.py --free-slots.© CALLE-AI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 8 other files (scripts, references) in skills/call-e-booking of CALLE-AI/awesome-phone-call-agents.
Open the folder on GitHubat commit 38d4118
Call E Booking next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Call E Booking this skillCALLE-AI/awesome-phone-call-agents | 107 | — | ~6.4k | Automated safety check: Notes | MIT | |
| Restaurant Bookingasgeirtj/system_prompts_leaks | 69k | — | ~2.6k | Automated safety check: Pass | CC0-1.0 | |
| Restaurant Bookinggooseworks-ai/goose-skills | 1.2k | 1 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Table Fitasgeirtj/system_prompts_leaks | 69k | — | ~772 | Automated safety check: Pass | CC0-1.0 | |
| Day Booksickn33/agentic-awesome-skills | 47k | 1 repos | ~7k | Automated safety check: Pass | MIT | |
| BookingsBuilderIO/agent-native | 7.1k | — | ~345 | Automated safety check: Pass | None |
asgeirtj/system_prompts_leaks
Find an available table and make, change, or cancel an authorized restaurant reservation.
gooseworks-ai/goose-skills
Book restaurant reservations via browser automation. An agent skill from gooseworks-ai/goose-skills.
asgeirtj/system_prompts_leaks
Keep a Markdown table readable in a narrow terminal of about 100 display columns - a wide table or one carrying prose in its cells wraps into unreadable ragged rows.
sickn33/agentic-awesome-skills
Daily cash, bank and digital day book: opening and closing balances per book, in/out movements, debit/credit presentation and reconciliation status.
BuilderIO/agent-native
Booking lifecycle — pending, confirmed, rescheduled, cancelled — plus attendees, references, no-shows, and reminders.
asgeirtj/system_prompts_leaks
Find restaurants that fit the people, occasion, location and budget.
CALLE-AI/awesome-phone-call-agents
Demonstrates advisory accessibility-planning checks with offline fixtures and a proposed bounded CALL-E workflow; use for exploring unknown or qualified venue claims without making calls.
CALLE-AI/awesome-phone-call-agents
A skill your agent uses when an agent holds some evidence for a physical-world claim but the evidence is broader, narrower, or older than the exact question asked, and it must first decide whether a…
CALLE-AI/awesome-phone-call-agents
Call a venue and ask the accessibility questions that matter to one specific person — step-free entry, hearing loop, guide dogs, quiet hours, changing places — then return a per-need verdict backed…
CALLE-AI/awesome-phone-call-agents
Turns a pre-written, building-level location config into a CALL-E outbound phone-call task that guides a delivery driver through the last few hundred metres to a specific building using landmarks…
CALLE-AI/awesome-phone-call-agents
Turn cited business research into a bounded, approval-gated phone-call plan that asks only unresolved factual questions, then reconcile CALL-E-compatible results without treating voicemail, refusal…
CALLE-AI/awesome-phone-call-agents
Place a goal-driven CALL-E call that collects specific structured answers, score those answers against a deterministic rubric you supply, and conditionally trigger a follow-up action — all runnable…
Book restaurant tables or medical appointments via CALL-E AI voice calls. Call E Booking is an agent skill from CALLE-AI/awesome-phone-call-agents. Book restaurant tables or medical appointments via CALL-E AI voice calls.
Call E Booking fits situations like: schedule anything over the phone.
Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a claude-code`. Or copy the skill folder (skills/call-e-booking in CALLE-AI/awesome-phone-call-agents) into .claude/skills/call-e-booking in your project. Claude Code loads it when a task matches its description.
Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a codex`. Or copy the skill folder (skills/call-e-booking in CALLE-AI/awesome-phone-call-agents) into .agents/skills/call-e-booking in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/call-e-booking, .gemini/skills/call-e-booking, .github/skills/call-e-booking and .opencode/skills/call-e-booking in your project.
Going by SKILL.md and its folder, Call E Booking needs Python for the scripts in its folder, the command-line tools its instructions call (python3) and credentials named CALLE_API_KEY. Our summary lists: Python 3; A credential in CALLE_API_KEY.
SKILL.md names 2 domains. As links in the text: heycall-e.com and dashboard.heycall-e.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Call E Booking is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Call E Booking: Restaurant Booking (asgeirtj/system_prompts_leaks, 69k stars), Restaurant Booking (gooseworks-ai/goose-skills, 1.2k stars), Table Fit (asgeirtj/system_prompts_leaks, 69k stars) and Day Book (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
CALLE-AI (a GitHub organization) maintains it in CALLE-AI/awesome-phone-call-agents, which has 107 GitHub stars. The repository holds 101 skills in this directory. The repository was last updated on October 10, 2026.
Source: CALLE-AI/awesome-phone-call-agents on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.