MCPInstall

create-campaign

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 /call batch.

Installs
76
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/vapiai/skills --skill create-campaign
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads create-campaign automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Vapi Outbound Campaigns

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.

The current public API uses /v2/campaign. The unversioned /campaign endpoints are legacy and have different behavior. Use /v2/campaign for new integrations, and touch /campaign only when the user explicitly asks to maintain an existing legacy integration.

Source and Safety Rules

  • Verify live payloads against the current Vapi documentation MCP, Campaigns documentation, or public API reference. Do not silently fall back from /v2/campaign to legacy /campaign behavior.
  • 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.
  • Treat phone numbers, names, contact variables, call records, transcripts, and recordings as sensitive. Report counts and redacted samples unless the user needs specific records.
  • 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.
  • 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.
  • 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 when relevant.
  • A timeout or ambiguous response to POST /v2/campaign does not prove failure. Search for the intended campaign before retrying so the audience is not called twice.

Procedure

  1. Choose the API and execution mode.

    • Use POST /call 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.
    • Return a plan, CSV, payload, or implementation without calling Vapi when the user asks to draft, explain, review, or prepare.
    • Use live API operations only when the user asks to create, duplicate, cancel, or archive and VAPI_API_KEY is available.
  2. Resolve the caller and outbound number.

    • Select exactly one saved assistantId or squadId. Do not use deprecated Workflows for a new campaign.
    • Resolve one outbound-capable phoneNumberId. Vapi Free Numbers cannot launch campaigns. The current /v2/campaign API does not support legacy dialPlan routing across multiple outbound numbers.
    • Inspect the assistant or squad before launch. Ensure its prompt, tools, variables, call-ending behavior, and published configuration match this outbound use case.
    • 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.
  3. Prepare and validate contacts.

    • 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.
    • 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.
    • 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.
    • 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.
    • 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.
  4. Set timing and concurrency.

    • Omit schedulePlan for a new campaign that should dispatch as soon as capacity is available.
    • 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.
    • 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.
    • 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.
    • 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.
  5. Configure campaign webhooks only when needed.

    • Set server before using predialPlan or serverMessages. Prefer a saved credential over inline secrets and use an intentional timeout and backoff plan.
    • 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.
    • Use serverMessages for selected asynchronous campaign and contact lifecycle events. Make the receiver idempotent and do not depend on event ordering.
    • 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.
  6. Build and review the request.

    • For a fresh campaign, include name, exactly one of assistantId or squadId, phoneNumberId, a non-empty customers array, and maxConcurrency.
    • 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.
    • Add campaign-level assistantOverrides or squadOverrides, schedulePlan, server, serverMessages, and predialPlan only when intentional.
    • Read Campaign API Reference for validated REST shapes, duplicate semantics, pagination, and lifecycle requests.
    • 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.
  7. Create once and verify.

    • Send one POST /v2/campaign. Treat the returned campaign ID as the durable identifier.
    • Re-fetch it with GET /v2/campaign/{id}?includeCounters=true before claiming creation succeeded. Report the actual status and schedule; creation does not prove any contact was reached.
    • If creation returns an ambiguous timeout or 5xx, use GET /v2/campaign with narrow supported filters and creation-time context to look for the campaign. Do not automatically repeat the POST.
  8. Inspect and diagnose from contact evidence.

    • 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.
    • Fetch GET /v2/campaign/{id}/contacts and paginate when needed. Contact status is the source of truth for each audience member.
    • 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.
    • Separate campaign dispatch problems, pre-dial eligibility failures, telephony connection failures, voicemail outcomes, and assistant behavior. Counters alone do not identify the cause.
  9. Duplicate to rerun or replace compatible configuration.

    • Campaigns are immutable after creation. Do not patch the caller, contacts, schedule, concurrency, or webhook configuration.
    • 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 /v2/campaign API.
    • 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.
    • 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.
    • Treat a duplicate as another live launch with the same authorization and double-dial safeguards as a fresh campaign.
  10. Cancel or archive deliberately.

  • To stop a scheduled or running campaign, send PATCH /v2/campaign/{id} with only { "status": "cancelled" }. Pending work stops; calls already in progress may finish. Cancellation is final for that campaign.
  • Re-fetch and verify the terminal state and endedReason. Do not describe cancellation as reversing calls already placed.
  • DELETE /v2/campaign/{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.

Failure Handling

  • 400: report the rejected field and compare it with the current /v2/campaign schema. Correct one unambiguous request-shape issue before at most one safe retry.
  • 401 or 403: stop for authentication, scope, entitlement, frozen subscription, or permission failure.
  • 404: report the exact missing campaign, assistant, squad, or phone number ID.
  • 409: re-fetch the campaign; an immutable or terminal lifecycle conflict requires a duplicate or no further action, not a repeated patch.
  • 429 or 5xx: report the service condition. Never retry campaign creation until duplicate creation has been ruled out.
  • Partial completion: preserve the campaign and report actual contact outcomes. Do not delete, redial, or replace the remaining audience automatically.

Output Contract

Return only what the request needs:

  • Mode: plan, payload, launch, inspect, duplicate, cancel, archive, or diagnose
  • Resolved caller, outbound number, contact count, and redacted sample
  • Local and ISO schedule, max concurrency, and shared-capacity caveat
  • Consent and calling-window assumptions that still require user verification
  • Webhook and pre-dial behavior, including remaining live side effects
  • Save-ready CSV, JSON, or code when requested
  • Campaign ID, verified status, counters, contact outcomes, and call IDs after live operations
  • Unresolved failures, evidence, and the smallest safe next action

Public Sources

FAQ

What does the create-campaign skill do?

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 /call batch.

How do I install create-campaign?

Run npx skills add https://github.com/vapiai/skills --skill create-campaign in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/create-campaign/ (personal) or .claude/skills/create-campaign/ (project).

Which AI agents can use create-campaign?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is create-campaign safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains create-campaign?

It is published by vapiai in vapiai/skills. It has 76 recorded installs.

More from vapiai/skills

View all →

create-assistant

vapiai/skills

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/voice/transcriber selection, multilingual compatibility, existing tool attachment, native call-control tools, assistant hooks, and Create Assistant API validation errors.

OfficialMedia & Creative1.1K installs

create-call

vapiai/skills

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 /call request programmatically. Use create-campaign for a persistent multi-contact Campaign with lifecycle, reporting, cancellation, duplication, or campaign webhooks.

OfficialMarketing & SEO1.1K installs

setup-api-key

vapiai/skills

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.

OfficialBackend & APIs953 installs

create-phone-number

vapiai/skills

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/Vonage/Telnyx or BYO carrier numbers, secure credential handling, assistant or squad routing, area-code requests, outbound limitations, and phone-provider troubleshooting.

OfficialBackend & APIs946 installs

setup-webhook

vapiai/skills

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.

OfficialBackend & APIs939 installs

create-tool

vapiai/skills

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.

OfficialBackend & APIs930 installs

Popular marketing & seo skills

View category →

reddit-automation

flowkit-labs/skills

Find Reddit threads where people are genuinely asking for what you offer, then draft short, genuinely helpful replies — disclosing your affiliation honestly and naming your product only when it truly answers the question. Two moves: discovery — scan the right subreddits for real needs (recommendation asks, expressed pain, competitor mentions) and rank the few threads where you can actually help; drafting — write from real experience, respect each community's self-promo rules, and keep a human in the loop to review and post. This markets on Reddit the honest way: contribute value, disclose who you are, never astroturf. Distilled from the playbook behind doany.ai's Reddit agent. Triggers on "find reddit opportunities", "reddit marketing", "reddit automation", "reply on reddit for my product", "reddit community engagement", "reddit lead gen", or any ask to turn Reddit threads into genuine, disclosed marketing replies.

Marketing & SEO1.1M installs

twitter-automation

101-skills/superpowers

Automate Twitter/X with posting, engagement, and user management via inference.sh CLI. Apps: x/post-tweet, x/post-create (with media), x/post-like, x/post-retweet, x/dm-send, x/user-follow. Capabilities: post tweets, schedule content, like posts, retweet, send DMs, follow users, get profiles. Use for: social media automation, content scheduling, engagement bots, audience growth, X API. Triggers: twitter api, x api, tweet automation, post to twitter, twitter bot, social media automation, x automation, tweet scheduler, twitter integration, post tweet, twitter post, x post, send tweet

Marketing & SEO880K installs

twitter-automation

magentosh/superpowers

Automate Twitter/X with posting, engagement, and user management via inference.sh CLI. Apps: x/post-tweet, x/post-create (with media), x/post-like, x/post-retweet, x/dm-send, x/user-follow. Capabilities: post tweets, schedule content, like posts, retweet, send DMs, follow users, get profiles. Use for: social media automation, content scheduling, engagement bots, audience growth, X API. Triggers: twitter api, x api, tweet automation, post to twitter, twitter bot, social media automation, x automation, tweet scheduler, twitter integration, post tweet, twitter post, x post, send tweet

Marketing & SEO771.7K installs

twitter-automation

qu-skills/superpowers

Automate Twitter/X with posting, engagement, and user management via inference.sh CLI. Apps: x/post-tweet, x/post-create (with media), x/post-like, x/post-retweet, x/dm-send, x/user-follow. Capabilities: post tweets, schedule content, like posts, retweet, send DMs, follow users, get profiles. Use for: social media automation, content scheduling, engagement bots, audience growth, X API. Triggers: twitter api, x api, tweet automation, post to twitter, twitter bot, social media automation, x automation, tweet scheduler, twitter integration, post tweet, twitter post, x post, send tweet

Marketing & SEO564.3K installs

product-launch-video

heygen-com/hyperframes

Turn a product or marketing URL, pasted script, or brief into a product launch / promo video — SaaS promos, feature reveals, product demos, app and company launches. Use when the user wants to market, launch, promote, or reveal a product; the default for any commercial URL. Site tours / showcases of a website route here too — the brief carries the show-it-as-is intent. Unclear → /hyperframes.

Marketing & SEO538.7K installs

twitter-automation

skills-shell/superpowers

Automate Twitter/X with posting, engagement, and user management via inference.sh CLI. Apps: x/post-tweet, x/post-create (with media), x/post-like, x/post-retweet, x/dm-send, x/user-follow. Capabilities: post tweets, schedule content, like posts, retweet, send DMs, follow users, get profiles. Use for: social media automation, content scheduling, engagement bots, audience growth, X API. Triggers: twitter api, x api, tweet automation, post to twitter, twitter bot, social media automation, x automation, tweet scheduler, twitter integration, post tweet, twitter post, x post, send tweet

Marketing & SEO453.7K installs