Negative keywords live in three layers: ad group, campaign criteria, and shared negative lists. GET/v1/ads/keywords returns ad-group negatives, and the other two layers are readable through the GAQL passthrough (campaign_criterion,
shared_criterion). On a real customer account we see 1.712 ad-group negatives, 870 campaign-level and516in shared lists — so the majority of exclusions isin the two layers we cannot write.
Practically, most wasted-spend exclusions belong at campaign or shared-list level: a term that is irrelevant for the business is irrelevant forevery ad group, and putting it inone ad grouponly moves the spend next door.
Request: write support for campaign negative criteria andfor shared negative keyword lists (add/remove, and attach a shared list to a campaign).
Shipped and live. Both layers you could not write are now writable, so all three layers of negative keywords are reachable through the API.
Shared negative keyword lists, at the account level:
GET /v1/ads/accounts/negative-keyword-lists and POST to create one
GET, PUT (rename) and DELETE on /v1/ads/accounts/negative-keyword-lists/{listId}
PUT /v1/ads/accounts/negative-keyword-lists/{listId}/keywords to set the list's keywords, desired-state like the campaign endpoint: send the full set you want and we diff it, so untouched keywords keep their ids
Attaching a list to a campaign, at the campaign level: GET and PUT on /v1/ads/campaigns/{campaignId}/negative-keyword-lists, also desired-state. Reading one of our own campaigns returns its attached lists with memberCount and referenceCount, so you can see how many campaigns share a list before you edit it.
Campaign-level negative criteria were already writable through PUT /v1/ads/campaigns/{campaignId}/negative-keywords, which we shipped earlier. So on your example account the 870 campaign-level and 516 shared-list exclusions are both manageable now, not just the 1,712 at ad-group level.
Your framing was the useful part of this request: an exclusion that is irrelevant for the business is irrelevant for every ad group, and putting it in one ad group only moves the spend next door. Thanks.
Log in to comment and vote
Comments1
Miquel Palet López
Sep 9
Shipped and live. Both layers you could not write are now writable, so all three layers of negative keywords are reachable through the API.
Shared negative keyword lists, at the account level:
GET /v1/ads/accounts/negative-keyword-listsandPOSTto create oneGET,PUT(rename) andDELETEon/v1/ads/accounts/negative-keyword-lists/{listId}PUT /v1/ads/accounts/negative-keyword-lists/{listId}/keywordsto set the list's keywords, desired-state like the campaign endpoint: send the full set you want and we diff it, so untouched keywords keep their idsAttaching a list to a campaign, at the campaign level:
GETandPUTon/v1/ads/campaigns/{campaignId}/negative-keyword-lists, also desired-state. Reading one of our own campaigns returns its attached lists withmemberCountandreferenceCount, so you can see how many campaigns share a list before you edit it.Campaign-level negative criteria were already writable through
PUT /v1/ads/campaigns/{campaignId}/negative-keywords, which we shipped earlier. So on your example account the 870 campaign-level and 516 shared-list exclusions are both manageable now, not just the 1,712 at ad-group level.Your framing was the useful part of this request: an exclusion that is irrelevant for the business is irrelevant for every ad group, and putting it in one ad group only moves the spend next door. Thanks.