Change Status

Video: Status

Change Status provides a means to keep track of which resources have changed within an account over a given time period. If a resource had multiple changes during your given time period, then only the latest change is returned. You can then determine if you need to sync your local database values with those that have changed within the time period.

For example, if during a given time period you add and then update a given campaign, only the change status for the UPDATE and not for the ADD operation is returned. If you move the end of the timeframe to before the update, then you would see the ADD operation.

If you want the complete field-by-field results with a detailed view similar to the Change History web page, see Change Event .

Change Status types

The following resource types are tracked. Note that the resource type IDs are different than the enum value indexes of ChangeStatusResourceType .

Resource type
Value
Resource type ID
Core Entities
Ad group
AD_GROUP
2
Ad group ad
AD_GROUP_AD
3
Ad group bid modifier
AD_GROUP_BID_MODIFIER
11
Ad group criterion
AD_GROUP_CRITERION
4
Ad group feed
AD_GROUP_FEED
12
Asset group
ASSET_BUNDLE
19
Campaign
CAMPAIGN
5
Campaign budget
CAMPAIGN_BUDGET
7
Campaign criterion
CAMPAIGN_CRITERION
6
Feeds
Campaign feed
CAMPAIGN_FEED
9
Feed
FEED
8
Feed item
FEED_ITEM
10
Shared Sets
Shared set
SHARED_SET
17
Campaign shared set
CAMPAIGN_SHARED_SET
18
Assets
Asset
ASSET
13
Asset Set
ASSET_SET
25
Customer asset
CUSTOMER_ASSET
14
Campaign asset
CAMPAIGN_ASSET
15
Campaign asset set
CAMPAIGN_ASSET_SET
26
Ad group asset
AD_GROUP_ASSET
16

Determining resource type by ID

The Google Ads API can return rows with an UNKNOWN resource type value for earlier API versions, meaning that the type is supported in a future version of the Google Ads API but was not fully supported at the time that your current version was released. When this happens, you can still determine the resource type of the row by parsing the returned resource_name .

The resource name format is:

 customers/{customer_id}/changeStatus/{timestamp}-{resource_type_id}-{additional_ids} 

There could be one or more additional IDs, separated by the - character, but the one that is relevant is the resource_type_id —the second ID after the final slash. The previous table lists all of the resource type IDs.

Retrieve changes

The list of changes can be filtered by date as well as by resource type. The operation on a given resource is one of ADDED , CHANGED , or REMOVED .

You can retrieve the list of all changes for all resource types. The returned resource_type is the field that changed. Any parent fields are also populated. For example, if the ad_group_criterion changed, then the ad_group field is also populated.

A change could take up to 3 minutes to be reflected in the change status results.

The query must filter on a date within the past 90 days, and optionally a time, and must include a LIMIT clause set to at most 10,000 results.

