*Account / Env*
-
API version: *Google Ads API v20*
-
Client library: *Python*
-
Campaign type: *Performance Max*
-
We can share request IDs if needed.
------------------------------
1) Device controls for Performance Max (API) What we tried
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")
create = op.create create.campaign =
f"customers/{customer_id}/campaigns/{campaign_id}"
create.device.type_ = client.enums.DeviceEnum.CONNECTED_TV
create.negative = True svc = client.get_service("CampaignCriterionService")
svc.mutate_campaign_criteria(customer_id=customer_id, operations=[op])
*Result:*
-
Error: field_error: IMMUTABLE_FIELD
-
Message: “The field attempted to be mutated is immutable.”
-
Location points to .create.negative.
Questions
1.
*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?
2.
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?
GAQL we use to verify current state -- Current criteria rows on the PMax
campaign SELECT campaign_criterion.resource_name, campaign_criterion.type,
campaign_criterion.negative, campaign_criterion.device.type FROM
campaign_criterion WHERE campaign_criterion.campaign =
'customers/{CID}/campaigns/{CAMPAIGN_ID}'
------------------------------
2) Asset Group “Brand guidelines”: business name, logos, custom colors,
font
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 us
-
*Business 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 API
-
*Custom 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.
Questions
3.
*Are “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?
GAQL we use to inspect assets attached to the asset group SELECT
asset_group_asset.asset_group, asset_group_asset.field_type,
asset.resource_name, asset.type FROM asset_group_asset WHERE
asset_group_asset.asset_group = 'customers/{CID}/assetGroups/{AG_ID}'
------------------------------
Bonus: if device rules are supported, can you share a minimal working
request?
-
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.
--
--
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
Also find us on our blog:
https://googleadsdeveloper.blogspot.com/
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
You received this message because you are subscribed to the Google
Groups "AdWords API and Google Ads API Forum" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/adwords-api?hl=en
---
You received this message because you are subscribed to the Google Groups
"Google Ads API and AdWords API Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/adwords-api/4003ff26-f0ff-462d-aee4-a7b0d41b7822n%40googlegroups.com.