How do I go about removing one or more keyword-specific bids via the Google 
Ads API Python library? What I want to be able to do is perform the 
equivalent of changing the "Max. CPC" field to blank for a keyword in the 
Ads UI, thus allowing the ad group default bid to kick in for that keyword.

The first approach I took was retrieving the ad group criterion instance 
that I wanted to update via GoogleAdsService, then creating a new ad group 
criterion operation, copying the retrieved campaign onto the new ad group 
criterion operation's update field, mutating the new ad group criterion (by 
setting ad_group_criterion.cpc_bid_micros.value = 0), then creating a field 
mask and copying the field mask onto the operation's update_mask field. 

from google.api_core import protobuf_helpers
from google.ads.google_ads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage()
google_ads_service = client.get_service('GoogleAdsService', version='v3')
agc_operation = client.get_type('AdGroupCriterionOperation',
                                               version='v3')

query = ("SELECT customer.id, ad_group.id, "
         "ad_group_criterion.criterion_id, "
         "ad_group_criterion.cpc_bid_micros, "
         "ad_group_criterion.keyword.text, "
         "FROM ad_group_criterion "
         "WHERE campaign.status = 'ENABLED' "
         "AND ad_group.status = 'ENABLED' "
         "AND ad_group_criterion.type = 'KEYWORD' "
         "AND ad_group_criterion.status = 'ENABLED' "
         "AND ad_group_criterion.cpc_bid_micros > 0")

results = google_ads_service.search(customer_id, query=query)

for row in results:    
    initial_ad_group_criterion = row.ad_group_criterion
    agc_operation.update.CopyFrom(initial_ad_group_criterion)
    updated_ad_group_criterion = agc_operation.update
    updated_ad_group_criterion.cpc_bid_micros.value = 0
    field_mask = protobuf_helpers.field_mask(initial_ad_group_criterion,
                                             updated_ad_group_criterion)
    agc_operation.update_mask.CopyFrom(field_mask)

However, attempting to update/remove the keyword-specific bid in this way 
results in an INVALID_VALUE partial failure error, with the error message 
"The field's value is invalid." Digging in a bit further, it appears that 0 
is not considered a valid Int64 value and thus cannot be accepted as an 
updated value for ad_group_criterion.cpc_bid_micros.


For my other approach, I created an empty AdGroupOperation object, 
retrieving an empty AdGroupCriterion object and updating that object to 
have ad_group_criterion.cpc_bid_micros.value = 0. I then created a new 
field mask that compares it to None, finally copying the field mask onto 
the operation's update_mask field.

from google.api_core import protobuf_helpers
from google.ads.google_ads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage()
google_ads_service = client.get_service('GoogleAdsService',
                                        version='v3')
ad_group_criterion_operation = client.get_type('AdGroupCriterionOperation',
                                               version='v3')

query = ("SELECT customer.id, ad_group.id, "
         "ad_group_criterion.criterion_id, "
         "ad_group_criterion.cpc_bid_micros, "
         "ad_group_criterion.keyword.text, "
         "FROM ad_group_criterion "
         "WHERE campaign.status = 'ENABLED' "
         "AND ad_group.status = 'ENABLED' "
         "AND ad_group_criterion.type = 'KEYWORD' "
         "AND ad_group_criterion.status = 'ENABLED' "
         "AND ad_group_criterion.cpc_bid_micros > 0 ")

results = google_ads_service.search(customer_id, query=query)

for row in results:    
    initial_ad_group_criterion = row.ad_group_criterion
    ad_group_criterion_operation.update.CopyFrom(initial_ad_group_criterion)
    updated_ad_group_criterion = ad_group_criterion_operation.update 
    updated_ad_group_criterion.cpc_bid_micros.value = 0
    field_mask = protobuf_helpers.field_mask(initial_ad_group_criterion,
                                             updated_ad_group_criterion)
    ad_group_criterion_operation.update_mask.CopyFrom(field_mask)

This resulted in a response containing the correct resourceName 
(customers/{customer_id}/adGroupCriteria/{ad_group_id}~{ad_group_criterion_id}),
 
but the keyword-specific bid wasn't removed or updated -- it remained as it 
was.

Should I be going about this in a different way entirely? For instance, 
rather than trying to update the cpc_bid_micros value to "0" should I be 
using a "remove" mutate of some kind? Thanks for reading and for any help 
you can provide.

-- 
-- 
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
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 
"AdWords API and Google Ads API Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/adwords-api/eebe5dff-ed06-4da2-81c6-a7f23ecbe910%40googlegroups.com.

Reply via email to