Agent skill

Call E Booking

by CALLE-AI in CALLE-AI/awesome-phone-call-agents

Book restaurant tables or medical appointments via CALL-E AI voice calls.

MITAuto-check: notes

Install Call E Booking

skills CLI
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill call-e-booking -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install CALLE-AI/awesome-phone-call-agents call-e-booking --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
call-e-booking
GitHub stars
107
Token cost
~6.4k tokens
SKILL.md length
2,994 words
Files
9 (incl. scripts, references)
Skills in repo
101
Repo updated
First seen
Licence
MIT

At a glance

Book restaurant tables or medical appointments via CALL-E AI voice calls.

  • Works in 6 steps: Gather any missing details — the… → Plan — run calle_booking.py plan ... to… → Confirm — wait for explicit user… → …
  • Schedule anything over the phone
  • SKILL.md covers What CALL-E is, Quick-start (the simplest…, Quick-start (the agent runs… and Manual usage (debugging), plus 14 more sections
  • Runs Python scripts from its folder; calls python3; needs CALLE_API_KEY

What it does

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.

When your agent uses it

  • Schedule anything over the phone

Example prompts

  • “/call-e-booking”

Requirements

  • Python 3
  • A credential in CALLE_API_KEY

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Gather any missing details — the business phone number, the user's name, callback number, email, and any special requests. A host may…
  2. Plan — run calle_booking.py plan ... to build and preview the exact task + recipient + result schema. This is a dry-run with NO network…
  3. Confirm — wait for explicit user approval. Never dial without it.
  4. Book — run calle_booking.py book --confirm .... This calls calls.create() then calls.wait_for_result() — the explicit split preserves the…
  5. Calendar — if structured_result.booked is true, create a Google Calendar event via the google-workspace skill (gws CLI: $PY $GAPI calendar…
  6. Deliver — summarize the confirmation (or failure) and deliver to the user. The CLI writes to stdout; gateway delivery and background…

What it can do on your machine

Read from SKILL.md and the folder at commit 38d4118. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 2 files in scripts/ (Python), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • heycall-e.com
    • dashboard.heycall-e.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • CALLE_API_KEY

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~42
When it runs · the whole SKILL.md, loaded when a task matches
~6.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~13k

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.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:134
    ├── .env — CALLE_API_KEY + caller phone

Automated 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.

SKILL.md

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.

Download SKILL.mdSave it as .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.
name
call-e-booking
description
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.
tags
booking, voice, call, restaurant, medical, calendar, calle-ai

CALL-E Booking

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.

What CALL-E is

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:

bash
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.

Quick-start (the simplest path: --task)

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:

bash
# 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.

Quick-start (the agent runs this for you)

When the user says "book a table at [restaurant] for [N] at [time]," the agent:

  1. Gather any missing details — the business phone number, the user's name, callback number, email, and any special requests. A host may supply consented memory, but the scripts do not implement memory. Pass identity explicitly through CLI arguments and export required environment variables before launch.
  2. Plan — run 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.
  3. Confirm — wait for explicit user approval. Never dial without it.
  4. Book — run 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.
  5. Calendar — if 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.
  6. Deliver — summarize the confirmation (or failure) and deliver to the user. The CLI writes to stdout; gateway delivery and background notifications depend on the host and are not implemented by these scripts.

Manual usage (debugging)

bash
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 --pretty

For medical appointments, swap --kind medical and use --reason "GP visit" instead of --party-size.

Generic booking kinds

--kind is optional when --task is provided (defaults to generic). When you do pass it, it accepts any value, not just restaurant / medical:

  • Raw task — pass --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.
  • Built-in templates — restaurant (needs --party-size) and medical (needs --reason) produce tailored task text + result schema.
  • Generic fallback — any other --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).
  • Fully custom schema — pass --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.
bash
# 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"

Architecture

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 delivery

Configuration for non-SA users

calle_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:

VariablePurpose
CALLE_API_KEYCALL-E API key (required for book)
BOOKING_PHONEYour 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.

Prerequisites

  • CALL-E account: sign up at https://heycall-e.com (20 free calls to start).
  • API key: get from https://dashboard.heycall-e.com/account/api-keys. Store in your environment file:
    CALLE_API_KEY="iams_live_..."   # key prefix varies (iams_live_, calle_live_, etc.)
  • Callback number: store your phone number in your environment file:
    BOOKING_PHONE="+27XXXXXXXXX"
  • Python SDK: installed in the skill's own venv (Python 3.9+). See references/venv-setup.md. All scripts run via $PY $SCRIPT.
  • Google Calendar: the google-workspace skill must be fully OAuth-authenticated (missing google_token.json or google_client_secret.json = blocked).
  • Telegram: Hermes gateway must have the Telegram channel wired.

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.

Safety rules

  1. Never dial without explicit user confirmation. calle_booking.py book requires --confirm. The plan must be shown and approved first.
  2. Real phone calls. Always remind the user that --confirm will place a real outbound call to the number shown.
  3. Medical calls are higher risk — strict IVRs, hold queues, privacy/consent rules. Test the pipeline on restaurants first.
  4. Cost. 20 free calls, then paid. Check the CALL-E dashboard for pricing.

Identity

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.

Calendar availability (variant A: book within free windows)

⚠️ 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"},...]}.
  • Pipe it straight into calle_booking.py --free-slots "$FREE" (accepts either the array or the full calendar_slots.py object).
  • Google source: google_api.py calendar list (needs google-workspace OAuth).
  • Apple source: osascript reading Calendar.app (see TCC pitfall; degrades to "all free" if unreadable).
  • Window formats accepted: full ISO {"start","end"}, or shorthand {"date","start","end","timezone"}.

Research calls (use phone-scout, NOT calle_booking.py)

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:

bash
# 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 price

The 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.

Interactive flow (terminal, desktop, or any gateway)

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:

  1. User — "book a table for 2 tonight at Kettle Steak" (or "book me a GP appointment").
  2. Agent gathers missing details: business phone number, date/time, party size / reason, special requests. Ask for identity, or use consented host context and explicitly exported settings. If the user says "when I'm free", compute windows: $PY $SLOTS --source google --days N.
  3. Agent previews the plan ($PY $BOOK plan ...) and shows the user the exact task + the number that will be dialed.
  4. Agent confirms — "Reply YES to place this call." Never dial before this.
  5. Agent books — $PY $BOOK book --confirm ... (blocks until terminal, or --no-wait to background it).
  6. Agent finishes — parses structured_result, writes the calendar event, replies with the confirmation (date, time, place, reference number).

Notes:

  • The confirmation gate is text-based and surface-agnostic — a plain "YES" works on every gateway, no buttons required.
  • The CLI prints to stdout. Returning that output to a Telegram/gateway chat requires the host's delivery configuration; no routing guarantee is made here.
  • For a long call, use --no-wait + status --call-id (or a cron poller) so the conversation isn't blocked for minutes.

Delegating a booking (delegate_task)

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:

  • Gather + confirm in the parent FIRST. Subagents cannot ask the user (no so collect every detail and get explicit approval before delegating. The subagent runs book --confirm with approval already given.
  • Pass everything in context. Subagents have no memory of the conversation — include identity, the exact command, and file paths.
  • Not durable. A delegated child is process-local; if the parent session exits, the child is lost. For work that must survive, use a cron job + --no-wait + status --call-id instead.
  • The subagent's summary is a self-report — verify the calendar event was actually created (re-run calendar list) before telling the user it worked.

Handling outcomes (booked, not-booked, alternatives, failures)

The structured_result and each attempts[] element tell a story. Here's the full decision tree the agent must follow after book --confirm finishes:

booked = true (success)

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.

Show full SKILL.md (1,192 more words)Show less
booked = false (business declined or could not book)

CALL-E spoke to someone but could not make a booking. Reasons include:

  • No availability at all. The business is fully booked. CALL-E should have asked for the closest alternatives — they appear in 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.
  • Wrong number / not a restaurant or clinic. The call connected but the business doesn't do bookings. Report verbatim; suggest the user verifies the number.
  • Language / communication failure. The business couldn't take an English booking or the AI couldn't navigate the conversation. Check attempts[].summary + failure_message. Offer to retry with a different approach (e.g. --notes "speak slowly, use French as fallback").
Call never dialed / no contact

If status is failed or attempts[].status is failed / canceled, nobody picked up. Check attempts[].failure_code and failure_message:

SignalMeaningAction
failure_code = voicemail or no_answerUnanswered / voicemailReport: "Nobody answered. Try again later or try a different number?"
failure_code = operator_intercept or call_blockedCarrier/call blockingReport; the number or region may not be reachable
failure_code = ivr or call_screeningAutomated system blocked the AIReport; 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 terminalUse status --call-id <id> to inspect; the call may still be in queued or in_progress
Retry with different parameters

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)
No contact at all (status = queued / never reached dialing)

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.

The retry loop (agent pattern)

If the business has no availability and the user wants to try alternatives, the loop is:

  1. Read the alternatives from attempts[].summary or notes.
  2. Show them to the user.
  3. If the user picks one → re-plan with the new target date/time, get re-confirmation, then book --confirm again.
  4. If the user rejects all → suggest widening the date range or trying a different venue. Offer to use --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.

Pitfalls

  • 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

  • references/result-schemas.md — the restaurant and medical JSON Schema specs CALL-E validates against
  • references/sdk-api.md — calle-ai SDK method signatures, call lifecycle, and model reference
  • references/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 patterns

Scripts

  • scripts/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

Files

SKILL.md and 8 other files (scripts, references) in skills/call-e-booking of CALLE-AI/awesome-phone-call-agents.

  • SKILL.md
  • references/examples.md
  • references/live-calle-pitfalls.md
  • references/result-schemas.md
  • references/safety.md
  • references/sdk-api.md
  • references/venv-setup.md
  • scripts/calendar_slots.py
  • scripts/calle_booking.py

Open the folder on GitHubat commit 38d4118

Compare with similar skills

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.

Call E Booking compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Call E Booking this skillCALLE-AI/awesome-phone-call-agents107—~6.4kAutomated safety check: NotesMIT
Restaurant Bookingasgeirtj/system_prompts_leaks69k—~2.6kAutomated safety check: PassCC0-1.0
Restaurant Bookinggooseworks-ai/goose-skills1.2k1 repos~1.7kAutomated safety check: PassMIT
Table Fitasgeirtj/system_prompts_leaks69k—~772Automated safety check: PassCC0-1.0
Day Booksickn33/agentic-awesome-skills47k1 repos~7kAutomated safety check: PassMIT
BookingsBuilderIO/agent-native7.1k—~345Automated safety check: PassNone

Similar skills

  • Restaurant Booking

    asgeirtj/system_prompts_leaks

    Find an available table and make, change, or cancel an authorized restaurant reservation.

    69k GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed
  • Restaurant Booking

    gooseworks-ai/goose-skills

    Book restaurant reservations via browser automation. An agent skill from gooseworks-ai/goose-skills.

    1.2k GitHub starsUsed in 1 repo~1.7k tokens
    Productivity & AutomationAuto-check passed
  • Table Fit

    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.

    69k GitHub stars~772 tokensUpdated yesterday
    Testing & QAAuto-check passed
  • Day Book

    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.

    47k GitHub starsUsed in 1 repo~7k tokens
    Business, Finance & HRAuto-check passed
  • Bookings

    BuilderIO/agent-native

    Booking lifecycle — pending, confirmed, rescheduled, cancelled — plus attendees, references, no-shows, and reminders.

    7.1k GitHub stars~345 tokensUpdated yesterday
    Auto-check passed
  • Restaurant Recommendations

    asgeirtj/system_prompts_leaks

    Find restaurants that fit the people, occasion, location and budget.

    69k GitHub stars~755 tokensUpdated yesterday
    Auto-check passed

More from CALLE-AI/awesome-phone-call-agents

All 101 skills in this repo
  • Accessible Outing Verifier

    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.

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Ground Truth Gate

    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…

    107 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Is It Accessible

    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…

    107 GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Landmark Navigation Assist

    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…

    107 GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Research Gap Call Verifier

    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…

    107 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Structured Outcome Followup Call

    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…

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed

Questions about Call E Booking

What does Call E Booking do?

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.

When should I use Call E Booking?

Call E Booking fits situations like: schedule anything over the phone.

How do I install Call E Booking in Claude Code?

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.

How do I install Call E Booking in Codex?

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.

Can I use Call E Booking in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Call E Booking need to run?

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.

Does Call E Booking access the network?

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.

Is Call E Booking safe to install?

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.

What licence does Call E Booking use?

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.

How many tokens does Call E Booking use?

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.

What are the alternatives to Call E Booking?

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.

Who maintains Call E Booking?

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.