Java

 private 
  
 void 
  
 runExample 
 ( 
 GoogleAdsClient 
  
 googleAdsClient 
 , 
  
 long 
  
 customerId 
 ) 
  
 { 
  
 String 
  
 query 
  
 = 
  
 "SELECT change_status.resource_name, " 
  
 + 
  
 "change_status.last_change_date_time, " 
  
 + 
  
 "change_status.resource_status, " 
  
 + 
  
 "change_status.resource_type, " 
  
 + 
  
 "change_status.ad_group, " 
  
 + 
  
 "change_status.ad_group_ad, " 
  
 + 
  
 "change_status.ad_group_bid_modifier, " 
  
 + 
  
 "change_status.ad_group_criterion, " 
  
 + 
  
 "change_status.campaign, " 
  
 + 
  
 "change_status.campaign_criterion, " 
  
 + 
  
 "FROM change_status " 
  
 + 
  
 "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " 
  
 + 
  
 "ORDER BY change_status.last_change_date_time " 
  
 + 
  
 "LIMIT 10000" 
 ; 
  
 try 
  
 ( 
 GoogleAdsServiceClient 
  
 client 
  
 = 
  
 googleAdsClient 
 . 
 getLatestVersion 
 (). 
 createGoogleAdsServiceClient 
 ()) 
  
 { 
  
 SearchPagedResponse 
  
 response 
  
 = 
  
 client 
 . 
 search 
 ( 
 String 
 . 
 valueOf 
 ( 
 customerId 
 ), 
  
 query 
 ); 
  
 for 
  
 ( 
 GoogleAdsRow 
  
 row 
  
 : 
  
 response 
 . 
 iterateAll 
 ()) 
  
 { 
  
 Optional<String> 
  
 resourceNameOfChangedEntity 
  
 = 
  
 getResourceNameForResourceType 
 ( 
 row 
 . 
 getChangeStatus 
 ()); 
  
 System 
 . 
 out 
 . 
 printf 
 ( 
  
 "On '%s', change status '%s' shows a resource type of '%s' " 
  
 + 
  
 "with resource name '%s' was '%s'.%n" 
 , 
  
 row 
 . 
 getChangeStatus 
 (). 
 getLastChangeDateTime 
 (), 
  
 row 
 . 
 getChangeStatus 
 (). 
 getResourceName 
 (), 
  
 row 
 . 
 getChangeStatus 
 (). 
 getResourceType 
 (). 
 name 
 (), 
  
 resourceNameOfChangedEntity 
 . 
 orElse 
 ( 
 "" 
 ), 
  
 row 
 . 
 getChangeStatus 
 (). 
 getResourceStatus 
 (). 
 name 
 ()); 
  
 } 
  
 } 
 } 
  
  

