---
title: "Update an Ad Campaign"
method: PATCH
path: "/ad_campaigns/{id}"
tags: ["Ad Campaigns"]
---

# Update an Ad Campaign

`PATCH /ad_campaigns/{id}`

Updates an ad campaign's editable fields (title, budget, schedule, bid strategy, special ad categories, and, before launch, budget optimization), and launches a draft campaign by setting status to active. Objective, budget type and desired cost per result are fixed at creation and cannot be changed.

## Request body

- object
  - `bid_type` 'minimum_cost' | 'average_target' | 'maximum_target' — How delivery bids in the ad auction: `minimum_cost` gets the most results for the budget, `average_target` holds an average cost per result, `maximum_target` never bids above a cap. Switching to `minimum_cost` clears the cap amounts stored on the campaign's ad groups. Only for campaigns that own the budget.
  - `budget_amount` number — The campaign budget, in the account's currency. Interpreted as daily or lifetime per the campaign's existing budget type.
  - `budget_optimization` 'ad_campaign' | 'ad_group' — Which level owns the budget: the whole campaign (`ad_campaign`) or each ad group individually (`ad_group`). Only changeable before the campaign is live on the ad network; switching to `ad_campaign` requires budget_amount in the same request, and switching to `ad_group` clears the campaign budget.
  - `ends_at` string — When the campaign stops delivering, as an ISO 8601 timestamp. Only for campaigns that own the budget.
  - `special_ad_categories` string[] — Regulated categories the campaign falls under. Editable on any campaign, draft or launched; pass an empty array to clear.
  - `starts_at` string — When the campaign starts delivering, as an ISO 8601 timestamp. Only for campaigns that own the budget.
  - `status` 'active' — Set to active to launch a draft campaign (moderates and pushes it live). Live-campaign pause and resume use the pause and unpause actions.
  - `title` string — The name of the campaign.

## Response `200`

ad campaign updated

