diff --git a/ChangeLog b/ChangeLog index 61604c05d..f3badc11e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,5 @@ * 31.3.0 -- Add logging functionality to examples. -- Update pyproject.toml license configuration. +- Google Ads API v25_1 release. * 31.2.0 - Google Ads API v25_0 release. diff --git a/examples/account_management/create_customer.py b/examples/account_management/create_customer.py index 2eadae4e6..cfe48811c 100755 --- a/examples/account_management/create_customer.py +++ b/examples/account_management/create_customer.py @@ -21,9 +21,8 @@ """ import argparse -from datetime import datetime -import logging import sys +from datetime import datetime from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -35,9 +34,6 @@ CreateCustomerClientResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START create_customer] def main(client: GoogleAdsClient, manager_customer_id: str) -> None: diff --git a/examples/account_management/get_account_hierarchy.py b/examples/account_management/get_account_hierarchy.py index 4a5db2fc5..ef81d3c60 100755 --- a/examples/account_management/get_account_hierarchy.py +++ b/examples/account_management/get_account_hierarchy.py @@ -23,7 +23,6 @@ """ import argparse -import logging import sys from typing import Optional, List, Dict @@ -43,10 +42,6 @@ GoogleAdsRow, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # ListAccessibleCustomersResponse is not directly used for a variable type, # but its attribute .resource_names is used, which is List[str]. diff --git a/examples/account_management/get_change_details.py b/examples/account_management/get_change_details.py index 382202434..7ec79ff73 100755 --- a/examples/account_management/get_change_details.py +++ b/examples/account_management/get_change_details.py @@ -20,7 +20,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from typing import Any @@ -39,9 +38,6 @@ ) from google.ads.googleads.v24.resources.types.change_event import ChangeEvent -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START get_change_details] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/account_management/get_change_summary.py b/examples/account_management/get_change_summary.py index d245ae4a4..44d549c60 100755 --- a/examples/account_management/get_change_summary.py +++ b/examples/account_management/get_change_summary.py @@ -17,7 +17,6 @@ """This example gets a list of which resources have been changed in an account.""" import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -32,9 +31,6 @@ ) from google.ads.googleads.v24.resources.types.change_status import ChangeStatus -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START get_change_summary] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/account_management/invite_user_with_access_role.py b/examples/account_management/invite_user_with_access_role.py index 2d1294810..0eae10769 100755 --- a/examples/account_management/invite_user_with_access_role.py +++ b/examples/account_management/invite_user_with_access_role.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -34,10 +33,6 @@ CustomerUserAccessInvitation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # AccessRoleEnum is part of google.ads.googleads.v24.enums.types.access_role # but it's accessed via client.enums.AccessRoleEnum, so direct import for type hint might not be strictly needed for the parameter. # The field invitation.access_role expects an int (the enum value). diff --git a/examples/account_management/link_manager_to_client.py b/examples/account_management/link_manager_to_client.py index ea479dfd0..5db5bbbf8 100755 --- a/examples/account_management/link_manager_to_client.py +++ b/examples/account_management/link_manager_to_client.py @@ -15,7 +15,6 @@ """This example shows how to link a manager customer to a client customer.""" import argparse -import logging import sys from google.api_core import protobuf_helpers @@ -51,10 +50,6 @@ CustomerManagerLink, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # ManagerLinkStatusEnum is used via client.enums diff --git a/examples/account_management/list_accessible_customers.py b/examples/account_management/list_accessible_customers.py index b8d47bff4..2d156ff2c 100755 --- a/examples/account_management/list_accessible_customers.py +++ b/examples/account_management/list_accessible_customers.py @@ -20,7 +20,6 @@ documentation: https://developers.google.com/google-ads/api/docs/concepts/call-structure#cid """ -import logging import sys from typing import List @@ -33,9 +32,6 @@ ListAccessibleCustomersResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START list_accessible_customers] def main(client: GoogleAdsClient) -> None: diff --git a/examples/account_management/update_user_access.py b/examples/account_management/update_user_access.py index c6bcad2a5..75e931943 100755 --- a/examples/account_management/update_user_access.py +++ b/examples/account_management/update_user_access.py @@ -22,13 +22,32 @@ """ import argparse -import logging import sys -from typing import Optional -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) +from google.ads.googleads.client import GoogleAdsClient +from google.ads.googleads.errors import GoogleAdsException +from google.ads.googleads.v24.services.services.google_ads_service.client import ( + GoogleAdsServiceClient, +) +from google.ads.googleads.v24.services.types.google_ads_service import ( + SearchGoogleAdsRequest, + SearchPagedResponse, +) +from google.ads.googleads.v24.resources.types.customer_user_access import ( + CustomerUserAccess, +) +from google.ads.googleads.v24.services.services.customer_user_access_service.client import ( + CustomerUserAccessServiceClient, +) +from google.ads.googleads.v24.services.types.customer_user_access_service import ( + CustomerUserAccessOperation, + MutateCustomerUserAccessResponse, +) + +from google.api_core import protobuf_helpers +from google.protobuf.field_mask_pb2 import FieldMask +from typing import Optional _ACCESS_ROLES = ["ADMIN", "STANDARD", "READ_ONLY", "EMAIL_ONLY"] diff --git a/examples/account_management/verify_advertiser_identity.py b/examples/account_management/verify_advertiser_identity.py index c04c05507..fb0995160 100755 --- a/examples/account_management/verify_advertiser_identity.py +++ b/examples/account_management/verify_advertiser_identity.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import Optional @@ -36,9 +35,6 @@ IdentityVerificationProgress, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/advanced_operations/add_ad_customizer.py b/examples/advanced_operations/add_ad_customizer.py index 6a6b91983..0b072ba7a 100755 --- a/examples/advanced_operations/add_ad_customizer.py +++ b/examples/advanced_operations/add_ad_customizer.py @@ -19,7 +19,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -52,9 +51,6 @@ MutateCustomizerAttributesResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/advanced_operations/add_ad_group_bid_modifier.py b/examples/advanced_operations/add_ad_group_bid_modifier.py index 0bdd7c619..9623bada9 100755 --- a/examples/advanced_operations/add_ad_group_bid_modifier.py +++ b/examples/advanced_operations/add_ad_group_bid_modifier.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -38,9 +37,6 @@ MutateAdGroupBidModifiersResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_ad_group_bid_modifier] def main( diff --git a/examples/advanced_operations/add_app_campaign.py b/examples/advanced_operations/add_app_campaign.py index 82495f9cb..5e3c00f00 100755 --- a/examples/advanced_operations/add_app_campaign.py +++ b/examples/advanced_operations/add_app_campaign.py @@ -23,7 +23,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from typing import List from uuid import uuid4 @@ -61,9 +60,6 @@ ) from google.ads.googleads.v24.services.types import * -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """Main function for running this example.""" diff --git a/examples/advanced_operations/add_bidding_data_exclusion.py b/examples/advanced_operations/add_bidding_data_exclusion.py index 43b285b72..7acd66210 100755 --- a/examples/advanced_operations/add_bidding_data_exclusion.py +++ b/examples/advanced_operations/add_bidding_data_exclusion.py @@ -22,7 +22,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -39,9 +38,6 @@ MutateBiddingDataExclusionsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/advanced_operations/add_bidding_seasonality_adjustment.py b/examples/advanced_operations/add_bidding_seasonality_adjustment.py index 776d45ba1..15f82fadb 100755 --- a/examples/advanced_operations/add_bidding_seasonality_adjustment.py +++ b/examples/advanced_operations/add_bidding_seasonality_adjustment.py @@ -22,7 +22,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -39,9 +38,6 @@ MutateBiddingSeasonalityAdjustmentsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/advanced_operations/add_demand_gen_campaign.py b/examples/advanced_operations/add_demand_gen_campaign.py index 937b10e89..3ea5e9049 100644 --- a/examples/advanced_operations/add_demand_gen_campaign.py +++ b/examples/advanced_operations/add_demand_gen_campaign.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List from uuid import uuid4 @@ -52,10 +51,6 @@ MutateOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Temporary IDs for resources. BUDGET_TEMPORARY_ID: int = -1 CAMPAIGN_TEMPORARY_ID: int = -2 diff --git a/examples/advanced_operations/add_display_upload_ad.py b/examples/advanced_operations/add_display_upload_ad.py index 54aeb20b2..2c1f0ded6 100644 --- a/examples/advanced_operations/add_display_upload_ad.py +++ b/examples/advanced_operations/add_display_upload_ad.py @@ -18,10 +18,10 @@ """ import argparse -import logging -import requests import sys +import requests + from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException from google.ads.googleads.v24.resources.types.ad import Ad @@ -42,10 +42,6 @@ MutateAssetsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - BUNDLE_URL: str = "https://gaagl.page.link/ib87" diff --git a/examples/advanced_operations/add_dynamic_page_feed_asset.py b/examples/advanced_operations/add_dynamic_page_feed_asset.py index aedfb5ef7..53ed8798f 100755 --- a/examples/advanced_operations/add_dynamic_page_feed_asset.py +++ b/examples/advanced_operations/add_dynamic_page_feed_asset.py @@ -15,7 +15,6 @@ """Adds a page feed with URLs for a Dynamic Search Ads campaign.""" import argparse -import logging import sys from typing import List, Optional @@ -76,10 +75,6 @@ MutateCampaignAssetSetsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # The label for the DSA page URLs. DSA_PAGE_URL_LABEL = "discounts" diff --git a/examples/advanced_operations/add_dynamic_search_ads.py b/examples/advanced_operations/add_dynamic_search_ads.py index 167edd440..9a4879b80 100755 --- a/examples/advanced_operations/add_dynamic_search_ads.py +++ b/examples/advanced_operations/add_dynamic_search_ads.py @@ -19,7 +19,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from uuid import uuid4 @@ -71,9 +70,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/advanced_operations/add_performance_max_campaign.py b/examples/advanced_operations/add_performance_max_campaign.py index 5ef18e155..3b8dd5fd7 100644 --- a/examples/advanced_operations/add_performance_max_campaign.py +++ b/examples/advanced_operations/add_performance_max_campaign.py @@ -29,7 +29,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from typing import List, Optional, Iterable from uuid import uuid4 @@ -83,10 +82,6 @@ MutateOperationResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # We specify temporary IDs that are specific to a single mutate request. # Temporary IDs are always negative and unique within one mutate request. # diff --git a/examples/advanced_operations/add_responsive_search_ad_full.py b/examples/advanced_operations/add_responsive_search_ad_full.py index 111bf6456..b670a49ab 100644 --- a/examples/advanced_operations/add_responsive_search_ad_full.py +++ b/examples/advanced_operations/add_responsive_search_ad_full.py @@ -23,10 +23,9 @@ """ import argparse -import logging import sys -from typing import List, Optional import uuid +from typing import List, Optional from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -116,10 +115,6 @@ MutateCustomizerAttributesResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Keywords from user. KEYWORD_TEXT_EXACT = "example of exact match" KEYWORD_TEXT_PHRASE = "example of phrase match" diff --git a/examples/advanced_operations/add_smart_campaign.py b/examples/advanced_operations/add_smart_campaign.py index 51527ee32..605238b2d 100755 --- a/examples/advanced_operations/add_smart_campaign.py +++ b/examples/advanced_operations/add_smart_campaign.py @@ -19,7 +19,6 @@ """ import argparse -import logging import sys from typing import List, Optional from uuid import uuid4 @@ -103,10 +102,6 @@ ) from google.api_core import protobuf_helpers -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Geo target constant for New York City. _GEO_TARGET_CONSTANT = "1023191" # Country code is a two-letter ISO-3166 code, for a list of all codes see: diff --git a/examples/advanced_operations/create_and_attach_shared_keyword_set.py b/examples/advanced_operations/create_and_attach_shared_keyword_set.py index f29c3cb4f..4306c345e 100755 --- a/examples/advanced_operations/create_and_attach_shared_keyword_set.py +++ b/examples/advanced_operations/create_and_attach_shared_keyword_set.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List import uuid @@ -59,9 +58,6 @@ SharedSetOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: campaign_service: CampaignServiceClient = client.get_service( diff --git a/examples/advanced_operations/find_and_remove_criteria_from_shared_set.py b/examples/advanced_operations/find_and_remove_criteria_from_shared_set.py index 6e6ee5746..76560fbd5 100755 --- a/examples/advanced_operations/find_and_remove_criteria_from_shared_set.py +++ b/examples/advanced_operations/find_and_remove_criteria_from_shared_set.py @@ -15,7 +15,6 @@ """Demonstrates how to find and remove shared sets, and shared set criteria.""" import argparse -import logging import sys from typing import List @@ -47,9 +46,6 @@ SharedCriterionOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") diff --git a/examples/advanced_operations/get_ad_group_bid_modifiers.py b/examples/advanced_operations/get_ad_group_bid_modifiers.py index f2ad85946..942b6bcb0 100755 --- a/examples/advanced_operations/get_ad_group_bid_modifiers.py +++ b/examples/advanced_operations/get_ad_group_bid_modifiers.py @@ -15,7 +15,6 @@ """This example illustrates how to retrieve ad group bid modifiers.""" import argparse -import logging import sys from typing import Optional @@ -33,9 +32,6 @@ SearchGoogleAdsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, ad_group_id: Optional[str] = None diff --git a/examples/advanced_operations/upload_video.py b/examples/advanced_operations/upload_video.py index 0ae8fa368..86dbf017c 100644 --- a/examples/advanced_operations/upload_video.py +++ b/examples/advanced_operations/upload_video.py @@ -16,9 +16,9 @@ import argparse import itertools -import logging import os import sys +import logging from typing import Iterator, Iterable, List, MutableSequence import google.auth @@ -51,9 +51,6 @@ from google.protobuf import field_mask_pb2 from google.ads.googleads.v24.resources.types import youtube_video_upload -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, video_file_path: str diff --git a/examples/advanced_operations/use_cross_account_bidding_strategy.py b/examples/advanced_operations/use_cross_account_bidding_strategy.py index d31ad4685..82508226b 100755 --- a/examples/advanced_operations/use_cross_account_bidding_strategy.py +++ b/examples/advanced_operations/use_cross_account_bidding_strategy.py @@ -19,7 +19,6 @@ """ import argparse -import logging import sys from typing import Iterator from uuid import uuid4 @@ -58,9 +57,6 @@ SearchGoogleAdsStreamResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/advanced_operations/use_portfolio_bidding_strategy.py b/examples/advanced_operations/use_portfolio_bidding_strategy.py index d8b245ff3..9132737cf 100755 --- a/examples/advanced_operations/use_portfolio_bidding_strategy.py +++ b/examples/advanced_operations/use_portfolio_bidding_strategy.py @@ -15,7 +15,6 @@ """This example constructs a campaign with a Portfolio Bidding Strategy.""" import argparse -import logging import sys import uuid @@ -51,9 +50,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: campaign_budget_service: CampaignBudgetServiceClient = client.get_service( diff --git a/examples/assets/add_call.py b/examples/assets/add_call.py index 826acc04e..3bd3245be 100755 --- a/examples/assets/add_call.py +++ b/examples/assets/add_call.py @@ -15,9 +15,8 @@ """This example adds a call asset to a specific account.""" import argparse -import logging -import sys from typing import Optional +import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -31,10 +30,6 @@ CustomerAsset, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Country code is a two-letter ISO-3166 code, for a list of all codes see: # https://developers.google.com/google-ads/api/reference/data/codes-formats#expandable-17 _DEFAULT_PHONE_COUNTRY: str = "US" diff --git a/examples/assets/add_hotel_callout.py b/examples/assets/add_hotel_callout.py index bdf214001..d4c08e26e 100755 --- a/examples/assets/add_hotel_callout.py +++ b/examples/assets/add_hotel_callout.py @@ -15,9 +15,8 @@ """This example adds a hotel callout extension asset to a specific account.""" import argparse -import logging -import sys from typing import List +import sys from google.ads.googleads.client import GoogleAdsClient @@ -31,9 +30,6 @@ CustomerAsset, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, language_code: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/assets/add_lead_form_asset.py b/examples/assets/add_lead_form_asset.py index 23fa0a945..84e20ef9a 100755 --- a/examples/assets/add_lead_form_asset.py +++ b/examples/assets/add_lead_form_asset.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -38,9 +37,6 @@ CampaignAsset, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: """Creates a lead form and lead form extension for the given campaign. diff --git a/examples/assets/add_prices.py b/examples/assets/add_prices.py index 366b038be..4b98563b1 100644 --- a/examples/assets/add_prices.py +++ b/examples/assets/add_prices.py @@ -15,9 +15,8 @@ """This example adds a price asset and associates it with an account.""" import argparse -import logging -import sys from typing import Optional +import sys from uuid import uuid4 from google.ads.googleads.client import GoogleAdsClient @@ -36,9 +35,6 @@ CustomerAsset, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/assets/add_sitelinks.py b/examples/assets/add_sitelinks.py index 17215f4a2..06abbee6e 100755 --- a/examples/assets/add_sitelinks.py +++ b/examples/assets/add_sitelinks.py @@ -18,9 +18,8 @@ """ import argparse -import logging -import sys from typing import List +import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -33,9 +32,6 @@ CampaignAsset, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: """Adds sitelinks to a campaign using assets. diff --git a/examples/assets/upload_image_asset.py b/examples/assets/upload_image_asset.py index a9ccce4db..fae530d0e 100644 --- a/examples/assets/upload_image_asset.py +++ b/examples/assets/upload_image_asset.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from examples.utils.example_helpers import get_image_bytes_from_url @@ -27,9 +26,6 @@ from google.ads.googleads.v24.services.types.asset_service import AssetOperation from google.ads.googleads.v24.resources.types.asset import Asset -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START upload_image_asset] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/asyncio/async_add_campaigns.py b/examples/asyncio/async_add_campaigns.py index e4af38044..7bfbdd5cf 100644 --- a/examples/asyncio/async_add_campaigns.py +++ b/examples/asyncio/async_add_campaigns.py @@ -15,8 +15,8 @@ """This example illustrates how to add a campaign using asyncio.""" import argparse +import asyncio import datetime -import logging import sys from typing import List import uuid @@ -38,10 +38,6 @@ MutateOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - _START_DATE_FORMAT: str = "%Y%m%d 00:00:00" _END_DATE_FORMAT: str = "%Y%m%d 23:59:59" diff --git a/examples/asyncio/async_search.py b/examples/asyncio/async_search.py index 9cabeabe7..ce12f7242 100755 --- a/examples/asyncio/async_search.py +++ b/examples/asyncio/async_search.py @@ -15,7 +15,7 @@ """This example illustrates how to get all campaigns using asyncio.""" import argparse -import logging +import asyncio import sys from typing import List @@ -28,9 +28,6 @@ GoogleAdsRow, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - async def main(client: GoogleAdsClient, customer_id: str) -> None: ga_service: GoogleAdsServiceAsyncClient = client.get_service( diff --git a/examples/asyncio/async_search_stream.py b/examples/asyncio/async_search_stream.py index 6bd3689c0..f47feea7a 100755 --- a/examples/asyncio/async_search_stream.py +++ b/examples/asyncio/async_search_stream.py @@ -15,7 +15,7 @@ """This example illustrates how to get all campaigns using asyncio.""" import argparse -import logging +import asyncio import sys from typing import List @@ -28,9 +28,6 @@ GoogleAdsRow, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - async def main(client: GoogleAdsClient, customer_id: str) -> None: ga_service: GoogleAdsServiceAsyncClient = client.get_service( diff --git a/examples/audience_insights/generate_audience_insights.py b/examples/audience_insights/generate_audience_insights.py index 4a37df97e..af4cb6f75 100644 --- a/examples/audience_insights/generate_audience_insights.py +++ b/examples/audience_insights/generate_audience_insights.py @@ -15,7 +15,6 @@ """This example illustrates how to generate audience insights.""" import argparse -import logging import sys from typing import Any @@ -44,9 +43,6 @@ LocationInfo, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, custom_name: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/basic_operations/add_ad_groups.py b/examples/basic_operations/add_ad_groups.py index 7e7ca1ada..b37ca9f67 100755 --- a/examples/basic_operations/add_ad_groups.py +++ b/examples/basic_operations/add_ad_groups.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List import uuid @@ -37,9 +36,6 @@ ) from google.ads.googleads.v24.resources.types.ad_group import AdGroup -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: ad_group_service: AdGroupServiceClient = client.get_service( diff --git a/examples/basic_operations/add_campaigns.py b/examples/basic_operations/add_campaigns.py index 40967e570..1b2f9f4b3 100755 --- a/examples/basic_operations/add_campaigns.py +++ b/examples/basic_operations/add_campaigns.py @@ -19,7 +19,6 @@ import argparse import datetime -import logging import sys from typing import List import uuid @@ -45,10 +44,6 @@ ) from google.ads.googleads.v24.resources.types.campaign import Campaign -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - _START_DATE_FORMAT: str = "%Y%m%d 00:00:00" _END_DATE_FORMAT: str = "%Y%m%d 23:59:59" diff --git a/examples/basic_operations/get_campaigns.py b/examples/basic_operations/get_campaigns.py index fcdce24a4..1174f0565 100755 --- a/examples/basic_operations/get_campaigns.py +++ b/examples/basic_operations/get_campaigns.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import Iterator, List @@ -32,9 +31,6 @@ GoogleAdsRow, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START get_campaigns] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/basic_operations/get_responsive_search_ads.py b/examples/basic_operations/get_responsive_search_ads.py index 69854b1e8..438285517 100755 --- a/examples/basic_operations/get_responsive_search_ads.py +++ b/examples/basic_operations/get_responsive_search_ads.py @@ -19,7 +19,6 @@ """ import argparse -import logging import sys from typing import List, Optional, Sequence @@ -35,9 +34,6 @@ SearchGoogleAdsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/basic_operations/pause_ad.py b/examples/basic_operations/pause_ad.py index 42b87f83a..b504bb4e2 100755 --- a/examples/basic_operations/pause_ad.py +++ b/examples/basic_operations/pause_ad.py @@ -15,7 +15,6 @@ """This example pauses an ad.""" import argparse -import logging import sys from typing import List @@ -32,9 +31,6 @@ MutateAdGroupAdsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/basic_operations/remove_campaign.py b/examples/basic_operations/remove_campaign.py index fa0789904..13bfeebf5 100755 --- a/examples/basic_operations/remove_campaign.py +++ b/examples/basic_operations/remove_campaign.py @@ -15,7 +15,6 @@ """This example removes an existing campaign.""" import argparse -import logging import sys from typing import List @@ -29,9 +28,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: campaign_service: CampaignServiceClient = client.get_service( diff --git a/examples/basic_operations/search_for_google_ads_fields.py b/examples/basic_operations/search_for_google_ads_fields.py index 84dd209ee..747a28359 100755 --- a/examples/basic_operations/search_for_google_ads_fields.py +++ b/examples/basic_operations/search_for_google_ads_fields.py @@ -21,7 +21,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -37,9 +36,6 @@ SearchGoogleAdsFieldsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, name_prefix: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/basic_operations/update_ad_group.py b/examples/basic_operations/update_ad_group.py index 49ecc56ae..9adf016d4 100755 --- a/examples/basic_operations/update_ad_group.py +++ b/examples/basic_operations/update_ad_group.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List @@ -38,9 +37,6 @@ MutateAdGroupsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START update_ad_group] def main( diff --git a/examples/basic_operations/update_campaign.py b/examples/basic_operations/update_campaign.py index 537365668..29a50fc32 100755 --- a/examples/basic_operations/update_campaign.py +++ b/examples/basic_operations/update_campaign.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List @@ -35,9 +34,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: campaign_service: CampaignServiceClient = client.get_service( diff --git a/examples/basic_operations/update_responsive_search_ad.py b/examples/basic_operations/update_responsive_search_ad.py index 40d1eadd8..f3fb9fb96 100755 --- a/examples/basic_operations/update_responsive_search_ad.py +++ b/examples/basic_operations/update_responsive_search_ad.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List from uuid import uuid4 @@ -37,9 +36,6 @@ MutateAdsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START update_responsive_search_ad] def main(client: GoogleAdsClient, customer_id: str, ad_id: str) -> None: diff --git a/examples/billing/add_account_budget_proposal.py b/examples/billing/add_account_budget_proposal.py index 0cf29afa8..b9218ebbd 100755 --- a/examples/billing/add_account_budget_proposal.py +++ b/examples/billing/add_account_budget_proposal.py @@ -18,16 +18,12 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_account_budget_proposal] def main(client: GoogleAdsClient, customer_id: str, billing_setup_id: str): diff --git a/examples/billing/add_billing_setup.py b/examples/billing/add_billing_setup.py index 05894c178..042aeb9cf 100755 --- a/examples/billing/add_billing_setup.py +++ b/examples/billing/add_billing_setup.py @@ -25,7 +25,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from typing import Any, Optional from uuid import uuid4 @@ -33,9 +32,6 @@ from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/billing/get_invoices.py b/examples/billing/get_invoices.py index 74e37d35f..3e8f0c7c0 100755 --- a/examples/billing/get_invoices.py +++ b/examples/billing/get_invoices.py @@ -16,16 +16,12 @@ import argparse from datetime import date, timedelta -import logging import sys from typing import Optional from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, billing_setup_id: str): """The main method that creates all necessary entities for the example. diff --git a/examples/campaign_management/add_campaign_labels.py b/examples/campaign_management/add_campaign_labels.py index 26fd8827b..38f7f55cd 100755 --- a/examples/campaign_management/add_campaign_labels.py +++ b/examples/campaign_management/add_campaign_labels.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List, Any @@ -40,9 +39,6 @@ CampaignLabel, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_campaign_labels] def main( diff --git a/examples/campaign_management/add_complete_campaigns_using_batch_job.py b/examples/campaign_management/add_complete_campaigns_using_batch_job.py index d428f6970..6cd015d1f 100755 --- a/examples/campaign_management/add_complete_campaigns_using_batch_job.py +++ b/examples/campaign_management/add_complete_campaigns_using_batch_job.py @@ -18,10 +18,10 @@ """ import argparse -import logging +import asyncio import sys -from typing import Any, List, Coroutine from uuid import uuid4 +from typing import Any, List, Coroutine from google.api_core.operation import Operation @@ -62,10 +62,6 @@ BatchJobOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - NUMBER_OF_CAMPAIGNS_TO_ADD: int = 2 NUMBER_OF_AD_GROUPS_TO_ADD: int = 2 NUMBER_OF_KEYWORDS_TO_ADD: int = 4 diff --git a/examples/campaign_management/get_all_disapproved_ads.py b/examples/campaign_management/get_all_disapproved_ads.py index 69b53f512..f776d7c1f 100755 --- a/examples/campaign_management/get_all_disapproved_ads.py +++ b/examples/campaign_management/get_all_disapproved_ads.py @@ -15,7 +15,6 @@ """This illustrates how to retrieve disapproved ads in a given campaign.""" import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -33,9 +32,6 @@ PolicyApprovalStatusEnum, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") diff --git a/examples/campaign_management/set_ad_parameters.py b/examples/campaign_management/set_ad_parameters.py index 1976751f0..5dcc39a65 100755 --- a/examples/campaign_management/set_ad_parameters.py +++ b/examples/campaign_management/set_ad_parameters.py @@ -15,7 +15,6 @@ """This example sets ad parameters for an ad group criterion.""" import argparse -import logging import sys from typing import List @@ -33,9 +32,6 @@ ) from google.ads.googleads.v24.resources.types.ad_parameter import AdParameter -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/campaign_management/update_campaign_criterion_bid_modifier.py b/examples/campaign_management/update_campaign_criterion_bid_modifier.py index f22937f88..37af08c67 100755 --- a/examples/campaign_management/update_campaign_criterion_bid_modifier.py +++ b/examples/campaign_management/update_campaign_criterion_bid_modifier.py @@ -15,7 +15,6 @@ """Updates a campaign criterion with a new bid modifier.""" import argparse -import logging import sys from google.api_core import protobuf_helpers @@ -33,9 +32,6 @@ CampaignCriterion, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/campaign_management/validate_ad.py b/examples/campaign_management/validate_ad.py index 0ab61d681..76061f61a 100755 --- a/examples/campaign_management/validate_ad.py +++ b/examples/campaign_management/validate_ad.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys from typing import List @@ -43,9 +42,6 @@ ) from google.ads.googleads.v24.common.types.policy import PolicyTopicEntry -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: ad_group_ad_operation: AdGroupAdOperation = client.get_type( diff --git a/examples/custom_logging_interceptor/cloud_logging_interceptor.py b/examples/custom_logging_interceptor/cloud_logging_interceptor.py index b9531ea76..f808276d6 100644 --- a/examples/custom_logging_interceptor/cloud_logging_interceptor.py +++ b/examples/custom_logging_interceptor/cloud_logging_interceptor.py @@ -19,8 +19,6 @@ within the class (in this case, a Cloud Logging client). """ -import logging -import sys import time from typing import Any, Callable, Dict, Optional @@ -29,9 +27,6 @@ from google.ads.googleads.interceptors import LoggingInterceptor -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - class CloudLoggingInterceptor(LoggingInterceptor): """An interceptor that logs rpc request and response details to Google Cloud Logging. diff --git a/examples/custom_logging_interceptor/get_campaigns.py b/examples/custom_logging_interceptor/get_campaigns.py index 1eddb79b2..704fd49d3 100755 --- a/examples/custom_logging_interceptor/get_campaigns.py +++ b/examples/custom_logging_interceptor/get_campaigns.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import Any, Iterable @@ -36,9 +35,6 @@ from cloud_logging_interceptor import CloudLoggingInterceptor -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: # Instantiate the GoogleAdsService object with a custom interceptor. diff --git a/examples/error_handling/handle_keyword_policy_violations.py b/examples/error_handling/handle_keyword_policy_violations.py index ef4a99c16..16c0658e8 100755 --- a/examples/error_handling/handle_keyword_policy_violations.py +++ b/examples/error_handling/handle_keyword_policy_violations.py @@ -26,7 +26,6 @@ """ import argparse -import logging import sys from typing import Any, List, Optional, Tuple @@ -40,9 +39,6 @@ ) from google.ads.googleads.v24.common.types.policy import PolicyViolationKey -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/error_handling/handle_partial_failure.py b/examples/error_handling/handle_partial_failure.py index 61d568142..02c7b540d 100755 --- a/examples/error_handling/handle_partial_failure.py +++ b/examples/error_handling/handle_partial_failure.py @@ -15,10 +15,9 @@ """This shows how to handle responses that may include partial_failure errors.""" import argparse -import logging import sys -from typing import Any, List import uuid +from typing import Any, List from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -34,9 +33,6 @@ MutateAdGroupsRequest, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: """Runs the example code, which demonstrates how to handle partial failures. diff --git a/examples/error_handling/handle_rate_exceeded_error.py b/examples/error_handling/handle_rate_exceeded_error.py index 8af4c298c..b7dfebde8 100755 --- a/examples/error_handling/handle_rate_exceeded_error.py +++ b/examples/error_handling/handle_rate_exceeded_error.py @@ -23,8 +23,6 @@ """ import argparse -import logging -import sys from time import sleep from typing import List, Any @@ -43,10 +41,6 @@ MutateAdGroupCriteriaResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Number of requests to be run. NUM_REQUESTS: int = 5 # Number of keywords to be validated in each API call. diff --git a/examples/error_handling/handle_responsive_search_ad_policy_violations.py b/examples/error_handling/handle_responsive_search_ad_policy_violations.py index 714c15c84..e9c2bd83f 100755 --- a/examples/error_handling/handle_responsive_search_ad_policy_violations.py +++ b/examples/error_handling/handle_responsive_search_ad_policy_violations.py @@ -19,10 +19,9 @@ """ import argparse -import logging import sys -from typing import List import uuid +from typing import List from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -47,9 +46,6 @@ PolicyFindingErrorEnum, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: """Handles responsive search ad policy violations. diff --git a/examples/experiments/create_asset_optimization_experiment.py b/examples/experiments/create_asset_optimization_experiment.py index 0a297312e..fc37d96a5 100644 --- a/examples/experiments/create_asset_optimization_experiment.py +++ b/examples/experiments/create_asset_optimization_experiment.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import List, Tuple, Any from uuid import uuid4 @@ -30,9 +29,6 @@ MutateOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, asset_group_id: str diff --git a/examples/experiments/create_search_adopt_ai_max_experiment.py b/examples/experiments/create_search_adopt_ai_max_experiment.py index 9e8fcccc4..24963d4e9 100644 --- a/examples/experiments/create_search_adopt_ai_max_experiment.py +++ b/examples/experiments/create_search_adopt_ai_max_experiment.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -27,9 +26,6 @@ from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: """Creates an ADOPT_AI_MAX intra-campaign experiment for a Search campaign. diff --git a/examples/experiments/create_search_custom_experiment.py b/examples/experiments/create_search_custom_experiment.py index 7ee9eeeef..a869ea57a 100644 --- a/examples/experiments/create_search_custom_experiment.py +++ b/examples/experiments/create_search_custom_experiment.py @@ -25,10 +25,9 @@ """ import argparse -import logging import sys -from typing import List, Any import uuid +from typing import List, Any from google.api_core import protobuf_helpers @@ -61,9 +60,6 @@ ) from google.ads.googleads.v24.resources.types.campaign import Campaign -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, base_campaign_id: str diff --git a/examples/experiments/evaluate_and_update_experiment.py b/examples/experiments/evaluate_and_update_experiment.py index 3fe4eeeb8..ca0e43952 100644 --- a/examples/experiments/evaluate_and_update_experiment.py +++ b/examples/experiments/evaluate_and_update_experiment.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys import uuid @@ -44,10 +43,6 @@ CampaignBudgetMapping, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Constants for decision making # Choose a confidence level based on your specific needs. # - The p-value (probability value) is the probability that the observed performance diff --git a/examples/google-ads-account-analyzer-demo/analyzer.py b/examples/google-ads-account-analyzer-demo/analyzer.py index 0db04c94b..432f92c6d 100644 --- a/examples/google-ads-account-analyzer-demo/analyzer.py +++ b/examples/google-ads-account-analyzer-demo/analyzer.py @@ -16,17 +16,12 @@ import argparse -import logging import sys from typing import Optional, Dict, List, Any from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - _DEFAULT_LOG_SPACE_LENGTH = 4 diff --git a/examples/incentives/apply_incentive.py b/examples/incentives/apply_incentive.py index abbea78a8..f57534097 100644 --- a/examples/incentives/apply_incentive.py +++ b/examples/incentives/apply_incentive.py @@ -21,7 +21,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -34,9 +33,6 @@ IncentiveServiceClient, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/incentives/fetch_incentives.py b/examples/incentives/fetch_incentives.py index f41b93d07..3fc40b7ba 100644 --- a/examples/incentives/fetch_incentives.py +++ b/examples/incentives/fetch_incentives.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -31,9 +30,6 @@ IncentiveServiceClient, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/misc/add_ad_group_image_asset.py b/examples/misc/add_ad_group_image_asset.py index 2da1cea11..745cdea46 100644 --- a/examples/misc/add_ad_group_image_asset.py +++ b/examples/misc/add_ad_group_image_asset.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -33,9 +32,6 @@ MutateAdGroupAssetsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/misc/campaign_report_to_csv.py b/examples/misc/campaign_report_to_csv.py index d7cd6ad4f..33f482efa 100755 --- a/examples/misc/campaign_report_to_csv.py +++ b/examples/misc/campaign_report_to_csv.py @@ -29,7 +29,7 @@ import argparse import csv -import logging +from collections.abc import Iterator import os import sys @@ -44,10 +44,6 @@ SearchGoogleAdsStreamResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - _DEFAULT_FILE_NAME = "campaign_report_to_csv_results.csv" _QUERY: str = """ SELECT diff --git a/examples/misc/set_custom_client_timeouts.py b/examples/misc/set_custom_client_timeouts.py index 0385d8938..73d3f5f04 100755 --- a/examples/misc/set_custom_client_timeouts.py +++ b/examples/misc/set_custom_client_timeouts.py @@ -23,7 +23,7 @@ """ import argparse -import logging +from collections.abc import Iterator import sys from typing import List @@ -41,10 +41,6 @@ from google.api_core.exceptions import DeadlineExceeded from google.api_core.retry import Retry -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - _CLIENT_TIMEOUT_SECONDS = 5 * 60 # 5 minutes. _QUERY: str = "SELECT campaign.id FROM campaign" diff --git a/examples/misc/upload_image_asset.py b/examples/misc/upload_image_asset.py index 72097f8af..0fbf2974a 100644 --- a/examples/misc/upload_image_asset.py +++ b/examples/misc/upload_image_asset.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from examples.utils.example_helpers import get_image_bytes_from_url @@ -34,9 +33,6 @@ MutateAssetsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START upload_image_asset] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/planning/forecast_reach.py b/examples/planning/forecast_reach.py index bc7e72489..88b6140a0 100755 --- a/examples/planning/forecast_reach.py +++ b/examples/planning/forecast_reach.py @@ -15,7 +15,6 @@ """This code example generates a video ads reach forecast.""" import argparse -import logging import math import sys @@ -45,10 +44,6 @@ PlannedProduct, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - ONE_MILLION = 1.0e6 diff --git a/examples/planning/generate_forecast_metrics.py b/examples/planning/generate_forecast_metrics.py index db9ece366..6ad0f3a30 100755 --- a/examples/planning/generate_forecast_metrics.py +++ b/examples/planning/generate_forecast_metrics.py @@ -20,7 +20,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -41,9 +40,6 @@ GenerateKeywordForecastMetricsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START generate_forecast_metrics] def main(client: GoogleAdsClient, customer_id: str): diff --git a/examples/planning/generate_historical_metrics.py b/examples/planning/generate_historical_metrics.py index 0b00baafe..9e1daa3bb 100755 --- a/examples/planning/generate_historical_metrics.py +++ b/examples/planning/generate_historical_metrics.py @@ -18,10 +18,9 @@ https://developers.google.com/google-ads/api/docs/keyword-planning/generate-historical-metrics """ +from typing import Iterable import argparse -import logging import sys -from typing import Iterable from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -41,9 +40,6 @@ GenerateKeywordHistoricalMetricsResult, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START generate_historical_metrics] def main(client: GoogleAdsClient, customer_id: str): diff --git a/examples/planning/generate_keyword_ideas.py b/examples/planning/generate_keyword_ideas.py index 91f2df784..8d70e59a8 100755 --- a/examples/planning/generate_keyword_ideas.py +++ b/examples/planning/generate_keyword_ideas.py @@ -15,7 +15,6 @@ """This example generates keyword ideas from a list of seed keywords.""" import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -39,10 +38,6 @@ GenerateKeywordIdeaResult, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Location IDs are listed here: # https://developers.google.com/google-ads/api/reference/data/geotargets # and they can also be retrieved using the GeoTargetConstantService as shown diff --git a/examples/planning/get_ad_group_criterion_cpc_bid_simulations.py b/examples/planning/get_ad_group_criterion_cpc_bid_simulations.py index de12c8590..495dceda7 100755 --- a/examples/planning/get_ad_group_criterion_cpc_bid_simulations.py +++ b/examples/planning/get_ad_group_criterion_cpc_bid_simulations.py @@ -17,10 +17,9 @@ To get ad groups, run get_ad_groups.py. """ +from typing import Iterable import argparse -import logging import sys -from typing import Iterable from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -38,9 +37,6 @@ GoogleAdsRow, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START get_ad_group_criterion_cpc_bid_simulations] def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str): diff --git a/examples/recommendations/detect_and_apply_recommendations.py b/examples/recommendations/detect_and_apply_recommendations.py index 63511cfa6..363fe85ba 100755 --- a/examples/recommendations/detect_and_apply_recommendations.py +++ b/examples/recommendations/detect_and_apply_recommendations.py @@ -29,7 +29,6 @@ """ import argparse -import logging import sys from typing import List, Iterable @@ -43,9 +42,6 @@ ApplyRecommendationResult, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/recommendations/dismiss_recommendation.py b/examples/recommendations/dismiss_recommendation.py index d8a9a29ee..018f585fc 100755 --- a/examples/recommendations/dismiss_recommendation.py +++ b/examples/recommendations/dismiss_recommendation.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -31,9 +30,6 @@ DismissRecommendationResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, recommendation_id: str diff --git a/examples/recommendations/generate_budget_recommendations.py b/examples/recommendations/generate_budget_recommendations.py index 13fa8b1f6..abe2b7073 100644 --- a/examples/recommendations/generate_budget_recommendations.py +++ b/examples/recommendations/generate_budget_recommendations.py @@ -25,7 +25,6 @@ """ import argparse -import logging import sys from typing import List, Dict, Any @@ -42,9 +41,6 @@ Recommendation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/recommendations/get_recommendation_impact_metrics.py b/examples/recommendations/get_recommendation_impact_metrics.py index 3805ba396..0a2c8e1be 100644 --- a/examples/recommendations/get_recommendation_impact_metrics.py +++ b/examples/recommendations/get_recommendation_impact_metrics.py @@ -25,7 +25,6 @@ """ import argparse -import logging import sys from typing import List, Dict, Any @@ -42,9 +41,6 @@ Recommendation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, customer_id: str, user_provided_budget_amount: int diff --git a/examples/remarketing/add_conversion_action.py b/examples/remarketing/add_conversion_action.py index 36eb38b27..58462fd4e 100755 --- a/examples/remarketing/add_conversion_action.py +++ b/examples/remarketing/add_conversion_action.py @@ -15,7 +15,6 @@ """This example illustrates adding a conversion action.""" import argparse -import logging import sys import uuid @@ -32,9 +31,6 @@ MutateConversionActionsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_conversion_action] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/remarketing/add_conversion_based_user_list.py b/examples/remarketing/add_conversion_based_user_list.py index 13bf7bd8f..dc1ddaa25 100644 --- a/examples/remarketing/add_conversion_based_user_list.py +++ b/examples/remarketing/add_conversion_based_user_list.py @@ -20,10 +20,9 @@ """ import argparse -import logging import sys -from typing import List from uuid import uuid4 +from typing import List from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -40,9 +39,6 @@ MutateUserListsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_conversion_based_user_list] def main( diff --git a/examples/remarketing/add_custom_audience.py b/examples/remarketing/add_custom_audience.py index 548816f16..cc54c7413 100755 --- a/examples/remarketing/add_custom_audience.py +++ b/examples/remarketing/add_custom_audience.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -41,9 +40,6 @@ CustomAudienceServiceClient, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/remarketing/add_customer_match_user_list.py b/examples/remarketing/add_customer_match_user_list.py index f68074902..57991eaf4 100755 --- a/examples/remarketing/add_customer_match_user_list.py +++ b/examples/remarketing/add_customer_match_user_list.py @@ -28,10 +28,9 @@ import argparse import hashlib -import logging import sys -from typing import List, Dict, Optional, Union, Iterable import uuid +from typing import List, Dict, Optional, Union, Iterable from google.protobuf.any_pb2 import Any from google.rpc import status_pb2 @@ -76,9 +75,6 @@ GoogleAdsError, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/remarketing/add_dynamic_remarketing_asset.py b/examples/remarketing/add_dynamic_remarketing_asset.py index f1aa98b21..9ca8b50d2 100755 --- a/examples/remarketing/add_dynamic_remarketing_asset.py +++ b/examples/remarketing/add_dynamic_remarketing_asset.py @@ -16,7 +16,6 @@ import argparse from datetime import datetime -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -64,9 +63,6 @@ GoogleAdsServiceClient, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/remarketing/add_flexible_rule_user_list.py b/examples/remarketing/add_flexible_rule_user_list.py index 641345332..1eb3cd84a 100644 --- a/examples/remarketing/add_flexible_rule_user_list.py +++ b/examples/remarketing/add_flexible_rule_user_list.py @@ -19,7 +19,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -42,9 +41,6 @@ MutateUserListsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_combined_rule_user_list] def main(client: GoogleAdsClient, customer_id: str) -> None: diff --git a/examples/remarketing/add_logical_user_list.py b/examples/remarketing/add_logical_user_list.py index 29010bba8..2cd9e9d79 100644 --- a/examples/remarketing/add_logical_user_list.py +++ b/examples/remarketing/add_logical_user_list.py @@ -19,10 +19,9 @@ """ import argparse -import logging import sys -from typing import List from uuid import uuid4 +from typing import List from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -39,9 +38,6 @@ MutateUserListsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_logical_user_list] def main( diff --git a/examples/remarketing/add_merchant_center_dynamic_remarketing_campaign.py b/examples/remarketing/add_merchant_center_dynamic_remarketing_campaign.py index e32299d33..97ec08957 100644 --- a/examples/remarketing/add_merchant_center_dynamic_remarketing_campaign.py +++ b/examples/remarketing/add_merchant_center_dynamic_remarketing_campaign.py @@ -19,7 +19,6 @@ """ import argparse -import logging import requests import sys from uuid import uuid4 @@ -76,9 +75,6 @@ ResponsiveDisplayAdInfo, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/remarketing/set_up_advanced_remarketing.py b/examples/remarketing/set_up_advanced_remarketing.py index a84382513..3317d5085 100644 --- a/examples/remarketing/set_up_advanced_remarketing.py +++ b/examples/remarketing/set_up_advanced_remarketing.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys from uuid import uuid4 @@ -48,9 +47,6 @@ UserListOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/remarketing/set_up_remarketing.py b/examples/remarketing/set_up_remarketing.py index 1e96d5cb7..91259fefb 100755 --- a/examples/remarketing/set_up_remarketing.py +++ b/examples/remarketing/set_up_remarketing.py @@ -25,7 +25,6 @@ """ import argparse -import logging import sys from typing import List from uuid import uuid4 @@ -77,9 +76,6 @@ UserListOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/remarketing/update_audience_target_restriction.py b/examples/remarketing/update_audience_target_restriction.py index bed09b8b0..e6d729551 100644 --- a/examples/remarketing/update_audience_target_restriction.py +++ b/examples/remarketing/update_audience_target_restriction.py @@ -15,7 +15,6 @@ """Updates the audience target restriction of a given ad group to bid only.""" import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -43,9 +42,6 @@ ) from google.api_core import protobuf_helpers -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: """Updates the audience target restriction of a given ad group to bid only. diff --git a/examples/remarketing/upload_call_conversion.py b/examples/remarketing/upload_call_conversion.py index 1c2bfbdf6..e2170ab32 100644 --- a/examples/remarketing/upload_call_conversion.py +++ b/examples/remarketing/upload_call_conversion.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import Optional @@ -38,9 +37,6 @@ from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START upload_call_conversion] def main( diff --git a/examples/remarketing/upload_conversion_adjustment.py b/examples/remarketing/upload_conversion_adjustment.py index 39367267f..60f7c4e5f 100644 --- a/examples/remarketing/upload_conversion_adjustment.py +++ b/examples/remarketing/upload_conversion_adjustment.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from typing import Optional, Iterable @@ -46,9 +45,6 @@ UploadConversionAdjustmentsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START upload_conversion_adjustment] def main( diff --git a/examples/remarketing/upload_enhanced_conversions_for_leads.py b/examples/remarketing/upload_enhanced_conversions_for_leads.py index ba651932a..f8c6f3269 100644 --- a/examples/remarketing/upload_enhanced_conversions_for_leads.py +++ b/examples/remarketing/upload_enhanced_conversions_for_leads.py @@ -22,7 +22,6 @@ import argparse import hashlib -import logging import re import sys from typing import Dict, Optional, Union @@ -45,9 +44,6 @@ UploadClickConversionsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/remarketing/upload_enhanced_conversions_for_web.py b/examples/remarketing/upload_enhanced_conversions_for_web.py index 3a982ae1d..aa2a3f578 100644 --- a/examples/remarketing/upload_enhanced_conversions_for_web.py +++ b/examples/remarketing/upload_enhanced_conversions_for_web.py @@ -19,16 +19,12 @@ import argparse import hashlib -import logging import re import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client, diff --git a/examples/remarketing/upload_offline_conversion.py b/examples/remarketing/upload_offline_conversion.py index d61c61956..4ca0f8b1d 100644 --- a/examples/remarketing/upload_offline_conversion.py +++ b/examples/remarketing/upload_offline_conversion.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys from typing import Optional @@ -40,9 +39,6 @@ UploadClickConversionsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START upload_offline_conversion] def main( diff --git a/examples/remarketing/upload_store_sales_transactions.py b/examples/remarketing/upload_store_sales_transactions.py index 0b53b2859..5e512f5ba 100644 --- a/examples/remarketing/upload_store_sales_transactions.py +++ b/examples/remarketing/upload_store_sales_transactions.py @@ -21,7 +21,6 @@ import argparse from datetime import datetime import hashlib -import logging import sys from typing import List, Optional, Tuple @@ -66,9 +65,6 @@ OfflineUserDataJobOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/reporting/parallel_report_download.py b/examples/reporting/parallel_report_download.py index 07f6b6cf8..2517b863e 100644 --- a/examples/reporting/parallel_report_download.py +++ b/examples/reporting/parallel_report_download.py @@ -21,9 +21,7 @@ import argparse from itertools import product -import logging import multiprocessing -import sys import time from typing import Any, Dict, Iterable, List, Tuple @@ -41,10 +39,6 @@ SearchGoogleAdsStreamResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Maximum number of processes to spawn. MAX_PROCESSES: int = multiprocessing.cpu_count() # Timeout between retries in seconds. diff --git a/examples/shopping_ads/add_listing_scope.py b/examples/shopping_ads/add_listing_scope.py index a8e234852..9f506f485 100755 --- a/examples/shopping_ads/add_listing_scope.py +++ b/examples/shopping_ads/add_listing_scope.py @@ -28,7 +28,6 @@ """ import argparse -import logging import sys from typing import List @@ -57,9 +56,6 @@ MutateCampaignCriteriaResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, campaign_id: str) -> None: campaign_service: CampaignServiceClient = client.get_service( diff --git a/examples/shopping_ads/add_performance_max_product_listing_group_tree.py b/examples/shopping_ads/add_performance_max_product_listing_group_tree.py index 94db1d4ef..1a52e3414 100644 --- a/examples/shopping_ads/add_performance_max_product_listing_group_tree.py +++ b/examples/shopping_ads/add_performance_max_product_listing_group_tree.py @@ -23,7 +23,6 @@ """ import argparse -import logging import sys from typing import Dict, List, Optional @@ -47,10 +46,6 @@ MutateOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # We specify temporary IDs that are specific to a single mutate request. # Temporary IDs are always negative and unique within one mutate request. # diff --git a/examples/shopping_ads/add_performance_max_retail_campaign.py b/examples/shopping_ads/add_performance_max_retail_campaign.py index ffbc855f3..ceaeabb7e 100644 --- a/examples/shopping_ads/add_performance_max_retail_campaign.py +++ b/examples/shopping_ads/add_performance_max_retail_campaign.py @@ -36,7 +36,6 @@ import argparse from datetime import datetime, timedelta -import logging import sys from typing import Dict, List, Union from uuid import uuid4 @@ -108,10 +107,6 @@ MutateOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # We specify temporary IDs that are specific to a single mutate request. # Temporary IDs are always negative and unique within one mutate request. # diff --git a/examples/shopping_ads/add_shopping_product_ad.py b/examples/shopping_ads/add_shopping_product_ad.py index dd713216b..18b80b40f 100755 --- a/examples/shopping_ads/add_shopping_product_ad.py +++ b/examples/shopping_ads/add_shopping_product_ad.py @@ -25,7 +25,6 @@ """ import argparse -import logging import sys import uuid @@ -71,9 +70,6 @@ CampaignOperation, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/shopping_ads/add_shopping_product_listing_group_tree.py b/examples/shopping_ads/add_shopping_product_listing_group_tree.py index fae34d868..0f36de255 100644 --- a/examples/shopping_ads/add_shopping_product_listing_group_tree.py +++ b/examples/shopping_ads/add_shopping_product_listing_group_tree.py @@ -26,7 +26,6 @@ """ import argparse -import logging import sys from typing import List, Optional @@ -59,10 +58,6 @@ SearchGoogleAdsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - last_criterion_id: int = 0 diff --git a/examples/shopping_ads/get_product_category_constants.py b/examples/shopping_ads/get_product_category_constants.py index 2dd2d3802..aa73dd559 100755 --- a/examples/shopping_ads/get_product_category_constants.py +++ b/examples/shopping_ads/get_product_category_constants.py @@ -15,7 +15,7 @@ """This example fetches the set of all ProductCategoryConstants.""" import argparse -import logging +import collections import sys from typing import DefaultDict, List, Optional @@ -32,9 +32,6 @@ SearchGoogleAdsStreamResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - class Category: def __init__( diff --git a/examples/targeting/add_campaign_targeting_criteria.py b/examples/targeting/add_campaign_targeting_criteria.py index 2a1994392..cde6bd672 100755 --- a/examples/targeting/add_campaign_targeting_criteria.py +++ b/examples/targeting/add_campaign_targeting_criteria.py @@ -15,9 +15,8 @@ """This example adds campaign targeting criteria.""" import argparse -import logging -import sys from typing import List +import sys from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException @@ -41,9 +40,6 @@ MutateCampaignCriteriaResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/targeting/add_customer_negative_criteria.py b/examples/targeting/add_customer_negative_criteria.py index 92dc72007..d91e73c66 100755 --- a/examples/targeting/add_customer_negative_criteria.py +++ b/examples/targeting/add_customer_negative_criteria.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -34,9 +33,6 @@ MutateCustomerNegativeCriteriaResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str) -> None: """The main method that creates all necessary entities for the example. diff --git a/examples/targeting/add_demographic_targeting_criteria.py b/examples/targeting/add_demographic_targeting_criteria.py index 40a990a99..760696152 100755 --- a/examples/targeting/add_demographic_targeting_criteria.py +++ b/examples/targeting/add_demographic_targeting_criteria.py @@ -17,7 +17,6 @@ create ad groups, run add_ad_groups.py.""" import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -36,9 +35,6 @@ MutateAdGroupCriteriaResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: ad_group_service: AdGroupServiceClient = client.get_service( diff --git a/examples/targeting/get_geo_target_constants_by_names.py b/examples/targeting/get_geo_target_constants_by_names.py index 293bcd15a..f8f16c6b3 100755 --- a/examples/targeting/get_geo_target_constants_by_names.py +++ b/examples/targeting/get_geo_target_constants_by_names.py @@ -14,7 +14,6 @@ # limitations under the License. """This example illustrates getting GeoTargetConstants by given location names.""" -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -31,10 +30,6 @@ SuggestGeoTargetConstantsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # Locale is using ISO 639-1 format. If an invalid locale is given, # 'en' is used by default. LOCALE: str = "en" diff --git a/examples/travel/add_hotel_ad.py b/examples/travel/add_hotel_ad.py index 8dffeaa18..f5397a1be 100755 --- a/examples/travel/add_hotel_ad.py +++ b/examples/travel/add_hotel_ad.py @@ -21,7 +21,6 @@ """ import argparse -import logging import sys import uuid @@ -62,9 +61,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/examples/travel/add_hotel_ad_group_bid_modifiers.py b/examples/travel/add_hotel_ad_group_bid_modifiers.py index d40b4f53e..28008b194 100755 --- a/examples/travel/add_hotel_ad_group_bid_modifiers.py +++ b/examples/travel/add_hotel_ad_group_bid_modifiers.py @@ -18,7 +18,6 @@ """ import argparse -import logging import sys from google.ads.googleads.client import GoogleAdsClient @@ -39,9 +38,6 @@ MutateAdGroupBidModifiersResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - # [START add_hotel_ad_group_bid_modifiers] def main(client: GoogleAdsClient, customer_id: str, ad_group_id: str) -> None: diff --git a/examples/travel/add_hotel_listing_group_tree.py b/examples/travel/add_hotel_listing_group_tree.py index 57558e494..71a594179 100755 --- a/examples/travel/add_hotel_listing_group_tree.py +++ b/examples/travel/add_hotel_listing_group_tree.py @@ -29,7 +29,6 @@ """ import argparse -import logging import sys from typing import List, Optional @@ -54,10 +53,6 @@ MutateAdGroupCriterionResult, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - # The next temporary criterion ID to be used, which is a negative integer. # # When creating a tree, we need to specify the parent-child relationships diff --git a/examples/travel/add_performance_max_for_travel_goals_campaign.py b/examples/travel/add_performance_max_for_travel_goals_campaign.py index 414ade622..0bd8301bf 100644 --- a/examples/travel/add_performance_max_for_travel_goals_campaign.py +++ b/examples/travel/add_performance_max_for_travel_goals_campaign.py @@ -36,7 +36,6 @@ """ import argparse -import logging import sys from typing import Dict, List @@ -91,10 +90,6 @@ SuggestTravelAssetsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - - MIN_REQUIRED_TEXT_ASSET_COUNTS: Dict[str, int] = { "HEADLINE": 3, "LONG_HEADLINE": 1, diff --git a/examples/travel/add_things_to_do_ad.py b/examples/travel/add_things_to_do_ad.py index cf5c7b32c..4ce89ddf5 100755 --- a/examples/travel/add_things_to_do_ad.py +++ b/examples/travel/add_things_to_do_ad.py @@ -20,7 +20,6 @@ """ import argparse -import logging import sys from examples.utils.example_helpers import get_printable_datetime @@ -61,9 +60,6 @@ MutateCampaignsResponse, ) -logger = logging.getLogger("google.ads.googleads.client") -logger.addHandler(logging.StreamHandler(sys.stdout)) - def main( client: GoogleAdsClient, diff --git a/google/ads/googleads/v25/common/__init__.py b/google/ads/googleads/v25/common/__init__.py index 9e9d72c3c..86387858a 100644 --- a/google/ads/googleads/v25/common/__init__.py +++ b/google/ads/googleads/v25/common/__init__.py @@ -48,6 +48,7 @@ "google.ads.googleads.v25.types.custom_parameter", "google.ads.googleads.v25.types.customizer_value", "google.ads.googleads.v25.types.dates", + "google.ads.googleads.v25.types.effective_automatic_goal", "google.ads.googleads.v25.types.experiment_types", "google.ads.googleads.v25.types.extensions", "google.ads.googleads.v25.types.feed_common", @@ -250,6 +251,7 @@ from .types.criteria import CustomAudienceInfo from .types.criteria import CustomIntentInfo from .types.criteria import DeviceInfo +from .types.criteria import EntityBid from .types.criteria import ExtendedDemographicInfo from .types.criteria import GenderInfo from .types.criteria import GeoPointInfo @@ -328,6 +330,7 @@ from .types.dates import DateRange from .types.dates import YearMonth from .types.dates import YearMonthRange +from .types.effective_automatic_goal import EffectiveAutomaticGoal from .types.experiment_types import OptimizeAssetsExperimentInfo from .types.experiment_types import VideoExperimentInfo from .types.extensions import CallFeedItem @@ -662,7 +665,9 @@ def _get_version(dependency_name): "DynamicLocalAsset", "DynamicRealEstateAsset", "DynamicTravelAsset", + "EffectiveAutomaticGoal", "EnhancedCpc", + "EntityBid", "EventAttribute", "EventItemAttribute", "ExclusionSegment", diff --git a/google/ads/googleads/v25/common/types/__init__.py b/google/ads/googleads/v25/common/types/__init__.py index b2b174c40..1d011cda7 100644 --- a/google/ads/googleads/v25/common/types/__init__.py +++ b/google/ads/googleads/v25/common/types/__init__.py @@ -214,6 +214,7 @@ CustomAudienceInfo, CustomIntentInfo, DeviceInfo, + EntityBid, ExtendedDemographicInfo, GenderInfo, GeoPointInfo, @@ -297,6 +298,9 @@ YearMonth, YearMonthRange, ) +from .effective_automatic_goal import ( + EffectiveAutomaticGoal, +) from .experiment_types import ( OptimizeAssetsExperimentInfo, VideoExperimentInfo, @@ -624,6 +628,7 @@ "CustomAudienceInfo", "CustomIntentInfo", "DeviceInfo", + "EntityBid", "ExtendedDemographicInfo", "GenderInfo", "GeoPointInfo", @@ -698,6 +703,7 @@ "DateRange", "YearMonth", "YearMonthRange", + "EffectiveAutomaticGoal", "OptimizeAssetsExperimentInfo", "VideoExperimentInfo", "CallFeedItem", diff --git a/google/ads/googleads/v25/common/types/criteria.py b/google/ads/googleads/v25/common/types/criteria.py index 41597cdc9..6aec5efc0 100644 --- a/google/ads/googleads/v25/common/types/criteria.py +++ b/google/ads/googleads/v25/common/types/criteria.py @@ -141,6 +141,7 @@ "RetailFilter", "RetailFilterExpression", "RetailTag", + "EntityBid", }, ) @@ -2585,4 +2586,24 @@ class RetailTag(proto.Message): ) +class EntityBid(proto.Message): + r"""Represents an entity bid criterion. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + item_code (str): + The ID specifying a particular travel entity, + such as a hotel, a thing to do, or an event. + + This field is a member of `oneof`_ ``_item_code``. + """ + + item_code: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + + __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/common/types/effective_automatic_goal.py b/google/ads/googleads/v25/common/types/effective_automatic_goal.py new file mode 100644 index 000000000..fcca2d8d9 --- /dev/null +++ b/google/ads/googleads/v25/common/types/effective_automatic_goal.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import conversion_action_category +from google.ads.googleads.v25.enums.types import conversion_origin + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.common", + marshal="google.ads.googleads.v25", + manifest={ + "EffectiveAutomaticGoal", + }, +) + + +class EffectiveAutomaticGoal(proto.Message): + r"""Represents an effective automatic conversion goal. + + Attributes: + category (google.ads.googleads.v25.enums.types.ConversionActionCategoryEnum.ConversionActionCategory): + Conversion category. + origin (google.ads.googleads.v25.enums.types.ConversionOriginEnum.ConversionOrigin): + Conversion origin. + """ + + category: ( + conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory + ) = proto.Field( + proto.ENUM, + number=1, + enum=conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory, + ) + origin: conversion_origin.ConversionOriginEnum.ConversionOrigin = ( + proto.Field( + proto.ENUM, + number=2, + enum=conversion_origin.ConversionOriginEnum.ConversionOrigin, + ) + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/common/types/metrics.py b/google/ads/googleads/v25/common/types/metrics.py index 9e8d06817..934588ac2 100644 --- a/google/ads/googleads/v25/common/types/metrics.py +++ b/google/ads/googleads/v25/common/types/metrics.py @@ -2421,6 +2421,420 @@ class Metrics(proto.Message): ``(conversion_value_change_point_estimate - conversion_value_margin_of_error, conversion_value_change_point_estimate + conversion_value_margin_of_error)``. This field is a member of `oneof`_ ``_conversion_value_change_point_estimate``. + incremental_conversions (float): + The estimated number of additional + conversions directly attributable to the ad + campaign. + + This field is a member of `oneof`_ ``_incremental_conversions``. + incremental_conversions_winner_score (float): + The probability that this experiment arm is + the winner for incremental conversions. This + value is between 0.0 and 1.0. + + This field is a member of `oneof`_ ``_incremental_conversions_winner_score``. + incremental_conversion_value (float): + The estimated additional conversion value the + ads generated. Measures the incremental revenue + or value from your campaigns. + + This field is a member of `oneof`_ ``_incremental_conversion_value``. + incremental_conversion_value_winner_score (float): + The probability that this experiment arm is + the winner for incremental conversion value. + This value is between 0.0 and 1.0. + + This field is a member of `oneof`_ ``_incremental_conversion_value_winner_score``. + conversion_lift_baseline_conversions (float): + Represents the number of conversions that + would have occurred naturally without ad + exposure, based on the behavior of the control + group. Often referred to as "Control" + conversions. + + This field is a member of `oneof`_ ``_conversion_lift_baseline_conversions``. + conversion_lift_baseline_conversion_value (float): + Represents the baseline conversion value from + users not exposed to the ads. + + This field is a member of `oneof`_ ``_conversion_lift_baseline_conversion_value``. + conversion_lift_exposed_conversions (float): + Represents the total conversions from users + who were exposed to the ads. Often referred to + as "Treatment" conversions. + + This field is a member of `oneof`_ ``_conversion_lift_exposed_conversions``. + conversion_lift_exposed_conversion_value (float): + Represents the total conversion value from + users exposed to the ads. + + This field is a member of `oneof`_ ``_conversion_lift_exposed_conversion_value``. + cost_per_incremental_conversion (float): + The estimated cost incurred for each + additional conversion generated by the campaign. + This is the Incremental Cost Per Acquisition + (iCPA). + + This field is a member of `oneof`_ ``_cost_per_incremental_conversion``. + cost_per_incremental_conversion_winner_score (float): + The probability that this experiment arm is + the winner for cost per incremental conversion. + This value is between 0.0 and 1.0. + + This field is a member of `oneof`_ ``_cost_per_incremental_conversion_winner_score``. + cost_per_incremental_conversion_p90_lower_bound (float): + The lower bound of the 90% confidence interval for + cost_per_incremental_conversion. The lowest likely cost you + paid per incremental conversion. + + This field is a member of `oneof`_ ``_cost_per_incremental_conversion_p90_lower_bound``. + cost_per_incremental_conversion_p90_upper_bound (float): + The upper bound of the 90% confidence interval for + cost_per_incremental_conversion. The highest likely cost you + paid per incremental conversion. + + This field is a member of `oneof`_ ``_cost_per_incremental_conversion_p90_upper_bound``. + incremental_conversions_p90_lower_bound (float): + The lower bound of the 90% confidence interval for + incremental_conversions. The "conservative" estimate of your + success. It is the minimum number of additional sales you + can be 90% sure were caused by your ads. + + This field is a member of `oneof`_ ``_incremental_conversions_p90_lower_bound``. + incremental_conversions_p90_upper_bound (float): + The upper bound of the 90% confidence interval for + incremental_conversions. The "optimistic" estimate of your + success. It is the maximum number of additional sales likely + driven by your ads. + + This field is a member of `oneof`_ ``_incremental_conversions_p90_upper_bound``. + incremental_conversions_p_value (float): + The conversions p-value provides a measure of + the statistical significance for the detected + lift in conversions. It calculates the + likelihood that your incremental conversions + were driven by ad performance rather than being + a merely random occurrence. + + This field is a member of `oneof`_ ``_incremental_conversions_p_value``. + incremental_conversion_value_p90_lower_bound (float): + The lower bound of the 90% confidence interval for + incremental_conversion_value. Shows the minimum amount of + extra revenue ($) you can be 90% certain was generated by + the campaign. + + This field is a member of `oneof`_ ``_incremental_conversion_value_p90_lower_bound``. + incremental_conversion_value_p90_upper_bound (float): + The upper bound of the 90% confidence interval for + incremental_conversion_value. The highest amount of extra + revenue ($) likely generated by the campaign. + + This field is a member of `oneof`_ ``_incremental_conversion_value_p90_upper_bound``. + incremental_conversion_value_p_value (float): + The conversions value p-value provides a + measure of the statistical significance for the + detected lift in conversions value. It + calculates the likelihood that your incremental + conversion value was driven by ad performance + rather than being a merely random occurrence. + + This field is a member of `oneof`_ ``_incremental_conversion_value_p_value``. + incremental_conversion_value_per_cost (float): + The incremental return on ad spend (iROAS), + calculated as the additional conversion value + generated per unit of campaign cost. Measures + the return on your ad spend in terms of + incremental value. + + This field is a member of `oneof`_ ``_incremental_conversion_value_per_cost``. + incremental_conversion_value_per_cost_winner_score (float): + The probability that this experiment arm is + the winner for incremental conversion value per + cost. This value is between 0.0 and 1.0. + + This field is a member of `oneof`_ ``_incremental_conversion_value_per_cost_winner_score``. + incremental_conversion_value_per_cost_p90_lower_bound (float): + The lower bound of the 90% confidence + interval for incremental conversion value per + cost. The "Guaranteed" return. Even if the data + is noisy, you can be 90% sure your return was at + least this high. + + This field is a member of `oneof`_ ``_incremental_conversion_value_per_cost_p90_lower_bound``. + incremental_conversion_value_per_cost_p90_upper_bound (float): + The upper bound of the 90% confidence + interval for incremental conversion value per + cost. The "Potential" return. The maximum likely + revenue generated for every dollar spent. + + This field is a member of `oneof`_ ``_incremental_conversion_value_per_cost_p90_upper_bound``. + relative_conversion_lift (float): + The percentage increase in conversions in the + exposed group compared to the control group. + + This field is a member of `oneof`_ ``_relative_conversion_lift``. + relative_conversion_lift_p90_lower_bound (float): + The lower bound of the 90% confidence interval for + relative_conversion_lift. The minimum percentage increase + you can be 90% sure occurred. + + This field is a member of `oneof`_ ``_relative_conversion_lift_p90_lower_bound``. + relative_conversion_lift_p90_upper_bound (float): + The upper bound of the 90% confidence interval for + relative_conversion_lift. The maximum percentage increase + you can be 90% sure occurred. + + This field is a member of `oneof`_ ``_relative_conversion_lift_p90_upper_bound``. + relative_conversion_value_lift (float): + The percentage increase in conversion value + in the exposed group compared to the control + group. + + This field is a member of `oneof`_ ``_relative_conversion_value_lift``. + relative_conversion_value_lift_p90_lower_bound (float): + The lower bound of the 90% confidence interval for + relative_conversion_value_lift. The lowest likely percentage + of incremental revenue the ads generated. + + This field is a member of `oneof`_ ``_relative_conversion_value_lift_p90_lower_bound``. + relative_conversion_value_lift_p90_upper_bound (float): + The upper bound of the 90% confidence interval for + relative_conversion_value_lift. The highest likely + percentage of incremental revenue the ads generated. + + This field is a member of `oneof`_ ``_relative_conversion_value_lift_p90_upper_bound``. + absolute_brand_lift (float): + These metrics estimate the additional brand + lift directly attributable to the ad campaign. + + This field is a member of `oneof`_ ``_absolute_brand_lift``. + absolute_brand_lift_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for absolute brand lift. The "conservative" + estimate of your success. It is the minimum + increase you can be 90% sure was caused by your + ads. + + This field is a member of `oneof`_ ``_absolute_brand_lift_p90_lower_bound``. + absolute_brand_lift_p90_upper_bound (float): + Upper bound of the 90% confidence interval + for absolute brand lift. The "optimistic" + estimate of your success. It is the maximum + increase likely driven by your ads. + + This field is a member of `oneof`_ ``_absolute_brand_lift_p90_upper_bound``. + absolute_brand_lift_p_value (float): + The p-value provides a measure of the + statistical significance for the detected brand + lift. It calculates the likelihood that your + incremental lift was driven by ad performance + rather than being a merely random occurrence. + Achieving a low score of 0.10 indicates 90% + confidence that your advertising efforts + directly generated the additional lift. + + This field is a member of `oneof`_ ``_absolute_brand_lift_p_value``. + brand_lift_baseline_positive_response_rate (float): + Represents the rate of positive responses + that would have occurred naturally without ad + exposure, based on the behavior of the control + group. Often referred to as "Control" responses. + Provides the baseline level of brand perception + that occurred naturally. + + This field is a member of `oneof`_ ``_brand_lift_baseline_positive_response_rate``. + brand_lift_baseline_positive_response_rate_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for the baseline positive response rate. + Represents the conservative baseline rate of + positive brand responses you could expect + naturally without ad exposure. + + This field is a member of `oneof`_ ``_brand_lift_baseline_positive_response_rate_p90_lower_bound``. + brand_lift_baseline_positive_response_rate_p90_upper_bound (float): + Upper bound of the 90% confidence interval + for the baseline positive response rate. + Represents the optimistic baseline rate of + positive brand responses expected naturally + without ad exposure. + + This field is a member of `oneof`_ ``_brand_lift_baseline_positive_response_rate_p90_upper_bound``. + brand_lift_exposed_positive_responder_fractional_cookies (float): + Estimated unique users showing interest in + the exposed group. This value is "fractional" + because it represents a statistical estimate + rather than a raw headcount. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_responder_fractional_cookies``. + brand_lift_exposed_positive_responder_fractional_cookies_p90_lower_bound (float): + The lower bound of the 90% confidence + interval for the estimated number of unique + cookies within the ad-exposed group that are + estimated to have a positive brand attitude, as + measured by the Brand Lift survey. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_responder_fractional_cookies_p90_lower_bound``. + brand_lift_exposed_positive_responder_fractional_cookies_p90_upper_bound (float): + The upper bound of the 90% confidence + interval for the estimated number of unique + cookies within the ad-exposed group that are + estimated to have experienced a positive shift + in brand attitude, as measured by the Brand Lift + survey. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_responder_fractional_cookies_p90_upper_bound``. + brand_lift_exposed_positive_response_rate (float): + Represents the rate of positive responses + from users who were exposed to the ads. Often + referred to as "Treatment" responses. Shows + total positive response rate when users were + exposed to your ads. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_response_rate``. + brand_lift_exposed_positive_response_rate_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for the exposed positive response rate. + Represents the conservative estimate of positive + brand responses among users exposed to your ads. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_response_rate_p90_lower_bound``. + brand_lift_exposed_positive_response_rate_p90_upper_bound (float): + Upper bound of the 90% confidence interval + for the exposed positive response rate. + Represents the maximum estimate of positive + brand responses among users exposed to your ads. + + This field is a member of `oneof`_ ``_brand_lift_exposed_positive_response_rate_p90_upper_bound``. + brand_lift_responses_exposed (float): + The number of survey responses from users who + were exposed to the ads. + + This field is a member of `oneof`_ ``_brand_lift_responses_exposed``. + brand_lift_responses_suppressed (float): + Brand lift responses suppressed. + + This field is a member of `oneof`_ ``_brand_lift_responses_suppressed``. + brand_lift_suppressed_positive_responder_fractional_cookies (float): + Estimated unique users showing interest in + the control/suppressed group. This value is + "fractional" because it represents a statistical + estimate. + + This field is a member of `oneof`_ ``_brand_lift_suppressed_positive_responder_fractional_cookies``. + brand_lift_suppressed_positive_responder_fractional_cookies_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for the estimated number of fractional cookies + within the control group that are categorized as + positive responders. This lower bound provides a + statistically supported minimum value for the + total fractional cookies in the control group + showing a positive brand attitude. + + This field is a member of `oneof`_ ``_brand_lift_suppressed_positive_responder_fractional_cookies_p90_lower_bound``. + brand_lift_suppressed_positive_responder_fractional_cookies_p90_upper_bound (float): + Represents the upper bound of the 90% + confidence interval for the estimated number of + fractional cookies within the control group that + are categorized as positive responders. This + upper bound provides a statistically supported + maximum value for the total fractional cookies + in the control group showing a positive brand + attitude. + + This field is a member of `oneof`_ ``_brand_lift_suppressed_positive_responder_fractional_cookies_p90_upper_bound``. + brand_lift_total_responses (float): + The total number of survey responses + collected across both the exposed and control + groups. + + This field is a member of `oneof`_ ``_brand_lift_total_responses``. + cost_per_lifted_cookie (float): + The estimated cost incurred for each + additional person moved to a positive brand + state by the campaign. Helps assess the + cost-effectiveness of your ad spend in driving + brand growth. + + This field is a member of `oneof`_ ``_cost_per_lifted_cookie``. + cost_per_lifted_cookie_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for the cost per lifted cookie. Represents the + most optimistic (lowest cost) estimate for + moving a user to a positive brand state. + + This field is a member of `oneof`_ ``_cost_per_lifted_cookie_p90_lower_bound``. + cost_per_lifted_cookie_p90_upper_bound (float): + Upper bound of the 90% confidence interval + for the cost per lifted cookie. Represents the + most conservative (highest cost) estimate for + moving a user to a positive brand state. + + This field is a member of `oneof`_ ``_cost_per_lifted_cookie_p90_upper_bound``. + fractional_lifted_cookies (float): + Estimated number of unique users who were + moved to a positive brand state directly by the + campaign (that is, lifted users). + + This field is a member of `oneof`_ ``_fractional_lifted_cookies``. + fractional_lifted_cookies_p90_lower_bound (float): + The lower bound of the 90% confidence interval for the + fractional_lifted_cookies metric. This value represents a + statistically conservative estimate of the minimum number of + cookies for whom a positive Brand Lift is attributed to the + ad exposure. + + This field is a member of `oneof`_ ``_fractional_lifted_cookies_p90_lower_bound``. + fractional_lifted_cookies_p90_upper_bound (float): + The upper bound of the 90% confidence interval for the + fractional_lifted_cookies metric. This value represents a + statistically optimistic estimate of the maximum number of + cookies that may have experienced a positive Brand Lift. + + This field is a member of `oneof`_ ``_fractional_lifted_cookies_p90_upper_bound``. + headroom_brand_lift (float): + The increase in positive brand responses + relative to the total potential growth + remaining. + + This field is a member of `oneof`_ ``_headroom_brand_lift``. + headroom_brand_lift_p90_lower_bound (float): + Lower bound of the 90% confidence interval + for headroom brand lift. The minimum growth rate + relative to remaining brand potential you can be + 90% confident was driven by your ads. + + This field is a member of `oneof`_ ``_headroom_brand_lift_p90_lower_bound``. + headroom_brand_lift_p90_upper_bound (float): + Upper bound of the 90% confidence interval + for headroom brand lift. The maximum growth rate + relative to remaining brand potential likely + driven by your ads. + + This field is a member of `oneof`_ ``_headroom_brand_lift_p90_upper_bound``. + relative_brand_lift (float): + The percentage increase in positive responses + in the exposed group compared to the control + group. + + This field is a member of `oneof`_ ``_relative_brand_lift``. + relative_brand_lift_p90_lower_bound (float): + The lower bound of the 90% confidence + interval for Relative Brand Lift. Represents the + minimum percentage increase in positive brand + perception among users who were exposed to the + ads, relative to the baseline positive response + rate observed in the control group. + + This field is a member of `oneof`_ ``_relative_brand_lift_p90_lower_bound``. + relative_brand_lift_p90_upper_bound (float): + The upper bound of the 90% confidence + interval for Relative Brand Lift. Represents the + maximum percentage increase in positive brand + perception in the ad-exposed group, relative to + the control group's baseline positive response + rate, at a 90% confidence level. + + This field is a member of `oneof`_ ``_relative_brand_lift_p90_upper_bound``. youtube_comments (int): The number of comments on YouTube Shorts videos attributed to ad impressions. @@ -2436,6 +2850,14 @@ class Metrics(proto.Message): attributed to ad impressions. This field is a member of `oneof`_ ``_youtube_shares``. + original_conversion_value (float): + The original conversion value from biddable + conversions. This is the unadjusted value of + conversions before any value rule adjustments, + such as conversion value rules or lifecycle + goals adjustments are applied. + + This field is a member of `oneof`_ ``_original_conversion_value``. """ absolute_top_impression_percentage: float = proto.Field( @@ -3859,6 +4281,321 @@ class Metrics(proto.Message): number=472, optional=True, ) + incremental_conversions: float = proto.Field( + proto.DOUBLE, + number=473, + optional=True, + ) + incremental_conversions_winner_score: float = proto.Field( + proto.DOUBLE, + number=601, + optional=True, + ) + incremental_conversion_value: float = proto.Field( + proto.DOUBLE, + number=474, + optional=True, + ) + incremental_conversion_value_winner_score: float = proto.Field( + proto.DOUBLE, + number=602, + optional=True, + ) + conversion_lift_baseline_conversions: float = proto.Field( + proto.DOUBLE, + number=475, + optional=True, + ) + conversion_lift_baseline_conversion_value: float = proto.Field( + proto.DOUBLE, + number=476, + optional=True, + ) + conversion_lift_exposed_conversions: float = proto.Field( + proto.DOUBLE, + number=477, + optional=True, + ) + conversion_lift_exposed_conversion_value: float = proto.Field( + proto.DOUBLE, + number=478, + optional=True, + ) + cost_per_incremental_conversion: float = proto.Field( + proto.DOUBLE, + number=479, + optional=True, + ) + cost_per_incremental_conversion_winner_score: float = proto.Field( + proto.DOUBLE, + number=603, + optional=True, + ) + cost_per_incremental_conversion_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=480, + optional=True, + ) + cost_per_incremental_conversion_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=481, + optional=True, + ) + incremental_conversions_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=482, + optional=True, + ) + incremental_conversions_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=483, + optional=True, + ) + incremental_conversions_p_value: float = proto.Field( + proto.DOUBLE, + number=484, + optional=True, + ) + incremental_conversion_value_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=485, + optional=True, + ) + incremental_conversion_value_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=486, + optional=True, + ) + incremental_conversion_value_p_value: float = proto.Field( + proto.DOUBLE, + number=487, + optional=True, + ) + incremental_conversion_value_per_cost: float = proto.Field( + proto.DOUBLE, + number=488, + optional=True, + ) + incremental_conversion_value_per_cost_winner_score: float = proto.Field( + proto.DOUBLE, + number=604, + optional=True, + ) + incremental_conversion_value_per_cost_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=489, + optional=True, + ) + incremental_conversion_value_per_cost_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=490, + optional=True, + ) + relative_conversion_lift: float = proto.Field( + proto.DOUBLE, + number=491, + optional=True, + ) + relative_conversion_lift_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=492, + optional=True, + ) + relative_conversion_lift_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=493, + optional=True, + ) + relative_conversion_value_lift: float = proto.Field( + proto.DOUBLE, + number=494, + optional=True, + ) + relative_conversion_value_lift_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=495, + optional=True, + ) + relative_conversion_value_lift_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=496, + optional=True, + ) + absolute_brand_lift: float = proto.Field( + proto.DOUBLE, + number=497, + optional=True, + ) + absolute_brand_lift_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=498, + optional=True, + ) + absolute_brand_lift_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=499, + optional=True, + ) + absolute_brand_lift_p_value: float = proto.Field( + proto.DOUBLE, + number=500, + optional=True, + ) + brand_lift_baseline_positive_response_rate: float = proto.Field( + proto.DOUBLE, + number=501, + optional=True, + ) + brand_lift_baseline_positive_response_rate_p90_lower_bound: float = ( + proto.Field( + proto.DOUBLE, + number=502, + optional=True, + ) + ) + brand_lift_baseline_positive_response_rate_p90_upper_bound: float = ( + proto.Field( + proto.DOUBLE, + number=503, + optional=True, + ) + ) + brand_lift_exposed_positive_responder_fractional_cookies: float = ( + proto.Field( + proto.DOUBLE, + number=504, + optional=True, + ) + ) + brand_lift_exposed_positive_responder_fractional_cookies_p90_lower_bound: ( + float + ) = proto.Field( + proto.DOUBLE, + number=505, + optional=True, + ) + brand_lift_exposed_positive_responder_fractional_cookies_p90_upper_bound: ( + float + ) = proto.Field( + proto.DOUBLE, + number=506, + optional=True, + ) + brand_lift_exposed_positive_response_rate: float = proto.Field( + proto.DOUBLE, + number=507, + optional=True, + ) + brand_lift_exposed_positive_response_rate_p90_lower_bound: float = ( + proto.Field( + proto.DOUBLE, + number=508, + optional=True, + ) + ) + brand_lift_exposed_positive_response_rate_p90_upper_bound: float = ( + proto.Field( + proto.DOUBLE, + number=509, + optional=True, + ) + ) + brand_lift_responses_exposed: float = proto.Field( + proto.DOUBLE, + number=510, + optional=True, + ) + brand_lift_responses_suppressed: float = proto.Field( + proto.DOUBLE, + number=511, + optional=True, + ) + brand_lift_suppressed_positive_responder_fractional_cookies: float = ( + proto.Field( + proto.DOUBLE, + number=512, + optional=True, + ) + ) + brand_lift_suppressed_positive_responder_fractional_cookies_p90_lower_bound: ( + float + ) = proto.Field( + proto.DOUBLE, + number=513, + optional=True, + ) + brand_lift_suppressed_positive_responder_fractional_cookies_p90_upper_bound: ( + float + ) = proto.Field( + proto.DOUBLE, + number=514, + optional=True, + ) + brand_lift_total_responses: float = proto.Field( + proto.DOUBLE, + number=515, + optional=True, + ) + cost_per_lifted_cookie: float = proto.Field( + proto.DOUBLE, + number=516, + optional=True, + ) + cost_per_lifted_cookie_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=517, + optional=True, + ) + cost_per_lifted_cookie_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=518, + optional=True, + ) + fractional_lifted_cookies: float = proto.Field( + proto.DOUBLE, + number=519, + optional=True, + ) + fractional_lifted_cookies_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=520, + optional=True, + ) + fractional_lifted_cookies_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=521, + optional=True, + ) + headroom_brand_lift: float = proto.Field( + proto.DOUBLE, + number=522, + optional=True, + ) + headroom_brand_lift_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=523, + optional=True, + ) + headroom_brand_lift_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=524, + optional=True, + ) + relative_brand_lift: float = proto.Field( + proto.DOUBLE, + number=525, + optional=True, + ) + relative_brand_lift_p90_lower_bound: float = proto.Field( + proto.DOUBLE, + number=526, + optional=True, + ) + relative_brand_lift_p90_upper_bound: float = proto.Field( + proto.DOUBLE, + number=527, + optional=True, + ) youtube_comments: int = proto.Field( proto.INT64, number=528, @@ -3874,6 +4611,11 @@ class Metrics(proto.Message): number=530, optional=True, ) + original_conversion_value: float = proto.Field( + proto.DOUBLE, + number=531, + optional=True, + ) class SearchVolumeRange(proto.Message): diff --git a/google/ads/googleads/v25/common/types/segments.py b/google/ads/googleads/v25/common/types/segments.py index f3bd9c122..5bcb60358 100644 --- a/google/ads/googleads/v25/common/types/segments.py +++ b/google/ads/googleads/v25/common/types/segments.py @@ -35,6 +35,9 @@ ad_sub_network_type as gage_ad_sub_network_type, ) from google.ads.googleads.v25.enums.types import age_range_type +from google.ads.googleads.v25.enums.types import ( + brand_lift_measurement_type as gage_brand_lift_measurement_type, +) from google.ads.googleads.v25.enums.types import ( budget_campaign_association_status as gage_budget_campaign_association_status, ) @@ -48,6 +51,9 @@ from google.ads.googleads.v25.enums.types import ( conversion_lag_bucket as gage_conversion_lag_bucket, ) +from google.ads.googleads.v25.enums.types import ( + conversion_lift_included_conversion_action_types as gage_conversion_lift_included_conversion_action_types, +) from google.ads.googleads.v25.enums.types import ( conversion_or_adjustment_lag_bucket as gage_conversion_or_adjustment_lag_bucket, ) @@ -75,6 +81,9 @@ from google.ads.googleads.v25.enums.types import ( landing_page_source as gage_landing_page_source, ) +from google.ads.googleads.v25.enums.types import ( + loyalty_membership as gage_loyalty_membership, +) from google.ads.googleads.v25.enums.types import match_type as gage_match_type from google.ads.googleads.v25.enums.types import ( mobile_device_platform as gage_mobile_device_platform, @@ -189,6 +198,8 @@ class Segments(proto.Message): Ad sub network type. Currently only available for ads running as part of DemandGen campaigns on YouTube and has to always be selected together with ad_network_type. + age_range (google.ads.googleads.v25.enums.types.AgeRangeTypeEnum.AgeRangeType): + Age range asset_group (str): Resource name of the asset group. @@ -200,6 +211,8 @@ class Segments(proto.Message): This field is a member of `oneof`_ ``_auction_insight_domain``. budget_campaign_association_status (google.ads.googleads.v25.common.types.BudgetCampaignAssociationStatus): Budget campaign association status. + brand_lift_measurement_type (google.ads.googleads.v25.enums.types.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType): + The brand lift measurement type. campaign (str): Resource name of the campaign. @@ -231,11 +244,33 @@ class Segments(proto.Message): conversion_lag_bucket (google.ads.googleads.v25.enums.types.ConversionLagBucketEnum.ConversionLagBucket): An enum value representing the number of days between the impression and the conversion. + conversion_lift_conversion_category (google.ads.googleads.v25.enums.types.ConversionActionCategoryEnum.ConversionActionCategory): + Conversion Category for Conversion Lift. + conversion_lift_end_date (int): + The end date of the period for which these + Conversion Lift results are calculated. This can + differ from the overall Study End Time. + conversion_lift_included_conversion_action_types (google.ads.googleads.v25.enums.types.ConversionLiftIncludedConversionActionTypesEnum.ConversionLiftIncludedConversionActionTypes): + The specific conversion types that were + included in the Conversion Lift measurement for + this reporting period. + conversion_lift_start_date (int): + The start date of the period for which these + Conversion Lift results are calculated. This can + differ from the overall Study Start Time. conversion_or_adjustment_lag_bucket (google.ads.googleads.v25.enums.types.ConversionOrAdjustmentLagBucketEnum.ConversionOrAdjustmentLagBucket): An enum value representing the number of days between the impression and the conversion or between the impression and adjustments to the conversion. + country (str): + Resource name of the country + + This field is a member of `oneof`_ ``_country``. + country_localized_name (str): + Localized name of the country. + + This field is a member of `oneof`_ ``_country_localized_name``. date (str): Date to which metrics apply. yyyy-MM-dd format, for example, 2018-04-17. @@ -248,8 +283,14 @@ class Segments(proto.Message): mobile_device_platform (google.ads.googleads.v25.enums.types.MobileDevicePlatformEnum.MobileDevicePlatform): Mobile device platform to which metrics apply. + experiment_arm (str): + Experiment arm. + + This field is a member of `oneof`_ ``_experiment_arm``. external_conversion_source (google.ads.googleads.v25.enums.types.ExternalConversionSourceEnum.ExternalConversionSource): External conversion source. + gender (google.ads.googleads.v25.enums.types.GenderTypeEnum.GenderType): + Gender geo_target_airport (str): Resource name of the geo target constant that represents an airport. @@ -371,6 +412,9 @@ class Segments(proto.Message): landing_page_source (google.ads.googleads.v25.enums.types.LandingPageSourceEnum.LandingPageSource): The source of a landing page in the landing page report. + loyalty_membership (google.ads.googleads.v25.enums.types.LoyaltyMembershipEnum.LoyaltyMembership): + The user loyalty membership tier, based on + the user belonging to a loyalty program. month (str): Month as represented by the date of the first day of a month. Formatted as yyyy-MM-dd. @@ -889,6 +933,11 @@ class Segments(proto.Message): number=204, enum=gage_ad_sub_network_type.AdSubNetworkTypeEnum.AdSubNetworkType, ) + age_range: age_range_type.AgeRangeTypeEnum.AgeRangeType = proto.Field( + proto.ENUM, + number=225, + enum=age_range_type.AgeRangeTypeEnum.AgeRangeType, + ) asset_group: str = proto.Field( proto.STRING, number=159, @@ -906,6 +955,13 @@ class Segments(proto.Message): message="BudgetCampaignAssociationStatus", ) ) + brand_lift_measurement_type: ( + gage_brand_lift_measurement_type.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType + ) = proto.Field( + proto.ENUM, + number=230, + enum=gage_brand_lift_measurement_type.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType, + ) campaign: str = proto.Field( proto.STRING, number=157, @@ -952,6 +1008,28 @@ class Segments(proto.Message): number=50, enum=gage_conversion_lag_bucket.ConversionLagBucketEnum.ConversionLagBucket, ) + conversion_lift_conversion_category: ( + gage_conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory + ) = proto.Field( + proto.ENUM, + number=229, + enum=gage_conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory, + ) + conversion_lift_end_date: int = proto.Field( + proto.INT64, + number=223, + ) + conversion_lift_included_conversion_action_types: ( + gage_conversion_lift_included_conversion_action_types.ConversionLiftIncludedConversionActionTypesEnum.ConversionLiftIncludedConversionActionTypes + ) = proto.Field( + proto.ENUM, + number=224, + enum=gage_conversion_lift_included_conversion_action_types.ConversionLiftIncludedConversionActionTypesEnum.ConversionLiftIncludedConversionActionTypes, + ) + conversion_lift_start_date: int = proto.Field( + proto.INT64, + number=222, + ) conversion_or_adjustment_lag_bucket: ( gage_conversion_or_adjustment_lag_bucket.ConversionOrAdjustmentLagBucketEnum.ConversionOrAdjustmentLagBucket ) = proto.Field( @@ -959,6 +1037,16 @@ class Segments(proto.Message): number=51, enum=gage_conversion_or_adjustment_lag_bucket.ConversionOrAdjustmentLagBucketEnum.ConversionOrAdjustmentLagBucket, ) + country: str = proto.Field( + proto.STRING, + number=227, + optional=True, + ) + country_localized_name: str = proto.Field( + proto.STRING, + number=228, + optional=True, + ) date: str = proto.Field( proto.STRING, number=79, @@ -981,6 +1069,11 @@ class Segments(proto.Message): number=219, enum=gage_mobile_device_platform.MobileDevicePlatformEnum.MobileDevicePlatform, ) + experiment_arm: str = proto.Field( + proto.STRING, + number=231, + optional=True, + ) external_conversion_source: ( gage_external_conversion_source.ExternalConversionSourceEnum.ExternalConversionSource ) = proto.Field( @@ -988,6 +1081,11 @@ class Segments(proto.Message): number=55, enum=gage_external_conversion_source.ExternalConversionSourceEnum.ExternalConversionSource, ) + gender: gender_type.GenderTypeEnum.GenderType = proto.Field( + proto.ENUM, + number=226, + enum=gender_type.GenderTypeEnum.GenderType, + ) geo_target_airport: str = proto.Field( proto.STRING, number=116, @@ -1143,6 +1241,13 @@ class Segments(proto.Message): number=200, enum=gage_landing_page_source.LandingPageSourceEnum.LandingPageSource, ) + loyalty_membership: ( + gage_loyalty_membership.LoyaltyMembershipEnum.LoyaltyMembership + ) = proto.Field( + proto.ENUM, + number=233, + enum=gage_loyalty_membership.LoyaltyMembershipEnum.LoyaltyMembership, + ) month: str = proto.Field( proto.STRING, number=90, diff --git a/google/ads/googleads/v25/enums/__init__.py b/google/ads/googleads/v25/enums/__init__.py index 17d7b8bee..e3ea1ff32 100644 --- a/google/ads/googleads/v25/enums/__init__.py +++ b/google/ads/googleads/v25/enums/__init__.py @@ -105,6 +105,7 @@ "google.ads.googleads.v25.types.bidding_strategy_type", "google.ads.googleads.v25.types.billing_setup_status", "google.ads.googleads.v25.types.booking_status", + "google.ads.googleads.v25.types.brand_lift_measurement_type", "google.ads.googleads.v25.types.brand_request_rejection_reason", "google.ads.googleads.v25.types.brand_safety_suitability", "google.ads.googleads.v25.types.brand_state", @@ -149,6 +150,7 @@ "google.ads.googleads.v25.types.conversion_customer_type", "google.ads.googleads.v25.types.conversion_environment_enum", "google.ads.googleads.v25.types.conversion_lag_bucket", + "google.ads.googleads.v25.types.conversion_lift_included_conversion_action_types", "google.ads.googleads.v25.types.conversion_or_adjustment_lag_bucket", "google.ads.googleads.v25.types.conversion_origin", "google.ads.googleads.v25.types.conversion_tracking_status_enum", @@ -237,6 +239,8 @@ "google.ads.googleads.v25.types.lead_form_field_user_input_type", "google.ads.googleads.v25.types.lead_form_post_submit_call_to_action_type", "google.ads.googleads.v25.types.legacy_app_install_ad_app_store", + "google.ads.googleads.v25.types.lift_measurement_flight_status", + "google.ads.googleads.v25.types.lift_metric_type", "google.ads.googleads.v25.types.linked_account_type", "google.ads.googleads.v25.types.linked_product_type", "google.ads.googleads.v25.types.listing_group_filter_custom_attribute_index", @@ -271,6 +275,7 @@ "google.ads.googleads.v25.types.location_source_type", "google.ads.googleads.v25.types.location_string_filter_type", "google.ads.googleads.v25.types.lookalike_expansion_level", + "google.ads.googleads.v25.types.loyalty_membership", "google.ads.googleads.v25.types.manager_link_status", "google.ads.googleads.v25.types.match_type", "google.ads.googleads.v25.types.media_type", @@ -349,6 +354,7 @@ "google.ads.googleads.v25.types.search_term_targeting_status", "google.ads.googleads.v25.types.seasonality_event_scope", "google.ads.googleads.v25.types.seasonality_event_status", + "google.ads.googleads.v25.types.sentiment", "google.ads.googleads.v25.types.served_asset_field_type", "google.ads.googleads.v25.types.shared_set_status", "google.ads.googleads.v25.types.shared_set_type", @@ -365,6 +371,9 @@ "google.ads.googleads.v25.types.smart_campaign_status", "google.ads.googleads.v25.types.spending_limit_type", "google.ads.googleads.v25.types.summary_row_setting", + "google.ads.googleads.v25.types.survey_intended_action", + "google.ads.googleads.v25.types.survey_lift_flight_target_response_mode", + "google.ads.googleads.v25.types.survey_subject_type", "google.ads.googleads.v25.types.synthetic_content_attestation_status", "google.ads.googleads.v25.types.synthetic_content_source", "google.ads.googleads.v25.types.system_managed_entity_source", @@ -527,6 +536,7 @@ from .types.bidding_strategy_type import BiddingStrategyTypeEnum from .types.billing_setup_status import BillingSetupStatusEnum from .types.booking_status import BookingStatusEnum +from .types.brand_lift_measurement_type import BrandLiftMeasurementTypeEnum from .types.brand_request_rejection_reason import ( BrandRequestRejectionReasonEnum, ) @@ -591,6 +601,9 @@ from .types.conversion_customer_type import ConversionCustomerTypeEnum from .types.conversion_environment_enum import ConversionEnvironmentEnum from .types.conversion_lag_bucket import ConversionLagBucketEnum +from .types.conversion_lift_included_conversion_action_types import ( + ConversionLiftIncludedConversionActionTypesEnum, +) from .types.conversion_or_adjustment_lag_bucket import ( ConversionOrAdjustmentLagBucketEnum, ) @@ -725,6 +738,10 @@ from .types.legacy_app_install_ad_app_store import ( LegacyAppInstallAdAppStoreEnum, ) +from .types.lift_measurement_flight_status import ( + LiftMeasurementFlightStatusEnum, +) +from .types.lift_metric_type import LiftMetricTypeEnum from .types.linked_account_type import LinkedAccountTypeEnum from .types.linked_product_type import LinkedProductTypeEnum from .types.listing_group_filter_custom_attribute_index import ( @@ -799,6 +816,7 @@ from .types.location_source_type import LocationSourceTypeEnum from .types.location_string_filter_type import LocationStringFilterTypeEnum from .types.lookalike_expansion_level import LookalikeExpansionLevelEnum +from .types.loyalty_membership import LoyaltyMembershipEnum from .types.manager_link_status import ManagerLinkStatusEnum from .types.match_type import MatchTypeEnum from .types.media_type import MediaTypeEnum @@ -917,6 +935,7 @@ from .types.search_term_targeting_status import SearchTermTargetingStatusEnum from .types.seasonality_event_scope import SeasonalityEventScopeEnum from .types.seasonality_event_status import SeasonalityEventStatusEnum +from .types.sentiment import SentimentEnum from .types.served_asset_field_type import ServedAssetFieldTypeEnum from .types.shared_set_status import SharedSetStatusEnum from .types.shared_set_type import SharedSetTypeEnum @@ -943,6 +962,11 @@ from .types.smart_campaign_status import SmartCampaignStatusEnum from .types.spending_limit_type import SpendingLimitTypeEnum from .types.summary_row_setting import SummaryRowSettingEnum +from .types.survey_intended_action import SurveyIntendedActionEnum +from .types.survey_lift_flight_target_response_mode import ( + SurveyLiftFlightTargetResponseModeEnum, +) +from .types.survey_subject_type import SurveySubjectTypeEnum from .types.synthetic_content_attestation_status import ( SyntheticContentAttestationStatusEnum, ) @@ -1195,6 +1219,7 @@ def _get_version(dependency_name): "BiddingStrategyTypeEnum", "BillingSetupStatusEnum", "BookingStatusEnum", + "BrandLiftMeasurementTypeEnum", "BrandRequestRejectionReasonEnum", "BrandSafetySuitabilityEnum", "BrandStateEnum", @@ -1239,6 +1264,7 @@ def _get_version(dependency_name): "ConversionCustomerTypeEnum", "ConversionEnvironmentEnum", "ConversionLagBucketEnum", + "ConversionLiftIncludedConversionActionTypesEnum", "ConversionOrAdjustmentLagBucketEnum", "ConversionOriginEnum", "ConversionTrackingStatusEnum", @@ -1327,6 +1353,8 @@ def _get_version(dependency_name): "LeadFormFieldUserInputTypeEnum", "LeadFormPostSubmitCallToActionTypeEnum", "LegacyAppInstallAdAppStoreEnum", + "LiftMeasurementFlightStatusEnum", + "LiftMetricTypeEnum", "LinkedAccountTypeEnum", "LinkedProductTypeEnum", "ListingGroupFilterCustomAttributeIndexEnum", @@ -1361,6 +1389,7 @@ def _get_version(dependency_name): "LocationSourceTypeEnum", "LocationStringFilterTypeEnum", "LookalikeExpansionLevelEnum", + "LoyaltyMembershipEnum", "ManagerLinkStatusEnum", "MatchTypeEnum", "MediaTypeEnum", @@ -1439,6 +1468,7 @@ def _get_version(dependency_name): "SearchTermTargetingStatusEnum", "SeasonalityEventScopeEnum", "SeasonalityEventStatusEnum", + "SentimentEnum", "ServedAssetFieldTypeEnum", "SharedSetStatusEnum", "SharedSetTypeEnum", @@ -1455,6 +1485,9 @@ def _get_version(dependency_name): "SmartCampaignStatusEnum", "SpendingLimitTypeEnum", "SummaryRowSettingEnum", + "SurveyIntendedActionEnum", + "SurveyLiftFlightTargetResponseModeEnum", + "SurveySubjectTypeEnum", "SyntheticContentAttestationStatusEnum", "SyntheticContentSourceEnum", "SystemManagedResourceSourceEnum", diff --git a/google/ads/googleads/v25/enums/types/__init__.py b/google/ads/googleads/v25/enums/types/__init__.py index 1e7b1c14a..9919db1f7 100644 --- a/google/ads/googleads/v25/enums/types/__init__.py +++ b/google/ads/googleads/v25/enums/types/__init__.py @@ -241,6 +241,9 @@ from .booking_status import ( BookingStatusEnum, ) +from .brand_lift_measurement_type import ( + BrandLiftMeasurementTypeEnum, +) from .brand_request_rejection_reason import ( BrandRequestRejectionReasonEnum, ) @@ -373,6 +376,9 @@ from .conversion_lag_bucket import ( ConversionLagBucketEnum, ) +from .conversion_lift_included_conversion_action_types import ( + ConversionLiftIncludedConversionActionTypesEnum, +) from .conversion_or_adjustment_lag_bucket import ( ConversionOrAdjustmentLagBucketEnum, ) @@ -637,6 +643,12 @@ from .legacy_app_install_ad_app_store import ( LegacyAppInstallAdAppStoreEnum, ) +from .lift_measurement_flight_status import ( + LiftMeasurementFlightStatusEnum, +) +from .lift_metric_type import ( + LiftMetricTypeEnum, +) from .linked_account_type import ( LinkedAccountTypeEnum, ) @@ -739,6 +751,9 @@ from .lookalike_expansion_level import ( LookalikeExpansionLevelEnum, ) +from .loyalty_membership import ( + LoyaltyMembershipEnum, +) from .manager_link_status import ( ManagerLinkStatusEnum, ) @@ -973,6 +988,9 @@ from .seasonality_event_status import ( SeasonalityEventStatusEnum, ) +from .sentiment import ( + SentimentEnum, +) from .served_asset_field_type import ( ServedAssetFieldTypeEnum, ) @@ -1021,6 +1039,15 @@ from .summary_row_setting import ( SummaryRowSettingEnum, ) +from .survey_intended_action import ( + SurveyIntendedActionEnum, +) +from .survey_lift_flight_target_response_mode import ( + SurveyLiftFlightTargetResponseModeEnum, +) +from .survey_subject_type import ( + SurveySubjectTypeEnum, +) from .synthetic_content_attestation_status import ( SyntheticContentAttestationStatusEnum, ) @@ -1252,6 +1279,7 @@ "BiddingStrategyTypeEnum", "BillingSetupStatusEnum", "BookingStatusEnum", + "BrandLiftMeasurementTypeEnum", "BrandRequestRejectionReasonEnum", "BrandSafetySuitabilityEnum", "BrandStateEnum", @@ -1296,6 +1324,7 @@ "ConversionCustomerTypeEnum", "ConversionEnvironmentEnum", "ConversionLagBucketEnum", + "ConversionLiftIncludedConversionActionTypesEnum", "ConversionOrAdjustmentLagBucketEnum", "ConversionOriginEnum", "ConversionTrackingStatusEnum", @@ -1384,6 +1413,8 @@ "LeadFormFieldUserInputTypeEnum", "LeadFormPostSubmitCallToActionTypeEnum", "LegacyAppInstallAdAppStoreEnum", + "LiftMeasurementFlightStatusEnum", + "LiftMetricTypeEnum", "LinkedAccountTypeEnum", "LinkedProductTypeEnum", "ListingGroupFilterCustomAttributeIndexEnum", @@ -1418,6 +1449,7 @@ "LocationSourceTypeEnum", "LocationStringFilterTypeEnum", "LookalikeExpansionLevelEnum", + "LoyaltyMembershipEnum", "ManagerLinkStatusEnum", "MatchTypeEnum", "MediaTypeEnum", @@ -1496,6 +1528,7 @@ "SearchTermTargetingStatusEnum", "SeasonalityEventScopeEnum", "SeasonalityEventStatusEnum", + "SentimentEnum", "ServedAssetFieldTypeEnum", "SharedSetStatusEnum", "SharedSetTypeEnum", @@ -1512,6 +1545,9 @@ "SmartCampaignStatusEnum", "SpendingLimitTypeEnum", "SummaryRowSettingEnum", + "SurveyIntendedActionEnum", + "SurveyLiftFlightTargetResponseModeEnum", + "SurveySubjectTypeEnum", "SyntheticContentAttestationStatusEnum", "SyntheticContentSourceEnum", "SystemManagedResourceSourceEnum", diff --git a/google/ads/googleads/v25/enums/types/asset_field_type.py b/google/ads/googleads/v25/enums/types/asset_field_type.py index f27e625f7..699df76c2 100644 --- a/google/ads/googleads/v25/enums/types/asset_field_type.py +++ b/google/ads/googleads/v25/enums/types/asset_field_type.py @@ -145,6 +145,9 @@ class AssetFieldType(proto.Enum): CLASSIC_DISPLAY_IMAGE (47): The asset is linked for use as a classic display image. + TEXT_DISCLAIMER (48): + The asset is linked for use as a text + disclaimer. """ UNSPECIFIED = 0 @@ -184,6 +187,7 @@ class AssetFieldType(proto.Enum): LONG_DESCRIPTION = 39 CALL_TO_ACTION = 40 CLASSIC_DISPLAY_IMAGE = 47 + TEXT_DISCLAIMER = 48 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/benchmarks_source_type.py b/google/ads/googleads/v25/enums/types/benchmarks_source_type.py index b70c74cb2..92c15addb 100644 --- a/google/ads/googleads/v25/enums/types/benchmarks_source_type.py +++ b/google/ads/googleads/v25/enums/types/benchmarks_source_type.py @@ -43,11 +43,14 @@ class BenchmarksSourceType(proto.Enum): The classification of ad categories for benchmarking. (for example, "Technology" or "Finance"). + CATEGORY (3): + A Product & Service Category. """ UNSPECIFIED = 0 UNKNOWN = 1 INDUSTRY_VERTICAL = 2 + CATEGORY = 3 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/brand_lift_measurement_type.py b/google/ads/googleads/v25/enums/types/brand_lift_measurement_type.py new file mode 100644 index 000000000..13f669d74 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/brand_lift_measurement_type.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "BrandLiftMeasurementTypeEnum", + }, +) + + +class BrandLiftMeasurementTypeEnum(proto.Message): + r"""Container for enum describing the type of brand lift + measurement types. + + """ + + class BrandLiftMeasurementType(proto.Enum): + r"""Enum describing the type of brand lift measurement types. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Used for return value only. Represents value + unknown in this version. + RECALL (2): + Ad Recall. + AWARENESS (3): + Awareness. + CONSIDERATION (4): + Consideration. + FAVORABILITY (5): + Favorability. + PURCHASE_INTENT (6): + Purchase Intent. + CUSTOM (7): + Custom. + ASSOCIATION (8): + Association. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + RECALL = 2 + AWARENESS = 3 + CONSIDERATION = 4 + FAVORABILITY = 5 + PURCHASE_INTENT = 6 + CUSTOM = 7 + ASSOCIATION = 8 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/content_creator_insights_supplemental_data.py b/google/ads/googleads/v25/enums/types/content_creator_insights_supplemental_data.py index ca08759b2..ecaeb701b 100644 --- a/google/ads/googleads/v25/enums/types/content_creator_insights_supplemental_data.py +++ b/google/ads/googleads/v25/enums/types/content_creator_insights_supplemental_data.py @@ -42,6 +42,16 @@ class ContentCreatorInsightsSupplementalData(proto.Enum): Not specified. UNKNOWN (1): The value is unknown in this version. + BRAND_SENTIMENT_DATA (2): + Populate brand sentiment data in + [ContentCreatorInsightsService.GenerateTrendingInsights][google.ads.googleads.v25.services.ContentCreatorInsightsService.GenerateTrendingInsights]. + This is only available when requesting trending insights for + a brand topic. A brand topic is a Knowledge Graph entity + that is tagged with + [BRAND][google.ads.googleads.v25.enums.InsightsKnowledgeGraphEntityCapabilitiesEnum.InsightsKnowledgeGraphEntityCapabilities.BRAND]. + Use + [AudienceInsightsService.ListAudienceInsightsAttributes][] + to get the list of supported Knowledge Graph entities. LOCAL_CREATOR_DATA (3): Populate local creator data in [ContentCreatorInsightsService.GenerateTrendingInsights][google.ads.googleads.v25.services.ContentCreatorInsightsService.GenerateTrendingInsights] @@ -64,6 +74,7 @@ class ContentCreatorInsightsSupplementalData(proto.Enum): UNSPECIFIED = 0 UNKNOWN = 1 + BRAND_SENTIMENT_DATA = 2 LOCAL_CREATOR_DATA = 3 diff --git a/google/ads/googleads/v25/enums/types/conversion_lift_included_conversion_action_types.py b/google/ads/googleads/v25/enums/types/conversion_lift_included_conversion_action_types.py new file mode 100644 index 000000000..a5febc05d --- /dev/null +++ b/google/ads/googleads/v25/enums/types/conversion_lift_included_conversion_action_types.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "ConversionLiftIncludedConversionActionTypesEnum", + }, +) + + +class ConversionLiftIncludedConversionActionTypesEnum(proto.Message): + r"""Container for enum describing the type of conversion lift + included conversion types. + + """ + + class ConversionLiftIncludedConversionActionTypes(proto.Enum): + r"""Enum describing the type of conversion lift included + conversion types. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Used for return value only. Represents value + unknown in this version. + ALL (2): + All conversion types from selected campaigns. + SELECTED (3): + Selected conversion types. All biddable + conversion types or selected conversion types + during the setup of the measurement. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + ALL = 2 + SELECTED = 3 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/conversion_value_rule_primary_dimension.py b/google/ads/googleads/v25/enums/types/conversion_value_rule_primary_dimension.py index 7a676d99b..bfd1bf810 100644 --- a/google/ads/googleads/v25/enums/types/conversion_value_rule_primary_dimension.py +++ b/google/ads/googleads/v25/enums/types/conversion_value_rule_primary_dimension.py @@ -67,6 +67,9 @@ class ConversionValueRulePrimaryDimension(proto.Enum): ITINERARY (9): When a query-time itinerary condition is satisfied. + LOYALTY_MEMBERSHIP (10): + When a loyalty membership condition is + satisfied. """ UNSPECIFIED = 0 @@ -79,6 +82,7 @@ class ConversionValueRulePrimaryDimension(proto.Enum): AUDIENCE = 7 MULTIPLE = 8 ITINERARY = 9 + LOYALTY_MEMBERSHIP = 10 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/criterion_type.py b/google/ads/googleads/v25/enums/types/criterion_type.py index 8de675da8..7e1513171 100644 --- a/google/ads/googleads/v25/enums/types/criterion_type.py +++ b/google/ads/googleads/v25/enums/types/criterion_type.py @@ -133,6 +133,8 @@ class CriterionType(proto.Enum): Ads. VERTICAL_ADS_ITEM_GROUP_RULE (46): A rule for an item group in Vertical Ads. + VERTICAL_ADS_ITEM_BID (47): + A bid for a Vertical Ads item. RETAIL_FILTER_BUNDLE (180): Retail Filter Bundle for linking a retail filter shared set to an ad group. @@ -188,6 +190,7 @@ class CriterionType(proto.Enum): PLACEMENT_LIST = 44 VERTICAL_ADS_ITEM_GROUP_RULE_LIST = 45 VERTICAL_ADS_ITEM_GROUP_RULE = 46 + VERTICAL_ADS_ITEM_BID = 47 RETAIL_FILTER_BUNDLE = 180 RETAIL_FILTER = 181 diff --git a/google/ads/googleads/v25/enums/types/goal_type.py b/google/ads/googleads/v25/enums/types/goal_type.py index 9471add05..047e3f867 100644 --- a/google/ads/googleads/v25/enums/types/goal_type.py +++ b/google/ads/googleads/v25/enums/types/goal_type.py @@ -43,7 +43,9 @@ class GoalType(proto.Enum): CUSTOMER_RETENTION (3): Retention goal, which allows advertisers to optimize campaigns to win back lapsed customers. - (https://support.google.com/google-ads/answer/14792043?hl=en) + See + https://support.google.com/google-ads/answer/14792043 + to learn more. NEW_CUSTOMER_ACQUISITION (4): New customer acquisition goal, which allows advertisers to optimize campaigns to acquire new diff --git a/google/ads/googleads/v25/enums/types/insights_knowledge_graph_entity_capabilities.py b/google/ads/googleads/v25/enums/types/insights_knowledge_graph_entity_capabilities.py index dd269430a..103c05c24 100644 --- a/google/ads/googleads/v25/enums/types/insights_knowledge_graph_entity_capabilities.py +++ b/google/ads/googleads/v25/enums/types/insights_knowledge_graph_entity_capabilities.py @@ -50,6 +50,10 @@ class InsightsKnowledgeGraphEntityCapabilities(proto.Enum): [ContentCreatorInsightsService.GenerateCreatorInsights][google.ads.googleads.v25.services.ContentCreatorInsightsService.GenerateCreatorInsights] in field [GenerateCreatorInsightsRequest.search_attributes.creator_attributes][google.ads.googleads.v25.services.GenerateCreatorInsightsRequest.SearchAttributes.creator_attributes]. + BRAND (4): + An entity that represents a brand. This + entity supports brand capabilities, such as + brand sentiment. CREATOR_TOPIC_INSIGHTS (5): An entity that is supported to use as a topic in [ContentCreatorInsightsService.GenerateCreatorInsights] @@ -62,6 +66,7 @@ class InsightsKnowledgeGraphEntityCapabilities(proto.Enum): UNKNOWN = 1 CONTENT_TRENDING_INSIGHTS = 2 CREATOR_ATTRIBUTE = 3 + BRAND = 4 CREATOR_TOPIC_INSIGHTS = 5 diff --git a/google/ads/googleads/v25/enums/types/lift_measurement_flight_status.py b/google/ads/googleads/v25/enums/types/lift_measurement_flight_status.py new file mode 100644 index 000000000..2d9edc288 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/lift_measurement_flight_status.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementFlightStatusEnum", + }, +) + + +class LiftMeasurementFlightStatusEnum(proto.Message): + r"""Container for enum describing the status of a + LiftMeasurementFlight. + + """ + + class LiftMeasurementFlightStatus(proto.Enum): + r"""Status of a LiftMeasurementFlight. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Used for return value only. Represents value + unknown in this version. + ENABLED (2): + The flight is enabled. + STOPPED (3): + The flight has been stopped. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + ENABLED = 2 + STOPPED = 3 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/lift_metric_type.py b/google/ads/googleads/v25/enums/types/lift_metric_type.py new file mode 100644 index 000000000..429602db7 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/lift_metric_type.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMetricTypeEnum", + }, +) + + +class LiftMetricTypeEnum(proto.Message): + r"""Container for enum describing the type of lift being studied.""" + + class LiftMetricType(proto.Enum): + r"""Specifies the type of lift being studied. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Used for return value only. Represents value + unknown in this version. + CONVERSION (2): + Conversion lift is running on this set of + campaigns. + SEARCH (3): + Search lift is running on this set of + campaigns. + SURVEY (4): + Survey lift is running on this set of + campaigns. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + CONVERSION = 2 + SEARCH = 3 + SURVEY = 4 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/loyalty_membership.py b/google/ads/googleads/v25/enums/types/loyalty_membership.py new file mode 100644 index 000000000..dc5221833 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/loyalty_membership.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "LoyaltyMembershipEnum", + }, +) + + +class LoyaltyMembershipEnum(proto.Message): + r"""Container for enumeration of loyalty membership.""" + + class LoyaltyMembership(proto.Enum): + r"""Enumerates loyalty membership. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Unknown. + NONMEMBER (2): + The user is not a member of the loyalty + program. + TIER1 (3): + The user is a tier 1 member of the loyalty + program. + TIER2 (4): + The user is a tier 2 member of the loyalty + program. + TIER3 (5): + The user is a tier 3 member of the loyalty + program. + TIER4 (6): + The user is a tier 4 member of the loyalty + program. + TIER5 (7): + The user is a tier 5 member of the loyalty + program. + TIER6 (8): + The user is a tier 6 member of the loyalty + program. + TIER7 (9): + The user is a tier 7 member of the loyalty + program. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + NONMEMBER = 2 + TIER1 = 3 + TIER2 = 4 + TIER3 = 5 + TIER4 = 6 + TIER5 = 7 + TIER6 = 8 + TIER7 = 9 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/recommendation_type.py b/google/ads/googleads/v25/enums/types/recommendation_type.py index 4d061d4d2..c6636942a 100644 --- a/google/ads/googleads/v25/enums/types/recommendation_type.py +++ b/google/ads/googleads/v25/enums/types/recommendation_type.py @@ -222,6 +222,9 @@ class RecommendationType(proto.Enum): IMPROVE_DEMAND_GEN_AD_STRENGTH (58): Recommendation to improve the strength of ads in Demand Gen campaigns. + CAMPAIGN_SPECIFIC_APP_GOAL (59): + Recommendation to add a campaign-specific app + conversion goal. """ UNSPECIFIED = 0 @@ -282,6 +285,7 @@ class RecommendationType(proto.Enum): CUSTOM_AUDIENCE_OPT_IN = 56 LEAD_FORM_ASSET = 57 IMPROVE_DEMAND_GEN_AD_STRENGTH = 58 + CAMPAIGN_SPECIFIC_APP_GOAL = 59 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/sentiment.py b/google/ads/googleads/v25/enums/types/sentiment.py new file mode 100644 index 000000000..9e23416e3 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/sentiment.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "SentimentEnum", + }, +) + + +class SentimentEnum(proto.Message): + r"""Container for the enum describing sentiment.""" + + class Sentiment(proto.Enum): + r"""Sentiment for a brand - how a brand is viewed according to + content related to the brand. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + The value is unknown in this version. + SENTIMENT_NEUTRAL (2): + The sentiment is neutral; often this label is + attributed to content that is instructional + (how-to videos). + SENTIMENT_POSITIVE (3): + The sentiment is positive. + SENTIMENT_NEGATIVE (4): + The sentiment is negative. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + SENTIMENT_NEUTRAL = 2 + SENTIMENT_POSITIVE = 3 + SENTIMENT_NEGATIVE = 4 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/served_asset_field_type.py b/google/ads/googleads/v25/enums/types/served_asset_field_type.py index 0daee0d70..18cf27c9f 100644 --- a/google/ads/googleads/v25/enums/types/served_asset_field_type.py +++ b/google/ads/googleads/v25/enums/types/served_asset_field_type.py @@ -126,6 +126,8 @@ class ServedAssetFieldType(proto.Enum): DESCRIPTION_LINE_HEADLINE_AS_SITELINK_POSITION_TWO (42): A description line asset used as a sitelink in position 2. + TEXT_DISCLAIMER (43): + The asset is used as a text disclaimer. """ UNSPECIFIED = 0 @@ -165,6 +167,7 @@ class ServedAssetFieldType(proto.Enum): HEADLINE_AS_SITELINK_POSITION_TWO = 40 DESCRIPTION_LINE_HEADLINE_AS_SITELINK_POSITION_ONE = 41 DESCRIPTION_LINE_HEADLINE_AS_SITELINK_POSITION_TWO = 42 + TEXT_DISCLAIMER = 43 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/survey_intended_action.py b/google/ads/googleads/v25/enums/types/survey_intended_action.py new file mode 100644 index 000000000..424ca20b1 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/survey_intended_action.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "SurveyIntendedActionEnum", + }, +) + + +class SurveyIntendedActionEnum(proto.Message): + r"""Container for enum""" + + class SurveyIntendedAction(proto.Enum): + r"""The enum + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Unknown value. + APPLY_FOR (2): + Apply For + APPLY_TO_WORK_FOR (3): + Apply To Work For + ATTEND (4): + Attend + BOOK (5): + Book + BOOK_WITH (6): + Book With + BUY (7): + Buy + BUY_CONTENT_FROM (8): + Buy Content From + BUY_TICKETS_FOR (9): + Buy Tickets For + CARE_ABOUT (10): + Care About + CHOOSE (11): + Choose + DONATE_TO (12): + Donate To + DOWNLOAD (13): + Download + DOWNLOAD_FROM (14): + Download From + EAT (15): + Eat + EAT_AT (16): + Eat At + HAVE_UNFAVORABLE_OPINION_OF (17): + Have Unfavorable Opinion Of + JOIN (18): + Join + LEARN (19): + Learn + LISTEN_TO (20): + Listen To + NONE (21): + None + ORDER_FROM (22): + Order From + PARTICIPATE_IN (23): + Participate In + PLAY (24): + Play + PLAY_AT (25): + Play At + PLAY_ON (26): + Play On + RENT (27): + Rent + SEE (28): + See + SEE_IN_THEATERS (29): + See In Theaters + SHOP (30): + Shop + SIGN_UP_FOR (31): + Sign Up For + SUBSCRIBE_TO (32): + Subscribe To + TAKE_ACTION_ON (33): + Take Action On + USE (34): + Use + VISIT (35): + Visit + VOTE_FOR (36): + Vote For + WATCH (37): + Watch + WATCH_IN_THEATERS (38): + Watch In Theaters + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + APPLY_FOR = 2 + APPLY_TO_WORK_FOR = 3 + ATTEND = 4 + BOOK = 5 + BOOK_WITH = 6 + BUY = 7 + BUY_CONTENT_FROM = 8 + BUY_TICKETS_FOR = 9 + CARE_ABOUT = 10 + CHOOSE = 11 + DONATE_TO = 12 + DOWNLOAD = 13 + DOWNLOAD_FROM = 14 + EAT = 15 + EAT_AT = 16 + HAVE_UNFAVORABLE_OPINION_OF = 17 + JOIN = 18 + LEARN = 19 + LISTEN_TO = 20 + NONE = 21 + ORDER_FROM = 22 + PARTICIPATE_IN = 23 + PLAY = 24 + PLAY_AT = 25 + PLAY_ON = 26 + RENT = 27 + SEE = 28 + SEE_IN_THEATERS = 29 + SHOP = 30 + SIGN_UP_FOR = 31 + SUBSCRIBE_TO = 32 + TAKE_ACTION_ON = 33 + USE = 34 + VISIT = 35 + VOTE_FOR = 36 + WATCH = 37 + WATCH_IN_THEATERS = 38 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/survey_lift_flight_target_response_mode.py b/google/ads/googleads/v25/enums/types/survey_lift_flight_target_response_mode.py new file mode 100644 index 000000000..77172623a --- /dev/null +++ b/google/ads/googleads/v25/enums/types/survey_lift_flight_target_response_mode.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "SurveyLiftFlightTargetResponseModeEnum", + }, +) + + +class SurveyLiftFlightTargetResponseModeEnum(proto.Message): + r"""Container for enum describing the Survey Lift target response + mode. + + """ + + class SurveyLiftFlightTargetResponseMode(proto.Enum): + r"""Sets the Survey Lift (a.k.a. Brand Lift) + LiftMeasurementFlight's survey response target and target + completion days. + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Used for return value only. Represents value + unknown in this version. + STANDARD (2): + The LiftMeasurementFlight is not eligible for + boosted measurement. + BOOST (3): + The LiftMeasurementFlight is eligible for + boosted measurement. + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + STANDARD = 2 + BOOST = 3 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/enums/types/survey_subject_type.py b/google/ads/googleads/v25/enums/types/survey_subject_type.py new file mode 100644 index 000000000..4789b4799 --- /dev/null +++ b/google/ads/googleads/v25/enums/types/survey_subject_type.py @@ -0,0 +1,735 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.enums", + marshal="google.ads.googleads.v25", + manifest={ + "SurveySubjectTypeEnum", + }, +) + + +class SurveySubjectTypeEnum(proto.Message): + r"""Container for enum""" + + class SurveySubjectType(proto.Enum): + r"""The enum + + Values: + UNSPECIFIED (0): + Not specified. + UNKNOWN (1): + Unknown value. + GENERIC_BRAND (2): + Generic Brand + GENERIC_PRODUCT (3): + Generic Product + GENERIC_SERVICE (4): + Generic Service + APP (5): + App + APPS_DATING_SERVICES (6): + Apps Dating Services + APPS_PODCASTS (7): + Apps Podcasts + APPS_DIGITAL_COMICS (8): + Apps Digital Comics + AUTOMOTIVE_BATTERY (9): + Automotive Battery + AUTOMOTIVE_BRAND (10): + Automotive Brand + AUTOMOTIVE_CAR_RENTAL (11): + Automotive Car Rental + AUTOMOTIVE_CAR_SERVICE (12): + Automotive Car Service + AUTOMOTIVE_ELECTRIC_CAR_BRAND (13): + Automotive Electric Car Brand + AUTOMOTIVE_GAS_STATIONS (14): + Automotive Gas Stations + AUTOMOTIVE_MOTORCYCLE (15): + Automotive Motorcycle + AUTOMOTIVE_OIL (16): + Automotive Oil + AUTOMOTIVE_PRODUCT (17): + Automotive Product + AUTOMOTIVE_TIRES_BRAND (18): + Automotive Tires Brand + BIM_COMPANY (19): + Bim Company + BIM_ENTERPRISE_SERVICES_COMPANY (20): + Bim Enterprise Services Company + BIM_JOB (21): + Bim Job + BIM_MARKETING_COMPANY (22): + Bim Marketing Company + BIM_RECRUITING (23): + Bim Recruiting + BIM_SHIPPING (24): + Bim Shipping + CPG_BABY_CARE_BRAND (25): + Cpg Baby Care Brand + CPG_BABY_CARE_PRODUCT (26): + Cpg Baby Care Product + CPG_BEAUTY_BRAND (27): + Cpg Beauty Brand + CPG_BEAUTY_PRODUCT (28): + Cpg Beauty Product + CPG_BEAUTY_AND_PERSONAL_CARE_BRAND (29): + Cpg Beauty And Personal Care Brand + CPG_BEAUTY_AND_PERSONAL_CARE_PRODUCT (30): + Cpg Beauty And Personal Care Product + CPG_BODY_WASH_BRAND (31): + Cpg Body Wash Brand + CPG_BODY_WASH_PRODUCT (32): + Cpg Body Wash Product + CPG_DRAIN_CLEANERS (33): + Cpg Drain Cleaners + CPG_FRAGRANCE_BRAND (34): + Cpg Fragrance Brand + CPG_FRAGRANCE_PRODUCT (35): + Cpg Fragrance Product + CPG_HAIR_CARE_BRAND (36): + Cpg Hair Care Brand + CPG_HAIR_CARE_PRODUCT (37): + Cpg Hair Care Product + CPG_HOUSEHOLD_CLEANING_BRAND (38): + Cpg Household Cleaning Brand + CPG_HOUSEHOLD_CLEANING_PRODUCT (39): + Cpg Household Cleaning Product + CPG_LAUNDRY_BRAND (40): + Cpg Laundry Brand + CPG_MAKE_UP_BRAND (41): + Cpg Make Up Brand + CPG_MAKE_UP_PRODUCT (42): + Cpg Make Up Product + CPG_MOUTHWASH_BRAND (43): + Cpg Mouthwash Brand + CPG_OFFICE_SUPPLIES_BRAND (44): + Cpg Office Supplies Brand + CPG_OFFICE_SUPPLIES_PRODUCT (45): + Cpg Office Supplies Product + CPG_ORAL_CARE_BRAND (46): + Cpg Oral Care Brand + CPG_PERSONAL_CARE_BRAND (47): + Cpg Personal Care Brand + CPG_PERSONAL_CARE_PRODUCT (48): + Cpg Personal Care Product + CPG_SKIN_CARE_BRAND (49): + Cpg Skin Care Brand + CPG_SKIN_CARE_PRODUCT (50): + Cpg Skin Care Product + EDUCATION_BUSINESS_PROGRAMS (51): + Education Business Programs + EDUCATION_MASTERS_PROGRAMS (52): + Education Masters Programs + EDUCATION_NURSING_PROGRAMS (53): + Education Nursing Programs + EDUCATION_IT_PROGRAMS (54): + Education It Programs + EDUCATION_OFFLINE (55): + Education Offline + EDUCATION_ONLINE (56): + Education Online + EDUCATION_PROGRAM (57): + Education Program + EDUCATION_TEST_PREPARATION (58): + Education Test Preparation + FBR_BEER_BRAND (59): + Fbr Beer Brand + FBR_BEVERAGE_BRAND (60): + Fbr Beverage Brand + FBR_BEVERAGE_PRODUCT (61): + Fbr Beverage Product + FBR_BREAKFAST_FOOD_BRAND (62): + Fbr Breakfast Food Brand + FBR_BREAKFAST_FOOD_PRODUCT (63): + Fbr Breakfast Food Product + FBR_CANDY (64): + Fbr Candy + FBR_CHEESE (65): + Fbr Cheese + FBR_CHIPS_BRAND (66): + Fbr Chips Brand + FBR_CHIPS_PRODUCT (67): + Fbr Chips Product + FBR_CHOCOLATE_BRAND (68): + Fbr Chocolate Brand + FBR_CHOCOLATE_PRODUCT (69): + Fbr Chocolate Product + FBR_COFFEE_BRAND (70): + Fbr Coffee Brand + FBR_COFFEE_PRODUCT (71): + Fbr Coffee Product + FBR_COLD_DRINK_BRAND (72): + Fbr Cold Drink Brand + FBR_COLD_DRINK_PRODUCT (73): + Fbr Cold Drink Product + FBR_COOKIES (74): + Fbr Cookies + FBR_DOGFOOD_BRAND (75): + Fbr Dogfood Brand + FBR_DOGFOOD_PRODUCT (76): + Fbr Dogfood Product + FBR_DOG_TREATS_BRAND (77): + Fbr Dog Treats Brand + FBR_FOOD_BRAND (78): + Fbr Food Brand + FBR_FOOD_DELIVERY_BRAND (79): + Fbr Food Delivery Brand + FBR_FOOD_PRODUCT (80): + Fbr Food Product + FBR_ICE_CREAM_BRAND (81): + Fbr Ice Cream Brand + FBR_ICE_CREAM_PRODUCT (82): + Fbr Ice Cream Product + FBR_PET_FOOD_BRAND (83): + Fbr Pet Food Brand + FBR_PET_FOOD_PRODUCT (84): + Fbr Pet Food Product + FBR_PET_SUPPLY_BRAND (85): + Fbr Pet Supply Brand + FBR_PET_SUPPLY_PRODUCT (86): + Fbr Pet Supply Product + FBR_RESTAURANT (87): + Fbr Restaurant + FBR_RESTAURANT_DELIVERY_SERVICE_BRAND (88): + Fbr Restaurant Delivery Service Brand + FBR_RESTAURANT_DELIVERY_SERVICE_PRODUCT (89): + Fbr Restaurant Delivery Service Product + FBR_SNACKS_BRAND (90): + Fbr Snacks Brand + FBR_SNACKS_PRODUCT (91): + Fbr Snacks Product + FBR_SODA_BRAND (92): + Fbr Soda Brand + FBR_SODA_PRODUCT (93): + Fbr Soda Product + FBR_SPIRIT_BRAND (94): + Fbr Spirit Brand + FBR_SPIRIT_PRODUCT (95): + Fbr Spirit Product + FBR_WHEY_PROTEIN_BRAND (96): + Fbr Whey Protein Brand + FBR_WINE (97): + Fbr Wine + FINANCE_ACCOUNTING_BRAND (98): + Finance Accounting Brand + FINANCE_BANK (99): + Finance Bank + FINANCE_CREDIT_CARD_BRAND (100): + Finance Credit Card Brand + FINANCE_CREDIT_CARD_PRODUCT (101): + Finance Credit Card Product + FINANCE_FINANCIAL_SERVICES (102): + Finance Financial Services + FINANCE_INSURANCE (103): + Finance Insurance + FINANCE_INVESTMENT_SERVICES (104): + Finance Investment Services + FINANCE_LOAN_PROVIDER (105): + Finance Loan Provider + FINANCE_MORTGAGE_COMPANY (106): + Finance Mortgage Company + FINANCE_PAYMENTS_PROCESSING (107): + Finance Payments Processing + FINANCE_PAYMENTS_SYSTEMS (108): + Finance Payments Systems + FINANCE_TAXES_BRAND (109): + Finance Taxes Brand + FINANCE_TAXES_PRODUCT (110): + Finance Taxes Product + GAMBLING_CASINO (111): + Gambling Casino + GAMBLING_DAILY_FANTASY_SPORT (112): + Gambling Daily Fantasy Sport + GAMBLING_GAMBLING_SITE (113): + Gambling Gambling Site + GAMBLING_LOTTERY (114): + Gambling Lottery + GAMBLING_SPORTS_BETTING_SITE (115): + Gambling Sports Betting Site + GOVERNMENT_ANTI_SMOKING (116): + Government Anti Smoking + GOVERNMENT_MILITARY (117): + Government Military + GOVERNMENT_ORGANIZATION (118): + Government Organization + GOVERNMENT_PROGRAM (119): + Government Program + GOVERNMENT_PUBLIC_HEALTH_BEHAVIORS (120): + Government Public Health Behaviors + GOVERNMENT_PUBLIC_HEALTH_ISSUE (121): + Government Public Health Issue + GOVERNMENT_PUBLIC_HEALTH_TOPIC (122): + Government Public Health Topic + GOVERNMENT_SERVICE (123): + Government Service + HEALTHCARE_GYMS (124): + Healthcare Gyms + HEALTHCARE_HEALTH_INSURANCE_BRAND (125): + Healthcare Health Insurance Brand + HEALTHCARE_MULTIVITAMINS (126): + Healthcare Multivitamins + HEALTHCARE_SPORTS_SUPPLEMENTS (127): + Healthcare Sports Supplements + HEALTHCARE_WEIGHT_LOSS_BRAND (128): + Healthcare Weight Loss Brand + HEALTHCARE_WEIGHT_LOSS_PRODUCT (129): + Healthcare Weight Loss Product + HOME_SERVICES_CABLE_TV (130): + Home Services Cable Tv + HOME_SERVICES_ENERGY_BRAND (131): + Home Services Energy Brand + HOME_SERVICES_HOUSEHOLD_SERVICES_COMPANY (132): + Home Services Household Services Company + HOME_SERVICES_INTERNET_SERVICE (133): + Home Services Internet Service + HOME_SERVICES_MOBILE_PHONE (134): + Home Services Mobile Phone + HOME_SERVICES_PAY_TV_CHANNEL (135): + Home Services Pay Tv Channel + HOME_SERVICES_PAY_TV_NETWORK (136): + Home Services Pay Tv Network + LOCAL_CHARITY (137): + Local Charity + LOCAL_CLASSIFIEDS_SITE (138): + Local Classifieds Site + LOCAL_FLOWER_BRAND (139): + Local Flower Brand + LOCAL_JOB_CLASSIFIEDS_SITE (140): + Local Job Classifieds Site + LOCAL_LAW_FIRMS (141): + Local Law Firms + LOCAL_REAL_ESTATE_SITE (142): + Local Real Estate Site + MEDIA_AND_ENTERTAINMENT_DOWNLOAD_SITE (143): + Media And Entertainment Download Site + MEDIA_AND_ENTERTAINMENT_DVD (144): + Media And Entertainment Dvd + MEDIA_AND_ENTERTAINMENT_EVENT (145): + Media And Entertainment Event + MEDIA_AND_ENTERTAINMENT_GAME (146): + Media And Entertainment Game + MEDIA_AND_ENTERTAINMENT_GAMING_PRODUCTS (147): + Media And Entertainment Gaming Products + MEDIA_AND_ENTERTAINMENT_LIVE_EVENT (148): + Media And Entertainment Live Event + MEDIA_AND_ENTERTAINMENT_MOBILE_GAME (149): + Media And Entertainment Mobile Game + MEDIA_AND_ENTERTAINMENT_MOVIE (150): + Media And Entertainment Movie + MEDIA_AND_ENTERTAINMENT_MOVIE_DIGITAL_DOWNLOAD (151): + Media And Entertainment Movie Digital + Download + MEDIA_AND_ENTERTAINMENT_MUSIC_ARTIST (152): + Media And Entertainment Music Artist + MEDIA_AND_ENTERTAINMENT_MUSIC_RELEASES (153): + Media And Entertainment Music Releases + MEDIA_AND_ENTERTAINMENT_PLAYLISTS (154): + Media And Entertainment Playlists + MEDIA_AND_ENTERTAINMENT_SHOW (155): + Media And Entertainment Show + MEDIA_AND_ENTERTAINMENT_SHOW_DIGITAL_DOWNLOAD (156): + Media And Entertainment Show Digital Download + MEDIA_AND_ENTERTAINMENT_SPORTS (157): + Media And Entertainment Sports + MEDIA_AND_ENTERTAINMENT_STREAMING_SITE (158): + Media And Entertainment Streaming Site + MEDIA_AND_ENTERTAINMENT_TITLE_DIGITAL_DOWNLOAD (159): + Media And Entertainment Title Digital + Download + MEDIA_AND_ENTERTAINMENT_TV_CHANNEL (160): + Media And Entertainment Tv Channel + MEDIA_AND_ENTERTAINMENT_TV_SHOW (161): + Media And Entertainment Tv Show + MEDIA_AND_ENTERTAINMENT_TV_SHOW_DIGITAL_DOWNLOAD (162): + Media And Entertainment Tv Show Digital + Download + MEDIA_AND_ENTERTAINMENT_VIDEO_GAME (163): + Media And Entertainment Video Game + MEDIA_AND_ENTERTAINMENT_VIDEO_GAME_DLC (164): + Media And Entertainment Video Game Dlc + MEDIA_AND_ENTERTAINMENT_WEB_SERIES (165): + Media And Entertainment Web Series + OFFER (166): + Offer + PHARMA_NON_MEDICAL_CONDITION_OTC_DRUG (167): + Pharma Non Medical Condition Otc Drug + POLITICS_CANDIDATE (168): + Politics Candidate + POLITICS_GET_OUT_THE_VOTE_NOVEMBER_ELECTIONS (169): + Politics Get Out The Vote November Elections + POLITICS_GET_OUT_THE_VOTE_PRIMARY_ELECTIONS (170): + Politics Get Out The Vote Primary Elections + POLITICS_ISSUE (171): + Politics Issue + POLITICS_UNFAVORABLE_CANDIDATE (172): + Politics Unfavorable Candidate + RETAIL_APPAREL (173): + Retail Apparel + RETAIL_BRICK_AND_MORTAR (174): + Retail Brick And Mortar + RETAIL_FURNITURE_BRAND (175): + Retail Furniture Brand + RETAIL_FURNITURE_PRODUCT (176): + Retail Furniture Product + RETAIL_GIFTS_BRAND (177): + Retail Gifts Brand + RETAIL_GIFTS_PRODUCT (178): + Retail Gifts Product + RETAIL_HOME_GOODS (179): + Retail Home Goods + RETAIL_JEWELRY_BRAND (180): + Retail Jewelry Brand + RETAIL_ONLINE_RETAILERS (181): + Retail Online Retailers + RETAIL_SHOE_BRAND (182): + Retail Shoe Brand + RETAIL_STORE (183): + Retail Store + RETAIL_TOY_SHOP (184): + Retail Toy Shop + TECHNOLOGY_ARTIFICIAL_INTELLIGENCE_BRAND (185): + Technology Artificial Intelligence Brand + TECHNOLOGY_ARTIFICIAL_INTELLIGENCE_PRODUCT (186): + Technology Artificial Intelligence Product + TECHNOLOGY_BRAND (187): + Technology Brand + TECHNOLOGY_FEATURE (188): + Technology Feature + TECHNOLOGY_PRODUCT (189): + Technology Product + TECHNOLOGY_CAMERA_BRAND (190): + Technology Camera Brand + TECHNOLOGY_CAMERA_PRODUCT (191): + Technology Camera Product + TECHNOLOGY_CONTROL_PLANS (192): + Technology Control Plans + TECHNOLOGY_GAMING_BRAND (193): + Technology Gaming Brand + TECHNOLOGY_HOME_APPLIANCE_BRAND (194): + Technology Home Appliance Brand + TECHNOLOGY_HOME_APPLIANCE_PRODUCT (195): + Technology Home Appliance Product + TECHNOLOGY_LAPTOP_BRAND (196): + Technology Laptop Brand + TECHNOLOGY_LAPTOP_PRODUCT (197): + Technology Laptop Product + TECHNOLOGY_MOBILE_PHONE_PLANS (198): + Technology Mobile Phone Plans + TECHNOLOGY_ONLINE_SAFETY_BRAND (199): + Technology Online Safety Brand + TECHNOLOGY_ONLINE_SAFETY_PRODUCT (200): + Technology Online Safety Product + TECHNOLOGY_OPERATING_SYSTEM (201): + Technology Operating System + TECHNOLOGY_POSTPAID_TELCO_PLAN (202): + Technology Postpaid Telco Plan + TECHNOLOGY_PREPAID_TELCO_PLAN (203): + Technology Prepaid Telco Plan + TECHNOLOGY_PRINTER_BRAND (204): + Technology Printer Brand + TECHNOLOGY_SEARCH_ENGINE (205): + Technology Search Engine + TECHNOLOGY_SMALL_HOME_APPLIANCE_BRAND (206): + Technology Small Home Appliance Brand + TECHNOLOGY_SMALL_HOME_APPLIANCE_PRODUCT (207): + Technology Small Home Appliance Product + TECHNOLOGY_SMART_HOME_DEVICE (208): + Technology Smart Home Device + TECHNOLOGY_SMARTPHONE_BRAND (209): + Technology Mobile Phone Brand + TECHNOLOGY_SMARTPHONE_PRODUCT (210): + Technology Mobile Phone Product + TECHNOLOGY_SOCIAL_MEDIA (211): + Technology Social Media + TECHNOLOGY_TABLET_BRAND (212): + Technology Tablet Brand + TECHNOLOGY_TABLET_PRODUCT (213): + Technology Tablet Product + TECHNOLOGY_TELECOM_FIBER_OPTIC_INTERNET (214): + Technology Telecom Fiber Optic Internet + TECHNOLOGY_TELECOM_SERVICE_PACK (215): + Technology Telecom Service Pack + TECHNOLOGY_TELCO_NETWORK (216): + Technology Telco Network + TECHNOLOGY_TV_BRAND (217): + Technology Tv Brand + TECHNOLOGY_TV_PRODUCT (218): + Technology Tv Product + TECHNOLOGY_VIDEO_ON_DEMAND (219): + Technology Video On Demand + TECHNOLOGY_WEARABLES_BRAND (220): + Technology Wearables Brand + TECHNOLOGY_WEBSITE (221): + Technology Website + TRAVEL_ACCOMMODATIONS (222): + Travel Accommodations + TRAVEL_AIRLINE (223): + Travel Airline + TRAVEL_BOOKING_SERVICE (224): + Travel Booking Service + TRAVEL_CRUISES (225): + Travel Cruises + TRAVEL_DESTINATION (226): + Travel Destination + TRAVEL_HOTEL (227): + Travel Hotel + TRAVEL_OPTION (228): + Travel Option + TRAVEL_VACATION_RENTAL_SERVICE (229): + Travel Vacation Rental Service + """ + + UNSPECIFIED = 0 + UNKNOWN = 1 + GENERIC_BRAND = 2 + GENERIC_PRODUCT = 3 + GENERIC_SERVICE = 4 + APP = 5 + APPS_DATING_SERVICES = 6 + APPS_PODCASTS = 7 + APPS_DIGITAL_COMICS = 8 + AUTOMOTIVE_BATTERY = 9 + AUTOMOTIVE_BRAND = 10 + AUTOMOTIVE_CAR_RENTAL = 11 + AUTOMOTIVE_CAR_SERVICE = 12 + AUTOMOTIVE_ELECTRIC_CAR_BRAND = 13 + AUTOMOTIVE_GAS_STATIONS = 14 + AUTOMOTIVE_MOTORCYCLE = 15 + AUTOMOTIVE_OIL = 16 + AUTOMOTIVE_PRODUCT = 17 + AUTOMOTIVE_TIRES_BRAND = 18 + BIM_COMPANY = 19 + BIM_ENTERPRISE_SERVICES_COMPANY = 20 + BIM_JOB = 21 + BIM_MARKETING_COMPANY = 22 + BIM_RECRUITING = 23 + BIM_SHIPPING = 24 + CPG_BABY_CARE_BRAND = 25 + CPG_BABY_CARE_PRODUCT = 26 + CPG_BEAUTY_BRAND = 27 + CPG_BEAUTY_PRODUCT = 28 + CPG_BEAUTY_AND_PERSONAL_CARE_BRAND = 29 + CPG_BEAUTY_AND_PERSONAL_CARE_PRODUCT = 30 + CPG_BODY_WASH_BRAND = 31 + CPG_BODY_WASH_PRODUCT = 32 + CPG_DRAIN_CLEANERS = 33 + CPG_FRAGRANCE_BRAND = 34 + CPG_FRAGRANCE_PRODUCT = 35 + CPG_HAIR_CARE_BRAND = 36 + CPG_HAIR_CARE_PRODUCT = 37 + CPG_HOUSEHOLD_CLEANING_BRAND = 38 + CPG_HOUSEHOLD_CLEANING_PRODUCT = 39 + CPG_LAUNDRY_BRAND = 40 + CPG_MAKE_UP_BRAND = 41 + CPG_MAKE_UP_PRODUCT = 42 + CPG_MOUTHWASH_BRAND = 43 + CPG_OFFICE_SUPPLIES_BRAND = 44 + CPG_OFFICE_SUPPLIES_PRODUCT = 45 + CPG_ORAL_CARE_BRAND = 46 + CPG_PERSONAL_CARE_BRAND = 47 + CPG_PERSONAL_CARE_PRODUCT = 48 + CPG_SKIN_CARE_BRAND = 49 + CPG_SKIN_CARE_PRODUCT = 50 + EDUCATION_BUSINESS_PROGRAMS = 51 + EDUCATION_MASTERS_PROGRAMS = 52 + EDUCATION_NURSING_PROGRAMS = 53 + EDUCATION_IT_PROGRAMS = 54 + EDUCATION_OFFLINE = 55 + EDUCATION_ONLINE = 56 + EDUCATION_PROGRAM = 57 + EDUCATION_TEST_PREPARATION = 58 + FBR_BEER_BRAND = 59 + FBR_BEVERAGE_BRAND = 60 + FBR_BEVERAGE_PRODUCT = 61 + FBR_BREAKFAST_FOOD_BRAND = 62 + FBR_BREAKFAST_FOOD_PRODUCT = 63 + FBR_CANDY = 64 + FBR_CHEESE = 65 + FBR_CHIPS_BRAND = 66 + FBR_CHIPS_PRODUCT = 67 + FBR_CHOCOLATE_BRAND = 68 + FBR_CHOCOLATE_PRODUCT = 69 + FBR_COFFEE_BRAND = 70 + FBR_COFFEE_PRODUCT = 71 + FBR_COLD_DRINK_BRAND = 72 + FBR_COLD_DRINK_PRODUCT = 73 + FBR_COOKIES = 74 + FBR_DOGFOOD_BRAND = 75 + FBR_DOGFOOD_PRODUCT = 76 + FBR_DOG_TREATS_BRAND = 77 + FBR_FOOD_BRAND = 78 + FBR_FOOD_DELIVERY_BRAND = 79 + FBR_FOOD_PRODUCT = 80 + FBR_ICE_CREAM_BRAND = 81 + FBR_ICE_CREAM_PRODUCT = 82 + FBR_PET_FOOD_BRAND = 83 + FBR_PET_FOOD_PRODUCT = 84 + FBR_PET_SUPPLY_BRAND = 85 + FBR_PET_SUPPLY_PRODUCT = 86 + FBR_RESTAURANT = 87 + FBR_RESTAURANT_DELIVERY_SERVICE_BRAND = 88 + FBR_RESTAURANT_DELIVERY_SERVICE_PRODUCT = 89 + FBR_SNACKS_BRAND = 90 + FBR_SNACKS_PRODUCT = 91 + FBR_SODA_BRAND = 92 + FBR_SODA_PRODUCT = 93 + FBR_SPIRIT_BRAND = 94 + FBR_SPIRIT_PRODUCT = 95 + FBR_WHEY_PROTEIN_BRAND = 96 + FBR_WINE = 97 + FINANCE_ACCOUNTING_BRAND = 98 + FINANCE_BANK = 99 + FINANCE_CREDIT_CARD_BRAND = 100 + FINANCE_CREDIT_CARD_PRODUCT = 101 + FINANCE_FINANCIAL_SERVICES = 102 + FINANCE_INSURANCE = 103 + FINANCE_INVESTMENT_SERVICES = 104 + FINANCE_LOAN_PROVIDER = 105 + FINANCE_MORTGAGE_COMPANY = 106 + FINANCE_PAYMENTS_PROCESSING = 107 + FINANCE_PAYMENTS_SYSTEMS = 108 + FINANCE_TAXES_BRAND = 109 + FINANCE_TAXES_PRODUCT = 110 + GAMBLING_CASINO = 111 + GAMBLING_DAILY_FANTASY_SPORT = 112 + GAMBLING_GAMBLING_SITE = 113 + GAMBLING_LOTTERY = 114 + GAMBLING_SPORTS_BETTING_SITE = 115 + GOVERNMENT_ANTI_SMOKING = 116 + GOVERNMENT_MILITARY = 117 + GOVERNMENT_ORGANIZATION = 118 + GOVERNMENT_PROGRAM = 119 + GOVERNMENT_PUBLIC_HEALTH_BEHAVIORS = 120 + GOVERNMENT_PUBLIC_HEALTH_ISSUE = 121 + GOVERNMENT_PUBLIC_HEALTH_TOPIC = 122 + GOVERNMENT_SERVICE = 123 + HEALTHCARE_GYMS = 124 + HEALTHCARE_HEALTH_INSURANCE_BRAND = 125 + HEALTHCARE_MULTIVITAMINS = 126 + HEALTHCARE_SPORTS_SUPPLEMENTS = 127 + HEALTHCARE_WEIGHT_LOSS_BRAND = 128 + HEALTHCARE_WEIGHT_LOSS_PRODUCT = 129 + HOME_SERVICES_CABLE_TV = 130 + HOME_SERVICES_ENERGY_BRAND = 131 + HOME_SERVICES_HOUSEHOLD_SERVICES_COMPANY = 132 + HOME_SERVICES_INTERNET_SERVICE = 133 + HOME_SERVICES_MOBILE_PHONE = 134 + HOME_SERVICES_PAY_TV_CHANNEL = 135 + HOME_SERVICES_PAY_TV_NETWORK = 136 + LOCAL_CHARITY = 137 + LOCAL_CLASSIFIEDS_SITE = 138 + LOCAL_FLOWER_BRAND = 139 + LOCAL_JOB_CLASSIFIEDS_SITE = 140 + LOCAL_LAW_FIRMS = 141 + LOCAL_REAL_ESTATE_SITE = 142 + MEDIA_AND_ENTERTAINMENT_DOWNLOAD_SITE = 143 + MEDIA_AND_ENTERTAINMENT_DVD = 144 + MEDIA_AND_ENTERTAINMENT_EVENT = 145 + MEDIA_AND_ENTERTAINMENT_GAME = 146 + MEDIA_AND_ENTERTAINMENT_GAMING_PRODUCTS = 147 + MEDIA_AND_ENTERTAINMENT_LIVE_EVENT = 148 + MEDIA_AND_ENTERTAINMENT_MOBILE_GAME = 149 + MEDIA_AND_ENTERTAINMENT_MOVIE = 150 + MEDIA_AND_ENTERTAINMENT_MOVIE_DIGITAL_DOWNLOAD = 151 + MEDIA_AND_ENTERTAINMENT_MUSIC_ARTIST = 152 + MEDIA_AND_ENTERTAINMENT_MUSIC_RELEASES = 153 + MEDIA_AND_ENTERTAINMENT_PLAYLISTS = 154 + MEDIA_AND_ENTERTAINMENT_SHOW = 155 + MEDIA_AND_ENTERTAINMENT_SHOW_DIGITAL_DOWNLOAD = 156 + MEDIA_AND_ENTERTAINMENT_SPORTS = 157 + MEDIA_AND_ENTERTAINMENT_STREAMING_SITE = 158 + MEDIA_AND_ENTERTAINMENT_TITLE_DIGITAL_DOWNLOAD = 159 + MEDIA_AND_ENTERTAINMENT_TV_CHANNEL = 160 + MEDIA_AND_ENTERTAINMENT_TV_SHOW = 161 + MEDIA_AND_ENTERTAINMENT_TV_SHOW_DIGITAL_DOWNLOAD = 162 + MEDIA_AND_ENTERTAINMENT_VIDEO_GAME = 163 + MEDIA_AND_ENTERTAINMENT_VIDEO_GAME_DLC = 164 + MEDIA_AND_ENTERTAINMENT_WEB_SERIES = 165 + OFFER = 166 + PHARMA_NON_MEDICAL_CONDITION_OTC_DRUG = 167 + POLITICS_CANDIDATE = 168 + POLITICS_GET_OUT_THE_VOTE_NOVEMBER_ELECTIONS = 169 + POLITICS_GET_OUT_THE_VOTE_PRIMARY_ELECTIONS = 170 + POLITICS_ISSUE = 171 + POLITICS_UNFAVORABLE_CANDIDATE = 172 + RETAIL_APPAREL = 173 + RETAIL_BRICK_AND_MORTAR = 174 + RETAIL_FURNITURE_BRAND = 175 + RETAIL_FURNITURE_PRODUCT = 176 + RETAIL_GIFTS_BRAND = 177 + RETAIL_GIFTS_PRODUCT = 178 + RETAIL_HOME_GOODS = 179 + RETAIL_JEWELRY_BRAND = 180 + RETAIL_ONLINE_RETAILERS = 181 + RETAIL_SHOE_BRAND = 182 + RETAIL_STORE = 183 + RETAIL_TOY_SHOP = 184 + TECHNOLOGY_ARTIFICIAL_INTELLIGENCE_BRAND = 185 + TECHNOLOGY_ARTIFICIAL_INTELLIGENCE_PRODUCT = 186 + TECHNOLOGY_BRAND = 187 + TECHNOLOGY_FEATURE = 188 + TECHNOLOGY_PRODUCT = 189 + TECHNOLOGY_CAMERA_BRAND = 190 + TECHNOLOGY_CAMERA_PRODUCT = 191 + TECHNOLOGY_CONTROL_PLANS = 192 + TECHNOLOGY_GAMING_BRAND = 193 + TECHNOLOGY_HOME_APPLIANCE_BRAND = 194 + TECHNOLOGY_HOME_APPLIANCE_PRODUCT = 195 + TECHNOLOGY_LAPTOP_BRAND = 196 + TECHNOLOGY_LAPTOP_PRODUCT = 197 + TECHNOLOGY_MOBILE_PHONE_PLANS = 198 + TECHNOLOGY_ONLINE_SAFETY_BRAND = 199 + TECHNOLOGY_ONLINE_SAFETY_PRODUCT = 200 + TECHNOLOGY_OPERATING_SYSTEM = 201 + TECHNOLOGY_POSTPAID_TELCO_PLAN = 202 + TECHNOLOGY_PREPAID_TELCO_PLAN = 203 + TECHNOLOGY_PRINTER_BRAND = 204 + TECHNOLOGY_SEARCH_ENGINE = 205 + TECHNOLOGY_SMALL_HOME_APPLIANCE_BRAND = 206 + TECHNOLOGY_SMALL_HOME_APPLIANCE_PRODUCT = 207 + TECHNOLOGY_SMART_HOME_DEVICE = 208 + TECHNOLOGY_SMARTPHONE_BRAND = 209 + TECHNOLOGY_SMARTPHONE_PRODUCT = 210 + TECHNOLOGY_SOCIAL_MEDIA = 211 + TECHNOLOGY_TABLET_BRAND = 212 + TECHNOLOGY_TABLET_PRODUCT = 213 + TECHNOLOGY_TELECOM_FIBER_OPTIC_INTERNET = 214 + TECHNOLOGY_TELECOM_SERVICE_PACK = 215 + TECHNOLOGY_TELCO_NETWORK = 216 + TECHNOLOGY_TV_BRAND = 217 + TECHNOLOGY_TV_PRODUCT = 218 + TECHNOLOGY_VIDEO_ON_DEMAND = 219 + TECHNOLOGY_WEARABLES_BRAND = 220 + TECHNOLOGY_WEBSITE = 221 + TRAVEL_ACCOMMODATIONS = 222 + TRAVEL_AIRLINE = 223 + TRAVEL_BOOKING_SERVICE = 224 + TRAVEL_CRUISES = 225 + TRAVEL_DESTINATION = 226 + TRAVEL_HOTEL = 227 + TRAVEL_OPTION = 228 + TRAVEL_VACATION_RENTAL_SERVICE = 229 + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/errors/types/authorization_error.py b/google/ads/googleads/v25/errors/types/authorization_error.py index 295e59b60..5c35913ec 100644 --- a/google/ads/googleads/v25/errors/types/authorization_error.py +++ b/google/ads/googleads/v25/errors/types/authorization_error.py @@ -74,6 +74,11 @@ class AuthorizationError(proto.Enum): The developer token is only approved for use with test accounts. To access non-test accounts, apply for Basic or Standard access. + CLOUD_PROJECT_NOT_APPROVED_FOR_PRODUCTION (32): + The Google Cloud project is only approved for + use with test accounts. To access non-test + accounts, apply for Explorer, Basic or Standard + access. INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION (11): The login customer specified does not have access to the account specified, so the request @@ -108,6 +113,7 @@ class AuthorizationError(proto.Enum): CUSTOMER_NOT_ENABLED = 24 MISSING_TOS = 9 DEVELOPER_TOKEN_NOT_APPROVED = 10 + CLOUD_PROJECT_NOT_APPROVED_FOR_PRODUCTION = 32 INVALID_LOGIN_CUSTOMER_ID_SERVING_CUSTOMER_ID_COMBINATION = 11 SERVICE_ACCESS_DENIED = 12 ACCESS_DENIED_FOR_ACCOUNT_TYPE = 25 diff --git a/google/ads/googleads/v25/errors/types/smart_campaign_error.py b/google/ads/googleads/v25/errors/types/smart_campaign_error.py index 0b610402e..943286881 100644 --- a/google/ads/googleads/v25/errors/types/smart_campaign_error.py +++ b/google/ads/googleads/v25/errors/types/smart_campaign_error.py @@ -60,6 +60,18 @@ class SmartCampaignError(proto.Enum): The final URL could not be crawled. CREATION_FAILED (9): New Smart campaigns cannot be created. + VALIDATE_ONLY_GENERATE_PMAX_NOT_SUPPORTED (10): + The validate_only generate PMax feature is not supported + yet. + GBP_ENABLED_GENERATE_PMAX_NOT_SUPPORTED (11): + The GBP enabled generate PMax feature is not + supported yet. + IMAGE_ENABLED_GENERATE_PMAX_NOT_SUPPORTED (12): + The image enabled generate PMax feature is + not supported yet. + GENERATE_PMAX_CONVERTERS_FAIL (13): + The Smart Campaign to PMax conversion failed + validation. """ UNSPECIFIED = 0 @@ -72,6 +84,10 @@ class SmartCampaignError(proto.Enum): CANNOT_DETERMINE_SUGGESTION_LOCALE = 7 FINAL_URL_NOT_CRAWLABLE = 8 CREATION_FAILED = 9 + VALIDATE_ONLY_GENERATE_PMAX_NOT_SUPPORTED = 10 + GBP_ENABLED_GENERATE_PMAX_NOT_SUPPORTED = 11 + IMAGE_ENABLED_GENERATE_PMAX_NOT_SUPPORTED = 12 + GENERATE_PMAX_CONVERTERS_FAIL = 13 __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/__init__.py b/google/ads/googleads/v25/resources/__init__.py index 64e53bf9f..2a2425b08 100644 --- a/google/ads/googleads/v25/resources/__init__.py +++ b/google/ads/googleads/v25/resources/__init__.py @@ -164,6 +164,13 @@ "google.ads.googleads.v25.types.language_constant", "google.ads.googleads.v25.types.lead_form_submission_data", "google.ads.googleads.v25.types.life_event", + "google.ads.googleads.v25.types.lift_measurement_age_range", + "google.ads.googleads.v25.types.lift_measurement_campaign", + "google.ads.googleads.v25.types.lift_measurement_config", + "google.ads.googleads.v25.types.lift_measurement_device", + "google.ads.googleads.v25.types.lift_measurement_flight", + "google.ads.googleads.v25.types.lift_measurement_gender", + "google.ads.googleads.v25.types.lift_measurement_video", "google.ads.googleads.v25.types.local_services_employee", "google.ads.googleads.v25.types.local_services_lead", "google.ads.googleads.v25.types.local_services_lead_conversation", @@ -404,6 +411,17 @@ from .types.lead_form_submission_data import LeadFormSubmissionData from .types.lead_form_submission_data import LeadFormSubmissionField from .types.life_event import LifeEvent +from .types.lift_measurement_age_range import LiftMeasurementAgeRange +from .types.lift_measurement_campaign import LiftMeasurementCampaign +from .types.lift_measurement_config import LiftMeasurementConfig +from .types.lift_measurement_device import LiftMeasurementDevice +from .types.lift_measurement_flight import LiftMeasurementFlight +from .types.lift_measurement_flight import LiftMeasurementFlightSurveyLiftInfo +from .types.lift_measurement_flight import ( + LiftMeasurementFlightSurveyLiftMeasurement, +) +from .types.lift_measurement_gender import LiftMeasurementGender +from .types.lift_measurement_video import LiftMeasurementVideo from .types.local_services_employee import Fellowship from .types.local_services_employee import LocalServicesEmployee from .types.local_services_employee import Residency @@ -784,6 +802,15 @@ def _get_version(dependency_name): "LeadFormSubmissionField", "LicenseVerificationArtifact", "LifeEvent", + "LiftMeasurementAgeRange", + "LiftMeasurementCampaign", + "LiftMeasurementConfig", + "LiftMeasurementDevice", + "LiftMeasurementFlight", + "LiftMeasurementFlightSurveyLiftInfo", + "LiftMeasurementFlightSurveyLiftMeasurement", + "LiftMeasurementGender", + "LiftMeasurementVideo", "ListingGroupFilterDimension", "ListingGroupFilterDimensionPath", "LocalServicesCallout", diff --git a/google/ads/googleads/v25/resources/types/__init__.py b/google/ads/googleads/v25/resources/types/__init__.py index 524e341f8..92d9d560d 100644 --- a/google/ads/googleads/v25/resources/types/__init__.py +++ b/google/ads/googleads/v25/resources/types/__init__.py @@ -448,6 +448,29 @@ from .life_event import ( LifeEvent, ) +from .lift_measurement_age_range import ( + LiftMeasurementAgeRange, +) +from .lift_measurement_campaign import ( + LiftMeasurementCampaign, +) +from .lift_measurement_config import ( + LiftMeasurementConfig, +) +from .lift_measurement_device import ( + LiftMeasurementDevice, +) +from .lift_measurement_flight import ( + LiftMeasurementFlight, + LiftMeasurementFlightSurveyLiftInfo, + LiftMeasurementFlightSurveyLiftMeasurement, +) +from .lift_measurement_gender import ( + LiftMeasurementGender, +) +from .lift_measurement_video import ( + LiftMeasurementVideo, +) from .local_services_employee import ( Fellowship, LocalServicesEmployee, @@ -798,6 +821,15 @@ "LeadFormSubmissionData", "LeadFormSubmissionField", "LifeEvent", + "LiftMeasurementAgeRange", + "LiftMeasurementCampaign", + "LiftMeasurementConfig", + "LiftMeasurementDevice", + "LiftMeasurementFlight", + "LiftMeasurementFlightSurveyLiftInfo", + "LiftMeasurementFlightSurveyLiftMeasurement", + "LiftMeasurementGender", + "LiftMeasurementVideo", "Fellowship", "LocalServicesEmployee", "Residency", diff --git a/google/ads/googleads/v25/resources/types/ad.py b/google/ads/googleads/v25/resources/types/ad.py index 560ac7480..0aab88c52 100644 --- a/google/ads/googleads/v25/resources/types/ad.py +++ b/google/ads/googleads/v25/resources/types/ad.py @@ -130,7 +130,15 @@ class Ad(proto.Message): then this field will indicate the source. This field is read-only. synthetic_content_info (google.ads.googleads.v25.common.types.SyntheticContentInfo): - Synthetic content info for the ad. + Synthetic content info for the ad. Only ads with specific ad + types are eligible for updates using the + ``synthetic_content_info`` field. + + Allowed ``AdType`` values: + + - ``HTML5_UPLOAD_AD`` + - ``DYNAMIC_HTML5_AD`` + - ``IMAGE_AD`` text_ad (google.ads.googleads.v25.common.types.TextAdInfo): Immutable. Details pertaining to a text ad. diff --git a/google/ads/googleads/v25/resources/types/ad_group_criterion.py b/google/ads/googleads/v25/resources/types/ad_group_criterion.py index 4164bd160..24ec2f25f 100644 --- a/google/ads/googleads/v25/resources/types/ad_group_criterion.py +++ b/google/ads/googleads/v25/resources/types/ad_group_criterion.py @@ -326,6 +326,10 @@ class AdGroupCriterion(proto.Message): retail_filter_bundle (google.ads.googleads.v25.common.types.RetailFilterBundle): Immutable. Retail Filter Bundle. + This field is a member of `oneof`_ ``criterion``. + entity_bid (google.ads.googleads.v25.common.types.EntityBid): + Immutable. Entity bid criterion. + This field is a member of `oneof`_ ``criterion``. """ @@ -802,6 +806,12 @@ class PositionEstimates(proto.Message): oneof="criterion", message=criteria.RetailFilterBundle, ) + entity_bid: criteria.EntityBid = proto.Field( + proto.MESSAGE, + number=92, + oneof="criterion", + message=criteria.EntityBid, + ) __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/asset.py b/google/ads/googleads/v25/resources/types/asset.py index 1eb3a117b..be5cb5255 100644 --- a/google/ads/googleads/v25/resources/types/asset.py +++ b/google/ads/googleads/v25/resources/types/asset.py @@ -111,7 +111,15 @@ class Asset(proto.Message): This field is a member of `oneof`_ ``_orientation``. synthetic_content_info (google.ads.googleads.v25.common.types.SyntheticContentInfo): - Synthetic content info for the asset. + Synthetic content info for the asset. Only assets with + specific asset types are eligible for updates using the + ``synthetic_content_info`` field. + + Allowed ``AssetType`` values: + + - ``IMAGE`` + - ``MEDIA_BUNDLE`` + - ``YOUTUBE_VIDEO`` youtube_video_asset (google.ads.googleads.v25.common.types.YoutubeVideoAsset): Immutable. A YouTube video asset. diff --git a/google/ads/googleads/v25/resources/types/campaign.py b/google/ads/googleads/v25/resources/types/campaign.py index 5189b6900..1c1265dce 100644 --- a/google/ads/googleads/v25/resources/types/campaign.py +++ b/google/ads/googleads/v25/resources/types/campaign.py @@ -453,6 +453,20 @@ class Campaign(proto.Message): declaration. This field is read-only. + aca_migration_date_time (str): + Output only. The timestamp when the ACA + campaign was migrated to AI Max. The timestamp + is in the customer's timezone and in "yyyy-MM-dd + HH:mm:ss" format. + + This field is a member of `oneof`_ ``_aca_migration_date_time``. + broad_match_migration_date_time (str): + Output only. The timestamp when the Broad + Match campaign was migrated to AI Max. The + timestamp is in the customer's timezone and in + "yyyy-MM-dd HH:mm:ss" format. + + This field is a member of `oneof`_ ``_broad_match_migration_date_time``. bidding_strategy (str): The resource name of the portfolio bidding strategy used by the campaign. @@ -2102,6 +2116,16 @@ class AiMaxBundlingRequired(proto.Enum): proto.BOOL, number=108, ) + aca_migration_date_time: str = proto.Field( + proto.STRING, + number=112, + optional=True, + ) + broad_match_migration_date_time: str = proto.Field( + proto.STRING, + number=113, + optional=True, + ) bidding_strategy: str = proto.Field( proto.STRING, number=67, diff --git a/google/ads/googleads/v25/resources/types/experiment.py b/google/ads/googleads/v25/resources/types/experiment.py index cfd793730..c30336a9c 100644 --- a/google/ads/googleads/v25/resources/types/experiment.py +++ b/google/ads/googleads/v25/resources/types/experiment.py @@ -123,6 +123,11 @@ class Experiment(proto.Message): be set when the experiment is being created. This field is a member of `oneof`_ ``_sync_enabled``. + lift_measurement_config (str): + Output only. The lift measurement + configuration. + + This field is a member of `oneof`_ ``_lift_measurement_config``. video_experiment (google.ads.googleads.v25.common.types.VideoExperimentInfo): Immutable. Details of the video experiment. Applies for experiment types: YOUTUBE_CUSTOM. @@ -200,6 +205,11 @@ class Experiment(proto.Message): number=20, optional=True, ) + lift_measurement_config: str = proto.Field( + proto.STRING, + number=23, + optional=True, + ) video_experiment: experiment_types.VideoExperimentInfo = proto.Field( proto.MESSAGE, number=21, diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_age_range.py b/google/ads/googleads/v25/resources/types/lift_measurement_age_range.py new file mode 100644 index 000000000..2192d85a1 --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_age_range.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import age_range_type + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementAgeRange", + }, +) + + +class LiftMeasurementAgeRange(proto.Message): + r"""A brand lift measurement by age range. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Output only. The resource name of the lift measurement age + range. Lift measurement age range resource names have the + form: + + ``customers/{customer_id}/liftMeasurementAgeRanges/{lift_measurement_config_id}~{campaign_id}~{criterion_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement config ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + campaign (str): + Output only. The campaign resource name. + + This field is a member of `oneof`_ ``_campaign``. + age_range (google.ads.googleads.v25.enums.types.AgeRangeTypeEnum.AgeRangeType): + Output only. The age range type. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + campaign: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + age_range: age_range_type.AgeRangeTypeEnum.AgeRangeType = proto.Field( + proto.ENUM, + number=5, + enum=age_range_type.AgeRangeTypeEnum.AgeRangeType, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_campaign.py b/google/ads/googleads/v25/resources/types/lift_measurement_campaign.py new file mode 100644 index 000000000..2a22e4b73 --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_campaign.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementCampaign", + }, +) + + +class LiftMeasurementCampaign(proto.Message): + r"""A brand lift measurement by campaign. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Output only. The resource name of the lift measurement + campaign. Lift measurement campaign resource names have the + form: + + ``customers/{customer_id}/liftMeasurementCampaigns/{lift_measurement_config_id}~{campaign_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement config ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + campaign (str): + Output only. The campaign resource name. + + This field is a member of `oneof`_ ``_campaign``. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + campaign: str = proto.Field( + proto.STRING, + number=4, + optional=True, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_config.py b/google/ads/googleads/v25/resources/types/lift_measurement_config.py new file mode 100644 index 000000000..3e7d166fc --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_config.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + +from typing import MutableSequence + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import brand_lift_measurement_type +from google.ads.googleads.v25.enums.types import survey_intended_action +from google.ads.googleads.v25.enums.types import survey_subject_type + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementConfig", + }, +) + + +class LiftMeasurementConfig(proto.Message): + r"""A Lift Measurement Configuration (LMC), which is a lift + study. This groups all associated Brand Lift, Conversion Lift, + and Search Lift measurements. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Immutable. The resource name of the lift measurement config. + Lift measurement config resource names have the form: + + ``customers/{customer_id}/liftMeasurementConfigs/{lift_measurement_config_id}`` + lift_measurement_config_id (int): + Output only. The unique identifier for the + Lift Measurement Configuration (LMC). + name (str): + Output only. The name of the lift study. + conversion_actions (MutableSequence[str]): + Output only. The list of conversion action + resource names associated with this lift + measurement configuration. + campaigns (MutableSequence[str]): + Output only. The resource names of campaigns + associated with this lift measurement config. + These are the ones currently linked, not + historical. + survey_language (str): + Output only. The survey language. + single_measurement_question_set (google.ads.googleads.v25.resources.types.LiftMeasurementConfig.SingleMeasurementQuestionSet): + Output only. The single measurement question + set. + conversion_lift_holdback_ratio_micros (int): + Output only. The holdback ratio for + Conversion Lift. + + This field is a member of `oneof`_ ``_conversion_lift_holdback_ratio_micros``. + """ + + class SingleMeasurementQuestionSet(proto.Message): + r"""A single measurement question set for a survey. + + Attributes: + question_text_intended_action (google.ads.googleads.v25.enums.types.SurveyIntendedActionEnum.SurveyIntendedAction): + Output only. The intended action for the + question text. + question_text_subject_type (google.ads.googleads.v25.enums.types.SurveySubjectTypeEnum.SurveySubjectType): + Output only. The subject type for the + question text. + question_measurements (MutableSequence[google.ads.googleads.v25.enums.types.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType]): + Output only. The brand measurement types for + the question. + advertiser_preferred_choice (str): + Output only. The advertiser preferred choice. + competitor_choices (MutableSequence[str]): + Output only. The competitor choices. + """ + + question_text_intended_action: ( + survey_intended_action.SurveyIntendedActionEnum.SurveyIntendedAction + ) = proto.Field( + proto.ENUM, + number=1, + enum=survey_intended_action.SurveyIntendedActionEnum.SurveyIntendedAction, + ) + question_text_subject_type: ( + survey_subject_type.SurveySubjectTypeEnum.SurveySubjectType + ) = proto.Field( + proto.ENUM, + number=2, + enum=survey_subject_type.SurveySubjectTypeEnum.SurveySubjectType, + ) + question_measurements: MutableSequence[ + brand_lift_measurement_type.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType + ] = proto.RepeatedField( + proto.ENUM, + number=3, + enum=brand_lift_measurement_type.BrandLiftMeasurementTypeEnum.BrandLiftMeasurementType, + ) + advertiser_preferred_choice: str = proto.Field( + proto.STRING, + number=4, + ) + competitor_choices: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=5, + ) + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + ) + name: str = proto.Field( + proto.STRING, + number=3, + ) + conversion_actions: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=4, + ) + campaigns: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=5, + ) + survey_language: str = proto.Field( + proto.STRING, + number=7, + ) + single_measurement_question_set: SingleMeasurementQuestionSet = proto.Field( + proto.MESSAGE, + number=9, + message=SingleMeasurementQuestionSet, + ) + conversion_lift_holdback_ratio_micros: int = proto.Field( + proto.INT64, + number=10, + optional=True, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_device.py b/google/ads/googleads/v25/resources/types/lift_measurement_device.py new file mode 100644 index 000000000..f0f89daa9 --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_device.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import device as gage_device + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementDevice", + }, +) + + +class LiftMeasurementDevice(proto.Message): + r"""A brand lift measurement by device. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Output only. The resource name of the lift measurement + device. Lift measurement device resource names have the + form: + + ``customers/{customer_id}/liftMeasurementDevices/{lift_measurement_config_id}~{campaign_id}~{criterion_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement config ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + campaign (str): + Output only. The campaign resource name. + + This field is a member of `oneof`_ ``_campaign``. + device (google.ads.googleads.v25.enums.types.DeviceEnum.Device): + Output only. The device type. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + campaign: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + device: gage_device.DeviceEnum.Device = proto.Field( + proto.ENUM, + number=5, + enum=gage_device.DeviceEnum.Device, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_flight.py b/google/ads/googleads/v25/resources/types/lift_measurement_flight.py new file mode 100644 index 000000000..92ea8056a --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_flight.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import lift_measurement_flight_status +from google.ads.googleads.v25.enums.types import lift_metric_type +from google.ads.googleads.v25.enums.types import ( + survey_lift_flight_target_response_mode, +) + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementFlight", + "LiftMeasurementFlightSurveyLiftInfo", + "LiftMeasurementFlightSurveyLiftMeasurement", + }, +) + + +class LiftMeasurementFlight(proto.Message): + r"""A brand lift measurement flight. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Immutable. The resource name of the lift measurement flight. + Lift measurement flight resource names have the form: + + ``customers/{customer_id}/liftMeasurementFlights/{lift_measurement_configuration_id}~{flight_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement + configuration ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + lift_measurement_flight_id (int): + Output only. The lift measurement flight ID. + + This field is a member of `oneof`_ ``_lift_measurement_flight_id``. + survey_lift_info (google.ads.googleads.v25.resources.types.LiftMeasurementFlightSurveyLiftInfo): + Output only. Flight configuration specific to + Survey Lift. + + This field is a member of `oneof`_ ``_survey_lift_info``. + name (str): + Output only. The name of the lift measurement + flight. + + This field is a member of `oneof`_ ``_name``. + status (google.ads.googleads.v25.enums.types.LiftMeasurementFlightStatusEnum.LiftMeasurementFlightStatus): + Output only. The status of the lift + measurement flight. + lift_type (google.ads.googleads.v25.enums.types.LiftMetricTypeEnum.LiftMetricType): + Output only. The lift type measured during + this flight. + survey_lift_measurement (google.ads.googleads.v25.resources.types.LiftMeasurementFlightSurveyLiftMeasurement): + Output only. Data about survey lift + measurement. + + This field is a member of `oneof`_ ``_survey_lift_measurement``. + start_date (str): + Output only. The start date of the lift + measurement flight in the customer's time zone. + + Format: YYYY-MM-DD + + This field is a member of `oneof`_ ``_start_date``. + end_date (str): + Output only. The end date of the lift + measurement flight in the customer's time zone. + + Format: YYYY-MM-DD + + This field is a member of `oneof`_ ``_end_date``. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + lift_measurement_flight_id: int = proto.Field( + proto.INT64, + number=3, + optional=True, + ) + survey_lift_info: "LiftMeasurementFlightSurveyLiftInfo" = proto.Field( + proto.MESSAGE, + number=4, + optional=True, + message="LiftMeasurementFlightSurveyLiftInfo", + ) + name: str = proto.Field( + proto.STRING, + number=5, + optional=True, + ) + status: ( + lift_measurement_flight_status.LiftMeasurementFlightStatusEnum.LiftMeasurementFlightStatus + ) = proto.Field( + proto.ENUM, + number=8, + enum=lift_measurement_flight_status.LiftMeasurementFlightStatusEnum.LiftMeasurementFlightStatus, + ) + lift_type: lift_metric_type.LiftMetricTypeEnum.LiftMetricType = proto.Field( + proto.ENUM, + number=9, + enum=lift_metric_type.LiftMetricTypeEnum.LiftMetricType, + ) + survey_lift_measurement: "LiftMeasurementFlightSurveyLiftMeasurement" = ( + proto.Field( + proto.MESSAGE, + number=12, + optional=True, + message="LiftMeasurementFlightSurveyLiftMeasurement", + ) + ) + start_date: str = proto.Field( + proto.STRING, + number=14, + optional=True, + ) + end_date: str = proto.Field( + proto.STRING, + number=15, + optional=True, + ) + + +class LiftMeasurementFlightSurveyLiftInfo(proto.Message): + r"""Survey Lift specific flight configuration. + + Attributes: + target_response_mode (google.ads.googleads.v25.enums.types.SurveyLiftFlightTargetResponseModeEnum.SurveyLiftFlightTargetResponseMode): + Output only. The target response mode that + will be used to collect survey responses. + """ + + target_response_mode: ( + survey_lift_flight_target_response_mode.SurveyLiftFlightTargetResponseModeEnum.SurveyLiftFlightTargetResponseMode + ) = proto.Field( + proto.ENUM, + number=1, + enum=survey_lift_flight_target_response_mode.SurveyLiftFlightTargetResponseModeEnum.SurveyLiftFlightTargetResponseMode, + ) + + +class LiftMeasurementFlightSurveyLiftMeasurement(proto.Message): + r"""Survey Lift measurement info. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + response_collection_ratio_micros (int): + Output only. The ratio of target survey + responses that have been collected so far. + Expressed in micros: 0 = 0%, 1000000 = 100%. + + This field is a member of `oneof`_ ``_response_collection_ratio_micros``. + min_survey_response_date (str): + Output only. The earliest date in which + survey responses were recorded. + + This field is a member of `oneof`_ ``_min_survey_response_date``. + max_survey_response_date (str): + Output only. The latest date in which survey + responses were recorded. + + This field is a member of `oneof`_ ``_max_survey_response_date``. + """ + + response_collection_ratio_micros: int = proto.Field( + proto.INT64, + number=1, + optional=True, + ) + min_survey_response_date: str = proto.Field( + proto.STRING, + number=2, + optional=True, + ) + max_survey_response_date: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_gender.py b/google/ads/googleads/v25/resources/types/lift_measurement_gender.py new file mode 100644 index 000000000..4a84f9f12 --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_gender.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + +from google.ads.googleads.v25.enums.types import gender_type + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementGender", + }, +) + + +class LiftMeasurementGender(proto.Message): + r"""A brand lift measurement by gender. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Output only. The resource name of the lift measurement + gender. Lift measurement gender resource names have the + form: + + ``customers/{customer_id}/liftMeasurementGenders/{lift_measurement_config_id}~{campaign_id}~{criterion_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement config ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + campaign (str): + Output only. The campaign resource name. + + This field is a member of `oneof`_ ``_campaign``. + gender (google.ads.googleads.v25.enums.types.GenderTypeEnum.GenderType): + Output only. The gender type. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + campaign: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + gender: gender_type.GenderTypeEnum.GenderType = proto.Field( + proto.ENUM, + number=5, + enum=gender_type.GenderTypeEnum.GenderType, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/lift_measurement_video.py b/google/ads/googleads/v25/resources/types/lift_measurement_video.py new file mode 100644 index 000000000..5692a6bd7 --- /dev/null +++ b/google/ads/googleads/v25/resources/types/lift_measurement_video.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from __future__ import annotations + + +import proto # type: ignore + + +__protobuf__ = proto.module( + package="google.ads.googleads.v25.resources", + marshal="google.ads.googleads.v25", + manifest={ + "LiftMeasurementVideo", + }, +) + + +class LiftMeasurementVideo(proto.Message): + r"""A brand lift measurement by video. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + resource_name (str): + Output only. The resource name of the lift measurement + video. Lift measurement video resource names have the form: + + ``customers/{customer_id}/liftMeasurementVideos/{lift_measurement_config_id}~{campaign_id}~{external_video_id}`` + lift_measurement_config_id (int): + Output only. The lift measurement config ID. + + This field is a member of `oneof`_ ``_lift_measurement_config_id``. + campaign (str): + Output only. The campaign resource name. + + This field is a member of `oneof`_ ``_campaign``. + video (str): + Output only. The video resource name. + + This field is a member of `oneof`_ ``_video``. + """ + + resource_name: str = proto.Field( + proto.STRING, + number=1, + ) + lift_measurement_config_id: int = proto.Field( + proto.INT64, + number=2, + optional=True, + ) + campaign: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + video: str = proto.Field( + proto.STRING, + number=5, + optional=True, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/resources/types/local_services_lead.py b/google/ads/googleads/v25/resources/types/local_services_lead.py index 7e4b51eba..271a36d8c 100644 --- a/google/ads/googleads/v25/resources/types/local_services_lead.py +++ b/google/ads/googleads/v25/resources/types/local_services_lead.py @@ -171,9 +171,11 @@ class ContactDetails(proto.Message): Output only. Phone number of the consumer for the lead. This can be a real phone number or a tracking number. The phone number is returned in - E164 format. See - https://support.google.com/google-ads/answer/16355235?hl=en - to learn more. Example: +16504519489. + E.164 format. See + https://support.google.com/google-ads/answer/16355235 + to learn more. + + Example: "+16504519489". consumer_name (str): Output only. Consumer name if consumer provided name from Message or Booking form on diff --git a/google/ads/googleads/v25/resources/types/recommendation.py b/google/ads/googleads/v25/resources/types/recommendation.py index 996be7269..4ea5acb04 100644 --- a/google/ads/googleads/v25/resources/types/recommendation.py +++ b/google/ads/googleads/v25/resources/types/recommendation.py @@ -20,10 +20,12 @@ import proto # type: ignore from google.ads.googleads.v25.common.types import criteria +from google.ads.googleads.v25.common.types import effective_automatic_goal from google.ads.googleads.v25.enums.types import ad_strength as gage_ad_strength from google.ads.googleads.v25.enums.types import ( app_bidding_goal as gage_app_bidding_goal, ) +from google.ads.googleads.v25.enums.types import conversion_action_category from google.ads.googleads.v25.enums.types import keyword_match_type from google.ads.googleads.v25.enums.types import recommendation_type from google.ads.googleads.v25.enums.types import ( @@ -398,6 +400,11 @@ class Recommendation(proto.Message): Output only. The improve Demand Gen ad strength recommendation. + This field is a member of `oneof`_ ``recommendation``. + campaign_specific_app_goal_recommendation (google.ads.googleads.v25.resources.types.Recommendation.CampaignSpecificAppGoalRecommendation): + Output only. The campaign-specific app goal + recommendation. + This field is a member of `oneof`_ ``recommendation``. """ @@ -1642,6 +1649,107 @@ class ImproveDemandGenAdStrengthRecommendation(proto.Message): ) ) + class CampaignSpecificAppGoalRecommendation(proto.Message): + r"""The campaign-specific app goal recommendation. Recommendation to add + app conversion goals to a campaign. LINT: LEGACY_NAMES + + Attributes: + campaign_cost_micros_last_fifteen_days (int): + Output only. Campaign cost in micros for the + last 15 days. + campaign_conversions_last_fifteen_days (float): + Output only. Campaign conversion count for + the last 15 days. + campaign_conversion_value_last_fifteen_days (float): + Output only. Campaign conversion value for + the last 15 days. + projected_conversions_last_fifteen_days (float): + Output only. Projected conversions over the + last 15 days if the recommendation is applied. + projected_conversion_value_last_fifteen_days (float): + Output only. Projected conversion value over + the last 15 days if the recommendation is + applied. + app_conversion_goals (MutableSequence[google.ads.googleads.v25.enums.types.ConversionActionCategoryEnum.ConversionActionCategory]): + Output only. Deprecated: Use suggested_conversion_goals + instead. Suggested auto conversion goals for the campaign. + current_auto_goals (MutableSequence[google.ads.googleads.v25.common.types.EffectiveAutomaticGoal]): + Output only. Deprecated: Use current_conversion_goals + instead. Current automatic conversion goals for the + campaign. + current_custom_goal (str): + Output only. Deprecated: Use current_custom_conversion_goal + instead. Current custom goal for the campaign. + suggested_conversion_goals (MutableSequence[google.ads.googleads.v25.enums.types.ConversionActionCategoryEnum.ConversionActionCategory]): + Output only. Suggested conversion goals for + the campaign which optimize towards app + conversions. + current_conversion_goals (MutableSequence[google.ads.googleads.v25.common.types.EffectiveAutomaticGoal]): + Output only. Current conversion goals for the + campaign. + current_custom_conversion_goal (str): + Output only. Current custom conversion goal + for the campaign. This is the resource name of + the CustomConversionGoal. + """ + + campaign_cost_micros_last_fifteen_days: int = proto.Field( + proto.INT64, + number=1, + ) + campaign_conversions_last_fifteen_days: float = proto.Field( + proto.DOUBLE, + number=2, + ) + campaign_conversion_value_last_fifteen_days: float = proto.Field( + proto.DOUBLE, + number=3, + ) + projected_conversions_last_fifteen_days: float = proto.Field( + proto.DOUBLE, + number=4, + ) + projected_conversion_value_last_fifteen_days: float = proto.Field( + proto.DOUBLE, + number=5, + ) + app_conversion_goals: MutableSequence[ + conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory + ] = proto.RepeatedField( + proto.ENUM, + number=6, + enum=conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory, + ) + current_auto_goals: MutableSequence[ + effective_automatic_goal.EffectiveAutomaticGoal + ] = proto.RepeatedField( + proto.MESSAGE, + number=7, + message=effective_automatic_goal.EffectiveAutomaticGoal, + ) + current_custom_goal: str = proto.Field( + proto.STRING, + number=8, + ) + suggested_conversion_goals: MutableSequence[ + conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory + ] = proto.RepeatedField( + proto.ENUM, + number=9, + enum=conversion_action_category.ConversionActionCategoryEnum.ConversionActionCategory, + ) + current_conversion_goals: MutableSequence[ + effective_automatic_goal.EffectiveAutomaticGoal + ] = proto.RepeatedField( + proto.MESSAGE, + number=10, + message=effective_automatic_goal.EffectiveAutomaticGoal, + ) + current_custom_conversion_goal: str = proto.Field( + proto.STRING, + number=11, + ) + resource_name: str = proto.Field( proto.STRING, number=1, @@ -2096,6 +2204,14 @@ class ImproveDemandGenAdStrengthRecommendation(proto.Message): oneof="recommendation", message=ImproveDemandGenAdStrengthRecommendation, ) + campaign_specific_app_goal_recommendation: ( + CampaignSpecificAppGoalRecommendation + ) = proto.Field( + proto.MESSAGE, + number=70, + oneof="recommendation", + message=CampaignSpecificAppGoalRecommendation, + ) __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/services/__init__.py b/google/ads/googleads/v25/services/__init__.py index 61f3cb6bf..f96eae1af 100644 --- a/google/ads/googleads/v25/services/__init__.py +++ b/google/ads/googleads/v25/services/__init__.py @@ -216,6 +216,7 @@ RunBatchJobRequest, ) from .types.benchmarks_service import ( + AggregateMetrics, BenchmarksLocation, BenchmarksProductMetadata, BenchmarksSource, @@ -223,6 +224,8 @@ BreakdownDefinition, BreakdownKey, BreakdownMetrics, + CategoryFilter, + CategoryInfo, CustomerMetrics, GenerateBenchmarksMetricsRequest, GenerateBenchmarksMetricsResponse, @@ -238,6 +241,7 @@ Metrics, ProductFilter, RateMetrics, + ShareMetrics, ) from .types.bidding_data_exclusion_service import ( BiddingDataExclusionOperation, @@ -355,6 +359,7 @@ MutateCampaignSharedSetsResponse, ) from .types.content_creator_insights_service import ( + BrandSentimentInsight, GenerateCreatorInsightsRequest, GenerateCreatorInsightsResponse, GenerateTrendingInsightsRequest, @@ -362,6 +367,8 @@ LanguageDistribution, SearchAudience, SearchTopics, + SentimentInsightDistribution, + SentimentInsightSummary, TrendInsight, TrendInsightDataPoint, TrendInsightMetrics, @@ -1005,6 +1012,7 @@ "MutateBatchJobResponse", "MutateBatchJobResult", "RunBatchJobRequest", + "AggregateMetrics", "BenchmarksLocation", "BenchmarksProductMetadata", "BenchmarksSource", @@ -1012,6 +1020,8 @@ "BreakdownDefinition", "BreakdownKey", "BreakdownMetrics", + "CategoryFilter", + "CategoryInfo", "CustomerMetrics", "GenerateBenchmarksMetricsRequest", "GenerateBenchmarksMetricsResponse", @@ -1027,6 +1037,7 @@ "Metrics", "ProductFilter", "RateMetrics", + "ShareMetrics", "BiddingDataExclusionOperation", "MutateBiddingDataExclusionsRequest", "MutateBiddingDataExclusionsResponse", @@ -1106,6 +1117,7 @@ "MutateCampaignSharedSetResult", "MutateCampaignSharedSetsRequest", "MutateCampaignSharedSetsResponse", + "BrandSentimentInsight", "GenerateCreatorInsightsRequest", "GenerateCreatorInsightsResponse", "GenerateTrendingInsightsRequest", @@ -1113,6 +1125,8 @@ "LanguageDistribution", "SearchAudience", "SearchTopics", + "SentimentInsightDistribution", + "SentimentInsightSummary", "TrendInsight", "TrendInsightDataPoint", "TrendInsightMetrics", diff --git a/google/ads/googleads/v25/services/services/audience_insights_service/async_client.py b/google/ads/googleads/v25/services/services/audience_insights_service/async_client.py index dc54bec8d..fb5678a64 100644 --- a/google/ads/googleads/v25/services/services/audience_insights_service/async_client.py +++ b/google/ads/googleads/v25/services/services/audience_insights_service/async_client.py @@ -702,6 +702,17 @@ async def generate_audience_composition_insights( LIFE_EVENT_USER_INTEREST, PARENTAL_STATUS, INCOME_RANGE, AGE_RANGE, GENDER, and USER_LIST. + Note that when an + [InsightsAudience.user_list][google.ads.googleads.v25.services.InsightsAudience.user_list] + is requested: + + - Only the following dimensions are supported: + AFFINITY_USER_INTEREST, AGE_RANGE, GENDER, + IN_MARKET_USER_INTEREST + - The score field is omitted from + AudienceCompositionMetrics of the + GenerateAudienceCompositionInsightsResponse. + This corresponds to the ``dimensions`` field on the ``request`` instance; if ``request`` is provided, this should not be set. diff --git a/google/ads/googleads/v25/services/services/audience_insights_service/client.py b/google/ads/googleads/v25/services/services/audience_insights_service/client.py index ea8b4d4dc..642cfb3f3 100644 --- a/google/ads/googleads/v25/services/services/audience_insights_service/client.py +++ b/google/ads/googleads/v25/services/services/audience_insights_service/client.py @@ -1153,6 +1153,17 @@ def generate_audience_composition_insights( LIFE_EVENT_USER_INTEREST, PARENTAL_STATUS, INCOME_RANGE, AGE_RANGE, GENDER, and USER_LIST. + Note that when an + [InsightsAudience.user_list][google.ads.googleads.v25.services.InsightsAudience.user_list] + is requested: + + - Only the following dimensions are supported: + AFFINITY_USER_INTEREST, AGE_RANGE, GENDER, + IN_MARKET_USER_INTEREST + - The score field is omitted from + AudienceCompositionMetrics of the + GenerateAudienceCompositionInsightsResponse. + This corresponds to the ``dimensions`` field on the ``request`` instance; if ``request`` is provided, this should not be set. diff --git a/google/ads/googleads/v25/services/services/batch_job_service/async_client.py b/google/ads/googleads/v25/services/services/batch_job_service/async_client.py index 8bb13d3a9..00dce404f 100644 --- a/google/ads/googleads/v25/services/services/batch_job_service/async_client.py +++ b/google/ads/googleads/v25/services/services/batch_job_service/async_client.py @@ -421,6 +421,12 @@ class BatchJobServiceAsyncClient: parse_life_event_path = staticmethod( BatchJobServiceClient.parse_life_event_path ) + lift_measurement_config_path = staticmethod( + BatchJobServiceClient.lift_measurement_config_path + ) + parse_lift_measurement_config_path = staticmethod( + BatchJobServiceClient.parse_lift_measurement_config_path + ) mobile_app_category_constant_path = staticmethod( BatchJobServiceClient.mobile_app_category_constant_path ) diff --git a/google/ads/googleads/v25/services/services/batch_job_service/client.py b/google/ads/googleads/v25/services/services/batch_job_service/client.py index f42794727..99dc2cca8 100644 --- a/google/ads/googleads/v25/services/services/batch_job_service/client.py +++ b/google/ads/googleads/v25/services/services/batch_job_service/client.py @@ -1583,6 +1583,26 @@ def parse_life_event_path(path: str) -> Dict[str, str]: ) return m.groupdict() if m else {} + @staticmethod + def lift_measurement_config_path( + customer_id: str, + lift_measurement_configuration_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_config string.""" + return "customers/{customer_id}/liftMeasurementConfigs/{lift_measurement_configuration_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + ) + + @staticmethod + def parse_lift_measurement_config_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_config path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementConfigs/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def mobile_app_category_constant_path( mobile_app_category_id: str, diff --git a/google/ads/googleads/v25/services/services/benchmarks_service/async_client.py b/google/ads/googleads/v25/services/services/benchmarks_service/async_client.py index 701c57ac3..45b06ed46 100644 --- a/google/ads/googleads/v25/services/services/benchmarks_service/async_client.py +++ b/google/ads/googleads/v25/services/services/benchmarks_service/async_client.py @@ -518,8 +518,11 @@ async def list_benchmarks_sources( The request object. Request message for [BenchmarksService.ListBenchmarksSources][google.ads.googleads.v25.services.BenchmarksService.ListBenchmarksSources]. benchmarks_sources (:class:`MutableSequence[google.ads.googleads.v25.enums.types.BenchmarksSourceTypeEnum.BenchmarksSourceType]`): - Required. The types of benchmarks - sources to be returned + Required. The types of benchmarks sources to be + returned. Supported sources include INDUSTRY_VERTICAL + and CATEGORY. Categories are used as filters for scoping + the benchmarks analysis when benchmarking against all + advertisers. This corresponds to the ``benchmarks_sources`` field on the ``request`` instance; if ``request`` is provided, this diff --git a/google/ads/googleads/v25/services/services/benchmarks_service/client.py b/google/ads/googleads/v25/services/services/benchmarks_service/client.py index a1865a7b6..47453ce1c 100644 --- a/google/ads/googleads/v25/services/services/benchmarks_service/client.py +++ b/google/ads/googleads/v25/services/services/benchmarks_service/client.py @@ -959,8 +959,11 @@ def list_benchmarks_sources( The request object. Request message for [BenchmarksService.ListBenchmarksSources][google.ads.googleads.v25.services.BenchmarksService.ListBenchmarksSources]. benchmarks_sources (MutableSequence[google.ads.googleads.v25.enums.types.BenchmarksSourceTypeEnum.BenchmarksSourceType]): - Required. The types of benchmarks - sources to be returned + Required. The types of benchmarks sources to be + returned. Supported sources include INDUSTRY_VERTICAL + and CATEGORY. Categories are used as filters for scoping + the benchmarks analysis when benchmarking against all + advertisers. This corresponds to the ``benchmarks_sources`` field on the ``request`` instance; if ``request`` is provided, this diff --git a/google/ads/googleads/v25/services/services/experiment_service/async_client.py b/google/ads/googleads/v25/services/services/experiment_service/async_client.py index 38e0fdbeb..84ecd4d4c 100644 --- a/google/ads/googleads/v25/services/services/experiment_service/async_client.py +++ b/google/ads/googleads/v25/services/services/experiment_service/async_client.py @@ -80,6 +80,12 @@ class ExperimentServiceAsyncClient: parse_experiment_path = staticmethod( ExperimentServiceClient.parse_experiment_path ) + lift_measurement_config_path = staticmethod( + ExperimentServiceClient.lift_measurement_config_path + ) + parse_lift_measurement_config_path = staticmethod( + ExperimentServiceClient.parse_lift_measurement_config_path + ) common_billing_account_path = staticmethod( ExperimentServiceClient.common_billing_account_path ) diff --git a/google/ads/googleads/v25/services/services/experiment_service/client.py b/google/ads/googleads/v25/services/services/experiment_service/client.py index f15a08087..04610602e 100644 --- a/google/ads/googleads/v25/services/services/experiment_service/client.py +++ b/google/ads/googleads/v25/services/services/experiment_service/client.py @@ -291,6 +291,26 @@ def parse_experiment_path(path: str) -> Dict[str, str]: ) return m.groupdict() if m else {} + @staticmethod + def lift_measurement_config_path( + customer_id: str, + lift_measurement_configuration_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_config string.""" + return "customers/{customer_id}/liftMeasurementConfigs/{lift_measurement_configuration_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + ) + + @staticmethod + def parse_lift_measurement_config_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_config path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementConfigs/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def common_billing_account_path( billing_account: str, diff --git a/google/ads/googleads/v25/services/services/google_ads_service/async_client.py b/google/ads/googleads/v25/services/services/google_ads_service/async_client.py index 066e5a7de..26a215638 100644 --- a/google/ads/googleads/v25/services/services/google_ads_service/async_client.py +++ b/google/ads/googleads/v25/services/services/google_ads_service/async_client.py @@ -805,6 +805,48 @@ class GoogleAdsServiceAsyncClient: parse_life_event_path = staticmethod( GoogleAdsServiceClient.parse_life_event_path ) + lift_measurement_age_range_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_age_range_path + ) + parse_lift_measurement_age_range_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_age_range_path + ) + lift_measurement_campaign_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_campaign_path + ) + parse_lift_measurement_campaign_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_campaign_path + ) + lift_measurement_config_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_config_path + ) + parse_lift_measurement_config_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_config_path + ) + lift_measurement_device_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_device_path + ) + parse_lift_measurement_device_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_device_path + ) + lift_measurement_flight_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_flight_path + ) + parse_lift_measurement_flight_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_flight_path + ) + lift_measurement_gender_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_gender_path + ) + parse_lift_measurement_gender_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_gender_path + ) + lift_measurement_video_path = staticmethod( + GoogleAdsServiceClient.lift_measurement_video_path + ) + parse_lift_measurement_video_path = staticmethod( + GoogleAdsServiceClient.parse_lift_measurement_video_path + ) local_services_employee_path = staticmethod( GoogleAdsServiceClient.local_services_employee_path ) diff --git a/google/ads/googleads/v25/services/services/google_ads_service/client.py b/google/ads/googleads/v25/services/services/google_ads_service/client.py index d1fe80b65..860e7c4c8 100644 --- a/google/ads/googleads/v25/services/services/google_ads_service/client.py +++ b/google/ads/googleads/v25/services/services/google_ads_service/client.py @@ -3094,6 +3094,166 @@ def parse_life_event_path(path: str) -> Dict[str, str]: ) return m.groupdict() if m else {} + @staticmethod + def lift_measurement_age_range_path( + customer_id: str, + lift_measurement_configuration_id: str, + campaign_id: str, + criterion_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_age_range string.""" + return "customers/{customer_id}/liftMeasurementAgeRanges/{lift_measurement_configuration_id}~{campaign_id}~{criterion_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + campaign_id=campaign_id, + criterion_id=criterion_id, + ) + + @staticmethod + def parse_lift_measurement_age_range_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_age_range path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementAgeRanges/(?P.+?)~(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_campaign_path( + customer_id: str, + lift_measurement_configuration_id: str, + campaign_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_campaign string.""" + return "customers/{customer_id}/liftMeasurementCampaigns/{lift_measurement_configuration_id}~{campaign_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + campaign_id=campaign_id, + ) + + @staticmethod + def parse_lift_measurement_campaign_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_campaign path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementCampaigns/(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_config_path( + customer_id: str, + lift_measurement_configuration_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_config string.""" + return "customers/{customer_id}/liftMeasurementConfigs/{lift_measurement_configuration_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + ) + + @staticmethod + def parse_lift_measurement_config_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_config path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementConfigs/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_device_path( + customer_id: str, + lift_measurement_configuration_id: str, + campaign_id: str, + criterion_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_device string.""" + return "customers/{customer_id}/liftMeasurementDevices/{lift_measurement_configuration_id}~{campaign_id}~{criterion_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + campaign_id=campaign_id, + criterion_id=criterion_id, + ) + + @staticmethod + def parse_lift_measurement_device_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_device path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementDevices/(?P.+?)~(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_flight_path( + customer_id: str, + lift_measurement_configuration_id: str, + lift_measurement_flight_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_flight string.""" + return "customers/{customer_id}/liftMeasurementFlights/{lift_measurement_configuration_id}~{lift_measurement_flight_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + lift_measurement_flight_id=lift_measurement_flight_id, + ) + + @staticmethod + def parse_lift_measurement_flight_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_flight path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementFlights/(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_gender_path( + customer_id: str, + lift_measurement_configuration_id: str, + campaign_id: str, + criterion_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_gender string.""" + return "customers/{customer_id}/liftMeasurementGenders/{lift_measurement_configuration_id}~{campaign_id}~{criterion_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + campaign_id=campaign_id, + criterion_id=criterion_id, + ) + + @staticmethod + def parse_lift_measurement_gender_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_gender path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementGenders/(?P.+?)~(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def lift_measurement_video_path( + customer_id: str, + lift_measurement_configuration_id: str, + campaign_id: str, + external_video_id: str, + ) -> str: + """Returns a fully-qualified lift_measurement_video string.""" + return "customers/{customer_id}/liftMeasurementVideos/{lift_measurement_configuration_id}~{campaign_id}~{external_video_id}".format( + customer_id=customer_id, + lift_measurement_configuration_id=lift_measurement_configuration_id, + campaign_id=campaign_id, + external_video_id=external_video_id, + ) + + @staticmethod + def parse_lift_measurement_video_path(path: str) -> Dict[str, str]: + """Parses a lift_measurement_video path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/liftMeasurementVideos/(?P.+?)~(?P.+?)~(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def local_services_employee_path( customer_id: str, diff --git a/google/ads/googleads/v25/services/services/recommendation_service/async_client.py b/google/ads/googleads/v25/services/services/recommendation_service/async_client.py index a36434ea9..0098e71f0 100644 --- a/google/ads/googleads/v25/services/services/recommendation_service/async_client.py +++ b/google/ads/googleads/v25/services/services/recommendation_service/async_client.py @@ -92,6 +92,12 @@ class RecommendationServiceAsyncClient: parse_conversion_action_path = staticmethod( RecommendationServiceClient.parse_conversion_action_path ) + custom_conversion_goal_path = staticmethod( + RecommendationServiceClient.custom_conversion_goal_path + ) + parse_custom_conversion_goal_path = staticmethod( + RecommendationServiceClient.parse_custom_conversion_goal_path + ) recommendation_path = staticmethod( RecommendationServiceClient.recommendation_path ) diff --git a/google/ads/googleads/v25/services/services/recommendation_service/client.py b/google/ads/googleads/v25/services/services/recommendation_service/client.py index 27c29078b..2a0db108f 100644 --- a/google/ads/googleads/v25/services/services/recommendation_service/client.py +++ b/google/ads/googleads/v25/services/services/recommendation_service/client.py @@ -351,6 +351,26 @@ def parse_conversion_action_path(path: str) -> Dict[str, str]: ) return m.groupdict() if m else {} + @staticmethod + def custom_conversion_goal_path( + customer_id: str, + goal_id: str, + ) -> str: + """Returns a fully-qualified custom_conversion_goal string.""" + return "customers/{customer_id}/customConversionGoals/{goal_id}".format( + customer_id=customer_id, + goal_id=goal_id, + ) + + @staticmethod + def parse_custom_conversion_goal_path(path: str) -> Dict[str, str]: + """Parses a custom_conversion_goal path into its component segments.""" + m = re.match( + r"^customers/(?P.+?)/customConversionGoals/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def recommendation_path( customer_id: str, diff --git a/google/ads/googleads/v25/services/types/__init__.py b/google/ads/googleads/v25/services/types/__init__.py index bd95ab0df..f51e95e79 100644 --- a/google/ads/googleads/v25/services/types/__init__.py +++ b/google/ads/googleads/v25/services/types/__init__.py @@ -216,6 +216,7 @@ RunBatchJobRequest, ) from .benchmarks_service import ( + AggregateMetrics, BenchmarksLocation, BenchmarksProductMetadata, BenchmarksSource, @@ -223,6 +224,8 @@ BreakdownDefinition, BreakdownKey, BreakdownMetrics, + CategoryFilter, + CategoryInfo, CustomerMetrics, GenerateBenchmarksMetricsRequest, GenerateBenchmarksMetricsResponse, @@ -238,6 +241,7 @@ Metrics, ProductFilter, RateMetrics, + ShareMetrics, ) from .bidding_data_exclusion_service import ( BiddingDataExclusionOperation, @@ -355,6 +359,7 @@ MutateCampaignSharedSetsResponse, ) from .content_creator_insights_service import ( + BrandSentimentInsight, GenerateCreatorInsightsRequest, GenerateCreatorInsightsResponse, GenerateTrendingInsightsRequest, @@ -362,6 +367,8 @@ LanguageDistribution, SearchAudience, SearchTopics, + SentimentInsightDistribution, + SentimentInsightSummary, TrendInsight, TrendInsightDataPoint, TrendInsightMetrics, @@ -1005,6 +1012,7 @@ "MutateBatchJobResponse", "MutateBatchJobResult", "RunBatchJobRequest", + "AggregateMetrics", "BenchmarksLocation", "BenchmarksProductMetadata", "BenchmarksSource", @@ -1012,6 +1020,8 @@ "BreakdownDefinition", "BreakdownKey", "BreakdownMetrics", + "CategoryFilter", + "CategoryInfo", "CustomerMetrics", "GenerateBenchmarksMetricsRequest", "GenerateBenchmarksMetricsResponse", @@ -1027,6 +1037,7 @@ "Metrics", "ProductFilter", "RateMetrics", + "ShareMetrics", "BiddingDataExclusionOperation", "MutateBiddingDataExclusionsRequest", "MutateBiddingDataExclusionsResponse", @@ -1106,6 +1117,7 @@ "MutateCampaignSharedSetResult", "MutateCampaignSharedSetsRequest", "MutateCampaignSharedSetsResponse", + "BrandSentimentInsight", "GenerateCreatorInsightsRequest", "GenerateCreatorInsightsResponse", "GenerateTrendingInsightsRequest", @@ -1113,6 +1125,8 @@ "LanguageDistribution", "SearchAudience", "SearchTopics", + "SentimentInsightDistribution", + "SentimentInsightSummary", "TrendInsight", "TrendInsightDataPoint", "TrendInsightMetrics", diff --git a/google/ads/googleads/v25/services/types/audience_insights_service.py b/google/ads/googleads/v25/services/types/audience_insights_service.py index 0d73c0aa0..8b134b58d 100644 --- a/google/ads/googleads/v25/services/types/audience_insights_service.py +++ b/google/ads/googleads/v25/services/types/audience_insights_service.py @@ -163,6 +163,16 @@ class GenerateAudienceCompositionInsightsRequest(proto.Message): IN_MARKET_USER_INTEREST, LIFE_EVENT_USER_INTEREST, PARENTAL_STATUS, INCOME_RANGE, AGE_RANGE, GENDER, and USER_LIST. + + Note that when an + [InsightsAudience.user_list][google.ads.googleads.v25.services.InsightsAudience.user_list] + is requested: + + - Only the following dimensions are supported: + AFFINITY_USER_INTEREST, AGE_RANGE, GENDER, + IN_MARKET_USER_INTEREST + - The score field is omitted from AudienceCompositionMetrics + of the GenerateAudienceCompositionInsightsResponse. customer_insights_group (str): The name of the customer being planned for. This is a user-defined value. @@ -215,12 +225,16 @@ class GenerateAudienceCompositionInsightsResponse(proto.Message): Attributes: sections (MutableSequence[google.ads.googleads.v25.services.types.AudienceCompositionSection]): - The contents of the insights report, - organized into sections. Each section is - associated with one of the - AudienceInsightsDimension values in the request. - There may be more than one section per - dimension. + The contents of the insights report, organized into + sections. Each section is associated with one of the + AudienceInsightsDimension values in the request. There may + be more than one section per dimension. + + Note: When an + [InsightsAudience.user_list][google.ads.googleads.v25.services.InsightsAudience.user_list] + is requested in GenerateAudienceCompositionInsightsRequest, + score is omitted from AudienceCompositionMetrics of the + GenerateAudienceCompositionInsightsResponse. """ sections: MutableSequence["AudienceCompositionSection"] = ( @@ -1212,6 +1226,11 @@ class AudienceCompositionMetrics(proto.Message): zero if this ratio is undefined or is not meaningful. score (float): A relevance score from 0 to 1 inclusive. + + Note: When an + [InsightsAudience.user_list][google.ads.googleads.v25.services.InsightsAudience.user_list] + is requested in GenerateAudienceCompositionInsightsRequest, + score is omitted. """ baseline_audience_share: float = proto.Field( diff --git a/google/ads/googleads/v25/services/types/benchmarks_service.py b/google/ads/googleads/v25/services/types/benchmarks_service.py index bf5de8be2..4fcbd2bdf 100644 --- a/google/ads/googleads/v25/services/types/benchmarks_service.py +++ b/google/ads/googleads/v25/services/types/benchmarks_service.py @@ -45,8 +45,10 @@ "ListBenchmarksSourcesResponse", "BenchmarksSourceMetadata", "IndustryVerticalInfo", + "CategoryInfo", "GenerateBenchmarksMetricsRequest", "BenchmarksSource", + "CategoryFilter", "ProductFilter", "BreakdownDefinition", "GenerateBenchmarksMetricsResponse", @@ -55,6 +57,8 @@ "Metrics", "CustomerMetrics", "RateMetrics", + "ShareMetrics", + "AggregateMetrics", }, ) @@ -242,8 +246,10 @@ class ListBenchmarksSourcesRequest(proto.Message): Attributes: benchmarks_sources (MutableSequence[google.ads.googleads.v25.enums.types.BenchmarksSourceTypeEnum.BenchmarksSourceType]): - Required. The types of benchmarks sources to - be returned + Required. The types of benchmarks sources to be returned. + Supported sources include INDUSTRY_VERTICAL and CATEGORY. + Categories are used as filters for scoping the benchmarks + analysis when benchmarking against all advertisers. application_info (google.ads.googleads.v25.common.types.AdditionalApplicationInfo): Additional information on the application issuing the request. @@ -287,6 +293,11 @@ class ListBenchmarksSourcesResponse(proto.Message): class BenchmarksSourceMetadata(proto.Message): r"""The metadata associated with a benchmarks source. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: @@ -295,6 +306,11 @@ class BenchmarksSourceMetadata(proto.Message): industry_vertical_info (google.ads.googleads.v25.services.types.IndustryVerticalInfo): Information on the Industry Vertical. + This field is a member of `oneof`_ ``benchmarks_source_info``. + category_info (google.ads.googleads.v25.services.types.CategoryInfo): + Information on the Product & Service + Category. + This field is a member of `oneof`_ ``benchmarks_source_info``. """ @@ -311,6 +327,12 @@ class BenchmarksSourceMetadata(proto.Message): oneof="benchmarks_source_info", message="IndustryVerticalInfo", ) + category_info: "CategoryInfo" = proto.Field( + proto.MESSAGE, + number=3, + oneof="benchmarks_source_info", + message="CategoryInfo", + ) class IndustryVerticalInfo(proto.Message): @@ -341,6 +363,34 @@ class IndustryVerticalInfo(proto.Message): ) +class CategoryInfo(proto.Message): + r"""The information associated with a Product & Service Category. + + Attributes: + category_name (str): + The name of the Product & Service Category. + category_id (int): + The unique identifier of the Product & + Service Category. + category_path (str): + The full path of the Product & Service + Category. + """ + + category_name: str = proto.Field( + proto.STRING, + number=1, + ) + category_id: int = proto.Field( + proto.INT64, + number=2, + ) + category_path: str = proto.Field( + proto.STRING, + number=3, + ) + + class GenerateBenchmarksMetricsRequest(proto.Message): r"""Request message for [BenchmarksService.GenerateBenchmarksMetrics][google.ads.googleads.v25.services.BenchmarksService.GenerateBenchmarksMetrics]. @@ -363,6 +413,17 @@ class GenerateBenchmarksMetricsRequest(proto.Message): benchmarks_source (google.ads.googleads.v25.services.types.BenchmarksSource): Required. The source used to generate benchmarks metrics for. + category_filter (google.ads.googleads.v25.services.types.CategoryFilter): + A list of Product & Service Categories for scoping a YouTube + benchmarks analysis. For example, when category + "/Apparel/Clothing" is selected, customer metrics represent + Ad performance for "/Apparel/Clothing" Ads only and the + customer is benchmarking against all advertisers’ Ads in the + "/Apparel/Clothing" category. + + This filter can only be used when ``all_advertisers`` is + used as the + [benchmarks_source][google.ads.googleads.v25.services.GenerateBenchmarksMetricsRequest.benchmarks_source]. product_filter (google.ads.googleads.v25.services.types.ProductFilter): Required. The products to aggregate metrics over. Product filter settings support a list of @@ -402,6 +463,11 @@ class GenerateBenchmarksMetricsRequest(proto.Message): number=4, message="BenchmarksSource", ) + category_filter: "CategoryFilter" = proto.Field( + proto.MESSAGE, + number=10, + message="CategoryFilter", + ) product_filter: "ProductFilter" = proto.Field( proto.MESSAGE, number=5, @@ -434,6 +500,10 @@ class BenchmarksSource(proto.Message): source can be obtained from [BenchmarksService.ListBenchmarksSources][google.ads.googleads.v25.services.BenchmarksService.ListBenchmarksSources]. + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields @@ -441,6 +511,14 @@ class BenchmarksSource(proto.Message): industry_vertical_id (int): The ID of the Industry Vertical. + This field is a member of `oneof`_ ``benchmarks_source_id``. + all_advertisers (bool): + Comparison against all advertisers running Ads. This + benchmarking option must utilize additional filters. Setting + the ``category_filter`` is required. One or more categories + will scope the metrics of both the customer and all + advertisers to those selected categories. + This field is a member of `oneof`_ ``benchmarks_source_id``. """ @@ -449,6 +527,30 @@ class BenchmarksSource(proto.Message): number=1, oneof="benchmarks_source_id", ) + all_advertisers: bool = proto.Field( + proto.BOOL, + number=2, + oneof="benchmarks_source_id", + ) + + +class CategoryFilter(proto.Message): + r"""A list of Product & Service Categories for scoping + benchmarks. + + Attributes: + category_ids (MutableSequence[str]): + Required. Product & Service Category IDs. The supported list + of IDs can be retrieved using + [BenchmarksService.ListBenchmarksSources][google.ads.googleads.v25.services.BenchmarksService.ListBenchmarksSources]. + The scope of benchmarks analysis will be the union (ORs) of + all categories supplied. + """ + + category_ids: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) class ProductFilter(proto.Message): @@ -653,6 +755,17 @@ class CustomerMetrics(proto.Message): average_rate_metrics (google.ads.googleads.v25.services.types.RateMetrics): Average rate metrics calculated by dividing one metric by another. + share_metrics (google.ads.googleads.v25.services.types.ShareMetrics): + Metrics calculated by dividing the metric of the customer by + that of the selected benchmarks source. These metrics are + only returned when: + + 1. ``all_advertisers`` is used as the ``benchmarks_source``. + Note that the request ``category_filter`` must be set + when using ``all_advertisers``. + aggregate_metrics (google.ads.googleads.v25.services.types.AggregateMetrics): + Metrics calculated by aggregating values of a + single metric for the customer. """ average_rate_metrics: "RateMetrics" = proto.Field( @@ -660,6 +773,16 @@ class CustomerMetrics(proto.Message): number=1, message="RateMetrics", ) + share_metrics: "ShareMetrics" = proto.Field( + proto.MESSAGE, + number=2, + message="ShareMetrics", + ) + aggregate_metrics: "AggregateMetrics" = proto.Field( + proto.MESSAGE, + number=3, + message="AggregateMetrics", + ) class RateMetrics(proto.Message): @@ -786,4 +909,112 @@ class RateMetrics(proto.Message): ) +class ShareMetrics(proto.Message): + r"""Metrics calculated by dividing the metric of the customer by + that of the selected benchmarks source. + + Attributes: + share_of_voice (float): + Relative impressions. Share of voice is + defined by the customer’s total number of + impressions divided by the aggregated number of + impressions of all advertisers in the selected + benchmarks source including your own. Share of + voice is represented on a scale of 0 to 1 + precise to 4 decimal places. For example, 0.0123 + which corresponds to 1.23%. + share_of_spend (float): + Relative spend. Share of spend is defined by + the customer’s total cost divided by the total + aggregated cost of all advertisers in the + selected benchmarks source including your own. + Share of spend is represented on a scale of 0 to + 1 precise to 4 decimal places. For example, + 0.0123 which corresponds to 1.23%. + """ + + share_of_voice: float = proto.Field( + proto.DOUBLE, + number=1, + ) + share_of_spend: float = proto.Field( + proto.DOUBLE, + number=2, + ) + + +class AggregateMetrics(proto.Message): + r"""Metrics calculated by aggregating values of a single metric. + + Attributes: + cost (float): + The total cost paid by the customer. Cost is + represented in USD by default, if unspecified in + the request. + video_trueview_views (float): + The number of video TrueView views. + + See + https://support.google.com/google-ads/answer/2375431 + for more information on TrueView Views. + impressions (float): + The number of times the Ad was shown to + users. + viewable_impressions (float): + The number of impressions that are considered + viewable according to the Active View criteria. + + See + https://support.google.com/google-ads/answer/7029393 + for more information on Active View. + clicks (float): + The number of clicks received. + interactions (float): + The number of interactions. Interactions + include physical clicks, engagements, and video + views that are logged as clicks. + + See + https://support.google.com/google-ads/answer/2375431 + for more information on interactions. + engagements (float): + The number of engagements. Engagements are ad + interactions such as expanding a lightbox Ad or + clicking on a video teaser. + + See + https://support.google.com/google-ads/answer/2375431 + for more information on engagements. + """ + + cost: float = proto.Field( + proto.DOUBLE, + number=1, + ) + video_trueview_views: float = proto.Field( + proto.DOUBLE, + number=2, + ) + impressions: float = proto.Field( + proto.DOUBLE, + number=3, + ) + viewable_impressions: float = proto.Field( + proto.DOUBLE, + number=4, + ) + clicks: float = proto.Field( + proto.DOUBLE, + number=5, + ) + interactions: float = proto.Field( + proto.DOUBLE, + number=6, + ) + engagements: float = proto.Field( + proto.DOUBLE, + number=7, + ) + + __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/ads/googleads/v25/services/types/content_creator_insights_service.py b/google/ads/googleads/v25/services/types/content_creator_insights_service.py index 4d3b664f9..450a4dc0a 100644 --- a/google/ads/googleads/v25/services/types/content_creator_insights_service.py +++ b/google/ads/googleads/v25/services/types/content_creator_insights_service.py @@ -27,6 +27,7 @@ ) from google.ads.googleads.v25.enums.types import insights_trend from google.ads.googleads.v25.enums.types import partnership_opportunity +from google.ads.googleads.v25.enums.types import sentiment as gage_sentiment __protobuf__ = proto.module( @@ -45,6 +46,9 @@ "TrendInsight", "TrendInsightMetrics", "TrendInsightDataPoint", + "BrandSentimentInsight", + "SentimentInsightDistribution", + "SentimentInsightSummary", "LanguageDistribution", }, ) @@ -793,6 +797,15 @@ class TrendInsight(proto.Message): month. The data points are ordered from most recent month to least recent month. Only populated for trends using search_topics. + brand_sentiment_insights (MutableSequence[google.ads.googleads.v25.services.types.BrandSentimentInsight]): + The brand sentiment for this topic. Only populated when all + of the following are true: + + - The trend request uses search_topics. + - The Knowledge graph entity topic has the Brand capability. + - Supplemental data + [BRAND_SENTIMENT_DATA][google.ads.googleads.v25.enums.ContentCreatorInsightsSupplementalDataEnum.ContentCreatorInsightsSupplementalData.BRAND_SENTIMENT_DATA] + is requested. related_videos (MutableSequence[google.ads.googleads.v25.common.types.AudienceInsightsAttributeMetadata]): Related videos for this topic. Only populated for trends using search_topics. @@ -839,6 +852,13 @@ class TrendInsight(proto.Message): message="TrendInsightDataPoint", ) ) + brand_sentiment_insights: MutableSequence["BrandSentimentInsight"] = ( + proto.RepeatedField( + proto.MESSAGE, + number=7, + message="BrandSentimentInsight", + ) + ) related_videos: MutableSequence[ audience_insights_attribute.AudienceInsightsAttributeMetadata ] = proto.RepeatedField( @@ -929,6 +949,116 @@ class TrendInsightDataPoint(proto.Message): ) +class BrandSentimentInsight(proto.Message): + r"""Brand sentiment for a specific month. Measuring brand + sentiment involves using AI models to analyze YouTube video + content related to the brand, categorizing the sentiment as + positive, negative, or neutral. Only the video content itself is + analyzed; user comments are not included. The AI models are + powered by Gemini and can make mistakes. + + Attributes: + month (str): + The month that the brand sentiment represents + in the string format "YYYY-MM". + has_insufficient_data (bool): + When true, there is insufficient data to + calculate the brand sentiment. + sentiment_distributions (MutableSequence[google.ads.googleads.v25.services.types.SentimentInsightDistribution]): + Distribution of sentiment between positive, + negative, and neutral. + sentiment_summaries (MutableSequence[google.ads.googleads.v25.services.types.SentimentInsightSummary]): + A summary of what was positive and negative + about content related to the brand. No summaries + are generated for neutral sentiment. The summary + is generated by AI models. + """ + + month: str = proto.Field( + proto.STRING, + number=1, + ) + has_insufficient_data: bool = proto.Field( + proto.BOOL, + number=2, + ) + sentiment_distributions: MutableSequence["SentimentInsightDistribution"] = ( + proto.RepeatedField( + proto.MESSAGE, + number=3, + message="SentimentInsightDistribution", + ) + ) + sentiment_summaries: MutableSequence["SentimentInsightSummary"] = ( + proto.RepeatedField( + proto.MESSAGE, + number=4, + message="SentimentInsightSummary", + ) + ) + + +class SentimentInsightDistribution(proto.Message): + r"""The distribution of sentiment for a brand. The distribution + is calculated as the proportion of views for videos that + correspond to the brand with each sentiment. Example: positive + sentiment share of 0.49 means that 49% of views about this brand + were on content with positive sentiment. + + Attributes: + sentiment (google.ads.googleads.v25.enums.types.SentimentEnum.Sentiment): + The sentiment for this distribution. + sentiment_share (float): + The proportion (between 0 and 1) of views for + videos that correspond to the brand with this + sentiment. + """ + + sentiment: gage_sentiment.SentimentEnum.Sentiment = proto.Field( + proto.ENUM, + number=1, + enum=gage_sentiment.SentimentEnum.Sentiment, + ) + sentiment_share: float = proto.Field( + proto.DOUBLE, + number=2, + ) + + +class SentimentInsightSummary(proto.Message): + r"""A summary of the sentiment for content related to a brand. + Summaries are only generated for positive and negative + sentiment, not neutral. The summary is generated by AI models. + + Attributes: + sentiment (google.ads.googleads.v25.enums.types.SentimentEnum.Sentiment): + The sentiment for this summary. + summary (str): + A summary of what was positive or negative + about content related to the brand. + sample_videos (MutableSequence[google.ads.googleads.v25.common.types.AudienceInsightsAttributeMetadata]): + Sample videos that correspond to the + sentiment. + """ + + sentiment: gage_sentiment.SentimentEnum.Sentiment = proto.Field( + proto.ENUM, + number=1, + enum=gage_sentiment.SentimentEnum.Sentiment, + ) + summary: str = proto.Field( + proto.STRING, + number=2, + ) + sample_videos: MutableSequence[ + audience_insights_attribute.AudienceInsightsAttributeMetadata + ] = proto.RepeatedField( + proto.MESSAGE, + number=3, + message=audience_insights_attribute.AudienceInsightsAttributeMetadata, + ) + + class LanguageDistribution(proto.Message): r"""Languages that pertain to a YouTube channel based on the channel content. Only languages above a certain proportion diff --git a/google/ads/googleads/v25/services/types/google_ads_service.py b/google/ads/googleads/v25/services/types/google_ads_service.py index 0beb75724..c226d4d03 100644 --- a/google/ads/googleads/v25/services/types/google_ads_service.py +++ b/google/ads/googleads/v25/services/types/google_ads_service.py @@ -401,6 +401,27 @@ from google.ads.googleads.v25.resources.types import ( life_event as gagr_life_event, ) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_age_range as gagr_lift_measurement_age_range, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_campaign as gagr_lift_measurement_campaign, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_config as gagr_lift_measurement_config, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_device as gagr_lift_measurement_device, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_flight as gagr_lift_measurement_flight, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_gender as gagr_lift_measurement_gender, +) +from google.ads.googleads.v25.resources.types import ( + lift_measurement_video as gagr_lift_measurement_video, +) from google.ads.googleads.v25.resources.types import ( local_services_employee as gagr_local_services_employee, ) @@ -1350,6 +1371,27 @@ class GoogleAdsRow(proto.Message): local_services_lead_conversation (google.ads.googleads.v25.resources.types.LocalServicesLeadConversation): The local services lead conversationreferenced in the query. + lift_measurement_config (google.ads.googleads.v25.resources.types.LiftMeasurementConfig): + The lift measurement config referenced in the + query. + lift_measurement_age_range (google.ads.googleads.v25.resources.types.LiftMeasurementAgeRange): + The brand lift measurement by age range + referenced in the query. + lift_measurement_gender (google.ads.googleads.v25.resources.types.LiftMeasurementGender): + The brand lift measurement by gender + referenced in the query. + lift_measurement_device (google.ads.googleads.v25.resources.types.LiftMeasurementDevice): + The brand lift measurement by device + referenced in the query. + lift_measurement_campaign (google.ads.googleads.v25.resources.types.LiftMeasurementCampaign): + The brand lift measurement by campaign + referenced in the query. + lift_measurement_video (google.ads.googleads.v25.resources.types.LiftMeasurementVideo): + The brand lift measurement by video + referenced in the query. + lift_measurement_flight (google.ads.googleads.v25.resources.types.LiftMeasurementFlight): + The lift measurement flight referenced in the + query. android_privacy_shared_key_google_ad_group (google.ads.googleads.v25.resources.types.AndroidPrivacySharedKeyGoogleAdGroup): The android privacy shared key google ad group referenced in the query. @@ -2441,6 +2483,55 @@ class GoogleAdsRow(proto.Message): number=214, message=gagr_local_services_lead_conversation.LocalServicesLeadConversation, ) + lift_measurement_config: ( + gagr_lift_measurement_config.LiftMeasurementConfig + ) = proto.Field( + proto.MESSAGE, + number=251, + message=gagr_lift_measurement_config.LiftMeasurementConfig, + ) + lift_measurement_age_range: ( + gagr_lift_measurement_age_range.LiftMeasurementAgeRange + ) = proto.Field( + proto.MESSAGE, + number=260, + message=gagr_lift_measurement_age_range.LiftMeasurementAgeRange, + ) + lift_measurement_gender: ( + gagr_lift_measurement_gender.LiftMeasurementGender + ) = proto.Field( + proto.MESSAGE, + number=261, + message=gagr_lift_measurement_gender.LiftMeasurementGender, + ) + lift_measurement_device: ( + gagr_lift_measurement_device.LiftMeasurementDevice + ) = proto.Field( + proto.MESSAGE, + number=262, + message=gagr_lift_measurement_device.LiftMeasurementDevice, + ) + lift_measurement_campaign: ( + gagr_lift_measurement_campaign.LiftMeasurementCampaign + ) = proto.Field( + proto.MESSAGE, + number=263, + message=gagr_lift_measurement_campaign.LiftMeasurementCampaign, + ) + lift_measurement_video: gagr_lift_measurement_video.LiftMeasurementVideo = ( + proto.Field( + proto.MESSAGE, + number=264, + message=gagr_lift_measurement_video.LiftMeasurementVideo, + ) + ) + lift_measurement_flight: ( + gagr_lift_measurement_flight.LiftMeasurementFlight + ) = proto.Field( + proto.MESSAGE, + number=266, + message=gagr_lift_measurement_flight.LiftMeasurementFlight, + ) android_privacy_shared_key_google_ad_group: ( gagr_android_privacy_shared_key_google_ad_group.AndroidPrivacySharedKeyGoogleAdGroup ) = proto.Field( diff --git a/google/ads/googleads/v25/services/types/reach_plan_service.py b/google/ads/googleads/v25/services/types/reach_plan_service.py index 0b09fa8a0..1b6076a56 100644 --- a/google/ads/googleads/v25/services/types/reach_plan_service.py +++ b/google/ads/googleads/v25/services/types/reach_plan_service.py @@ -604,6 +604,9 @@ class PlannableTargeting(proto.Message): products. networks (MutableSequence[google.ads.googleads.v25.enums.types.ReachPlanNetworkEnum.ReachPlanNetwork]): Targetable networks for the ad product. + parental_statuses (MutableSequence[google.ads.googleads.v25.common.types.ParentalStatusInfo]): + Targetable parental statuses for the ad + product. youtube_select_lineup_targeting (google.ads.googleads.v25.services.types.YouTubeSelectLineUpTargeting): Targetable YouTube Select Lineups for the ad product. @@ -638,6 +641,13 @@ class PlannableTargeting(proto.Message): number=4, enum=reach_plan_network.ReachPlanNetworkEnum.ReachPlanNetwork, ) + parental_statuses: MutableSequence[criteria.ParentalStatusInfo] = ( + proto.RepeatedField( + proto.MESSAGE, + number=8, + message=criteria.ParentalStatusInfo, + ) + ) youtube_select_lineup_targeting: "YouTubeSelectLineUpTargeting" = ( proto.Field( proto.MESSAGE, @@ -988,6 +998,9 @@ class Targeting(proto.Message): targets all applicable networks. Applicable networks vary by product and region and can be obtained from [ReachPlanService.ListPlannableProducts][google.ads.googleads.v25.services.ReachPlanService.ListPlannableProducts]. + parental_statuses (MutableSequence[google.ads.googleads.v25.common.types.ParentalStatusInfo]): + Targeted parental statuses. If not specified, targets all + parental statuses (PARENT, NOT_A_PARENT, and UNDETERMINED). audience_targeting (google.ads.googleads.v25.services.types.AudienceTargeting): Targeted audiences. If not specified, does not target any specific @@ -1022,6 +1035,13 @@ class Targeting(proto.Message): enum=reach_plan_network.ReachPlanNetworkEnum.ReachPlanNetwork, ) ) + parental_statuses: MutableSequence[criteria.ParentalStatusInfo] = ( + proto.RepeatedField( + proto.MESSAGE, + number=9, + message=criteria.ParentalStatusInfo, + ) + ) audience_targeting: "AudienceTargeting" = proto.Field( proto.MESSAGE, number=7, diff --git a/pyproject.toml b/pyproject.toml index 0dc2a358f..3683a8661 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,8 +22,7 @@ version = "31.3.0" description = "Client library for the Google Ads API" readme = "./README.rst" requires-python = ">=3.9, <3.15" -license = "Apache-2.0" -license-files = ["LICENSE"] +license = { file = "LICENSE" } authors = [ {name = "Google LLC", email = "googleapis-packages@google.com"} ] diff --git a/tests/client_test.py b/tests/client_test.py index eeecdf7f4..093f1c2b6 100644 --- a/tests/client_test.py +++ b/tests/client_test.py @@ -569,9 +569,6 @@ def test_get_service(self): name for name in os.listdir(services_filepath) if name.endswith("_service") - and os.path.isfile( - os.path.join(services_filepath, name, "client.py") - ) ] client = self._create_test_client(version=ver) @@ -599,9 +596,6 @@ def test_get_async_service(self): name for name in os.listdir(services_filepath) if name.endswith("_service") - and os.path.isfile( - os.path.join(services_filepath, name, "async_client.py") - ) ] client = self._create_test_client(version=ver)