C#

 public 
  
 void 
  
 Run 
 ( 
 GoogleAdsClient 
  
 client 
 , 
  
 long 
  
 customerId 
 ) 
 { 
  
 // Get the GoogleAdsService. 
  
 GoogleAdsServiceClient 
  
 googleAdsService 
  
 = 
  
 client 
 . 
 GetService 
 ( 
  
 Services 
 . 
 V21 
 . 
 GoogleAdsService 
 ); 
  
 string 
  
 searchQuery 
  
 = 
  
 @" 
 SELECT 
 change_status.resource_name, 
 change_status.last_change_date_time, 
 change_status.resource_type, 
 change_status.campaign, 
 change_status.ad_group, 
 change_status.resource_status, 
 change_status.ad_group_ad, 
 change_status.ad_group_criterion, 
 change_status.campaign_criterion 
 FROM change_status 
 WHERE 
 change_status.last_change_date_time DURING LAST_14_DAYS 
 ORDER BY change_status.last_change_date_time 
 LIMIT 10000" 
 ; 
  
 // Create a request that will retrieve all changes. 
  
 SearchGoogleAdsRequest 
  
 request 
  
 = 
  
 new 
  
 SearchGoogleAdsRequest 
 () 
  
 { 
  
 Query 
  
 = 
  
 searchQuery 
 , 
  
 CustomerId 
  
 = 
  
 customerId 
 . 
 ToString 
 () 
  
 }; 
  
 try 
  
 { 
  
 // Issue the search request. 
  
 PagedEnumerable<SearchGoogleAdsResponse 
 , 
  
 GoogleAdsRow 
>  
 searchPagedResponse 
  
 = 
  
 googleAdsService 
 . 
 Search 
 ( 
 request 
 ); 
  
 // Iterate over all rows in all pages and prints the requested field values for the 
  
 // campaign in each row. 
  
 foreach 
  
 ( 
 GoogleAdsRow 
  
 googleAdsRow 
  
 in 
  
 searchPagedResponse 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Last change: {0}, Resource type: {1}, " 
  
 + 
  
 "Resource name: {2}, Resource status: {3}, Specific resource name: {4}" 
 , 
  
 googleAdsRow 
 . 
 ChangeStatus 
 . 
 LastChangeDateTime 
 , 
  
 googleAdsRow 
 . 
 ChangeStatus 
 . 
 ResourceType 
 , 
  
 googleAdsRow 
 . 
 ChangeStatus 
 . 
 ResourceName 
 , 
  
 googleAdsRow 
 . 
 ChangeStatus 
 . 
 ResourceStatus 
 , 
  
 SpecificResourceName 
 ( 
 googleAdsRow 
 . 
 ChangeStatus 
 . 
 ResourceType 
 , 
  
 googleAdsRow 
 )); 
  
 } 
  
 } 
  
 catch 
  
 ( 
 GoogleAdsException 
  
 e 
 ) 
  
 { 
  
 Console 
 . 
 WriteLine 
 ( 
 "Failure:" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Message: {e.Message}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Failure: {e.Failure}" 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Request ID: {e.RequestId}" 
 ); 
  
 throw 
 ; 
  
 } 
 } 
 /// <summary> 
 /// Return the name of the most specific resource that changed. 
 /// </summary> 
 /// <param name="resourceType">Type of the resource.</param> 
 /// <param name="row">Each returned row contains all possible changed fields</param> 
 /// <returns>The resource name of the changed field based on the resource type. 
 /// The changed field's parent is also populated, but is not used.</returns> 
 private 
  
 string 
  
 SpecificResourceName 
 ( 
 ChangeStatusResourceType 
  
 resourceType 
 , 
  
 GoogleAdsRow 
  
 row 
 ) 
 { 
  
 string 
  
 resourceName 
 ; 
  
 switch 
  
 ( 
 resourceType 
 ) 
  
 { 
  
 case 
  
 ChangeStatusResourceType 
 . 
 AdGroup 
 : 
  
 resourceName 
  
 = 
  
 row 
 . 
 ChangeStatus 
 . 
 AdGroup 
 ; 
  
 break 
 ; 
  
 case 
  
 ChangeStatusResourceType 
 . 
 AdGroupAd 
 : 
  
 resourceName 
  
 = 
  
 row 
 . 
 ChangeStatus 
 . 
 AdGroupAd 
 ; 
  
 break 
 ; 
  
 case 
  
 ChangeStatusResourceType 
 . 
 AdGroupCriterion 
 : 
  
 resourceName 
  
 = 
  
 row 
 . 
 ChangeStatus 
 . 
 AdGroupCriterion 
 ; 
  
 break 
 ; 
  
 case 
  
 ChangeStatusResourceType 
 . 
 Campaign 
 : 
  
 resourceName 
  
 = 
  
 row 
 . 
 ChangeStatus 
 . 
 Campaign 
 ; 
  
 break 
 ; 
  
 case 
  
 ChangeStatusResourceType 
 . 
 CampaignCriterion 
 : 
  
 resourceName 
  
 = 
  
 row 
 . 
 ChangeStatus 
 . 
 CampaignCriterion 
 ; 
  
 break 
 ; 
  
 case 
  
 ChangeStatusResourceType 
 . 
 Unknown 
 : 
  
 case 
  
 ChangeStatusResourceType 
 . 
 Unspecified 
 : 
  
 default 
 : 
  
 resourceName 
  
 = 
  
 "" 
 ; 
  
 break 
 ; 
  
 } 
  
 return 
  
 resourceName 
 ; 
 } 
  
  

