Account / Env
API version: Google Ads API v20
Client library: Python
Campaign type: Performance Max
We can share request IDs if needed.
We attempted to set device criteria at the campaign level using CampaignCriterionService with device.type = CONNECTED_TV and negative = true (to exclude CTV) for a Performance Max campaign.
Operation (Python, simplified):
op = client.get_type("CampaignCriterionOperation")Result:
Error: field_error: IMMUTABLE_FIELD
Message: “The field attempted to be mutated is immutable.”
Location points to .create.negative.
Is device targeting (include/exclude or bid modifiers) supported for Performance Max via the API as of May 2025?
If yes, which resource(s)/field(s) should we use (e.g., campaign_criterion.device, campaign-level setting, or a different entity)?
Are there constraints like only excludes or only certain device types (e.g., CTV only), or create-time only vs. updatable later?
If not supported via API (and UI shows a “Devices” section in PMax):
Is that UI-only and system-managed for PMax?
Any documented workaround or roadmap we can follow?
In the UI (Asset group → Brand guidelines), we see inputs for Business name, Logos, and under “More options”, Custom colors and Font.
What works for usBusiness name: we create a TEXT Asset and link via AssetGroupAsset with field_type = BUSINESS_NAME.
Logos: we create IMAGE Assets and link via AssetGroupAsset with field_type = LOGO.
This successfully syncs and is reflected in UI.
Atomic create example (mutate):
from google.ads.googleads.v20.services.types.google_ads_service import MutateOperation ops = [] # Create AssetGroup (temp id pattern) ag_op = MutateOperation() ag_create = ag_op.asset_group_operation.create ag_create.resource_name = f"customers/{CID}/assetGroups/-12345" ag_create.campaign = f"customers/{CID}/campaigns/{PMAX_CAMPAIGN_ID}" ag_create.name = "AG – Brand Setup" ag_create.final_urls.append("https://example.com/") ops.append(ag_op) # BUSINESS_NAME (TEXT asset already created → resource_name in rn_text) m = MutateOperation() m.asset_group_asset_operation.create.asset_group = f"customers/{CID}/assetGroups/-12345" m.asset_group_asset_operation.create.asset = rn_text # e.g., customers/{CID}/assets/111 m.asset_group_asset_operation.create.field_type = client.enums.AssetFieldTypeEnum.BUSINESS_NAME ops.append(m) # LOGO (IMAGE asset already created → resource_name in rn_logo) m = MutateOperation() m.asset_group_asset_operation.create.asset_group = f"customers/{CID}/assetGroups/-12345" m.asset_group_asset_operation.create.asset = rn_logo # e.g., customers/{CID}/assets/222 m.asset_group_asset_operation.create.field_type = client.enums.AssetFieldTypeEnum.LOGO ops.append(m) gas = client.get_service("GoogleAdsService") resp = gas.mutate(customer_id=CID, mutate_operations=ops) What we cannot find in the APICustom colors (main/accent)
Font (brand font selector)
We haven’t found writeable fields on AssetGroup, AssetGroupAsset, or a related resource to push colors or font. We currently store those locally for UX, but don’t sync them.
QuestionsAre “Custom colors” and “Font” exposed in the Google Ads API for Performance Max asset groups?
If yes, which resource(s)/field(s) should we call, and example of the correct mutate operation?
If UI-only, is there documentation confirming they are not API-exposed? Any roadmap?
Smallest example (either mutate_campaign_criteria or other endpoint) that successfully excludes CONNECTED_TV (or any device) for a PMax campaign—plus any caveats (creation-time only, etc.).
Thanks in advance! Links to official docs and a minimal working snippet would be hugely appreciated.
Hi,
Thank you for reaching out to the Google Ads API support team.
![]() |
Google Ads API Team |
[2025-10-30 17:28:38Z GMT] This message is in relation to case "ref:!00D1U01174p.!500Ht01vSE1S:ref" (ADR-00337961)