Use CallMyCall API to start, end, and check AI phone calls, and return results in chat. Use when the user asks to call someone, plan a future call, end a call, or fetch call results.
This skill helps you operate CallMyCall from chat. It is pull based (no webhook callbacks): you start a call, store the returned call ID in state, and later fetch status and results on demand.
Resolve credentials in this order:
CALLMYCALL_API_KEY (preferred)~/.openclaw/openclaw.json under skills.openclaw-phone.apiKey~/.openclaw/openclaw.json.Persistence rules:
SKILL.md, examples, references, or memory/state files.recent_calls or any conversation-visible output. Do not tell the user “I won’t echo it back.”POST /v1/start-call.sid in state as a recent call.Send the API key in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Never echo the API key back to the user or include it in logs/summaries.
Maintain a list (last 10) of recent calls in state:
recent_calls: array of objects
id (call SID)phone_numbertaskstarted_atstatus (optional, updated when you fetch)Use this list to let the user say "end call 1" or "show results for call 2".
Do not rely on a single validation step. Use all layers below.
Do not finalize a task until all required fields exist:
phone_numberlanguagecall_brief (background + goals)When the user gives the initial request, analyze what is missing. Then ask only for missing info. If the user answers partially, repeat analysis and keep asking for the remaining gaps.
While missing info exists, continue gathering required fields. Do not proceed to the call until all required fields are present.
Before sending the call request:
from_number is not the same as phone_numberfrom_number is requested, run caller-ID preflight:
GET /v1/verified-caller-idsfrom_number exists in verified_caller_idslanguage; normalize voice fields (genderVoice, openaiVoice) only if providedPresent a short review summary:
Ask: "Confirm and place the call?" Do not proceed without explicit confirmation.
from_number is provided, run caller-ID preflight via GET /v1/verified-caller-ids.from_number is not verified, ask user to choose:
POST /v1/verify-caller-id, then GET /v1/verification-status/:verificationId).POST /v1/start-call.sid in recent_calls.Because the API has no scheduling field:
cron, launchd, task scheduler) and do not run autonomous background turns.start-call.If the user asks to schedule for later, explain that this skill does not create background jobs; it can prepare the call plan and execute when the user confirms in-session.
recent_calls from state.GET /v1/calls/:callId if needed.When the user asks to call repeatedly until answered:
POST /v1/start-call.GET /v1/calls/:callId until terminal status.status, duration) or nested (call.status, call.duration).busy, no-answer, failed, or canceled, wait requested interval and place next call.in-progress, orcompleted with duration > 0.Implementation note: keep one base URL per run (https://call-my-call-backend.fly.dev preferred) and use it consistently for both start + status endpoints.
If the user says "end the call" without specifying which, list recent calls and ask which one.
If there is only one active call, confirm and end it.
Call:
POST /v1/end-call with { callSid }.When the user asks for call results:
GET /v1/calls/:callId.GET /v1/calls/:callId/transcripts/stream.GET /v1/calls/:callSid/recording.Return:
references/api.mdexamples/prompts.md