- AdCampaign
  - `added_to_cart_value` number, required — USD value attributed to add-to-cart events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `added_to_carts` number, required — Whop pixel-attributed add-to-cart events, last-click.
  - `bid_type` 'minimum_cost' | 'average_target' | 'maximum_target' | 'null', nullable — How delivery bids in the ad auction: `minimum_cost` gets the most results for the budget, `average_target` holds an average cost per result, and `maximum_target` never bids above a cap.
  - `budget_amount` number, nullable, required — The campaign's budget, in the ad account's currency. `null` when each ad group sets its own budget instead.
  - `budget_optimization` 'ad_campaign' | 'ad_group' | 'null', nullable, required — Which level owns the budget: the whole campaign (`ad_campaign`) or each ad group individually (`ad_group`).
  - `budget_type` 'daily' | 'lifetime' | 'null', nullable, required — Whether `budget_amount` is spent per day (`daily`) or over the campaign's full run (`lifetime`).
  - `click_through_rate` number, required — Clicks divided by impressions, between 0 and 1.
  - `clicks` number, required — The number of clicks.
  - `completed_registration_value` number, required — USD value attributed to complete-registration events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `completed_registrations` number, required — Whop pixel-attributed complete-registration events, last-click.
  - `contact_value` number, required — USD value attributed to contact events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `contacts` number, required — Whop pixel-attributed contact events, last-click.
  - `cost_per_added_to_cart` number, nullable, required — Spend divided by attributed add-to-cart events; null when they are not the goal and none are attributed.
  - `cost_per_click` number, required — Spend divided by clicks; 0 when there are no clicks.
  - `cost_per_completed_registration` number, nullable, required — Spend divided by attributed complete-registration events; null when they are not the goal and none are attributed.
  - `cost_per_contact` number, nullable, required — Spend divided by attributed contact events; null when contacts are not the goal and none are attributed.
  - `cost_per_lead` number, nullable, required — Spend divided by attributed leads; null when leads are not a goal and none are attributed.
  - `cost_per_mille` number, required — Spend per 1,000 impressions; 0 when there are no impressions.
  - `cost_per_purchase` number, nullable, required — Spend divided by attributed purchases; null when purchases are not a goal and none are attributed.
  - `cost_per_result` number, nullable, required — Spend divided by Whop pixel-attributed results; null when nothing Whop-attributable is being optimized for.
  - `cost_per_schedule` number, nullable, required — Spend divided by attributed schedule events; null when schedules are not the goal and none are attributed.
  - `cost_per_submitted_application` number, nullable, required — Spend divided by attributed submit-application events; null when they are not the goal and none are attributed.
  - `cost_per_unique_click` number, nullable, required — Spend divided by unique clicks; null when there are no unique clicks.
  - `cost_per_viewed_content` number, nullable, required — Spend divided by attributed view-content events; null when they are not the goal and none are attributed.
  - `created_at` string, required — When the campaign was created, as an ISO 8601 timestamp.
  - `custom_conversions` number, required — Whop pixel-attributed custom (merchant-defined) conversion events, last-click, across all custom event names.
  - `custom_event_counts` object, required — Whop pixel-attributed custom conversions, keyed by your event name with its last-click count as the value. Empty when no named custom events are attributed. Custom events fired without a name are counted in custom_conversions but omitted here, so these values sum to at most custom_conversions.
  - `custom_event_values` object, required — Conversion value attributed to each custom event, keyed by event name like custom_event_counts. Sums the value passed to whop.track, normalized to USD; events fired without a value contribute 0.
  - `delivery_status` 'payment_failed' | 'all_ads_rejected' | 'draft' | 'no_ad_groups' | 'no_ads' | 'paused' | 'processing' | 'issues' | 'scheduled' | 'completed' | 'ad_groups_off' | 'active', required — Whether the campaign's ads are delivering right now, and if not, why. When several states apply at once, the highest-precedence one is returned.
  - `frequency` number, nullable, required — Platform-reported impressions divided by reach.
  - `id` string, required — Unique identifier for the ad campaign, prefixed `adcamp_`.
  - `impressions` number, required — The number of impressions.
  - `issues` AdPlatformIssue[], required
    - `id` string, required — Unique identifier for the issue.
    - `message` string, required — A description of what the issue is and how it can be resolved.
    - `resource_id` string, nullable, required — The ID of the campaign, ad group, or ad the issue is attached to.
    - `resource_type` 'ad_campaign' | 'ad_group' | 'ad', required — The type of resource the issue is attached to.
  - `lead_value` number, required — USD value attributed to lead events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `leads` number, required — Whop pixel-attributed leads, last-click.
  - `objective` 'awareness' | 'traffic' | 'engagement' | 'leads' | 'sales' | 'null', nullable, required — The goal the campaign optimizes toward.
  - `optimization_goal` string, nullable, required — The event the campaign optimizes for when a single goal is set campaign-wide. `null` when each ad group sets its own optimization_goal.
  - `platform` 'meta' | 'tiktok', required — The ad network the campaign runs on.
  - `purchase_value` number, required — USD value of pixel-attributed purchases.
  - `purchases` number, required — Whop pixel-attributed purchases, last-click.
  - `reach` number, required — The number of unique people who saw this.
  - `result_event` 'purchase' | 'lead' | 'schedule' | 'submit_application' | 'contact' | 'complete_registration' | 'view_content' | 'add_to_cart' | 'custom' | 'null', nullable, required — The Whop pixel conversion event whose attributed count represents results — the optimization goal, or the highest-volume attributed event for campaigns that budget per ad group. Null when the goal isn't a Whop-attributed event.
  - `result_event_name` string, nullable, required — The merchant-defined event name when result_event is custom; null for the standard events.
  - `results` number, nullable, required — The Whop pixel-attributed count behind result_event. When a campaign's ad groups optimize different goals there is no single result_event (it is null), and this is instead the sum of each ad group's own attributed results. Null when nothing Whop-attributable is being optimized for.
  - `return_on_ad_spend` number, required — Purchase value divided by spend, both in USD (a currency-neutral ratio); 0 when there is no spend.
  - `schedule_value` number, required — USD value attributed to schedule events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `schedules` number, required — Whop pixel-attributed schedule events, last-click.
  - `special_ad_categories` string[], required
  - `spend` number, required — The amount charged, in spend_currency.
  - `spend_currency` string, nullable, required — The ISO 4217 currency code of all monetary metrics.
  - `status` 'active' | 'paused' | 'inactive' | 'stale' | 'pending_refund' | 'payment_failed' | 'draft' | 'in_review' | 'flagged' | 'importing' | 'imported' | 'duplicating', required — The lifecycle status of the ad campaign.
  - `submitted_application_value` number, required — USD value attributed to submit-application events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `submitted_applications` number, required — Whop pixel-attributed submit-application events, last-click.
  - `title` string, required — Display name of the ad campaign.
  - `unique_click_through_rate` number, nullable, required — Unique clicks divided by impressions, between 0 and 1.
  - `unique_clicks` number, required — People who clicked, reported by the Whop pixel, counted once per person.
  - `updated_at` string, required — When the campaign was last updated, as an ISO 8601 timestamp.
  - `viewed_content_value` number, required — USD value attributed to view-content events. Sums the value sent with each event, normalized to USD; events without a value contribute 0.
  - `viewed_contents` number, required — Whop pixel-attributed view-content events, last-click.

---

[API](https://skmtc.net/whop/apis/whop-api.md) · [All operations](https://skmtc.net/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/whop/whop-api/versions/866821546d67/schema)
