[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vapi-create-campaign":3,"mdc--uhhuwj-key":43,"related-repo-vapi-create-campaign":1228,"related-org-vapi-create-campaign":1316},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":38,"sourceUrl":41,"mdContent":42},"create-campaign","manage Vapi outbound calling campaigns","Create, schedule, duplicate, inspect, cancel, archive, and troubleshoot Vapi outbound Campaigns. Use for persistent multi-contact calling, CSV or API contact personalization, campaign concurrency, campaign webhooks, pre-dial eligibility, contact outcomes, or rerunning an audience. Do not use for a single call or a simple one-off \u002Fcall batch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"vapi","Vapi","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvapi.png","VapiAI",[13,17,20,23],{"name":14,"slug":15,"type":16},"Campaign Planning","campaign-planning","tag",{"name":18,"slug":19,"type":16},"Automation","automation",{"name":21,"slug":22,"type":16},"Voice","voice",{"name":24,"slug":25,"type":16},"Communications","communications",53,"https:\u002F\u002Fgithub.com\u002FVapiAI\u002Fskills","2026-09-03T07:48:49.446167","MIT",7,[32,33,34,35,36,8,37],"agent-skills","claude-code","codex-skills","openclaw-skills","skills","vapi-ai",{"repoUrl":27,"stars":26,"forks":30,"topics":39,"description":40},[32,33,34,35,36,8,37],"A set of skills and MCP connector to allow agents to build Vapi AI agents, from creating tools and assistants to a phone call","https:\u002F\u002Fgithub.com\u002FVapiAI\u002Fskills\u002Ftree\u002FHEAD\u002Fcreate-campaign","---\nname: create-campaign\ndescription: Create, schedule, duplicate, inspect, cancel, archive, and troubleshoot Vapi outbound Campaigns. Use for persistent multi-contact calling, CSV or API contact personalization, campaign concurrency, campaign webhooks, pre-dial eligibility, contact outcomes, or rerunning an audience. Do not use for a single call or a simple one-off \u002Fcall batch.\nlicense: MIT\ncompatibility: Internet access is recommended for current Vapi schema verification; VAPI_API_KEY is required for live campaign operations.\nmetadata:\n  author: vapi\n  version: \"1.0\"\n---\n\n# Vapi Outbound Campaigns\n\nUse Campaigns for a persistent outbound run whose contacts, lifecycle, and results must be managed together. Creating a campaign launches it immediately or schedules it; there is no draft or separate start action.\n\nThe current public API uses `\u002Fv2\u002Fcampaign`. The unversioned `\u002Fcampaign` endpoints are legacy and have different behavior. Use `\u002Fv2\u002Fcampaign` for new integrations, and touch `\u002Fcampaign` only when the user explicitly asks to maintain an existing legacy integration.\n\n## Source and Safety Rules\n\n- Verify live payloads against the current Vapi documentation MCP, [Campaigns documentation](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Foverview), or public API reference. Do not silently fall back from `\u002Fv2\u002Fcampaign` to legacy `\u002Fcampaign` behavior.\n- Use a private API key only on a trusted server. Read it from `VAPI_API_KEY`; never print it, request it in chat, or put it in client-side code, examples, logs, or committed files.\n- Treat phone numbers, names, contact variables, call records, transcripts, and recordings as sensitive. Report counts and redacted samples unless the user needs specific records.\n- Never invent resource IDs, recipients, consent, schedules, time zones, campaign state, counters, or call outcomes. Resolve saved resources by exact ID or an unambiguous API result.\n- Launching can place real, chargeable calls. Before a live create or duplicate, review the exact target, outbound number, audience count, timing, concurrency, and webhook behavior. Obtain confirmation unless the user's current instruction already unambiguously authorizes that exact launch.\n- Do not make a legal determination. Tell the user to verify the consent, caller-identification, recording, opt-out, quiet-hours, and telemarketing requirements that apply to every recipient and destination. Use Vapi's [TCPA consent guidance](https:\u002F\u002Fdocs.vapi.ai\u002Ftcpa-consent) when relevant.\n- A timeout or ambiguous response to `POST \u002Fv2\u002Fcampaign` does not prove failure. Search for the intended campaign before retrying so the audience is not called twice.\n\n## Procedure\n\n1. Choose the API and execution mode.\n   - Use `POST \u002Fcall` and the `create-call` skill for one call or a simple one-off batch that does not need campaign-level lifecycle, reporting, cancellation, duplication, or webhooks.\n   - Return a plan, CSV, payload, or implementation without calling Vapi when the user asks to draft, explain, review, or prepare.\n   - Use live API operations only when the user asks to create, duplicate, cancel, or archive and `VAPI_API_KEY` is available.\n\n2. Resolve the caller and outbound number.\n   - Select exactly one saved `assistantId` or `squadId`. Do not use deprecated Workflows for a new campaign.\n   - Resolve one outbound-capable `phoneNumberId`. Vapi Free Numbers cannot launch campaigns. The current `\u002Fv2\u002Fcampaign` API does not support legacy `dialPlan` routing across multiple outbound numbers.\n   - Inspect the assistant or squad before launch. Ensure its prompt, tools, variables, call-ending behavior, and published configuration match this outbound use case.\n   - Configure one voicemail approach on every assistant that may handle a campaign call: the assistant-driven voicemail tool or built-in voicemail detection, never both. Test representative voicemail and call-screening paths before scaling.\n\n3. Prepare and validate contacts.\n   - Allow 1 to 10,000 contacts. Prefer E.164 numbers such as `+14155550100`. In an API request, an intentional non-E.164 SIP-trunk destination requires `numberE164CheckEnabled: false` on that customer; the number must still contain only an optional leading `+` followed by letters or digits. The Dashboard CSV importer cannot set this customer-level flag, so use E.164 numbers for that path.\n   - For a Dashboard CSV, require lowercase `number`; lowercase `name` is optional. Every other populated column becomes a case-sensitive dynamic variable. Prefer lowercase `snake_case` headers.\n   - Keep CSV files within the documented 5 MB Dashboard limit. Reject blank or malformed rows and surface duplicates for review; do not silently drop or merge recipients.\n   - For API requests, place per-contact values in `assistantOverrides.variableValues` for an assistant campaign or `squadOverrides.variableValues` for a squad campaign. Do not copy arbitrary source columns into unrelated configuration fields.\n   - Keep each contact's combined serialized variable data below 100,000 characters. Confirm that every variable referenced by the caller is present or has intentional fallback behavior.\n\n4. Set timing and concurrency.\n   - Omit `schedulePlan` for a new campaign that should dispatch as soon as capacity is available.\n   - For a scheduled window, send `schedulePlan.earliestAt` and optional `latestAt` as ISO 8601 date-times. When the user gives local time, establish the IANA time zone, convert it, and show both local and ISO values.\n   - Confirm `latestAt` is later than `earliestAt`. The Dashboard schedules up to seven days ahead in 15-minute increments; recheck current API constraints when implementing outside the Dashboard.\n   - Choose `maxConcurrency` at or below the organization's available concurrency. It limits this campaign but does not reserve slots or increase the organization's shared call capacity.\n   - Leave enough time for the audience. Contacts waiting for capacity may be retried for up to one hour, but retries stop earlier when `latestAt` is reached.\n\n5. Configure campaign webhooks only when needed.\n   - Set `server` before using `predialPlan` or `serverMessages`. Prefer a saved credential over inline secrets and use an intentional timeout and backoff plan.\n   - Use `predialPlan: { \"enabled\": true }` for a blocking check immediately before each contact is dialed. The endpoint must return JSON containing Boolean `eligible`; false skips the contact, while timeout, non-2xx, or invalid JSON produces `contact.predial-failed`.\n   - Use `serverMessages` for selected asynchronous campaign and contact lifecycle events. Make the receiver idempotent and do not depend on event ordering.\n   - Campaign events do not contain the full call artifact. Configure `end-of-call-report` on the relevant assistant when the integration also needs transcripts, recordings, or analysis, and join records by `callId`.\n\n6. Build and review the request.\n   - For a fresh campaign, include `name`, exactly one of `assistantId` or `squadId`, `phoneNumberId`, a non-empty `customers` array, and `maxConcurrency`.\n   - For a duplicate, include `name` and `duplicateFromCampaignId`, then send only intentional replacements. Omit `customers` to inherit the source audience; a supplied `customers` array replaces it.\n   - Add campaign-level `assistantOverrides` or `squadOverrides`, `schedulePlan`, `server`, `serverMessages`, and `predialPlan` only when intentional.\n   - Read [Campaign API Reference](references\u002Fapi-reference.md) for validated REST shapes, duplicate semantics, pagination, and lifecycle requests.\n   - Before a live launch, show the resolved caller and phone number, audience count with a redacted sample, local and ISO timing, max concurrency, webhook side effects, and whether calling starts now. Do not expose the full contact payload in routine confirmation output.\n\n7. Create once and verify.\n   - Send one `POST \u002Fv2\u002Fcampaign`. Treat the returned campaign ID as the durable identifier.\n   - Re-fetch it with `GET \u002Fv2\u002Fcampaign\u002F{id}?includeCounters=true` before claiming creation succeeded. Report the actual status and schedule; creation does not prove any contact was reached.\n   - If creation returns an ambiguous timeout or 5xx, use `GET \u002Fv2\u002Fcampaign` with narrow supported filters and creation-time context to look for the campaign. Do not automatically repeat the POST.\n\n8. Inspect and diagnose from contact evidence.\n   - Fetch the campaign with `includeCounters=true`. Use `contactCounters` for pending, dispatched, completed, failed, skipped, and pre-dial-failed totals; use `callMetrics.dialed` and `callMetrics.connected` for pickup analysis.\n   - Fetch `GET \u002Fv2\u002Fcampaign\u002F{id}\u002Fcontacts` and paginate when needed. Contact status is the source of truth for each audience member.\n   - A skipped or pre-dial-failed contact may have no call ID because no call was placed. When a real `callId` exists, retrieve that call and inspect its ended reason, transcript, recording, analysis, and logs before proposing a root cause.\n   - Separate campaign dispatch problems, pre-dial eligibility failures, telephony connection failures, voicemail outcomes, and assistant behavior. Counters alone do not identify the cause.\n\n9. Duplicate to rerun or replace compatible configuration.\n   - Campaigns are immutable after creation. Do not patch the caller, contacts, schedule, concurrency, or webhook configuration.\n   - Create a new campaign with `duplicateFromCampaignId` and a new `name`. Omitted configuration and contacts are copied from the source; provided fields override the source, and provided `customers` replace copied contacts. The source must also use the current `\u002Fv2\u002Fcampaign` API.\n   - Duplication cannot unset every inherited field. In particular, switching between `assistantId` and `squadId` inherits the old mutually exclusive caller and produces an invalid request. Create a fresh campaign when changing caller type or when an inherited option must be removed rather than replaced.\n   - Review every inherited field before launch. To run a duplicate near-immediately instead of inheriting an expired schedule, generate `schedulePlan.earliestAt` immediately before the request with enough future margin to remain valid during transport and server validation, such as current UTC time plus 60 seconds. State the resulting delay.\n   - Treat a duplicate as another live launch with the same authorization and double-dial safeguards as a fresh campaign.\n\n10. Cancel or archive deliberately.\n   - To stop a scheduled or running campaign, send `PATCH \u002Fv2\u002Fcampaign\u002F{id}` with only `{ \"status\": \"cancelled\" }`. Pending work stops; calls already in progress may finish. Cancellation is final for that campaign.\n   - Re-fetch and verify the terminal state and `endedReason`. Do not describe cancellation as reversing calls already placed.\n   - `DELETE \u002Fv2\u002Fcampaign\u002F{id}` archives rather than permanently erases campaign records. If active, the campaign is cancelled first. Archive only when the user separately asks to remove it from active campaign views.\n\n## Failure Handling\n\n- `400`: report the rejected field and compare it with the current `\u002Fv2\u002Fcampaign` schema. Correct one unambiguous request-shape issue before at most one safe retry.\n- `401` or `403`: stop for authentication, scope, entitlement, frozen subscription, or permission failure.\n- `404`: report the exact missing campaign, assistant, squad, or phone number ID.\n- `409`: re-fetch the campaign; an immutable or terminal lifecycle conflict requires a duplicate or no further action, not a repeated patch.\n- `429` or `5xx`: report the service condition. Never retry campaign creation until duplicate creation has been ruled out.\n- Partial completion: preserve the campaign and report actual contact outcomes. Do not delete, redial, or replace the remaining audience automatically.\n\n## Output Contract\n\nReturn only what the request needs:\n\n- Mode: plan, payload, launch, inspect, duplicate, cancel, archive, or diagnose\n- Resolved caller, outbound number, contact count, and redacted sample\n- Local and ISO schedule, max concurrency, and shared-capacity caveat\n- Consent and calling-window assumptions that still require user verification\n- Webhook and pre-dial behavior, including remaining live side effects\n- Save-ready CSV, JSON, or code when requested\n- Campaign ID, verified status, counters, contact outcomes, and call IDs after live operations\n- Unresolved failures, evidence, and the smallest safe next action\n\n## Public Sources\n\n- [Campaigns overview](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Foverview)\n- [Campaigns quickstart](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fquickstart)\n- [Campaign contact data](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fcontact-data)\n- [Campaign scheduling and lifecycle](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fscheduling-and-lifecycle)\n- [Campaign voicemail and call screening](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fvoicemail-and-call-screening)\n- [Campaign webhooks](https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fwebhooks)\n- [Campaign API reference](https:\u002F\u002Fdocs.vapi.ai\u002Fapi-reference\u002Fcampaigns\u002Fcampaign-controller-create-v-2)\n",{"data":44,"body":48},{"name":4,"description":6,"license":29,"compatibility":45,"metadata":46},"Internet access is recommended for current Vapi schema verification; VAPI_API_KEY is required for live campaign operations.",{"author":8,"version":47},"1.0",{"type":49,"children":50},"root",[51,60,66,102,109,199,205,958,1006,1012,1096,1102,1107,1150,1156],{"type":52,"tag":53,"props":54,"children":56},"element","h1",{"id":55},"vapi-outbound-campaigns",[57],{"type":58,"value":59},"text","Vapi Outbound Campaigns",{"type":52,"tag":61,"props":62,"children":63},"p",{},[64],{"type":58,"value":65},"Use Campaigns for a persistent outbound run whose contacts, lifecycle, and results must be managed together. Creating a campaign launches it immediately or schedules it; there is no draft or separate start action.",{"type":52,"tag":61,"props":67,"children":68},{},[69,71,78,80,86,88,93,95,100],{"type":58,"value":70},"The current public API uses ",{"type":52,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":58,"value":77},"\u002Fv2\u002Fcampaign",{"type":58,"value":79},". The unversioned ",{"type":52,"tag":72,"props":81,"children":83},{"className":82},[],[84],{"type":58,"value":85},"\u002Fcampaign",{"type":58,"value":87}," endpoints are legacy and have different behavior. Use ",{"type":52,"tag":72,"props":89,"children":91},{"className":90},[],[92],{"type":58,"value":77},{"type":58,"value":94}," for new integrations, and touch ",{"type":52,"tag":72,"props":96,"children":98},{"className":97},[],[99],{"type":58,"value":85},{"type":58,"value":101}," only when the user explicitly asks to maintain an existing legacy integration.",{"type":52,"tag":103,"props":104,"children":106},"h2",{"id":105},"source-and-safety-rules",[107],{"type":58,"value":108},"Source and Safety Rules",{"type":52,"tag":110,"props":111,"children":112},"ul",{},[113,144,157,162,167,172,186],{"type":52,"tag":114,"props":115,"children":116},"li",{},[117,119,128,130,135,137,142],{"type":58,"value":118},"Verify live payloads against the current Vapi documentation MCP, ",{"type":52,"tag":120,"props":121,"children":125},"a",{"href":122,"rel":123},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Foverview",[124],"nofollow",[126],{"type":58,"value":127},"Campaigns documentation",{"type":58,"value":129},", or public API reference. Do not silently fall back from ",{"type":52,"tag":72,"props":131,"children":133},{"className":132},[],[134],{"type":58,"value":77},{"type":58,"value":136}," to legacy ",{"type":52,"tag":72,"props":138,"children":140},{"className":139},[],[141],{"type":58,"value":85},{"type":58,"value":143}," behavior.",{"type":52,"tag":114,"props":145,"children":146},{},[147,149,155],{"type":58,"value":148},"Use a private API key only on a trusted server. Read it from ",{"type":52,"tag":72,"props":150,"children":152},{"className":151},[],[153],{"type":58,"value":154},"VAPI_API_KEY",{"type":58,"value":156},"; never print it, request it in chat, or put it in client-side code, examples, logs, or committed files.",{"type":52,"tag":114,"props":158,"children":159},{},[160],{"type":58,"value":161},"Treat phone numbers, names, contact variables, call records, transcripts, and recordings as sensitive. Report counts and redacted samples unless the user needs specific records.",{"type":52,"tag":114,"props":163,"children":164},{},[165],{"type":58,"value":166},"Never invent resource IDs, recipients, consent, schedules, time zones, campaign state, counters, or call outcomes. Resolve saved resources by exact ID or an unambiguous API result.",{"type":52,"tag":114,"props":168,"children":169},{},[170],{"type":58,"value":171},"Launching can place real, chargeable calls. Before a live create or duplicate, review the exact target, outbound number, audience count, timing, concurrency, and webhook behavior. Obtain confirmation unless the user's current instruction already unambiguously authorizes that exact launch.",{"type":52,"tag":114,"props":173,"children":174},{},[175,177,184],{"type":58,"value":176},"Do not make a legal determination. Tell the user to verify the consent, caller-identification, recording, opt-out, quiet-hours, and telemarketing requirements that apply to every recipient and destination. Use Vapi's ",{"type":52,"tag":120,"props":178,"children":181},{"href":179,"rel":180},"https:\u002F\u002Fdocs.vapi.ai\u002Ftcpa-consent",[124],[182],{"type":58,"value":183},"TCPA consent guidance",{"type":58,"value":185}," when relevant.",{"type":52,"tag":114,"props":187,"children":188},{},[189,191,197],{"type":58,"value":190},"A timeout or ambiguous response to ",{"type":52,"tag":72,"props":192,"children":194},{"className":193},[],[195],{"type":58,"value":196},"POST \u002Fv2\u002Fcampaign",{"type":58,"value":198}," does not prove failure. Search for the intended campaign before retrying so the audience is not called twice.",{"type":52,"tag":103,"props":200,"children":202},{"id":201},"procedure",[203],{"type":58,"value":204},"Procedure",{"type":52,"tag":206,"props":207,"children":208},"ol",{},[209,255,322,419,506,601,752,798,872,953],{"type":52,"tag":114,"props":210,"children":211},{},[212,214],{"type":58,"value":213},"Choose the API and execution mode.",{"type":52,"tag":110,"props":215,"children":216},{},[217,238,243],{"type":52,"tag":114,"props":218,"children":219},{},[220,222,228,230,236],{"type":58,"value":221},"Use ",{"type":52,"tag":72,"props":223,"children":225},{"className":224},[],[226],{"type":58,"value":227},"POST \u002Fcall",{"type":58,"value":229}," and the ",{"type":52,"tag":72,"props":231,"children":233},{"className":232},[],[234],{"type":58,"value":235},"create-call",{"type":58,"value":237}," skill for one call or a simple one-off batch that does not need campaign-level lifecycle, reporting, cancellation, duplication, or webhooks.",{"type":52,"tag":114,"props":239,"children":240},{},[241],{"type":58,"value":242},"Return a plan, CSV, payload, or implementation without calling Vapi when the user asks to draft, explain, review, or prepare.",{"type":52,"tag":114,"props":244,"children":245},{},[246,248,253],{"type":58,"value":247},"Use live API operations only when the user asks to create, duplicate, cancel, or archive and ",{"type":52,"tag":72,"props":249,"children":251},{"className":250},[],[252],{"type":58,"value":154},{"type":58,"value":254}," is available.",{"type":52,"tag":114,"props":256,"children":257},{},[258,260],{"type":58,"value":259},"Resolve the caller and outbound number.",{"type":52,"tag":110,"props":261,"children":262},{},[263,284,312,317],{"type":52,"tag":114,"props":264,"children":265},{},[266,268,274,276,282],{"type":58,"value":267},"Select exactly one saved ",{"type":52,"tag":72,"props":269,"children":271},{"className":270},[],[272],{"type":58,"value":273},"assistantId",{"type":58,"value":275}," or ",{"type":52,"tag":72,"props":277,"children":279},{"className":278},[],[280],{"type":58,"value":281},"squadId",{"type":58,"value":283},". Do not use deprecated Workflows for a new campaign.",{"type":52,"tag":114,"props":285,"children":286},{},[287,289,295,297,302,304,310],{"type":58,"value":288},"Resolve one outbound-capable ",{"type":52,"tag":72,"props":290,"children":292},{"className":291},[],[293],{"type":58,"value":294},"phoneNumberId",{"type":58,"value":296},". Vapi Free Numbers cannot launch campaigns. The current ",{"type":52,"tag":72,"props":298,"children":300},{"className":299},[],[301],{"type":58,"value":77},{"type":58,"value":303}," API does not support legacy ",{"type":52,"tag":72,"props":305,"children":307},{"className":306},[],[308],{"type":58,"value":309},"dialPlan",{"type":58,"value":311}," routing across multiple outbound numbers.",{"type":52,"tag":114,"props":313,"children":314},{},[315],{"type":58,"value":316},"Inspect the assistant or squad before launch. Ensure its prompt, tools, variables, call-ending behavior, and published configuration match this outbound use case.",{"type":52,"tag":114,"props":318,"children":319},{},[320],{"type":58,"value":321},"Configure one voicemail approach on every assistant that may handle a campaign call: the assistant-driven voicemail tool or built-in voicemail detection, never both. Test representative voicemail and call-screening paths before scaling.",{"type":52,"tag":114,"props":323,"children":324},{},[325,327],{"type":58,"value":326},"Prepare and validate contacts.",{"type":52,"tag":110,"props":328,"children":329},{},[330,359,388,393,414],{"type":52,"tag":114,"props":331,"children":332},{},[333,335,341,343,349,351,357],{"type":58,"value":334},"Allow 1 to 10,000 contacts. Prefer E.164 numbers such as ",{"type":52,"tag":72,"props":336,"children":338},{"className":337},[],[339],{"type":58,"value":340},"+14155550100",{"type":58,"value":342},". In an API request, an intentional non-E.164 SIP-trunk destination requires ",{"type":52,"tag":72,"props":344,"children":346},{"className":345},[],[347],{"type":58,"value":348},"numberE164CheckEnabled: false",{"type":58,"value":350}," on that customer; the number must still contain only an optional leading ",{"type":52,"tag":72,"props":352,"children":354},{"className":353},[],[355],{"type":58,"value":356},"+",{"type":58,"value":358}," followed by letters or digits. The Dashboard CSV importer cannot set this customer-level flag, so use E.164 numbers for that path.",{"type":52,"tag":114,"props":360,"children":361},{},[362,364,370,372,378,380,386],{"type":58,"value":363},"For a Dashboard CSV, require lowercase ",{"type":52,"tag":72,"props":365,"children":367},{"className":366},[],[368],{"type":58,"value":369},"number",{"type":58,"value":371},"; lowercase ",{"type":52,"tag":72,"props":373,"children":375},{"className":374},[],[376],{"type":58,"value":377},"name",{"type":58,"value":379}," is optional. Every other populated column becomes a case-sensitive dynamic variable. Prefer lowercase ",{"type":52,"tag":72,"props":381,"children":383},{"className":382},[],[384],{"type":58,"value":385},"snake_case",{"type":58,"value":387}," headers.",{"type":52,"tag":114,"props":389,"children":390},{},[391],{"type":58,"value":392},"Keep CSV files within the documented 5 MB Dashboard limit. Reject blank or malformed rows and surface duplicates for review; do not silently drop or merge recipients.",{"type":52,"tag":114,"props":394,"children":395},{},[396,398,404,406,412],{"type":58,"value":397},"For API requests, place per-contact values in ",{"type":52,"tag":72,"props":399,"children":401},{"className":400},[],[402],{"type":58,"value":403},"assistantOverrides.variableValues",{"type":58,"value":405}," for an assistant campaign or ",{"type":52,"tag":72,"props":407,"children":409},{"className":408},[],[410],{"type":58,"value":411},"squadOverrides.variableValues",{"type":58,"value":413}," for a squad campaign. Do not copy arbitrary source columns into unrelated configuration fields.",{"type":52,"tag":114,"props":415,"children":416},{},[417],{"type":58,"value":418},"Keep each contact's combined serialized variable data below 100,000 characters. Confirm that every variable referenced by the caller is present or has intentional fallback behavior.",{"type":52,"tag":114,"props":420,"children":421},{},[422,424],{"type":58,"value":423},"Set timing and concurrency.",{"type":52,"tag":110,"props":425,"children":426},{},[427,440,461,481,494],{"type":52,"tag":114,"props":428,"children":429},{},[430,432,438],{"type":58,"value":431},"Omit ",{"type":52,"tag":72,"props":433,"children":435},{"className":434},[],[436],{"type":58,"value":437},"schedulePlan",{"type":58,"value":439}," for a new campaign that should dispatch as soon as capacity is available.",{"type":52,"tag":114,"props":441,"children":442},{},[443,445,451,453,459],{"type":58,"value":444},"For a scheduled window, send ",{"type":52,"tag":72,"props":446,"children":448},{"className":447},[],[449],{"type":58,"value":450},"schedulePlan.earliestAt",{"type":58,"value":452}," and optional ",{"type":52,"tag":72,"props":454,"children":456},{"className":455},[],[457],{"type":58,"value":458},"latestAt",{"type":58,"value":460}," as ISO 8601 date-times. When the user gives local time, establish the IANA time zone, convert it, and show both local and ISO values.",{"type":52,"tag":114,"props":462,"children":463},{},[464,466,471,473,479],{"type":58,"value":465},"Confirm ",{"type":52,"tag":72,"props":467,"children":469},{"className":468},[],[470],{"type":58,"value":458},{"type":58,"value":472}," is later than ",{"type":52,"tag":72,"props":474,"children":476},{"className":475},[],[477],{"type":58,"value":478},"earliestAt",{"type":58,"value":480},". The Dashboard schedules up to seven days ahead in 15-minute increments; recheck current API constraints when implementing outside the Dashboard.",{"type":52,"tag":114,"props":482,"children":483},{},[484,486,492],{"type":58,"value":485},"Choose ",{"type":52,"tag":72,"props":487,"children":489},{"className":488},[],[490],{"type":58,"value":491},"maxConcurrency",{"type":58,"value":493}," at or below the organization's available concurrency. It limits this campaign but does not reserve slots or increase the organization's shared call capacity.",{"type":52,"tag":114,"props":495,"children":496},{},[497,499,504],{"type":58,"value":498},"Leave enough time for the audience. Contacts waiting for capacity may be retried for up to one hour, but retries stop earlier when ",{"type":52,"tag":72,"props":500,"children":502},{"className":501},[],[503],{"type":58,"value":458},{"type":58,"value":505}," is reached.",{"type":52,"tag":114,"props":507,"children":508},{},[509,511],{"type":58,"value":510},"Configure campaign webhooks only when needed.",{"type":52,"tag":110,"props":512,"children":513},{},[514,542,570,581],{"type":52,"tag":114,"props":515,"children":516},{},[517,519,525,527,533,534,540],{"type":58,"value":518},"Set ",{"type":52,"tag":72,"props":520,"children":522},{"className":521},[],[523],{"type":58,"value":524},"server",{"type":58,"value":526}," before using ",{"type":52,"tag":72,"props":528,"children":530},{"className":529},[],[531],{"type":58,"value":532},"predialPlan",{"type":58,"value":275},{"type":52,"tag":72,"props":535,"children":537},{"className":536},[],[538],{"type":58,"value":539},"serverMessages",{"type":58,"value":541},". Prefer a saved credential over inline secrets and use an intentional timeout and backoff plan.",{"type":52,"tag":114,"props":543,"children":544},{},[545,546,552,554,560,562,568],{"type":58,"value":221},{"type":52,"tag":72,"props":547,"children":549},{"className":548},[],[550],{"type":58,"value":551},"predialPlan: { \"enabled\": true }",{"type":58,"value":553}," for a blocking check immediately before each contact is dialed. The endpoint must return JSON containing Boolean ",{"type":52,"tag":72,"props":555,"children":557},{"className":556},[],[558],{"type":58,"value":559},"eligible",{"type":58,"value":561},"; false skips the contact, while timeout, non-2xx, or invalid JSON produces ",{"type":52,"tag":72,"props":563,"children":565},{"className":564},[],[566],{"type":58,"value":567},"contact.predial-failed",{"type":58,"value":569},".",{"type":52,"tag":114,"props":571,"children":572},{},[573,574,579],{"type":58,"value":221},{"type":52,"tag":72,"props":575,"children":577},{"className":576},[],[578],{"type":58,"value":539},{"type":58,"value":580}," for selected asynchronous campaign and contact lifecycle events. Make the receiver idempotent and do not depend on event ordering.",{"type":52,"tag":114,"props":582,"children":583},{},[584,586,592,594,600],{"type":58,"value":585},"Campaign events do not contain the full call artifact. Configure ",{"type":52,"tag":72,"props":587,"children":589},{"className":588},[],[590],{"type":58,"value":591},"end-of-call-report",{"type":58,"value":593}," on the relevant assistant when the integration also needs transcripts, recordings, or analysis, and join records by ",{"type":52,"tag":72,"props":595,"children":597},{"className":596},[],[598],{"type":58,"value":599},"callId",{"type":58,"value":569},{"type":52,"tag":114,"props":602,"children":603},{},[604,606],{"type":58,"value":605},"Build and review the request.",{"type":52,"tag":110,"props":607,"children":608},{},[609,655,689,734,747],{"type":52,"tag":114,"props":610,"children":611},{},[612,614,619,621,626,627,632,634,639,641,647,649,654],{"type":58,"value":613},"For a fresh campaign, include ",{"type":52,"tag":72,"props":615,"children":617},{"className":616},[],[618],{"type":58,"value":377},{"type":58,"value":620},", exactly one of ",{"type":52,"tag":72,"props":622,"children":624},{"className":623},[],[625],{"type":58,"value":273},{"type":58,"value":275},{"type":52,"tag":72,"props":628,"children":630},{"className":629},[],[631],{"type":58,"value":281},{"type":58,"value":633},", ",{"type":52,"tag":72,"props":635,"children":637},{"className":636},[],[638],{"type":58,"value":294},{"type":58,"value":640},", a non-empty ",{"type":52,"tag":72,"props":642,"children":644},{"className":643},[],[645],{"type":58,"value":646},"customers",{"type":58,"value":648}," array, and ",{"type":52,"tag":72,"props":650,"children":652},{"className":651},[],[653],{"type":58,"value":491},{"type":58,"value":569},{"type":52,"tag":114,"props":656,"children":657},{},[658,660,665,667,673,675,680,682,687],{"type":58,"value":659},"For a duplicate, include ",{"type":52,"tag":72,"props":661,"children":663},{"className":662},[],[664],{"type":58,"value":377},{"type":58,"value":666}," and ",{"type":52,"tag":72,"props":668,"children":670},{"className":669},[],[671],{"type":58,"value":672},"duplicateFromCampaignId",{"type":58,"value":674},", then send only intentional replacements. Omit ",{"type":52,"tag":72,"props":676,"children":678},{"className":677},[],[679],{"type":58,"value":646},{"type":58,"value":681}," to inherit the source audience; a supplied ",{"type":52,"tag":72,"props":683,"children":685},{"className":684},[],[686],{"type":58,"value":646},{"type":58,"value":688}," array replaces it.",{"type":52,"tag":114,"props":690,"children":691},{},[692,694,700,701,707,708,713,714,719,720,725,727,732],{"type":58,"value":693},"Add campaign-level ",{"type":52,"tag":72,"props":695,"children":697},{"className":696},[],[698],{"type":58,"value":699},"assistantOverrides",{"type":58,"value":275},{"type":52,"tag":72,"props":702,"children":704},{"className":703},[],[705],{"type":58,"value":706},"squadOverrides",{"type":58,"value":633},{"type":52,"tag":72,"props":709,"children":711},{"className":710},[],[712],{"type":58,"value":437},{"type":58,"value":633},{"type":52,"tag":72,"props":715,"children":717},{"className":716},[],[718],{"type":58,"value":524},{"type":58,"value":633},{"type":52,"tag":72,"props":721,"children":723},{"className":722},[],[724],{"type":58,"value":539},{"type":58,"value":726},", and ",{"type":52,"tag":72,"props":728,"children":730},{"className":729},[],[731],{"type":58,"value":532},{"type":58,"value":733}," only when intentional.",{"type":52,"tag":114,"props":735,"children":736},{},[737,739,745],{"type":58,"value":738},"Read ",{"type":52,"tag":120,"props":740,"children":742},{"href":741},"references\u002Fapi-reference.md",[743],{"type":58,"value":744},"Campaign API Reference",{"type":58,"value":746}," for validated REST shapes, duplicate semantics, pagination, and lifecycle requests.",{"type":52,"tag":114,"props":748,"children":749},{},[750],{"type":58,"value":751},"Before a live launch, show the resolved caller and phone number, audience count with a redacted sample, local and ISO timing, max concurrency, webhook side effects, and whether calling starts now. Do not expose the full contact payload in routine confirmation output.",{"type":52,"tag":114,"props":753,"children":754},{},[755,757],{"type":58,"value":756},"Create once and verify.",{"type":52,"tag":110,"props":758,"children":759},{},[760,772,785],{"type":52,"tag":114,"props":761,"children":762},{},[763,765,770],{"type":58,"value":764},"Send one ",{"type":52,"tag":72,"props":766,"children":768},{"className":767},[],[769],{"type":58,"value":196},{"type":58,"value":771},". Treat the returned campaign ID as the durable identifier.",{"type":52,"tag":114,"props":773,"children":774},{},[775,777,783],{"type":58,"value":776},"Re-fetch it with ",{"type":52,"tag":72,"props":778,"children":780},{"className":779},[],[781],{"type":58,"value":782},"GET \u002Fv2\u002Fcampaign\u002F{id}?includeCounters=true",{"type":58,"value":784}," before claiming creation succeeded. Report the actual status and schedule; creation does not prove any contact was reached.",{"type":52,"tag":114,"props":786,"children":787},{},[788,790,796],{"type":58,"value":789},"If creation returns an ambiguous timeout or 5xx, use ",{"type":52,"tag":72,"props":791,"children":793},{"className":792},[],[794],{"type":58,"value":795},"GET \u002Fv2\u002Fcampaign",{"type":58,"value":797}," with narrow supported filters and creation-time context to look for the campaign. Do not automatically repeat the POST.",{"type":52,"tag":114,"props":799,"children":800},{},[801,803],{"type":58,"value":802},"Inspect and diagnose from contact evidence.",{"type":52,"tag":110,"props":804,"children":805},{},[806,842,855,867],{"type":52,"tag":114,"props":807,"children":808},{},[809,811,817,819,825,827,833,834,840],{"type":58,"value":810},"Fetch the campaign with ",{"type":52,"tag":72,"props":812,"children":814},{"className":813},[],[815],{"type":58,"value":816},"includeCounters=true",{"type":58,"value":818},". Use ",{"type":52,"tag":72,"props":820,"children":822},{"className":821},[],[823],{"type":58,"value":824},"contactCounters",{"type":58,"value":826}," for pending, dispatched, completed, failed, skipped, and pre-dial-failed totals; use ",{"type":52,"tag":72,"props":828,"children":830},{"className":829},[],[831],{"type":58,"value":832},"callMetrics.dialed",{"type":58,"value":666},{"type":52,"tag":72,"props":835,"children":837},{"className":836},[],[838],{"type":58,"value":839},"callMetrics.connected",{"type":58,"value":841}," for pickup analysis.",{"type":52,"tag":114,"props":843,"children":844},{},[845,847,853],{"type":58,"value":846},"Fetch ",{"type":52,"tag":72,"props":848,"children":850},{"className":849},[],[851],{"type":58,"value":852},"GET \u002Fv2\u002Fcampaign\u002F{id}\u002Fcontacts",{"type":58,"value":854}," and paginate when needed. Contact status is the source of truth for each audience member.",{"type":52,"tag":114,"props":856,"children":857},{},[858,860,865],{"type":58,"value":859},"A skipped or pre-dial-failed contact may have no call ID because no call was placed. When a real ",{"type":52,"tag":72,"props":861,"children":863},{"className":862},[],[864],{"type":58,"value":599},{"type":58,"value":866}," exists, retrieve that call and inspect its ended reason, transcript, recording, analysis, and logs before proposing a root cause.",{"type":52,"tag":114,"props":868,"children":869},{},[870],{"type":58,"value":871},"Separate campaign dispatch problems, pre-dial eligibility failures, telephony connection failures, voicemail outcomes, and assistant behavior. Counters alone do not identify the cause.",{"type":52,"tag":114,"props":873,"children":874},{},[875,877],{"type":58,"value":876},"Duplicate to rerun or replace compatible configuration.",{"type":52,"tag":110,"props":878,"children":879},{},[880,885,918,936,948],{"type":52,"tag":114,"props":881,"children":882},{},[883],{"type":58,"value":884},"Campaigns are immutable after creation. Do not patch the caller, contacts, schedule, concurrency, or webhook configuration.",{"type":52,"tag":114,"props":886,"children":887},{},[888,890,895,897,902,904,909,911,916],{"type":58,"value":889},"Create a new campaign with ",{"type":52,"tag":72,"props":891,"children":893},{"className":892},[],[894],{"type":58,"value":672},{"type":58,"value":896}," and a new ",{"type":52,"tag":72,"props":898,"children":900},{"className":899},[],[901],{"type":58,"value":377},{"type":58,"value":903},". Omitted configuration and contacts are copied from the source; provided fields override the source, and provided ",{"type":52,"tag":72,"props":905,"children":907},{"className":906},[],[908],{"type":58,"value":646},{"type":58,"value":910}," replace copied contacts. The source must also use the current ",{"type":52,"tag":72,"props":912,"children":914},{"className":913},[],[915],{"type":58,"value":77},{"type":58,"value":917}," API.",{"type":52,"tag":114,"props":919,"children":920},{},[921,923,928,929,934],{"type":58,"value":922},"Duplication cannot unset every inherited field. In particular, switching between ",{"type":52,"tag":72,"props":924,"children":926},{"className":925},[],[927],{"type":58,"value":273},{"type":58,"value":666},{"type":52,"tag":72,"props":930,"children":932},{"className":931},[],[933],{"type":58,"value":281},{"type":58,"value":935}," inherits the old mutually exclusive caller and produces an invalid request. Create a fresh campaign when changing caller type or when an inherited option must be removed rather than replaced.",{"type":52,"tag":114,"props":937,"children":938},{},[939,941,946],{"type":58,"value":940},"Review every inherited field before launch. To run a duplicate near-immediately instead of inheriting an expired schedule, generate ",{"type":52,"tag":72,"props":942,"children":944},{"className":943},[],[945],{"type":58,"value":450},{"type":58,"value":947}," immediately before the request with enough future margin to remain valid during transport and server validation, such as current UTC time plus 60 seconds. State the resulting delay.",{"type":52,"tag":114,"props":949,"children":950},{},[951],{"type":58,"value":952},"Treat a duplicate as another live launch with the same authorization and double-dial safeguards as a fresh campaign.",{"type":52,"tag":114,"props":954,"children":955},{},[956],{"type":58,"value":957},"Cancel or archive deliberately.",{"type":52,"tag":110,"props":959,"children":960},{},[961,982,995],{"type":52,"tag":114,"props":962,"children":963},{},[964,966,972,974,980],{"type":58,"value":965},"To stop a scheduled or running campaign, send ",{"type":52,"tag":72,"props":967,"children":969},{"className":968},[],[970],{"type":58,"value":971},"PATCH \u002Fv2\u002Fcampaign\u002F{id}",{"type":58,"value":973}," with only ",{"type":52,"tag":72,"props":975,"children":977},{"className":976},[],[978],{"type":58,"value":979},"{ \"status\": \"cancelled\" }",{"type":58,"value":981},". Pending work stops; calls already in progress may finish. Cancellation is final for that campaign.",{"type":52,"tag":114,"props":983,"children":984},{},[985,987,993],{"type":58,"value":986},"Re-fetch and verify the terminal state and ",{"type":52,"tag":72,"props":988,"children":990},{"className":989},[],[991],{"type":58,"value":992},"endedReason",{"type":58,"value":994},". Do not describe cancellation as reversing calls already placed.",{"type":52,"tag":114,"props":996,"children":997},{},[998,1004],{"type":52,"tag":72,"props":999,"children":1001},{"className":1000},[],[1002],{"type":58,"value":1003},"DELETE \u002Fv2\u002Fcampaign\u002F{id}",{"type":58,"value":1005}," archives rather than permanently erases campaign records. If active, the campaign is cancelled first. Archive only when the user separately asks to remove it from active campaign views.",{"type":52,"tag":103,"props":1007,"children":1009},{"id":1008},"failure-handling",[1010],{"type":58,"value":1011},"Failure Handling",{"type":52,"tag":110,"props":1013,"children":1014},{},[1015,1033,1051,1062,1073,1091],{"type":52,"tag":114,"props":1016,"children":1017},{},[1018,1024,1026,1031],{"type":52,"tag":72,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":58,"value":1023},"400",{"type":58,"value":1025},": report the rejected field and compare it with the current ",{"type":52,"tag":72,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":58,"value":77},{"type":58,"value":1032}," schema. Correct one unambiguous request-shape issue before at most one safe retry.",{"type":52,"tag":114,"props":1034,"children":1035},{},[1036,1042,1043,1049],{"type":52,"tag":72,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":58,"value":1041},"401",{"type":58,"value":275},{"type":52,"tag":72,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":58,"value":1048},"403",{"type":58,"value":1050},": stop for authentication, scope, entitlement, frozen subscription, or permission failure.",{"type":52,"tag":114,"props":1052,"children":1053},{},[1054,1060],{"type":52,"tag":72,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":58,"value":1059},"404",{"type":58,"value":1061},": report the exact missing campaign, assistant, squad, or phone number ID.",{"type":52,"tag":114,"props":1063,"children":1064},{},[1065,1071],{"type":52,"tag":72,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":58,"value":1070},"409",{"type":58,"value":1072},": re-fetch the campaign; an immutable or terminal lifecycle conflict requires a duplicate or no further action, not a repeated patch.",{"type":52,"tag":114,"props":1074,"children":1075},{},[1076,1082,1083,1089],{"type":52,"tag":72,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":58,"value":1081},"429",{"type":58,"value":275},{"type":52,"tag":72,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":58,"value":1088},"5xx",{"type":58,"value":1090},": report the service condition. Never retry campaign creation until duplicate creation has been ruled out.",{"type":52,"tag":114,"props":1092,"children":1093},{},[1094],{"type":58,"value":1095},"Partial completion: preserve the campaign and report actual contact outcomes. Do not delete, redial, or replace the remaining audience automatically.",{"type":52,"tag":103,"props":1097,"children":1099},{"id":1098},"output-contract",[1100],{"type":58,"value":1101},"Output Contract",{"type":52,"tag":61,"props":1103,"children":1104},{},[1105],{"type":58,"value":1106},"Return only what the request needs:",{"type":52,"tag":110,"props":1108,"children":1109},{},[1110,1115,1120,1125,1130,1135,1140,1145],{"type":52,"tag":114,"props":1111,"children":1112},{},[1113],{"type":58,"value":1114},"Mode: plan, payload, launch, inspect, duplicate, cancel, archive, or diagnose",{"type":52,"tag":114,"props":1116,"children":1117},{},[1118],{"type":58,"value":1119},"Resolved caller, outbound number, contact count, and redacted sample",{"type":52,"tag":114,"props":1121,"children":1122},{},[1123],{"type":58,"value":1124},"Local and ISO schedule, max concurrency, and shared-capacity caveat",{"type":52,"tag":114,"props":1126,"children":1127},{},[1128],{"type":58,"value":1129},"Consent and calling-window assumptions that still require user verification",{"type":52,"tag":114,"props":1131,"children":1132},{},[1133],{"type":58,"value":1134},"Webhook and pre-dial behavior, including remaining live side effects",{"type":52,"tag":114,"props":1136,"children":1137},{},[1138],{"type":58,"value":1139},"Save-ready CSV, JSON, or code when requested",{"type":52,"tag":114,"props":1141,"children":1142},{},[1143],{"type":58,"value":1144},"Campaign ID, verified status, counters, contact outcomes, and call IDs after live operations",{"type":52,"tag":114,"props":1146,"children":1147},{},[1148],{"type":58,"value":1149},"Unresolved failures, evidence, and the smallest safe next action",{"type":52,"tag":103,"props":1151,"children":1153},{"id":1152},"public-sources",[1154],{"type":58,"value":1155},"Public Sources",{"type":52,"tag":110,"props":1157,"children":1158},{},[1159,1168,1178,1188,1198,1208,1218],{"type":52,"tag":114,"props":1160,"children":1161},{},[1162],{"type":52,"tag":120,"props":1163,"children":1165},{"href":122,"rel":1164},[124],[1166],{"type":58,"value":1167},"Campaigns overview",{"type":52,"tag":114,"props":1169,"children":1170},{},[1171],{"type":52,"tag":120,"props":1172,"children":1175},{"href":1173,"rel":1174},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fquickstart",[124],[1176],{"type":58,"value":1177},"Campaigns quickstart",{"type":52,"tag":114,"props":1179,"children":1180},{},[1181],{"type":52,"tag":120,"props":1182,"children":1185},{"href":1183,"rel":1184},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fcontact-data",[124],[1186],{"type":58,"value":1187},"Campaign contact data",{"type":52,"tag":114,"props":1189,"children":1190},{},[1191],{"type":52,"tag":120,"props":1192,"children":1195},{"href":1193,"rel":1194},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fscheduling-and-lifecycle",[124],[1196],{"type":58,"value":1197},"Campaign scheduling and lifecycle",{"type":52,"tag":114,"props":1199,"children":1200},{},[1201],{"type":52,"tag":120,"props":1202,"children":1205},{"href":1203,"rel":1204},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fvoicemail-and-call-screening",[124],[1206],{"type":58,"value":1207},"Campaign voicemail and call screening",{"type":52,"tag":114,"props":1209,"children":1210},{},[1211],{"type":52,"tag":120,"props":1212,"children":1215},{"href":1213,"rel":1214},"https:\u002F\u002Fdocs.vapi.ai\u002Foutbound-campaigns\u002Fwebhooks",[124],[1216],{"type":58,"value":1217},"Campaign webhooks",{"type":52,"tag":114,"props":1219,"children":1220},{},[1221],{"type":52,"tag":120,"props":1222,"children":1225},{"href":1223,"rel":1224},"https:\u002F\u002Fdocs.vapi.ai\u002Fapi-reference\u002Fcampaigns\u002Fcampaign-controller-create-v-2",[124],[1226],{"type":58,"value":1227},"Campaign API reference",{"items":1229,"total":1315},[1230,1244,1256,1263,1277,1289,1302],{"slug":1231,"name":1231,"fn":1232,"description":1233,"org":1234,"tags":1235,"stars":26,"repoUrl":27,"updatedAt":1243},"create-assistant","create Vapi voice AI assistants","Design, create, or validate saved and transient Vapi voice assistants. Use for new phone or web agents, production system prompts and first messages, saved-versus-transient architecture, model\u002Fvoice\u002Ftranscriber selection, multilingual compatibility, existing tool attachment, native call-control tools, assistant hooks, and Create Assistant API validation errors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1236,1239,1242],{"name":1237,"slug":1238,"type":16},"Agents","agents",{"name":1240,"slug":1241,"type":16},"API Development","api-development",{"name":21,"slug":22,"type":16},"2026-08-15T03:21:06.672037",{"slug":235,"name":235,"fn":1245,"description":1246,"org":1247,"tags":1248,"stars":26,"repoUrl":27,"updatedAt":1255},"create automated phone calls with Vapi","Create one-off outbound phone calls, web calls, scheduled calls, and simple batch calls using the Vapi API. Use when making or testing individual calls or initiating a bounded \u002Fcall request programmatically. Use create-campaign for a persistent multi-contact Campaign with lifecycle, reporting, cancellation, duplication, or campaign webhooks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1249,1250,1251,1254],{"name":1237,"slug":1238,"type":16},{"name":18,"slug":19,"type":16},{"name":1252,"slug":1253,"type":16},"Speech","speech",{"name":21,"slug":22,"type":16},"2026-09-03T07:23:57.111259",{"slug":4,"name":4,"fn":5,"description":6,"org":1257,"tags":1258,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1259,1260,1261,1262],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1264,"name":1264,"fn":1265,"description":1266,"org":1267,"tags":1268,"stars":26,"repoUrl":27,"updatedAt":1276},"create-phone-number","manage Vapi phone numbers","Plan, provision, import, route, update, and verify Vapi phone numbers through the public API. Use for Vapi-hosted US PSTN numbers, explicitly requested SIP addresses, Twilio\u002FVonage\u002FTelnyx or BYO carrier numbers, secure credential handling, assistant or squad routing, area-code requests, outbound limitations, and phone-provider troubleshooting.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1269,1272,1275],{"name":1270,"slug":1271,"type":16},"Operations","operations",{"name":1273,"slug":1274,"type":16},"Twilio","twilio",{"name":21,"slug":22,"type":16},"2026-08-15T03:21:07.855739",{"slug":1278,"name":1278,"fn":1279,"description":1280,"org":1281,"tags":1282,"stars":26,"repoUrl":27,"updatedAt":1288},"create-squad","create multi-assistant voice agent squads","Design, create, update, and verify Vapi Squads and documented handoff tools through the public API. Use for choosing a single assistant versus a multi-assistant Squad, persistent or transient members, entry-member ordering, specialization boundaries, context engineering, variable extraction, model-specific handoff patterns, assistant-version pins, and safe Squad updates.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1283,1284,1287],{"name":1237,"slug":1238,"type":16},{"name":1285,"slug":1286,"type":16},"Multi-Agent","multi-agent",{"name":21,"slug":22,"type":16},"2026-08-15T03:21:08.661686",{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1293,"tags":1294,"stars":26,"repoUrl":27,"updatedAt":1301},"create-structured-output","create Vapi structured outputs","Design, create, inspect, update, attach, detach, preview, execute, and verify reusable Vapi Structured Outputs through public API or Server SDK workflows. Use for post-call extraction, typed call artifacts, AI-versus-regex extraction, JSON Schema design, backfilling existing calls, or retrieving structured results programmatically.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1295,1296,1297,1298],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":18,"slug":19,"type":16},{"name":1299,"slug":1300,"type":16},"Data Extraction","data-extraction","2026-08-15T03:47:29.348015",{"slug":1303,"name":1303,"fn":1304,"description":1305,"org":1306,"tags":1307,"stars":26,"repoUrl":27,"updatedAt":1314},"create-tool","create custom tools for Vapi assistants","Select, define, create, inspect, update, attach, detach, and verify reusable Vapi tools through the public API. Use for native call-control tools, supported provider integrations, API Request tools, custom function tools, MCP tools, tool messages, credentials, or configuration-preserving assistant attachment changes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1308,1309,1310,1311],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":18,"slug":19,"type":16},{"name":1312,"slug":1313,"type":16},"Integrations","integrations","2026-08-15T03:21:05.673225",12,{"items":1317,"total":1436},[1318,1333,1339,1346,1353,1359,1365,1372,1379,1393,1406,1421],{"slug":8,"name":8,"fn":1319,"description":1320,"org":1321,"tags":1322,"stars":1330,"repoUrl":1331,"updatedAt":1332},"build AI voice assistants with Vapi","Build AI voice assistants and phone agents with Vapi. Use this skill when users want to create voice agents, phone bots, IVR systems, outbound calling campaigns, or any voice-based AI application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1323,1324,1325,1326,1329],{"name":1237,"slug":1238,"type":16},{"name":18,"slug":19,"type":16},{"name":1252,"slug":1253,"type":16},{"name":1327,"slug":1328,"type":16},"Text-to-Speech","text-to-speech",{"name":21,"slug":22,"type":16},56,"https:\u002F\u002Fgithub.com\u002FVapiAI\u002Fmcp-server","2026-08-15T03:21:18.708423",{"slug":1231,"name":1231,"fn":1232,"description":1233,"org":1334,"tags":1335,"stars":26,"repoUrl":27,"updatedAt":1243},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1336,1337,1338],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":21,"slug":22,"type":16},{"slug":235,"name":235,"fn":1245,"description":1246,"org":1340,"tags":1341,"stars":26,"repoUrl":27,"updatedAt":1255},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1342,1343,1344,1345],{"name":1237,"slug":1238,"type":16},{"name":18,"slug":19,"type":16},{"name":1252,"slug":1253,"type":16},{"name":21,"slug":22,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":1347,"tags":1348,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1349,1350,1351,1352],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":24,"slug":25,"type":16},{"name":21,"slug":22,"type":16},{"slug":1264,"name":1264,"fn":1265,"description":1266,"org":1354,"tags":1355,"stars":26,"repoUrl":27,"updatedAt":1276},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1356,1357,1358],{"name":1270,"slug":1271,"type":16},{"name":1273,"slug":1274,"type":16},{"name":21,"slug":22,"type":16},{"slug":1278,"name":1278,"fn":1279,"description":1280,"org":1360,"tags":1361,"stars":26,"repoUrl":27,"updatedAt":1288},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1362,1363,1364],{"name":1237,"slug":1238,"type":16},{"name":1285,"slug":1286,"type":16},{"name":21,"slug":22,"type":16},{"slug":1290,"name":1290,"fn":1291,"description":1292,"org":1366,"tags":1367,"stars":26,"repoUrl":27,"updatedAt":1301},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1368,1369,1370,1371],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":18,"slug":19,"type":16},{"name":1299,"slug":1300,"type":16},{"slug":1303,"name":1303,"fn":1304,"description":1305,"org":1373,"tags":1374,"stars":26,"repoUrl":27,"updatedAt":1314},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1375,1376,1377,1378],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":18,"slug":19,"type":16},{"name":1312,"slug":1313,"type":16},{"slug":1380,"name":1380,"fn":1381,"description":1382,"org":1383,"tags":1384,"stars":26,"repoUrl":27,"updatedAt":1392},"setup-api-key","configure Vapi API authentication","Guide users through obtaining and configuring a Vapi API key. Use when the user needs to set up Vapi, when API calls fail due to missing keys, or when the user mentions needing access to Vapi's voice AI platform.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1385,1386,1389],{"name":1240,"slug":1241,"type":16},{"name":1387,"slug":1388,"type":16},"Auth","auth",{"name":1390,"slug":1391,"type":16},"Configuration","configuration","2026-07-20T05:57:25.717229",{"slug":1394,"name":1394,"fn":1395,"description":1396,"org":1397,"tags":1398,"stars":26,"repoUrl":27,"updatedAt":1405},"setup-webhook","configure Vapi webhooks for call events","Configure Vapi server URLs and webhooks to receive real-time call events, transcripts, tool calls, and end-of-call reports. Use when setting up webhook endpoints, building tool servers, or integrating Vapi events into your application.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1399,1400,1401,1402],{"name":1237,"slug":1238,"type":16},{"name":1240,"slug":1241,"type":16},{"name":18,"slug":19,"type":16},{"name":1403,"slug":1404,"type":16},"Webhooks","webhooks","2026-07-20T05:57:31.703006",{"slug":1407,"name":1407,"fn":1408,"description":1409,"org":1410,"tags":1411,"stars":26,"repoUrl":27,"updatedAt":1420},"simulations","design and run Vapi simulations","Design, create, run, monitor, and maintain Vapi Simulations for assistants and squads. Use for simulation personalities, scenarios, structured-output success criteria, simulations, suites, chat or voice runs, tool mocks, target variables, lifecycle webhooks, regression coverage, CI quality gates, run-result analysis, and simulation API validation errors. Do not use for fixed-turn mock-conversation Evals unless the user is deciding between Evals and Simulations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1412,1413,1414,1417],{"name":1237,"slug":1238,"type":16},{"name":18,"slug":19,"type":16},{"name":1415,"slug":1416,"type":16},"Simulation","simulation",{"name":1418,"slug":1419,"type":16},"Testing","testing","2026-08-15T03:47:29.005508",{"slug":1422,"name":1422,"fn":1423,"description":1424,"org":1425,"tags":1426,"stars":26,"repoUrl":27,"updatedAt":1435},"vapi-bootstrap-framework","scaffold Vapi voice agent projects","Opt-in recreation of the Bun + TypeScript framework used to build Vapi's landing-page voice agents from a ROUGH_DRAFT.md spec, including a scenario registry, language stacks, prompt composer, assistant builder, and idempotent bootstrap script. Use only when the user explicitly invokes vapi-bootstrap-framework or specifically asks to reproduce or experiment with the landing-page-agent architecture. Do not use for ordinary Vapi assistant builds; use create-assistant, create-tool, create-squad, and vapi-prompt-builder instead. Targets Bun + TypeScript + @vapi-ai\u002Fserver-sdk.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1427,1428,1431,1434],{"name":1237,"slug":1238,"type":16},{"name":1429,"slug":1430,"type":16},"Engineering","engineering",{"name":1432,"slug":1433,"type":16},"TypeScript","typescript",{"name":21,"slug":22,"type":16},"2026-08-15T03:21:04.726284",13]