I'm trying to create an AccountBudgetProposal using the Google Ads API
(v14), but I keep encountering the following error:
Request with ID "xxxx" failed with status "INVALID_ARGUMENT" and includes
the following errors: Error with message "You are not allowed to make
changes to budgets." On field: operation
*Steps I've taken:*
1.
*Verified Permissions:*
- My account has "Standard" access level, which I believe should be
sufficient.
- Confirmed that I have appropriate permissions to make changes to
budgets.
2.
*Checked Billing Setup Status:*
- Verified that the billing_setup_id is active and correctly formatted.
- Used the following code to check the status of the billing setup:
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
def get_billing_setup_status(client, customer_id, billing_setup_id):
ga_service = client.get_service("GoogleAdsService")
query = f"""
SELECT
billing_setup.id,
billing_setup.status
FROM billing_setup
WHERE billing_setup.resource_name =
'customers/{customer_id}/billingSetups/{billing_setup_id}'
"""
try:
response = ga_service.search(customer_id=customer_id, query=query)
for row in response:
billing_setup = row.billing_setup
status = billing_setup.status
status_name =
client.enums.BillingSetupStatusEnum.BillingSetupStatus(status).name
print(f"Billing setup ID: {billing_setup.id}, Status:
{status_name}")
return status_name
except GoogleAdsException as ex:
print(f'Request with ID "{ex.request_id}" failed with status
"{ex.error.code().name}" and includes the following errors:')
for error in ex.failure.errors:
print(f'\tError with message "{error.message}".')
if error.location:
for field_path_element in
error.location.field_path_elements:
print(f'\t\tOn field: {field_path_element.field_name}')
return None
if __name__ == "__main__":
google_ads_client =
GoogleAdsClient.load_from_storage('path_to_google_ads.yaml', version='v14')
customer_id = 'your_customer_id' # Replace with your customer ID
billing_setup_id = 'your_billing_setup_id' # Replace with your billing
setup ID
billing_setup_status = get_billing_setup_status(google_ads_client,
customer_id, billing_setup_id)
if billing_setup_status == "ACTIVE":
print(f"Billing setup {billing_setup_id} is active.")
else:
print(f"Billing setup {billing_setup_id} is not active or not
found.")
*Creating Account Budget Proposal:*
- Attempted to create the AccountBudgetProposal using the following code:
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
def create_account_budget_proposal(client, customer_id, billing_setup_id):
account_budget_proposal_service =
client.get_service("AccountBudgetProposalService")
account_budget_proposal_operation =
client.get_type("AccountBudgetProposalOperation")
proposal = account_budget_proposal_operation.create
proposal.proposal_type =
client.enums.AccountBudgetProposalTypeEnum.CREATE
proposal.billing_setup =
f'customers/{customer_id}/billingSetups/{billing_setup_id}'
proposal.proposed_name = "Account Budget Proposal (example)"
proposal.proposed_start_time_type = client.enums.TimeTypeEnum.NOW
proposal.proposed_end_time_type = client.enums.TimeTypeEnum.FOREVER
proposal.proposed_spending_limit_micros = 100000000 # Example amount:
$100,000.00
try:
account_budget_proposal_response =
account_budget_proposal_service.mutate_account_budget_proposals(
customer_id=customer_id,
operations=[account_budget_proposal_operation],
)
print(f"Created account budget proposal
'{account_budget_proposal_response.results[0].resource_name}'.")
except GoogleAdsException as ex:
print(f'Request with ID "{ex.request_id}" failed with status
"{ex.error.code().name}" and includes the following errors:')
for error in ex.failure.errors:
print(f'\tError with message "{error.message}".')
if error.location:
for field_path_element in
error.location.field_path_elements:
print(f'\t\tOn field: {field_path_element.field_name}')
sys.exit(1)
if __name__ == "__main__":
google_ads_client =
GoogleAdsClient.load_from_storage('path_to_google_ads.yaml', version='v14')
customer_id = 'your_customer_id' # Replace with your customer ID
billing_setup_id = 'your_billing_setup_id' # Replace with your billing
setup ID
billing_setup_status = get_billing_setup_status(google_ads_client,
customer_id, billing_setup_id)
if billing_setup_status == "ACTIVE":
create_account_budget_proposal(google_ads_client, customer_id,
billing_setup_id)
else:
print("The billing setup ID is not active or not found. Please
check the billing setup ID and try again.")
*Questions:*
1. Are there any specific permissions required beyond "Standard" to make
changes to budgets?
2. Is there any additional configuration needed for billing_setup_id to
be accepted?
3. Could there be any other reason why I am encountering this error
despite having the correct permissions and an active billing setup?
Any help or insights would be greatly appreciated. Thank you!
--
--
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
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 on the web visit
https://groups.google.com/d/msgid/adwords-api/0fa8ef42-05d6-47ba-a438-8098118b14b6n%40googlegroups.com.