Targeting criteria can be set at three different levels:

- At the [campaign](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterion) level.
- At the [ad group](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion) level.
- At the [customer](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomerNegativeCriterion) level.

> [!NOTE]
> **Note:** Customer-level criteria can only be negative.

Not all criteria types can be set at all levels: some, for example, can be set
only at the campaign level. Additionally, some criteria can only be used for
negative targeting, and some can only be used for positive targeting.

## Supported criteria by level

The following table describes the allowed usage of all criterion types:
All levels Campaign Ad group Customer

| Type | Positive? | Negative? | Available levels | Notes |
|---|---|---|---|---|
| [Ad schedule](https://developers.google.com/google-ads/api/reference/rpc/v26/AdScheduleInfo) | Yes | No | - Campaign |   |
| [Age range](https://developers.google.com/google-ads/api/reference/rpc/v26/AgeRangeInfo) | Yes | Yes | - Campaign - Ad group |   |
| [App payment model](https://developers.google.com/google-ads/api/reference/rpc/v26/AppPaymentModelInfo) | Yes | No | - Ad group |   |
| [Audience](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInfo) | Yes | No | - Ad group | Refer to the [Demand Gen audience targeting guide](https://developers.google.com/google-ads/api/docs/demand-gen/audience-targeting). |
| [Brand list](https://developers.google.com/google-ads/api/reference/rpc/v26/BrandListInfo) | Yes | Yes | - Campaign - Ad group | At the ad group level, only positive targeting is supported. |
| [Carrier](https://developers.google.com/google-ads/api/reference/rpc/v26/CarrierInfo) | Yes | No | - Campaign |   |
| [Combined audience](https://developers.google.com/google-ads/api/reference/rpc/v26/CombinedAudienceInfo) | Yes | No | - Campaign - Ad group | See the [combined audiences Help Center article](https://support.google.com/google-ads/answer/9066029). |
| [Content label](https://developers.google.com/google-ads/api/reference/rpc/v26/ContentLabelInfo) | No | Yes | - Campaign - Customer |   |
| [Custom affinity](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomAffinityInfo) | Yes | No | - Campaign - Ad group | Defined by [`CustomInterest`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomInterest) resources. For audience segments that combine keywords, URLs, and apps, use [`CustomAudienceInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomAudienceInfo); see the [custom audiences guide](https://developers.google.com/google-ads/api/docs/remarketing/audience-segments/custom-audiences). |
| [Custom audience](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomAudienceInfo) | Yes | No | - Campaign - Ad group | Defined by [`CustomAudience`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomAudience) resources. See the [custom audiences guide](https://developers.google.com/google-ads/api/docs/remarketing/audience-segments/custom-audiences). |
| [Custom intent](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomIntentInfo) | Yes | No | - Ad group | Defined by [`CustomInterest`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomInterest) resources. For audience segments that combine keywords, URLs, and apps, use [`CustomAudienceInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomAudienceInfo); see the [custom audiences guide](https://developers.google.com/google-ads/api/docs/remarketing/audience-segments/custom-audiences). |
| [Device](https://developers.google.com/google-ads/api/reference/rpc/v26/DeviceInfo) | Yes | No | - Campaign | Set `bid_modifier` to `0.0` to opt out of a device type. Use [`AdGroupBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifier) for ad group-level device bid adjustments; see the [bid modifiers guide](https://developers.google.com/google-ads/api/docs/targeting/bid-modifiers). |
| [Entity bid](https://developers.google.com/google-ads/api/reference/rpc/v26/EntityBid) | Yes | No | - Ad group | In **v25 and later** , sets an item-level bid (`item_code`) for a travel entity (such as a hotel, thing to do, or event) in Vertical Ads using the `VERTICAL_ADS_ITEM_BID` criterion type. |
| [Extended demographic](https://developers.google.com/google-ads/api/reference/rpc/v26/ExtendedDemographicInfo) | Yes | Yes | - Campaign - Ad group |   |
| [Gender](https://developers.google.com/google-ads/api/reference/rpc/v26/GenderInfo) | Yes | Yes | - Campaign - Ad group | Campaign-level gender exclusions (`negative = true`) are also supported for Performance Max campaigns. Attempting to target only the `UNDETERMINED` category in a demographic dimension returns `CriterionError.CANNOT_TARGET_ONLY_UNDETERMINED`. See [Version differences](https://developers.google.com/google-ads/api/docs/targeting/criteria#version-differences) for demographic validation rules in **v24 and later**. |
| [Income range](https://developers.google.com/google-ads/api/reference/rpc/v26/IncomeRangeInfo) | Yes | Yes | - Campaign - Ad group |   |
| [IP block](https://developers.google.com/google-ads/api/reference/rpc/v26/IpBlockInfo) | No | Yes | - Campaign - Customer |   |
| [Keyword](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordInfo) | Yes | Yes | - Campaign - Ad group | At the campaign level, you can only exclude keywords. |
| [Keyword theme](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordThemeInfo) | Yes | Yes | - Campaign |   |
| [Language](https://developers.google.com/google-ads/api/reference/rpc/v26/LanguageInfo) | Yes | No | - Campaign - Ad group | For Search campaigns, adding or updating language criteria isn't supported, though existing campaign-level language criteria can be removed. See [Language targeting criteria](https://developers.google.com/google-ads/api/docs/targeting/criteria#language-targeting) for details. In **v24 and later** , attempting to target a disallowed language returns `CriterionError.CANNOT_TARGET_LANGUAGE`. |
| [Life event](https://developers.google.com/google-ads/api/reference/rpc/v26/LifeEventInfo) | Yes | Yes | - Campaign - Ad group |   |
| [Listing group](https://developers.google.com/google-ads/api/reference/rpc/v26/ListingGroupInfo) | Yes | No | - Ad group | Tree-based structure for Hotel Ads and Shopping campaigns. See the [Shopping listing groups guide](https://developers.google.com/google-ads/api/docs/shopping-ads/create-listing-groups). |
| [Listing scope](https://developers.google.com/google-ads/api/reference/rpc/v26/ListingScopeInfo) | Yes | No | - Campaign |   |
| [Local service ID](https://developers.google.com/google-ads/api/reference/rpc/v26/LocalServiceIdInfo) | Yes | No | - Campaign | Represents a service type for [Local Services Campaigns](https://developers.google.com/google-ads/api/docs/campaigns/local-service-campaigns). In **v24 and later** , Local Services service ID signals can also be set on Performance Max asset groups using `AssetGroupSignal.local_services_id`. |
| [Location](https://developers.google.com/google-ads/api/reference/rpc/v26/LocationInfo) | Yes | Yes | - Campaign - Ad group | See the [location targeting guide](https://developers.google.com/google-ads/api/docs/targeting/location-targeting). In **v24 and later** , removing all locations from a Local Services Performance Max campaign returns `CampaignCriterionError.CANNOT_REMOVE_ALL_LOCATIONS_FROM_LOCAL_SERVICES_PMAX_CAMPAIGN`. |
| [Location group](https://developers.google.com/google-ads/api/reference/rpc/v26/LocationGroupInfo) | Yes | No | - Campaign | Target multiple geographic regions using a distance radius. See the [location targeting guide](https://developers.google.com/google-ads/api/docs/targeting/location-targeting). |
| [Mobile app category](https://developers.google.com/google-ads/api/reference/rpc/v26/MobileAppCategoryInfo) | Yes | Yes | - Campaign - Ad group - Customer |   |
| [Mobile application](https://developers.google.com/google-ads/api/reference/rpc/v26/MobileApplicationInfo) | Yes | Yes | - Campaign - Ad group - Customer |   |
| [Mobile device](https://developers.google.com/google-ads/api/reference/rpc/v26/MobileDeviceInfo) | Yes | No | - Campaign |   |
| [Negative keyword list](https://developers.google.com/google-ads/api/reference/rpc/v26/NegativeKeywordListInfo) | No | Yes | - Customer | Links an `ACCOUNT_LEVEL_NEGATIVE_KEYWORDS` [shared set](https://developers.google.com/google-ads/api/docs/targeting/shared-sets) to an account (at most one per account). |
| [Operating system version](https://developers.google.com/google-ads/api/reference/rpc/v26/OperatingSystemVersionInfo) | Yes | No | - Campaign |   |
| [Parental status](https://developers.google.com/google-ads/api/reference/rpc/v26/ParentalStatusInfo) | Yes | Yes | - Campaign - Ad group | At the campaign level, only negative targeting is supported. |
| [Placement](https://developers.google.com/google-ads/api/reference/rpc/v26/PlacementInfo) | Yes | Yes | - Campaign - Ad group - Customer | Managed placements support positive targeting at the campaign and ad group levels, and negative targeting at all levels. Limits on URL length (250 chars) and depth (2 levels); `adsenseformobileapps.com` is not allowed. |
| [Placement list](https://developers.google.com/google-ads/api/reference/rpc/v26/PlacementListInfo) | No | Yes | - Customer | Links a `NEGATIVE_PLACEMENTS` [shared set](https://developers.google.com/google-ads/api/docs/targeting/shared-sets) to an account to exclude placements across campaigns. |
| [Proximity](https://developers.google.com/google-ads/api/reference/rpc/v26/ProximityInfo) | Yes | No | - Campaign | Created using an address or latitude-longitude and a radius. See the [location targeting guide](https://developers.google.com/google-ads/api/docs/targeting/location-targeting). |
| [Retail filter bundle](https://developers.google.com/google-ads/api/reference/rpc/v26/RetailFilterBundle) | Yes | Yes | - Ad group | In **v24 and later** (allowlisted accounts only), links a `RETAIL_FILTER` [shared set](https://developers.google.com/google-ads/api/docs/targeting/shared-sets) to an ad group (or to `AssetGroupListingGroupFilter` in Performance Max campaigns) for dynamic tag-based product filtering. |
| [Topic](https://developers.google.com/google-ads/api/reference/rpc/v26/TopicInfo) | Yes | Yes | - Campaign - Ad group |   |
| [User interest](https://developers.google.com/google-ads/api/reference/rpc/v26/UserInterestInfo) | Yes | Yes | - Campaign - Ad group | Verify the [availabilities](https://developers.google.com/google-ads/api/reference/rpc/v26/UserInterest#availabilities[]) are compatible with the campaign type. Some user interest options are only available for specific campaign types. |
| [User list](https://developers.google.com/google-ads/api/reference/rpc/v26/UserListInfo) | Yes | Yes | - Campaign - Ad group | Use the ID of the user list. |
| [Vertical ads item group rule list](https://developers.google.com/google-ads/api/reference/rpc/v26/VerticalAdsItemGroupRuleListInfo) | Yes | Yes | - Ad group | Links a `VERTICAL_ADS_ITEM_GROUP_RULE_LIST` [shared set](https://developers.google.com/google-ads/api/docs/targeting/shared-sets) to an ad group in Search campaigns with travel feeds (also supported on `AssetGroupSignal` in Performance Max campaigns in **v24 and later** for accounts on an allowlist). |
| [Video lineup](https://developers.google.com/google-ads/api/reference/rpc/v26/VideoLineupInfo) | Yes | Yes | - Campaign - Ad group | Specifying an invalid lineup ID returns `CampaignCriterionError.INVALID_VIDEO_LINEUP_ID`. |
| [Webpage](https://developers.google.com/google-ads/api/reference/rpc/v26/WebpageInfo) | Yes | Yes | - Campaign - Ad group | Used to target or exclude specific pages on an advertiser's website based on conditions. Setting a `Webpage` criterion as negative is used to implement URL exclusions. |
| [Webpage list](https://developers.google.com/google-ads/api/reference/rpc/v26/WebpageListInfo) | No | Yes | - Campaign | Links a `WEBPAGES` [shared set](https://developers.google.com/google-ads/api/docs/targeting/shared-sets) to exclude a list of webpages at the campaign level (not publicly available). |
| [YouTube channel](https://developers.google.com/google-ads/api/reference/rpc/v26/YouTubeChannelInfo) | Yes | Yes | - Campaign - Ad group - Customer |   |
| [YouTube video](https://developers.google.com/google-ads/api/reference/rpc/v26/YouTubeVideoInfo) | Yes | Yes | - Campaign - Ad group - Customer |   |

## Version differences

Several criterion types and validation behaviors differ across supported Google Ads API
versions:

- **v26 and later:**
  - Supports `require_eu_political_advertising_declaration` on [`CampaignCriterion`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterion) and [`AdGroupCriterion`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion) to determine whether a criterion requires a campaign-level EU political advertising declaration.
  - Uses vertical-agnostic travel dimensions on [`AdGroupBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifier) and vertical-agnostic error reasons in [`CriterionError`](https://developers.google.com/google-ads/api/reference/rpc/v26/CriterionErrorEnum.CriterionError) (replacing hotel-specific criteria and error codes in v25 and earlier).
- **v25 and later:** Supports the [`EntityBid`](https://developers.google.com/google-ads/api/reference/rpc/v26/EntityBid) (`entity_bid`) criterion on [`AdGroupCriterion`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion) with criterion type `VERTICAL_ADS_ITEM_BID` to set item-level bids for travel entities in Vertical Ads.
- **v24 and later:**
  - Supports [`RetailFilterBundle`](https://developers.google.com/google-ads/api/reference/rpc/v26/RetailFilterBundle) (`AdGroupCriterion.retail_filter_bundle` and `AssetGroupListingGroupFilter.Dimension.retail_filter_bundle`) and `RetailFilter` (`SharedCriterion.retail_filter`) for tag-based product filtering (allowlisted accounts only).
  - Supports the `user_rating`, `venue`, and `event_participant_display_name` rule dimensions on `VerticalAdsItemGroupRuleInfo` in `SharedCriterion`.
  - Supports `AssetGroupSignal.local_services_id` and `AssetGroupSignal.vertical_ads_item_group_rule_list` (allowlisted) for Performance Max asset group signals.
  - Returns `CriterionError.CANNOT_EXCLUDE_ALL_TARGETS` when attempting to exclude all targets within a demographic dimension (`AgeRangeInfo`, `GenderInfo`, `IncomeRangeInfo`, or `ParentalStatusInfo`).
  - Returns `CriterionError.CANNOT_TARGET_LANGUAGE` when attempting to target a disallowed language.
  - Returns `CampaignCriterionError.CANNOT_REMOVE_ALL_LOCATIONS_FROM_LOCAL_SERVICES_PMAX_CAMPAIGN` when attempting to remove all locations from a Local Services Performance Max campaign.

## Audience info targeting criteria

You can target audiences at the ad group level using
[`AudienceInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInfo) criteria on
[`AdGroupCriterion.audience`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion#audience). Set
`ad_group_criterion.audience.audience` to the resource name of the
[`Audience`](https://developers.google.com/google-ads/api/reference/rpc/v26/Audience) you want to target. To use `AudienceInfo` criteria on an
`AdGroupCriterion`, you must set
`ad_group.audience_setting.use_audience_grouped = true` when creating the ad
group (this setting is immutable after creation). You can also optionally set
`campaign.audience_setting.use_audience_grouped = true` when creating the
campaign to prevent segment and demographic exclusions at the campaign level.

### Inspect `MutateAudienceResult`

When creating an audience with
[`AudienceService.MutateAudiences`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceService/MutateAudiences), each operation returns a
[`MutateAudienceResult`](https://developers.google.com/google-ads/api/reference/rpc/v26/MutateAudienceResult). You can inspect
`MutateAudienceResult` to obtain the `audience_id` by parsing the returned
`resource_name`, and you can inspect mutable fields (such as `name`) on the
returned `audience` object when `response_content_type` is set to
`MUTABLE_RESOURCE`:

    # Inspect MutateAudienceResult to get audience_id.
    for result in response.results:
        resource_name = result.resource_name
        # Format: customers/{customer_id}/audiences/{audience_id}
        audience_id = audience_service.parse_audience_path(resource_name)[
            "audience_id"
        ]
        print(f"Created audience '{resource_name}' with ID '{audience_id}'.")

        # Access mutable fields on result.audience when MUTABLE_RESOURCE is requested.
        if result.audience.resource_name:
            print(f"Audience name from mutable resource: {result.audience.name}")

## Language targeting criteria

You can positively target languages using [`LanguageInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/LanguageInfo)
criteria at the campaign level
([`CampaignCriterion.language`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterion#language)) or ad group level
([`AdGroupCriterion.language`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion#language)) by setting
`language_constant` to a targetable [`LanguageConstant`](https://developers.google.com/google-ads/api/reference/rpc/v26/LanguageConstant)
resource name (of the form `languageConstants/{criterion_id}`; see the
[supported language codes](https://developers.google.com/google-ads/api/data/codes-formats#languages)). In **v24 and later** , attempting to
target a disallowed or non-targetable language returns
[`CriterionError.CANNOT_TARGET_LANGUAGE`](https://developers.google.com/google-ads/api/reference/rpc/v26/CriterionErrorEnum.CriterionError#cannot_target_language).

Support for `LanguageInfo` depends on the campaign type:

- **Supported campaign types:** You can target languages in eligible campaign types, such as Display, Video, [Performance Max](https://developers.google.com/google-ads/api/performance-max/create-campaign-criteria) (campaign level; applies to non-Search channels), [App campaigns](https://developers.google.com/google-ads/api/docs/app-campaigns/create-campaign#steps) (campaign level), and [Demand Gen campaigns](https://developers.google.com/google-ads/api/docs/demand-gen/create-campaign#create-ad-group) (ad group level by default, or campaign level depending on [`DemandGenCampaignSettings.upgraded_targeting`](https://developers.google.com/google-ads/api/reference/rpc/v26/Campaign.DemandGenCampaignSettings#upgraded_targeting)).
- **Search campaigns ([`AdvertisingChannelType.SEARCH`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdvertisingChannelTypeEnum.AdvertisingChannelType#search)),
  AI Max for Search campaigns, and Performance Max ads on Google Search:** Manual language targeting isn't supported. Instead, ads shown on Google Search automatically match to users based on the language of your ad creatives and landing pages alongside user language preferences:
  - **Creating or updating criteria:** Attempting to create or update a `LanguageInfo` criterion on a Search campaign fails with a [`ContextError.OPERATION_NOT_PERMITTED_FOR_CONTEXT`](https://developers.google.com/google-ads/api/reference/rpc/v26/ContextErrorEnum.ContextError#operation_not_permitted_for_context) error.
  - **Querying and removing legacy criteria:** Existing `CampaignCriterion.language` criteria on Search campaigns are still returned in query responses even though they aren't used for ad serving. Although the Google Ads UI doesn't provide a language targeting field for Search campaigns, you can remove legacy `CampaignCriterion.language` criteria using [`CampaignCriterionService`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterionService).