---
title: "Update an Ad Group"
method: PATCH
path: "/ad_groups/{id}"
tags: ["Ad Groups"]
---

# Update an Ad Group

`PATCH /ad_groups/{id}`

Updates an ad group's editable fields. Only the keys you send are changed.

## Request body

- object
  - `audiences` object — Saved-audience targeting: { include, exclude } arrays of audience IDs. Incompatible with demographics.automatic (Advantage+).
  - `bid_type` 'minimum_cost' | 'average_target' | 'maximum_target' — Bid strategy.
  - `budget_amount` number — Ad-set budget in dollars (ABO only; omit under CBO).
  - `budget_type` 'daily' | 'lifetime' — Whether the budget is daily or lifetime.
  - `conversion_event` union — The pixel event optimized for. A standard event, or any custom pixel event name.
    - 'purchase' | 'add_to_cart' | 'initiated_checkout' | 'add_payment_info' | 'complete_registration' | 'lead' | 'content_view' | 'search' | 'contact' | 'customize_product' | 'donate' | 'find_location' | 'schedule' | 'start_trial' | 'submit_application' | 'subscribe'
    - string
  - `conversion_location` 'website' | 'profile' | 'messaging' | 'on_ad' | 'instant_forms' | 'instant_forms_and_messenger' | 'website_and_instant_forms' — Where results happen: website (conversions), profile (IG/FB engagement), messaging (DM), on_ad (engagement on the ad, surface follows the optimization goal), or the lead destinations (instant_forms, instant_forms_and_messenger, website_and_instant_forms). The lead form itself is set on the ad.
  - `demographics` object — Demographic targeting: { automatic, minimum_age, maximum_age, gender }.
  - `desired_cost_per_result` number — Target/cap cost for average_target / maximum_target.
  - `devices` object — Device targeting: { platforms, operating_systems: [{ os, minimum_version }] }.
  - `ends_at` string — Schedule end, ISO 8601.
  - `frequency_cap` object — { maximum_impressions, per_days } — only valid for reach optimization.
  - `languages` string[] — Languages to target as ISO 639 codes (e.g. en, es). Empty/omitted = all languages.
  - `message_apps` string[] — Required when conversion_location is messaging: which apps to message on. Combinations map to the matching Meta destination.
  - `minimum_daily_spend` number — Daily spend floor within the budget.
  - `optimization_goal` string — What the ad group optimizes for (e.g. conversions, link_clicks, reach).
  - `placements` unknown
  - `regions` object — Geo targeting: { include / exclude: { countries (ISO 3166-1), regions (states/provinces as ISO 3166-2, e.g. US-CA), cities (keyed), zips } }.
  - `starts_at` string — Schedule start, ISO 8601.
  - `status` 'active' | 'paused' — Initial status (default: active).
  - `title` string — The display name of the ad group.

## Response `200`

ad group updated

- AdGroup
  - `ad_campaign` AdEntityReference, required
    - `id` string, required — The referenced entity's id.
  - `added_to_carts` number, required — Whop pixel-attributed add-to-cart events, last-click.
  - `audiences` object, required — Saved-audience targeting: { include, exclude } arrays of audience IDs.
  - `bid_type` 'minimum_cost' | 'average_target' | 'maximum_target' | 'null', nullable, required — Bid strategy.
  - `budget_amount` number, nullable, required — Ad-set budget; null when the campaign owns budget (CBO).
  - `budget_type` 'daily' | 'lifetime' | 'null', nullable, required — Whether the budget is daily or lifetime.
  - `click_through_rate` number, required — Clicks divided by impressions, between 0 and 1.
  - `clicks` number, required — The number of clicks.
  - `completed_registrations` number, required — Whop pixel-attributed complete-registration events, last-click.
  - `contacts` number, required — Whop pixel-attributed contact events, last-click.
  - `conversion_event` union, required — The pixel event optimized for. A standard event, or any custom pixel event name.
    - 'purchase' | 'add_to_cart' | 'initiated_checkout' | 'add_payment_info' | 'complete_registration' | 'lead' | 'content_view' | 'search' | 'contact' | 'customize_product' | 'donate' | 'find_location' | 'schedule' | 'start_trial' | 'submit_application' | 'subscribe'
    - string
  - `conversion_location` 'website' | 'profile' | 'messaging' | 'on_ad' | 'instant_forms' | 'instant_forms_and_messenger' | 'website_and_instant_forms' | 'null', nullable, required — Where results happen: website, profile (IG/FB), messaging (DM), on_ad (engagement), or the lead destinations (instant_forms, instant_forms_and_messenger, website_and_instant_forms).
  - `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_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 ad group was created, ISO 8601.
  - `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 broken out by merchant-defined event name, last-click, as a { event_name => count } map over the stats window. 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.
  - `delivery_status` 'all_ads_rejected' | 'rejected' | 'draft' | 'no_ads' | 'campaign_paused' | 'paused' | 'processing' | 'issues' | 'scheduled' | 'completed' | 'ads_off' | 'learning_limited' | 'learning' | 'active', required — The current delivery state, mirroring the Delivery column in the ads dashboard. When several states apply at once, the highest-precedence one is returned.
  - `demographics` object, required — Demographic targeting: automatic (Advantage+), age range, gender.
  - `desired_cost_per_result` number, nullable, required — Target/cap cost for average_target / maximum_target.
  - `devices` object, required — Device targeting: platforms and operating systems.
  - `dynamic_creative` boolean, required — Whether ads within this ad group have their creatives and copy dynamically AB tested.
  - `ends_at` string, nullable, required — Schedule end, ISO 8601.
  - `frequency` number, nullable, required — Platform-reported impressions divided by reach.
  - `frequency_cap` object, nullable, required — Impression cap; only valid for reach optimization.
  - `id` string, required — Unique identifier for the ad group.
  - `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.
  - `languages` string[], required
  - `leads` number, required — Whop pixel-attributed leads, last-click.
  - `message_apps` string[], required
  - `minimum_daily_spend` number, nullable, required — Daily spend floor within the budget.
  - `optimization_goal` string, nullable, required — What the ad group optimizes for.
  - `placements` object[], required
  - `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.
  - `regions` object, required — Geo targeting: include/exclude countries, regions (ISO 3166-2 states, e.g. US-CA), cities, zips.
  - `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.
  - `schedules` number, required — Whop pixel-attributed schedule events, last-click.
  - `spend` number, required — The amount charged, in spend_currency.
  - `spend_currency` string, nullable, required — The ISO 4217 currency code of all monetary metrics.
  - `starts_at` string, nullable, required — Schedule start, ISO 8601.
  - `status` 'active' | 'paused' | 'rejected', required — Delivery status of the ad group.
  - `submitted_applications` number, required — Whop pixel-attributed submit-application events, last-click.
  - `title` string, nullable, required — The display title of the ad group.
  - `unique_click_through_rate` number, nullable, required — Unique clicks divided by impressions, between 0 and 1.
  - `unique_clicks` number, required — The number of unique clicks.
  - `updated_at` string, required — When the ad group was last updated, ISO 8601.
  - `viewed_contents` number, required — Whop pixel-attributed view-content events, last-click.

## Changes

- **2026-07-14** `3a06a605784b` — 2 info
  - added the required property `custom_event_counts` to the response with the `200` status
  - added the required property `results` to the response with the `200` status

[Change history](https://skmtc.dev/whop/apis/whop-api/changes/ad_groups/:id/patch.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/whop/whop-api/revisions/3a06a605784b/schema)
