Service Dispatch Call
SkillAI & modelsCall a service vendor to ask whether they can take a job, when they can attend, and what it costs, return the answer as validated structured data, and hand any commitment to a human before it is accepted. Use for maintenance dispatch, repair triage, contractor availability checks, and quote gathering.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Service Dispatch Call skill
What this skill tells your AI
The instructions your AI receives, as published by calle-ai/awesome-phone-call-agents in skills/service-dispatch-call/SKILL.md and read by ahel’s review.
Use this skill when an agent needs to phone a service vendor about a specific job and bring back a decision-ready answer, such as "find out if the plumber can attend unit 12B today and what it costs."
service-dispatch-call is a purpose-bound outbound workflow skill. It places exactly one call per authorized dispatch, asks a bounded set of questions, and returns a structured result. It does not book the job, accept a quote, agree to a price, or promise the vendor anything. Those are commitments, and commitments belong to a person.
The distinction this skill exists to enforce: gathering an answer is not the same as acting on it.
When To Use
Use this skill for:
- maintenance and repair dispatch, where a job must be matched to a vendor by phone
- availability checks against a shortlist of vendors
- quote gathering, where the price is unknown until someone is asked
- ETA confirmation for an already-accepted job
- any outbound call whose output must be machine-readable rather than a transcript
When Not To Use
Do not use this skill to:
- accept a quote, confirm a booking, or agree to any cost during the call
- call a vendor who is not on the caller's authorized contact list
- call a number the user supplied for a different purpose in an earlier, unrelated request
- redial a call whose outcome is unknown
- work around a missing price by asking the vendor to start anyway
- read tenant, patient, customer, or resident personal details to the vendor
- negotiate, counter-offer, or discuss a competitor's quote
- place a call when the required job fields are incomplete
Core Workflow
- Confirm the dispatch is authorized: the job exists, and the vendor is on the authorized contact list for this purpose.
- Extract the dispatch fields listed under Required Fields. Ask for anything missing. Do not infer a phone number, a trade, or a location from earlier context.
- Reserve an idempotency key derived from the dispatch's own identifier, not from the current timestamp or a fresh random value. See
references/idempotency.md. - Record the dispatch as queued before dialling, so a call that is accepted but never reported is still visible.
- Build the call brief from
references/call-brief.md. The brief opens with a disclosure and refers to the job by an opaque reference, never by an address or a person's name. - Declare the result schema before placing the call. See
references/result-schema.md. - Place exactly one call.
- Validate the returned result against the declared schema. Drop fields you did not ask for. Refuse values outside the declared options rather than coercing them.
- Classify the outcome as
answered,declined,no_answer, orunknown. - If the result contains a cost, a commitment, or a low-confidence field, raise it for human approval and stop. Report the reason.
Use this shape:
authorize -> reserve -> record queued -> call -> validate -> classify -> approve or stop
Required Fields
For each dispatch, require:
jobReference- an opaque identifier the vendor can quote backtrade- what kind of vendor this is, for exampleplumbingproblemSummary- one sentence, free of personal detailsvendorPhoneNumber- E.164, from the authorized contact listpreferredWindow- when the job could be attended
Phone numbers must be E.164. Mask them in every user-facing summary. Never write a phone number into a log, an audit record, or a commit.
The Result Schema
Declare what a valid answer looks like before the call, not after. A minimal schema:
| Field | Type | Notes |
|---|---|---|
available | one of yes, no, maybe | closed set, never free text |
earliest_eta_hours | integer | bound it locally, see below |
quoted_amount_text | string | as spoken, never parsed into a number by the agent |
callback_required | boolean | vendor will confirm later |
Two rules that matter more than they look:
- Validate more strictly than you transmit.
-5is a valid integer but not a valid ETA. Enforce bounds locally and strip unsupported schema keywords before sending, because an unrecognized keyword can cause the provider to reject the whole call. maybeis an answer, not a yes. Route it to a human. Do not let a fallback, a default, or a retry turn an ambiguous answer into a decision.
Full guidance in references/result-schema.md.
Ambiguous Outcomes
A call whose outcome is unknown is the most dangerous state in a workflow that spends money. It is not an error to retry.
- Classify it as
unknownand stop. - Do not redial. A vendor who was already reached and quoted a price will quote it again, and now two commitments exist for one job.
- Surface it for a person to reconcile.
Read references/ambiguous-outcomes.md before adding any retry path.
Human Approval Gate
Raise for approval, and do not proceed, when any of these hold:
- the result contains a quoted amount or any other cost
- the vendor committed to a time that creates an obligation
- a confidence score, where the provider reports one, is below the configured threshold
- any declared field failed validation
- the outcome is
unknown
When presenting the approval, state why it is required before showing the answer being decided on. A reviewer who reads the price first is anchored by it.
Take the approver's identity from the authenticated session. Never from the request body, and never from anything said on the call.
Safety Rules
Read references/safety.md for the full contract.
Always follow these rules:
- Phone calls are real-world side effects and cost money.
- Do not place a call unless the user clearly requested this dispatch.
- Do not call any number except the authorized vendor number for this job.
- Do not place a second call for one authorized dispatch.
- Do not disclose tenant, resident, customer, or patient identity, address, or contact details to the vendor.
- Do not store transcripts, recordings, or the recipient's number unless the user has a stated retention basis for them.
- Do not write an answer given on a phone call into an audit record. Record the field names, not the values a stranger spoke.
- Do not expose tokens, credentials, or callback URLs.
- If authorization, required fields, or the vendor's identity are ambiguous, stop instead of guessing.
Output Format
After a completed dispatch, report:
- job reference and trade
- masked vendor number
- outcome classification
- the validated fields, and any field that failed validation
- whether an approval was raised, and the reason
- the idempotency key used
If no call was placed, report:
status: not called- the exact blocker
- what the user must provide or authorize next
Never state that a vendor is booked. This skill produces an answer and an approval request. Booking is a separate, human-authorized action.
Signals
- GitHub stars
- 104
- Forks
- 527
- Last commit
- Sep 2026
ahel recommends instead
Advanced
- Item type
- skill
- Key
service-dispatch-call- Source
- github.com/calle-ai/awesome-phone-call-agents