AI-generated Key Takeaways
-
Historical metrics provide data on past keyword performance on Google Search, including search volume, competition level, and bid ranges.
-
These metrics can be used to narrow down a large list of keywords based on their performance.
-
To obtain historical metrics, you can use the
GenerateKeywordHistoricalMetricsmethod with specified parameters like keywords, geo targets, and language. -
The functionality of generating historical metrics is similar to the Keyword Planner tool in the Google Ads UI.
Historical metrics provide metrics on how keywords have previously performed on Google Search including:
- Average monthly searches (past 12 months)
- Approximate monthly search volume (per month)
- Competition level
- Competition index
- 20th percentile of bids
- 80th percentile of bids
You can use historical metrics to reduce a large set of keywords to a more manageable size based on the performance. If you already know the keywords you want to use, you can skip historical metrics and go straight to forecast metrics .
Generate metrics
To generate historical metrics call KeywordPlanIdeaService.GenerateKeywordHistoricalMetrics
with the parameters you would like to include.
Java
private void runExample ( GoogleAdsClient googleAdsClient , Long customerId ) { GenerateKeywordHistoricalMetricsRequest request = GenerateKeywordHistoricalMetricsRequest . newBuilder () . setCustomerId ( String . valueOf ( customerId )) . addAllKeywords ( Arrays . asList ( "mars cruise" , "cheap cruise" , "jupiter cruise" )) // See https://developers.google.com/google-ads/api/reference/data/geotargets for the // list of geo target IDs. // Geo target constant 2840 is for USA. . addGeoTargetConstants ( ResourceNames . geoTargetConstant ( 2840 )) . setKeywordPlanNetwork ( KeywordPlanNetwork . GOOGLE_SEARCH ) // See // https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. . setLanguage ( ResourceNames . languageConstant ( 1000 )) . build (); try ( KeywordPlanIdeaServiceClient keywordPlanIdeaServiceClient = googleAdsClient . getLatestVersion (). createKeywordPlanIdeaServiceClient ()) { GenerateKeywordHistoricalMetricsResponse response = keywordPlanIdeaServiceClient . generateKeywordHistoricalMetrics ( request ); for ( GenerateKeywordHistoricalMetricsResult result : response . getResultsList ()) { KeywordPlanHistoricalMetrics metrics = result . getKeywordMetrics (); System . out . printf ( "The search query: %s%n" , result . getText ()); System . out . printf ( "and the following variants: %s%n" , Joiner . on ( "," ). join ( result . getCloseVariantsList ())); System . out . println ( "generated the following historical metrics:" ); // Approximate number of monthly searches on this query averaged for the past 12 // months. System . out . printf ( "Approximate monthly searches: %s%n" , metrics . hasAvgMonthlySearches () ? metrics . getAvgMonthlySearches () : null ); // The competition level for this search query. System . out . printf ( "Competition level: %s%n" , metrics . getCompetition ()); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. System . out . printf ( "Competition index: %s%n" , metrics . hasCompetitionIndex () ? metrics . getCompetitionIndex () : null ); // Top of page bid low range (20th percentile) in micros for the keyword. System . out . printf ( "Top of page bid low range: %s%n" , metrics . hasLowTopOfPageBidMicros () ? metrics . getLowTopOfPageBidMicros () : null ); // Top of page bid high range (80th percentile) in micros for the keyword. System . out . printf ( "Top of page bid high range: %s%n" , metrics . hasHighTopOfPageBidMicros () ? metrics . getHighTopOfPageBidMicros () : null ); // Approximate number of searches on this query for the past twelve months. metrics . getMonthlySearchVolumesList (). stream () // Orders the monthly search volumes by descending year, then descending month. . sorted ( ( a , b ) - > ComparisonChain . start () . compare ( b . getYear (), a . getYear ()) . compare ( b . getMonth (), a . getMonth ()) . result ()) // Prints each monthly search volume. . forEachOrdered ( monthlySearchVolume - > System . out . printf ( "Approximately %d searches in %s, %s%n" , monthlySearchVolume . getMonthlySearches (), monthlySearchVolume . getMonth (), monthlySearchVolume . getYear ())); } } }
C#
public void Run ( GoogleAdsClient client , long customerId ) { KeywordPlanIdeaServiceClient keywordPlanIdeaService = client . GetService ( Services . V22 . KeywordPlanIdeaService ); GenerateKeywordHistoricalMetricsRequest request = new GenerateKeywordHistoricalMetricsRequest () { CustomerId = customerId . ToString (), Keywords = { "mars cruise" , "cheap cruise" , "jupiter cruise" }, // See https://developers.google.com/google-ads/api/reference/data/geotargets // for the list of geo target IDs. // Geo target constant 2840 is for USA. GeoTargetConstants = { ResourceNames . GeoTargetConstant ( 2840 ) }, KeywordPlanNetwork = KeywordPlanNetwork . GoogleSearch , // See https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. Language = ResourceNames . LanguageConstant ( 1000 ) }; try { GenerateKeywordHistoricalMetricsResponse response = keywordPlanIdeaService . GenerateKeywordHistoricalMetrics ( request ); foreach ( GenerateKeywordHistoricalMetricsResult result in response . Results ) { KeywordPlanHistoricalMetrics metrics = result . KeywordMetrics ; Console . WriteLine ( $"The search query {result.Text}" ); Console . WriteLine ( "and the following variants: " + $"{String.Join(" , ", result.CloseVariants)}" ); Console . WriteLine ( "Generated the following historical metrics:" ); // Approximate number of monthly searches on this query averaged for the past 12 // months. Console . WriteLine ( $"Approximate monthly searches: {metrics.AvgMonthlySearches}" ); // The competition level for this search query. Console . WriteLine ( $"Competition level: {metrics.Competition}" ); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. Console . WriteLine ( $"Competition index: {metrics.CompetitionIndex}" ); // Top of page bid low range (20th percentile) in micros for the keyword. Console . WriteLine ( $"Top of page bid low range: {metrics.LowTopOfPageBidMicros}" ); // Top of page bid high range (80th percentile) in micros for the keyword. Console . WriteLine ( $"Top of page bid high range: {metrics.HighTopOfPageBidMicros}" ); // Approximate number of searches on this query for the past twelve months. foreach ( MonthlySearchVolume month in metrics . MonthlySearchVolumes ) { Console . WriteLine ( $"Approximately {month.MonthlySearches} searches in " + $"{month.Month}, {month.Year}" ); } } } catch ( GoogleAdsException e ) { Console . WriteLine ( "Failure:" ); Console . WriteLine ( $"Message: {e.Message}" ); Console . WriteLine ( $"Failure: {e.Failure}" ); Console . WriteLine ( $"Request ID: {e.RequestId}" ); throw ; } }
PHP
public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId ): void { $keywordPlanIdeaServiceClient = $googleAdsClient->getKeywordPlanIdeaServiceClient(); // Generates keyword historical metrics based on the specified parameters. $response = $keywordPlanIdeaServiceClient->generateKeywordHistoricalMetrics( new GenerateKeywordHistoricalMetricsRequest([ 'customer_id' => $customerId, 'keywords' => ['mars cruise', 'cheap cruise', 'jupiter cruise'], // See https://developers.google.com/google-ads/api/reference/data/geotargets for // the list of geo target IDs. // Geo target constant 2840 is for USA. 'geo_target_constants' => [ResourceNames::forGeoTargetConstant(2840)], 'keyword_plan_network' => KeywordPlanNetwork::GOOGLE_SEARCH, // https://developers.google.com/google-ads/api/reference/data/codes-formats#languages // for the list of language constant IDs. // Language constant 1000 is for English. 'language' => ResourceNames::forLanguageConstant(1000) ]) ); // Iterates over the results and print its detail. foreach ($response->getResults() as $result) { /** @var GenerateKeywordHistoricalMetricsResult $result */ $metrics = $result->getKeywordMetrics(); printf("The search query: '%s' ", $result->getText()); printf( "and the following variants: '%s' ", implode(',', iterator_to_array($result->getCloseVariants()->getIterator())) ); print "generated the following historical metrics:" . PHP_EOL; // Approximate number of monthly searches on this query averaged for the past 12 months. printf( "Approximate monthly searches: %s%s", $metrics->hasAvgMonthlySearches() ? sprintf("%d", $metrics->getAvgMonthlySearches()) : "'none'", PHP_EOL ); // The competition level for this search query. printf( "Competition level: '%s'%s", KeywordPlanCompetitionLevel::name($metrics->getCompetition()), PHP_EOL ); // The competition index for the query in the range [0,100]. This shows how // competitive ad placement is for a keyword. The level of competition from 0-100 is // determined by the number of ad slots filled divided by the total number of slots // available. If not enough data is available, null will be returned. printf( "Competition index: %s%s", $metrics->hasCompetitionIndex() ? sprintf("%d", $metrics->getCompetitionIndex()) : "'none'", PHP_EOL ); // Top of page bid low range (20th percentile) in micros for the keyword. printf( "Top of page bid low range: %s%s", $metrics->hasLowTopOfPageBidMicros() ? sprintf("%d", $metrics->getLowTopOfPageBidMicros()) : "'none'", PHP_EOL ); // Top of page bid high range (80th percentile) in micros for the keyword. printf( "Top of page bid high range: %s%s", $metrics->hasHighTopOfPageBidMicros() ? sprintf("%d", $metrics->getHighTopOfPageBidMicros()) : "'none'", PHP_EOL ); // Approximate number of searches on this query for the past twelve months. $monthlySearchVolumes = iterator_to_array($metrics->getMonthlySearchVolumes()->getIterator()); usort( $monthlySearchVolumes, // Orders the monthly search volumes by descending year, then descending month. function (MonthlySearchVolume $volume1, MonthlySearchVolume $volume2) { $yearsCompared = $volume2->getYear() <=> $volume1->getYear(); if ($yearsCompared != 0) { return $yearsCompared; } else { return $volume2->getMonth() <=> $volume1->getMonth(); } } ); // Prints each monthly search volume. array_walk($monthlySearchVolumes, function (MonthlySearchVolume $monthlySearchVolume) { printf( "Approximately %d searches in %s, %s.%s", $monthlySearchVolume->getMonthlySearches(), MonthOfYear::name($monthlySearchVolume->getMonth()), $monthlySearchVolume->getYear(), PHP_EOL ); }); print PHP_EOL; } }