PHP

 public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) 
 { 
 $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); 
 // Creates a query to find information about changed resources in your account. 
 $query = 'SELECT change_status.resource_name, ' 
 . 'change_status.last_change_date_time, ' 
 . 'change_status.resource_status, ' 
 . 'change_status.resource_type, ' 
 . 'change_status.ad_group, ' 
 . 'change_status.ad_group_ad, ' 
 . 'change_status.ad_group_bid_modifier, ' 
 . 'change_status.ad_group_criterion, ' 
 . 'change_status.ad_group_feed, ' 
 . 'change_status.campaign, ' 
 . 'change_status.campaign_criterion, ' 
 . 'change_status.campaign_feed, ' 
 . 'change_status.feed, ' 
 . 'change_status.feed_item ' 
 . 'FROM change_status ' 
 . 'WHERE change_status.last_change_date_time DURING LAST_14_DAYS ' 
 . 'ORDER BY change_status.last_change_date_time ' 
 . 'LIMIT 10000'; 
 // Issues a search request. 
 $response = $googleAdsServiceClient->search( 
 SearchGoogleAdsRequest::build($customerId, $query) 
 ); 
 // Iterates over all rows in all pages and prints the requested field values for 
 // the change status in each row. 
 foreach ($response->iterateAllElements() as $googleAdsRow) { 
 /** @var GoogleAdsRow $googleAdsRow */ 
 printf( 
 "On %s, change status '%s' shows resource '%s' with type '%s' and status '%s'.%s", 
 $googleAdsRow->getChangeStatus()->getLastChangeDateTime(), 
 $googleAdsRow->getChangeStatus()->getResourceName(), 
 self::getResourceNameForResourceType($googleAdsRow->getChangeStatus()), 
 ChangeStatusResourceType::name( 
 $googleAdsRow->getChangeStatus()->getResourceType() 
 ), 
 ChangeStatusOperation::name($googleAdsRow->getChangeStatus()->getResourceStatus()), 
 PHP_EOL 
 ); 
 } 
 } 
 /** 
 * Gets the resource name for the resource type of the change status object. 
 * 
 * Each returned row contains all possible changed resources, only one of which is populated 
 * with the name of the changed resource. This function returns the resource name of the 
 * changed resource based on the resource type. 
 * 
 * @param ChangeStatus $changeStatus the change status object for getting changed resource 
 * @return string the name of the resource that changed 
 */ 
 private static function getResourceNameForResourceType( 
 ChangeStatus $changeStatus 
 ) { 
 $resourceType = $changeStatus->getResourceType(); 
 $resourceName = ''; // Default value for UNSPECIFIED or UNKNOWN resource type. 
 switch ($resourceType) { 
 case ChangeStatusResourceType::AD_GROUP: 
 $resourceName = $changeStatus->getAdGroup(); 
 break; 
 case ChangeStatusResourceType::AD_GROUP_AD: 
 $resourceName = $changeStatus->getAdGroupAd(); 
 break; 
 case ChangeStatusResourceType::AD_GROUP_BID_MODIFIER: 
 $resourceName = $changeStatus->getAdGroupBidModifier(); 
 break; 
 case ChangeStatusResourceType::AD_GROUP_CRITERION: 
 $resourceName = $changeStatus->getAdGroupCriterion(); 
 break; 
 case ChangeStatusResourceType::AD_GROUP_FEED: 
 $resourceName = $changeStatus->getAdGroupFeed(); 
 break; 
 case ChangeStatusResourceType::CAMPAIGN: 
 $resourceName = $changeStatus->getCampaign(); 
 break; 
 case ChangeStatusResourceType::CAMPAIGN_CRITERION: 
 $resourceName = $changeStatus->getCampaignCriterion(); 
 break; 
 case ChangeStatusResourceType::CAMPAIGN_FEED: 
 $resourceName = $changeStatus->getCampaignFeed(); 
 break; 
 case ChangeStatusResourceType::FEED: 
 $resourceName = $changeStatus->getFeed(); 
 break; 
 case ChangeStatusResourceType::FEED_ITEM: 
 $resourceName = $changeStatus->getFeedItem(); 
 break; 
 } 
 return $resourceName; 
 }  
 

Python

 def 
  
 main 
 ( 
 client 
 : 
 GoogleAdsClient 
 , 
 customer_id 
 : 
 str 
 ) 
 - 
