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.