Today we can replace the creative on a Google search campaign through the top-level headlines / descriptions / finalUrls arrays on PUT /v1/ads/{adId}, and that works well. For Google campaigns withimagery (display and Performance Max) there
is no equivalent: the text can't be changed afterwards and the image can't be replaced at all.
Why it matters to us: we build campaigns for small business owners who don't log into Google Ads themselves. When their ad needs a new photo or a sharper line, the whole point of our tool is that they can do it where they already are. Right
now our only honest answer is "this one you have to doin Google Ads", which is exactly the step they hired a tool to avoid.
What would help, in order of usefulness:
1. Replacing individual assets (an image, a headline) on an existing image or PMax campaign.
2. If replacing in place isn't possible, an endpoint that swaps the whole asset set at once, the way the search arrays already work.
Meta and LinkedIn already support both text and image edits after creation, so for us thisis the one platform where the flow breaks.
Shipped and live, as your option 2. You can now swap the asset set on Display and Performance Max campaigns through PUT /v1/ads/{adId}:
PUT /v1/ads/{adId}
{"assetGroup": {"headlines": ["...", "...", "..."], "images": {"landscape": ["https://..."]}}}
Each list you send becomes the full new set for its kind, and a kind you leave out is untouched, matching the search arrays you already use. Display takes creative.headlines / descriptions / longHeadline / businessName / finalUrls plus the image roles; PMax takes the assetGroup shape above.
On your option 1, replacing an individual asset in place: that one genuinely is not possible, and it is Google's constraint rather than ours. Assets are immutable once uploaded, so the only supported shape is create-new and re-link, which is what runs underneath. The practical effect is the same and it is done in a single atomic mutate, so the asset group never dips below Google's required minimums part-way through.
Verified live on a throwaway Performance Max campaign, reading the result back from Google through GAQL rather than trusting our own 200:
ENABLED Ads API For Six Networks(new)
ENABLED Ship Ads In One POST(new)
ENABLED Zernio API(re-sent, same asset id, not duplicated)
REMOVED One API Many Networks(replaced)
REMOVED Social Media API(replaced)
Two behaviours worth knowing. Google dedupes assets by content, so re-sending a value the group already has resolves to the same asset and is left alone rather than churned. And an image Google rejects (wrong aspect ratio, for instance) fails the whole call with its reason, leaving the existing assets untouched, instead of half-applying.
Related, since it came from your other report the same day: replacing an image on a Display campaign used to return 200 and change nothing at all. Unsupported creative edits on Google now fail loudly with a message naming what cannot be changed.
Log in to comment and vote
Comments1
Miquel Palet López
Sep 11
Shipped and live, as your option 2. You can now swap the asset set on Display and Performance Max campaigns through
PUT /v1/ads/{adId}:PUT /v1/ads/{adId} {"assetGroup": {"headlines": ["...", "...", "..."], "images": {"landscape": ["https://..."]}}}Each list you send becomes the full new set for its kind, and a kind you leave out is untouched, matching the search arrays you already use. Display takes
creative.headlines/descriptions/longHeadline/businessName/finalUrlsplus the image roles; PMax takes theassetGroupshape above.On your option 1, replacing an individual asset in place: that one genuinely is not possible, and it is Google's constraint rather than ours. Assets are immutable once uploaded, so the only supported shape is create-new and re-link, which is what runs underneath. The practical effect is the same and it is done in a single atomic mutate, so the asset group never dips below Google's required minimums part-way through.
Verified live on a throwaway Performance Max campaign, reading the result back from Google through GAQL rather than trusting our own 200:
ENABLED Ads API For Six Networks (new) ENABLED Ship Ads In One POST (new) ENABLED Zernio API (re-sent, same asset id, not duplicated) REMOVED One API Many Networks (replaced) REMOVED Social Media API (replaced)Two behaviours worth knowing. Google dedupes assets by content, so re-sending a value the group already has resolves to the same asset and is left alone rather than churned. And an image Google rejects (wrong aspect ratio, for instance) fails the whole call with its reason, leaving the existing assets untouched, instead of half-applying.
Related, since it came from your other report the same day: replacing an image on a Display campaign used to return 200 and change nothing at all. Unsupported creative edits on Google now fail loudly with a message naming what cannot be changed.