> None 
 : 
 ads_service 
 : 
 GoogleAdsServiceClient 
 = 
 client 
 . 
 get_service 
 ( 
 "GoogleAdsService" 
 ) 
 # Construct a query to find information about changed resources in your 
 # account. 
 query 
 = 
 """ 
 SELECT 
 change_status.resource_name, 
 change_status.last_change_date_time, 
 change_status.resource_type, 
 change_status.campaign, 
 change_status.ad_group, 
 change_status.resource_status, 
 change_status.ad_group_ad, 
 change_status.ad_group_criterion, 
 change_status.campaign_criterion 
 FROM change_status 
 WHERE change_status.last_change_date_time DURING LAST_14_DAYS 
 ORDER BY change_status.last_change_date_time 
 LIMIT 10000""" 
 search_request 
 : 
 SearchGoogleAdsRequest 
 = 
 client 
 . 
 get_type 
 ( 
 "SearchGoogleAdsRequest" 
 ) 
 search_request 
 . 
 customer_id 
 = 
 customer_id 
 search_request 
 . 
 query 
 = 
 query 
 response 
 : 
 SearchPagedResponse 
 = 
 ads_service 
 . 
 search 
 ( 
 request 
 = 
 search_request 
 ) 
 row 
 : 
 GoogleAdsRow 
 for 
 row 
 in 
 response 
 : 
 cs 
 : 
 ChangeStatus 
 = 
 row 
 . 
 change_status 
 resource_type 
 : 
 str 
 = 
 cs 
 . 
 resource_type 
 . 
 name 
 resource_name 
 : 
 str 
 if 
 resource_type 
 == 
 "AD_GROUP" 
 : 
 resource_name 
 = 
 cs 
 . 
 ad_group 
 elif 
 resource_type 
 == 
 "AD_GROUP_AD" 
 : 
 resource_name 
 = 
 cs 
 . 
 ad_group_ad 
 elif 
 resource_type 
 == 
 "AD_GROUP_CRITERION" 
 : 
 resource_name 
 = 
 cs 
 . 
 ad_group_criterion 
 elif 
 resource_type 
 == 
 "CAMPAIGN" 
 : 
 resource_name 
 = 
 cs 
 . 
 campaign 
 elif 
 resource_type 
 == 
 "CAMPAIGN_CRITERION" 
 : 
 resource_name 
 = 
 cs 
 . 
 campaign_criterion 
 else 
 : 
 resource_name 
 = 
 "UNKNOWN" 
 resource_status 
 : 
 str 
 = 
 cs 
 . 
 resource_status 
 . 
 name 
 print 
 ( 
 f 
 "On ' 
 { 
 cs 
 . 
 last_change_date_time 
 } 
 ', change status " 
 f 
 "' 
 { 
 cs 
 . 
 resource_name 
 } 
 ' shows that a resource type of " 
 f 
 "' 
 { 
 resource_type 
 } 
 ' with resource name ' 
 { 
 resource_name 
 } 
 ' was " 
 f 
 " 
 { 
 resource_status 
 } 
 " 
 ) 
  

Ruby

 def 
  
 get_change_summary 
 ( 
 customer_id 
 ) 
  
 # GoogleAdsClient will read a config file from 
  
 # ENV['HOME']/google_ads_config.rb when called without parameters 
  
 client 
  
 = 
  
 Google 
 :: 
 Ads 
 :: 
 GoogleAds 
 :: 
 GoogleAdsClient 
 . 
 new 
  
 # Construct a query to find information about changed resources in your 
  
 # account. 
  
 query 
  
 = 
  
<< ~ 
 QUERY 
  
 SELECT 
  
 change_status 
 . 
 resource_name 
 , 
  
 change_status 
 . 
 last_change_date_time 
 , 
  
 change_status 
 . 
 resource_type 
 , 
  
 change_status 
 . 
 campaign 
 , 
  
 change_status 
 . 
 ad_group 
 , 
  
 change_status 
 . 
 resource_status 
 , 
  
 change_status 
 . 
 ad_group_ad 
 , 
  
 change_status 
 . 
 ad_group_criterion 
 , 
  
 change_status 
 . 
 campaign_criterion 
  
 FROM 
  
 change_status 
  
 WHERE 
  
 change_status 
 . 
 last_change_date_time 
  
 DURING 
  
 LAST_14_DAYS 
  
 ORDER 
  
 BY 
  
 change_status 
 . 
 last_change_date_time 
  
 LIMIT 
  
 10000 
  
 QUERY 
  
 # Execute the query. 
  
 response 
  
 = 
  
 client 
 . 
 service 
 . 
 google_ads 
 . 
 search 
 ( 
  
 customer_id 
 : 
  
 customer_id 
 , 
  
 query 
 : 
  
 query 
 , 
  
 ) 
  
 # Process the results. 
  
 response 
 . 
 each 
  
 do 
  
 | 
 row 
 | 
  
 cs 
  
 = 
  
 row 
 . 
 change_status 
  
 resource_name 
  
 = 
  
 case 
  
 cs 
 . 
 resource_type 
  
 when 
  
 :AD_GROUP 
  
 cs 
 . 
 ad_group 
  
 when 
  
 :AD_GROUP_AD 
  
 cs 
 . 
 ad_group_ad 
  
 when 
  
 :AD_GROUP_CRITERION 
  
 cs 
 . 
 ad_group_criterion 
  
 when 
  
 :CAMPAIGN 
  
 cs 
 . 
 campaign 
  
 when 
  
 :CAMPAIGN_CRITERION 
  
 cs 
 . 
 campaign_criterion 
  
 else 
  
 "UNKNOWN" 
  
 end 
  
 puts 
  
 "On 
 #{ 
 cs 
 . 
 last_change_date_time 
 } 
 , change status 
 #{ 
 cs 
 . 
 resource_name 
 } 
 " 
  
 \ 
  
 "shows a resource type of 
 #{ 
 cs 
 . 
 resource_type 
 } 
 " 
  
 \ 
  
 "with resource name 
 #{ 
 resource_name 
 } 
 was 
 #{ 
 cs 
 . 
 resource_status 
 } 
 ." 
  
 end 
 end  
 
 . 
 rb 
  

Perl

 sub 
  
 get_change_summary 
  
 { 
  
 my 
  
 ( 
 $api_client 
 , 
  
 $customer_id 
 ) 
  
 = 
  
 @_ 
 ; 
  
 # Construct a search query to find information about changed resources in your 
  
 # account. 
  
 my 
  
 $search_query 
  
 = 
  
 "SELECT change_status.resource_name, change_status.last_change_date_time, " 
  
 . 
  
 "change_status.resource_status, " 
  
 . 
  
 "change_status.resource_type, " 
  
 . 
  
 "change_status.ad_group, " 
  
 . 
  
 "change_status.ad_group_ad, " 
  
 . 
  
 "change_status.ad_group_bid_modifier, " 
  
 . 
  
 "change_status.ad_group_criterion, " 
  
 . 
  
 "change_status.ad_group_feed, " 
  
 . 
  
 "change_status.campaign, " 
  
 . 
  
 "change_status.campaign_criterion, " 
  
 . 
  
 "change_status.campaign_feed, " 
  
 . 
  
 "change_status.feed, " 
  
 . 
  
 "change_status.feed_item " 
  
 . 
  
 "FROM change_status " 
  
 . 
  
 "WHERE change_status.last_change_date_time DURING LAST_14_DAYS " 
  
 . 
  
 "ORDER BY change_status.last_change_date_time " 
  
 . 
  
 "LIMIT 10000" 
 ; 
  
 # Create a search Google Ads request that will retrieve all change statuses using 
  
 # pages of the specified page size. 
  
 my 
  
 $search_request 
  
 = 
  
 Google::Ads::GoogleAds::V21::Services::GoogleAdsService:: 
 SearchGoogleAdsRequest 
  
 - 
> new 
 ({ 
  
 customerId 
  
 = 
>  
 $customer_id 
 , 
  
 query 
  
 = 
>  
 $search_query 
  
 }); 
  
 # Get the GoogleAdsService. 
  
 my 
  
 $google_ads_service 
  
 = 
  
 $api_client 
 - 
> GoogleAdsService 
 (); 
  
 my 
  
 $iterator 
  
 = 
  
 Google::Ads::GoogleAds::Utils:: 
 SearchGoogleAdsIterator 
 - 
> new 
 ({ 
  
 service 
  
 = 
>  
 $google_ads_service 
 , 
  
 request 
  
 = 
>  
 $search_request 
  
 }); 
  
 # Iterate over all rows in all pages and print the requested field values for 
  
 # the change status in each row. 
  
 while 
  
 ( 
 $iterator 
 - 
> has_next 
 ) 
  
 { 
  
 my 
  
 $google_ads_row 
  
 = 
  
 $iterator 
 - 
> next 
 ; 
  
 my 
  
 $change_status 
  
 = 
  
 $google_ads_row 
 - 
> { 
 changeStatus 
 }; 
  
 printf 
  
 "On %s, change status '%s' shows a resource type of '%s' " 
  
 . 
  
 "with resource name '%s' was '%s'.\n" 
 , 
  
 $change_status 
 - 
> { 
 lastChangeDateTime 
 }, 
  
 $change_status 
 - 
> { 
 resourceName 
 }, 
  
 $change_status 
 - 
> { 
 resourceType 
 }, 
  
 __get_resource_name_for_resource_type 
 ( 
 $change_status 
 ), 
  
 $change_status 
 - 
> { 
 resourceStatus 
 }; 
  
 } 
  
 return 
  
 1 
 ; 
 } 
 # This method returns the resource name of the changed field based on the 
 # resource type. The changed field's parent is also populated but is not used. 
 sub 
  
 __get_resource_name_for_resource_type 
  
 { 
  
 my 
  
 $change_status 
  
 = 
  
 shift 
 ; 
  
 my 
  
 $resource_type 
  
 = 
  
 $change_status 
 - 
> { 
 resourceType 
 }; 
  
 if 
  
 ( 
 $resource_type 
  
 eq 
  
 AD_GROUP 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 adGroup 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 AD_GROUP_AD 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 adGroupAd 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 AD_GROUP_BID_MODIFIER 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 adGroupBidModifier 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 AD_GROUP_CRITERION 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 adGroupCriterion 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 AD_GROUP_FEED 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 adGroupFeed 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 CAMPAIGN 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 campaign 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 CAMPAIGN_CRITERION 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 campaignCriterion 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 CAMPAIGN_FEED 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 campaignFeed 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 FEED 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 feed 
 }; 
  
 } 
  
 elsif 
  
 ( 
 $resource_type 
  
 eq 
  
 FEED_ITEM 
 ) 
  
 { 
  
 return 
  
 $change_status 
 - 
> { 
 feedItem 
 }; 
  
 } 
  
 else 
  
 { 
  
 return 
  
 "" 
 ; 
  
 } 
 } 
  
  

Sync locally

Once the precise resource_name is retrieved, a new query with this resource name should be made to obtain all the current values of the resource. Change status is not tracked for a specific resource's changed values—only which resources have changed. Determining the difference between the prior and current values is the responsibility of the calling program.

Change time

The last_change_date_time field indicates when the most recent change to a resource occurred. Thus, the freshness of locally cached data can be compared with this field's value to help determine whether local data is out of date.

Note that this field is also filterable , meaning it can be used in the WHERE clause of a Google Ads Query Language (GAQL) query, letting you query for changes in resources that have occurred before or after a given time.

For example, finding all changes that have occurred for a certain resource type within the last week can be accomplished with the following GAQL predicate clause:

  WHERE 
  
 change_status 
 . 
 last_change_date_time 
  
 DURING 
  
 LAST_7_DAYS 
 
Create a Mobile Website
View Site in Mobile | Classic
Share by: