Here's an example of how to create a basic uploaded display ad:
Java
// Copyright 2020 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 // // https://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. package com.google.ads.googleads.examples.advancedoperations ; import com.beust.jcommander.Parameter ; import com.google.ads.googleads.examples.utils.ArgumentNames ; import com.google.ads.googleads.examples.utils.CodeSampleParams ; import com.google.ads.googleads.lib.GoogleAdsClient ; import com.google.ads.googleads.v21.common.AdMediaBundleAsset ; import com.google.ads.googleads.v21.common.DisplayUploadAdInfo ; import com.google.ads.googleads.v21.common.MediaBundleAsset ; import com.google.ads.googleads.v21.enums.AdGroupAdStatusEnum.AdGroupAdStatus ; import com.google.ads.googleads.v21.enums.AssetTypeEnum.AssetType ; import com.google.ads.googleads.v21.enums.DisplayUploadProductTypeEnum.DisplayUploadProductType ; import com.google.ads.googleads.v21.errors.GoogleAdsError ; import com.google.ads.googleads.v21.errors.GoogleAdsException ; import com.google.ads.googleads.v21.resources.Ad ; import com.google.ads.googleads.v21.resources.AdGroupAd ; import com.google.ads.googleads.v21.resources.Asset ; import com.google.ads.googleads.v21.services.AdGroupAdOperation ; import com.google.ads.googleads.v21.services.AdGroupAdServiceClient ; import com.google.ads.googleads.v21.services.AssetOperation ; import com.google.ads.googleads.v21.services.AssetServiceClient ; import com.google.ads.googleads.v21.services.MutateAdGroupAdsResponse ; import com.google.ads.googleads.v21.services.MutateAssetsResponse ; import com.google.ads.googleads.v21.utils.ResourceNames ; import com.google.common.collect.ImmutableList ; import com.google.common.io.ByteStreams ; import com.google.protobuf.ByteString ; import java.io.FileNotFoundException ; import java.io.IOException ; import java.net.URL ; /** Adds a display upload ad to a given ad group. To get ad groups, run GetAdGroups.java. */ public class AddDisplayUploadAd { private static final String BUNDLE_URL = "https://gaagl.page.link/ib87" ; private static class AddDisplayUploadAdParams extends CodeSampleParams { @Parameter ( names = ArgumentNames . CUSTOMER_ID , required = true ) private Long customerId ; @Parameter ( names = ArgumentNames . AD_GROUP_ID , required = true ) private Long adGroupId ; } public static void main ( String [] args ) throws IOException { AddDisplayUploadAdParams params = new AddDisplayUploadAdParams (); if ( ! params . parseArguments ( args )) { // Either pass the required parameters for this example on the command line, or insert them // into the code here. See the parameter class definition above for descriptions. params . customerId = Long . parseLong ( "INSERT_CUSTOMER_ID_HERE" ); params . adGroupId = Long . parseLong ( "INSERT_AD_GROUP_ID_HERE" ); } GoogleAdsClient googleAdsClient = null ; try { googleAdsClient = GoogleAdsClient . newBuilder (). fromPropertiesFile (). build (); } catch ( FileNotFoundException fnfe ) { System . err . printf ( "Failed to load GoogleAdsClient configuration from file. Exception: %s%n" , fnfe ); System . exit ( 1 ); } catch ( IOException ioe ) { System . err . printf ( "Failed to create GoogleAdsClient. Exception: %s%n" , ioe ); System . exit ( 1 ); } try { new AddDisplayUploadAd (). runExample ( googleAdsClient , params . customerId , params . adGroupId ); } catch ( GoogleAdsException gae ) { // GoogleAdsException is the base class for most exceptions thrown by an API request. // Instances of this exception have a message and a GoogleAdsFailure that contains a // collection of GoogleAdsErrors that indicate the underlying causes of the // GoogleAdsException. System . err . printf ( "Request ID %s failed due to GoogleAdsException. Underlying errors:%n" , gae . getRequestId ()); int i = 0 ; for ( GoogleAdsError googleAdsError : gae . getGoogleAdsFailure (). getErrorsList ()) { System . err . printf ( " Error %d: %s%n" , i ++ , googleAdsError ); } System . exit ( 1 ); } } /** * Runs the example. * * @param googleAdsClient the Google Ads API client. * @param customerId the client customer ID. * @param adGroupId the ad group ID. * @throws GoogleAdsException if an API request failed with one or more service errors. */ private void runExample ( GoogleAdsClient googleAdsClient , long customerId , long adGroupId ) throws IOException { // There are several types of display upload ads. For this example, we will create // an HTML5 upload ad, which requires a media bundle. // The DisplayUploadProductType field lists the available display upload types: // https://developers.google.com/google-ads/api/reference/rpc/v4/DisplayUploadAdInfo // Creates a new media bundle asset and returns the resource name. String adAssetResourceName = createMediaBundleAsset ( googleAdsClient , customerId ); // Creates a new display upload ad and associates it with the specified ad group. createDisplayUploadAdGroupAd ( googleAdsClient , customerId , adGroupId , adAssetResourceName ); } /** * Creates a media bundle from the assets in a zip file. The zip file contains the HTML5 * components. * * @param googleAdsClient the Google Ads API client. * @param customerId the client customer ID. * @return the resource name of the newly created media bundle. * @throws IOException if there is an error reading the media bundle. */ private String createMediaBundleAsset ( GoogleAdsClient googleAdsClient , long customerId ) throws IOException { // The HTML5 zip file contains all the HTML, CSS, and images needed for the // HTML5 ad. For help on creating an HTML5 zip file, check out Google Web // Designer (https://www.google.com/webdesigner/). // // There are several types of display upload ads. For this example, we will create // an HTML5 upload ad, which requires a media bundle. // The DisplayUploadProductType field lists the available display upload types: // https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo byte [] html5Zip = ByteStreams . toByteArray ( new URL ( BUNDLE_URL ). openStream ()); // Creates the media bundle asset. Asset asset = Asset . newBuilder () . setName ( "Ad Media Bundle" ) . setType ( AssetType . MEDIA_BUNDLE ) . setMediaBundleAsset ( MediaBundleAsset . newBuilder (). setData ( ByteString . copyFrom ( html5Zip )). build ()) . build (); // Creates the asset operation. AssetOperation operation = AssetOperation . newBuilder (). setCreate ( asset ). build (); // Gets the AssetService. try ( AssetServiceClient assetServiceClient = googleAdsClient . getLatestVersion (). createAssetServiceClient ()) { // Adds the asset to the client account. MutateAssetsResponse response = assetServiceClient . mutateAssets ( Long . toString ( customerId ), ImmutableList . of ( operation )); // Displays and returns the resulting resource name. String uploadedAssetResourceName = response . getResults ( 0 ). getResourceName (); System . out . printf ( "Uploaded media bundle with resource name: '%s'.%n" , uploadedAssetResourceName ); return uploadedAssetResourceName ; } } /** * Creates a new HTML5 display upload ad and adds it to the specified ad group. * * @param googleAdsClient the Google Ads API client. * @param customerId the client customer ID. * @param adGroupId the ad group ID. * @param adAssetResourceName The ID of the ad group to which the new ad will be added. */ private void createDisplayUploadAdGroupAd ( GoogleAdsClient googleAdsClient , long customerId , long adGroupId , String adAssetResourceName ) { // Creates the ad with the required fields. Ad displayUploadAd = Ad . newBuilder () . setName ( "Ad for HTML5" ) . addFinalUrls ( "http://example.com/html5" ) // Exactly one ad data field must be included to specify the ad type. See // https://developers.google.com/google-ads/api/reference/rpc/v4/Ad for the full // list of available types. . setDisplayUploadAd ( DisplayUploadAdInfo . newBuilder () . setDisplayUploadProductType ( DisplayUploadProductType . HTML5_UPLOAD_AD ) . setMediaBundle ( AdMediaBundleAsset . newBuilder (). setAsset ( adAssetResourceName ). build ()) . build ()) . build (); // Creates an ad group ad for the new ad. AdGroupAd adGroupAd = AdGroupAd . newBuilder () . setAd ( displayUploadAd ) . setStatus ( AdGroupAdStatus . PAUSED ) . setAdGroup ( ResourceNames . adGroup ( customerId , adGroupId )) . build (); // Creates the ad group ad operation. AdGroupAdOperation operation = AdGroupAdOperation . newBuilder (). setCreate ( adGroupAd ). build (); // Creates the ad group ad service client. try ( AdGroupAdServiceClient adGroupAdServiceClient = googleAdsClient . getLatestVersion (). createAdGroupAdServiceClient ()) { // Adds the ad group ad to the client account. MutateAdGroupAdsResponse response = adGroupAdServiceClient . mutateAdGroupAds ( Long . toString ( customerId ), ImmutableList . of ( operation )); // Displays the resulting ad group ad's resource name. System . out . printf ( "Created new ad group ad with resource name: '%s'.%n" , response . getResults ( 0 ). getResourceName ()); } } }
C#
// Copyright 2020 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. using CommandLine ; using Google.Ads.Gax.Examples ; using Google.Ads.Gax.Util ; using Google.Ads.GoogleAds.Lib ; using Google.Ads.GoogleAds.Util ; using Google.Ads.GoogleAds.V21.Common ; using Google.Ads.GoogleAds.V21.Enums ; using Google.Ads.GoogleAds.V21.Errors ; using Google.Ads.GoogleAds.V21.Resources ; using Google.Ads.GoogleAds.V21.Services ; using Google.Protobuf ; using System ; using System.Collections.Generic ; using System.Linq ; using static Google . Ads . GoogleAds . V21 . Enums . DisplayUploadProductTypeEnum . Types ; namespace Google.Ads.GoogleAds.Examples.V21 { /// <summary> /// This code example adds a display upload ad to a given ad group. To get ad groups, /// run GetAdGroups.cs. /// </summary> public class AddDisplayUploadAd : ExampleBase { /// <summary> /// Command line options for running the <see cref="AddDisplayUploadAd"/> example. /// </summary> public class Options : OptionsBase { /// <summary> /// The Google Ads customer ID for which the call is made. /// </summary> [Option("customerId", Required = true, HelpText = "The Google Ads customer ID for which the call is made.")] public long CustomerId { get ; set ; } /// <summary> /// The ID of the ad group to which the new ad will be added. /// </summary> [Option("adGroupId", Required = true, HelpText = "The ID of the ad group to which the new ad will be added.")] public long AdGroupId { get ; set ; } } /// <summary> /// Main method, to run this code example as a standalone application. /// </summary> /// <param name="args">The command line arguments.</param> public static void Main ( string [] args ) { Options options = ExampleUtilities . ParseCommandLine<Options> ( args ); AddDisplayUploadAd codeExample = new AddDisplayUploadAd (); Console . WriteLine ( codeExample . Description ); codeExample . Run ( new GoogleAdsClient (), options . CustomerId , options . AdGroupId ); } /// <summary> /// Returns a description about the code example. /// </summary> public override string Description = > "This code example adds a display upload ad to a given ad group. To get ad groups, " + "run GetAdGroups.cs." ; /// <summary> /// Runs the code example. /// </summary> /// <param name="client">The Google Ads client.</param> /// <param name="customerId">The Google Ads customer ID for which the call is made.</param> /// <param name="adGroupId">The ID of the ad group to which the new ad will be /// added.</param> public void Run ( GoogleAdsClient client , long customerId , long adGroupId ) { try { // There are several types of display upload ads. For this example, we will create // an HTML5 upload ad, which requires a media bundle. // This feature is only available to allowlisted accounts. // See https://support.google.com/google-ads/answer/1722096 for more details. // The DisplayUploadProductType field lists the available display upload types: // https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo // Creates a new media bundle asset and returns the resource name. string adAssetResourceName = CreateMediaBundleAsset ( client , customerId ); // Creates a new display upload ad and associates it with the specified ad group. CreateDisplayUploadAdGroupAd ( client , customerId , adGroupId , adAssetResourceName ); } catch ( GoogleAdsException e ) { Console . WriteLine ( "Failure:" ); Console . WriteLine ( $"Message: {e.Message}" ); Console . WriteLine ( $"Failure: {e.Failure}" ); Console . WriteLine ( $"Request ID: {e.RequestId}" ); throw ; } } /// <summary> /// Creates a media bundle from the assets in a zip file. The zip file contains the /// HTML5 components. /// </summary> /// <param name="client">The Google Ads API client.</param> /// <param name="customerId">The Google Ads customer ID for which the call is made.</param> /// <returns>The string resource name of the newly uploaded media bundle.</returns> private string CreateMediaBundleAsset ( GoogleAdsClient client , long customerId ) { // Gets the AssetService. AssetServiceClient assetServiceClient = client . GetService ( Services . V21 . AssetService ); // The HTML5 zip file contains all the HTML, CSS, and images needed for the // HTML5 ad. For help on creating an HTML5 zip file, check out Google Web // Designer (https://www.google.com/webdesigner/). byte [] html5Zip = MediaUtilities . GetAssetDataFromUrl ( "https://gaagl.page.link/ib87" , client . Config ); // Creates the media bundle asset. Asset mediaBundleAsset = new Asset () { Type = AssetTypeEnum . Types . AssetType . MediaBundle , MediaBundleAsset = new MediaBundleAsset () { Data = ByteString . CopyFrom ( html5Zip ) }, Name = "Ad Media Bundle" }; // Creates the asset operation. AssetOperation operation = new AssetOperation () { Create = mediaBundleAsset }; // Adds the asset to the client account. MutateAssetsResponse response = assetServiceClient . MutateAssets ( customerId . ToString (), new [] { operation }); // Displays the resulting resource name. string uploadedAssetResourceName = response . Results . First (). ResourceName ; Console . WriteLine ( $"Uploaded media bundle: {uploadedAssetResourceName}" ); return uploadedAssetResourceName ; } /// <summary> /// Creates a new HTML5 display upload ad and adds it to the specified ad group. /// </summary> /// <param name="client">The Google Ads API client.</param> /// <param name="customerId">The Google Ads customer ID for which the call is made.</param> /// <param name="adGroupId">The ID of the ad group to which the new ad will be /// added.</param> /// <param name="adAssetResourceName">The resource name of the media bundle containing /// the HTML5 components.</param> private void CreateDisplayUploadAdGroupAd ( GoogleAdsClient client , long customerId , long adGroupId , string adAssetResourceName ) { // Get the AdGroupAdService. AdGroupAdServiceClient adGroupAdServiceClient = client . GetService ( Services . V21 . AdGroupAdService ); // Creates the ad with the required fields. Ad displayUploadAd = new Ad () { Name = "Ad for HTML5" , FinalUrls = { "http://example.com/html5" }, // Exactly one ad data field must be included to specify the ad type. See // https://developers.google.com/google-ads/api/reference/rpc/latest/Ad for the // full list of available types. DisplayUploadAd = new DisplayUploadAdInfo () { DisplayUploadProductType = DisplayUploadProductType . Html5UploadAd , MediaBundle = new AdMediaBundleAsset () { Asset = adAssetResourceName } } }; // Creates an ad group ad for the new ad. AdGroupAd adGroupAd = new AdGroupAd () { Ad = displayUploadAd , Status = AdGroupAdStatusEnum . Types . AdGroupAdStatus . Paused , AdGroup = ResourceNames . AdGroup ( customerId , adGroupId ), }; // Creates the ad group ad operation. AdGroupAdOperation operation = new AdGroupAdOperation () { Create = adGroupAd }; // Adds the ad group ad to the client account. MutateAdGroupAdsResponse response = adGroupAdServiceClient . MutateAdGroupAds ( customerId . ToString (), new [] { operation }); // Displays the resulting ad group ad's resource name. Console . WriteLine ( $"Created new ad group ad{response.Results.First().ResourceName}." ); } } }
PHP
< ?php /** * Copyright 2020 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 * * https://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. */ namespace Google\Ads\GoogleAds\Examples\AdvancedOperations; require __DIR__ . '/../../vendor/autoload.php'; use GetOpt\GetOpt; use Google\Ads\GoogleAds\Examples\Utils\ArgumentNames; use Google\Ads\GoogleAds\Examples\Utils\ArgumentParser; use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder; use Google\Ads\GoogleAds\Lib\V21\GoogleAdsClient; use Google\Ads\GoogleAds\Lib\V21\GoogleAdsClientBuilder; use Google\Ads\GoogleAds\Lib\V21\GoogleAdsException; use Google\Ads\GoogleAds\Util\V21\ResourceNames; use Google\Ads\GoogleAds\V21\Common\AdMediaBundleAsset; use Google\Ads\GoogleAds\V21\Common\DisplayUploadAdInfo; use Google\Ads\GoogleAds\V21\Common\MediaBundleAsset; use Google\Ads\GoogleAds\V21\Enums\AdGroupAdStatusEnum\AdGroupAdStatus; use Google\Ads\GoogleAds\V21\Enums\AssetTypeEnum\AssetType; use Google\Ads\GoogleAds\V21\Enums\DisplayUploadProductTypeEnum\DisplayUploadProductType; use Google\Ads\GoogleAds\V21\Errors\GoogleAdsError; use Google\Ads\GoogleAds\V21\Resources\Ad; use Google\Ads\GoogleAds\V21\Resources\AdGroupAd; use Google\Ads\GoogleAds\V21\Resources\Asset; use Google\Ads\GoogleAds\V21\Services\AdGroupAdOperation; use Google\Ads\GoogleAds\V21\Services\AssetOperation; use Google\Ads\GoogleAds\V21\Services\MutateAdGroupAdsRequest; use Google\Ads\GoogleAds\V21\Services\MutateAdGroupAdsResponse; use Google\Ads\GoogleAds\V21\Services\MutateAssetsRequest; use Google\ApiCore\ApiException; /** * This code example adds a display upload ad to a given ad group. * To get ad groups, run GetAdGroups.php. */ class AddDisplayUploadAd { private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE'; private const AD_GROUP_ID = 'INSERT_AD_GROUP_ID_HERE'; public static function main() { // Either pass the required parameters for this example on the command line, or insert them // into the constants above. $options = (new ArgumentParser())->parseCommandArguments([ ArgumentNames::CUSTOMER_ID => GetOpt::REQUIRED_ARGUMENT, ArgumentNames::AD_GROUP_ID => GetOpt::REQUIRED_ARGUMENT ]); // Generate a refreshable OAuth2 credential for authentication. $oAuth2Credential = (new OAuth2TokenBuilder())->fromFile()->build(); // Construct a Google Ads client configured from a properties file and the // OAuth2 credentials above. $googleAdsClient = (new GoogleAdsClientBuilder())->fromFile() ->withOAuth2Credential($oAuth2Credential) ->build(); try { self::runExample( $googleAdsClient, $options[ArgumentNames::CUSTOMER_ID] ?: self::CUSTOMER_ID, $options[ArgumentNames::AD_GROUP_ID] ?: self::AD_GROUP_ID ); } catch (GoogleAdsException $googleAdsException) { printf( "Request with ID '%s' has failed.%sGoogle Ads failure details:%s", $googleAdsException->getRequestId(), PHP_EOL, PHP_EOL ); foreach ($googleAdsException->getGoogleAdsFailure()->getErrors() as $error) { /** @var GoogleAdsError $error */ printf( "\t%s: %s%s", $error->getErrorCode()->getErrorCode(), $error->getMessage(), PHP_EOL ); } exit(1); } catch (ApiException $apiException) { printf( "ApiException was thrown with message '%s'.%s", $apiException->getMessage(), PHP_EOL ); exit(1); } } /** * Runs the example. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client * @param int $customerId the customer ID * @param int $adGroupId the ad group ID to add a display upload ad to */ public static function runExample( GoogleAdsClient $googleAdsClient, int $customerId, int $adGroupId ) { // There are several types of display upload ads. For this example, we will create // an HTML5 upload ad, which requires a media bundle. // The DisplayUploadProductType field lists the available display upload types: // https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo // Creates a new media bundle asset and returns the resource name. $adAssetResourceName = self::createMediaBundleAsset($googleAdsClient, $customerId); // Creates a new display upload ad and associates it with the specified ad group. self::createDisplayUploadAdGroupAd( $googleAdsClient, $customerId, $adGroupId, $adAssetResourceName ); } /** * Creates a media bundle from the assets in a zip file. The zip file contains the HTML5 * components. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client * @param int $customerId the customer ID * @return string the resource name of the newly uploaded media bundle asset */ private static function createMediaBundleAsset( GoogleAdsClient $googleAdsClient, int $customerId ) { // The HTML5 zip file contains all the HTML, CSS, and images needed for the // HTML5 ad. For help on creating an HTML5 zip file, check out Google Web // Designer (https://www.google.com/webdesigner/). $html5Zip = file_get_contents('https://gaagl.page.link/ib87'); // Creates the media bundle asset. $asset = new Asset([ 'name' => 'Ad Media Bundle', 'type' => AssetType::MEDIA_BUNDLE, 'media_bundle_asset' => new MediaBundleAsset(['data' => $html5Zip]) ]); // Creates an asset operation. $assetOperation = new AssetOperation(); $assetOperation->setCreate($asset); // Issues a mutate request to add the asset. $assetServiceClient = $googleAdsClient->getAssetServiceClient(); $response = $assetServiceClient->mutateAssets( MutateAssetsRequest::build($customerId, [$assetOperation]) ); // Prints the resource name of the added media bundle asset. $addedMediaBundleAssetResourceName = $response->getResults()[0]->getResourceName(); printf( "Uploaded media bundle asset with resource name: '%s'.%s", $addedMediaBundleAssetResourceName, PHP_EOL ); return $addedMediaBundleAssetResourceName; } /** * Creates a new HTML5 display upload ad and adds it to the specified ad group. * * @param GoogleAdsClient $googleAdsClient the Google Ads API client * @param int $customerId the customer ID * @param int $adGroupId the ad group ID where the new ad will be added to * @param string $adAssetResourceName the resource name of the media bundle containing the * HTML5 components */ private static function createDisplayUploadAdGroupAd( GoogleAdsClient $googleAdsClient, int $customerId, int $adGroupId, string $adAssetResourceName ) { // Creates an ad group ad for the new ad. $adGroupAd = new AdGroupAd([ 'ad' => new Ad([ 'name' => 'Ad for HTML5', 'final_urls' => ['http://example.com/html5'], // Exactly one ad data field must be included to specify the ad type. See // https://developers.google.com/google-ads/api/reference/rpc/latest/Ad for the full // list of available types. 'display_upload_ad' => new DisplayUploadAdInfo([ 'display_upload_product_type' => DisplayUploadProductType::HTML5_UPLOAD_AD, 'media_bundle' => new AdMediaBundleAsset(['asset' => $adAssetResourceName]) ]) ]), 'ad_group' => ResourceNames::forAdGroup($customerId, $adGroupId), 'status' => AdGroupAdStatus::PAUSED ]); // Creates an ad group ad operation. $adGroupAdOperation = new AdGroupAdOperation(); $adGroupAdOperation->setCreate($adGroupAd); // Issues a mutate request to add the ad group ad. $adGroupAdServiceClient = $googleAdsClient->getAdGroupAdServiceClient(); /** @var MutateAdGroupAdsResponse $adGroupAdResponse */ $adGroupAdResponse = $adGroupAdServiceClient->mutateAdGroupAds( MutateAdGroupAdsRequest::build($customerId, [$adGroupAdOperation]) ); // Prints information about the newly created ad group ad. $adGroupAdResourceName = $adGroupAdResponse->getResults()[0]->getResourceName(); printf("Created ad group ad with resource name: '%s'.%s", $adGroupAdResourceName, PHP_EOL); } } AddDisplayUploadAd::main();
Python
#!/usr/bin/env python # Copyright 2020 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 # # https://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. """Adds a display upload ad to a given ad group. To get ad groups, run get_ad_groups.py. """ import argparse import sys import requests from google.ads.googleads.client import GoogleAdsClient from google.ads.googleads.errors import GoogleAdsException from google.ads.googleads.v21.resources.types.ad import Ad from google.ads.googleads.v21.resources.types.ad_group_ad import AdGroupAd from google.ads.googleads.v21.resources.types.asset import Asset from google.ads.googleads.v21.services.services.ad_group_ad_service import ( AdGroupAdServiceClient , ) from google.ads.googleads.v21.services.services.asset_service import ( AssetServiceClient , ) from google.ads.googleads.v21.services.types.ad_group_ad_service import ( AdGroupAdOperation , MutateAdGroupAdsResponse , ) from google.ads.googleads.v21.services.types.asset_service import ( AssetOperation , MutateAssetsResponse , ) BUNDLE_URL : str = "https://gaagl.page.link/ib87" def main ( client : GoogleAdsClient , customer_id : str , ad_group_id : str ) - > None : """Adds a display upload ad to a given ad group. Args: client: An initialized Google Ads client. customer_id: The Google Ads customer ID. ad_group_id: The ID of the ad group to which the new ad will be added. """ # There are several types of display upload ads. For this example, we will # create an HTML5 upload ad, which requires a media bundle. # This feature is only available to allowlisted accounts. # See https://support.google.com/google-ads/answer/1722096 for more details. # The DisplayUploadProductType field lists the available display upload types: # https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo # Creates a new media bundle asset and returns the resource name. ad_asset_resource_name : str = create_media_bundle_asset ( client , customer_id ) # Creates a new display upload ad and associates it with the specified # ad group. create_display_upload_ad_group_ad ( client , customer_id , ad_group_id , ad_asset_resource_name ) def create_media_bundle_asset ( client : GoogleAdsClient , customer_id : str ) - > str : """Creates a media bundle from the assets in a zip file. The zip file contains the HTML5 components. Args: client: An initialized Google Ads client. customer_id: The Google Ads customer ID for which the call is made. Returns: The string resource name of the newly uploaded media bundle. """ # Get the AssetService client. asset_service : AssetServiceClient = client . get_service ( "AssetService" ) # Construct an asset operation and populate its fields. asset_operation : AssetOperation = client . get_type ( "AssetOperation" ) media_bundle_asset : Asset = asset_operation . create media_bundle_asset . type_ = client . enums . AssetTypeEnum . MEDIA_BUNDLE media_bundle_asset . name = "Ad Media Bundle" # The HTML5 zip file contains all the HTML, CSS, and images needed for the # HTML5 ad. For help on creating an HTML5 zip file, check out Google Web # Designer (https://www.google.com/webdesigner/). # Download the ZIP as bytes from the URL media_bundle_asset . media_bundle_asset . data = requests . get ( BUNDLE_URL ) . content # Adds the asset to the client account. mutate_asset_response : MutateAssetsResponse = asset_service . mutate_assets ( customer_id = customer_id , operations = [ asset_operation ] ) # Display and return the resulting resource name. uploaded_asset_resource_name : str = mutate_asset_response . results [ 0 ] . resource_name print ( f "Uploaded file with resource name ' { uploaded_asset_resource_name } '." ) return uploaded_asset_resource_name def create_display_upload_ad_group_ad ( client : GoogleAdsClient , customer_id : str , ad_group_id : str , ad_asset_resource_name : str , ) - > None : """Creates a new HTML5 display upload ad and adds it to the given ad group. Args: client: An initialized Google Ads client. customer_id: The Google Ads customer ID. ad_group_id: The ID of the ad group to which the new ad will be added. ad_asset_resource_name: The resource name of the media bundle containing the HTML5 components. """ # Get the AdGroupAdService client. ad_group_ad_service : AdGroupAdServiceClient = client . get_service ( "AdGroupAdService" ) # Create an AdGroupAdOperation. ad_group_ad_operation : AdGroupAdOperation = client . get_type ( "AdGroupAdOperation" ) # Configure the ad group ad fields. ad_group_ad : AdGroupAd = ad_group_ad_operation . create ad_group_ad . status = client . enums . AdGroupAdStatusEnum . PAUSED ad_group_ad . ad_group = client . get_service ( "AdGroupService" ) . ad_group_path ( customer_id , ad_group_id ) # Configured the ad as a display upload ad. display_upload_ad : Ad = ad_group_ad . ad display_upload_ad . name = "Ad for HTML5" display_upload_ad . final_urls . append ( "http://example.com/html5" ) # Exactly one of the ad_data "oneof" fields must be included to specify the # ad type. See: https://developers.google.com/google-ads/api/reference/rpc/latest/Ad for # the full list of available types. By setting a "display_upload_ad" # subfield it sets that as the "oneof" field for the Ad. display_upload_ad . display_upload_ad . media_bundle . asset = ( ad_asset_resource_name ) display_upload_ad . display_upload_ad . display_upload_product_type = ( client . enums . DisplayUploadProductTypeEnum . HTML5_UPLOAD_AD ) # Add the ad group ad to the client account and display the resulting # ad's resource name. mutate_ad_group_ads_response : MutateAdGroupAdsResponse = ( ad_group_ad_service . mutate_ad_group_ads ( customer_id = customer_id , operations = [ ad_group_ad_operation ] ) ) print ( "Created new ad group ad with resource name " f "' { mutate_ad_group_ads_response . results [ 0 ] . resource_name } '." ) if __name__ == "__main__" : parser = argparse . ArgumentParser ( description = "Adds a display upload ad to a given ad group." ) # The following argument(s) should be provided to run the example. parser . add_argument ( "-c" , "--customer_id" , type = str , required = True , help = "The Google Ads customer ID." , ) parser . add_argument ( "-a" , "--ad_group_id" , type = str , required = True , help = "The ID of the ad group to which the new ad will be added." , ) args : argparse . Namespace = parser . parse_args () # GoogleAdsClient will read the google-ads.yaml configuration file in the # home directory if none is specified. googleads_client : GoogleAdsClient = GoogleAdsClient . load_from_storage ( version = "v21" ) try : main ( googleads_client , args . customer_id , args . ad_group_id ) except GoogleAdsException as ex : print ( f 'Request with ID " { ex . request_id } " failed with status ' f '" { ex . error . code () . name } " and includes the following errors:' ) for error in ex . failure . errors : print ( f ' \t Error with message " { error . message } ".' ) if error . location : for field_path_element in error . location . field_path_elements : print ( f " \t\t On field: { field_path_element . field_name } " ) sys . exit ( 1 )
Ruby
#!/usr/bin/env ruby # Encoding: utf-8 # # Copyright 2020 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 # # https://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. # # This code example adds a display upload ad to a given ad group. # To get ad groups, run get_ad_groups.rb. require 'optparse' require 'google/ads/google_ads' require 'open-uri' def add_display_upload_ad ( customer_id , ad_group_id ) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google :: Ads :: GoogleAds :: GoogleAdsClient . new # Creates a new media bundle asset and returns the resource name. # There are several types of display upload ads. For this example, we will # create an HTML5 upload ad, which requires a media bundle. # The display_upload_product_type field lists the available display # upload types: # https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo ad_asset_resource_name = create_media_bundle_asset ( client , customer_id ) # Creates a new display upload ad and associates it with the specified # ad group. create_display_upload_ad_group_ad ( client , customer_id , ad_group_id , ad_asset_resource_name , ) end # Creates a media bundle from the assets in a zip file. The zip file contains # the HTML5 components. def create_media_bundle_asset ( client , customer_id ) # The HTML5 zip file contains all the HTML, CSS, and images needed for the # HTML5 ad. For help on creating an HTML5 zip file, check out Google Web # Designer (https://www.google.com/webdesigner/). html5_zip = open ( "https://gaagl.page.link/ib87" ) { | f | f . read } # Creates the media bundle asset. operation = client . operation . create_resource . asset do | asset | asset . type = :MEDIA_BUNDLE asset . name = "Ad Media Bundle" asset . media_bundle_asset = client . resource . media_bundle_asset do | media | media . data = html5_zip end end # Issues a mutate request to add the asset. response = client . service . asset . mutate_assets ( customer_id : customer_id , operations : [ operation ] , ) # Prints the resource name of the added media bundle asset. ad_asset_resource_name = response . results . first . resource_name puts "Uploaded media bundle asset with resource name: " \ " #{ ad_asset_resource_name } " ad_asset_resource_name end # Creates a new HTML5 display upload ad and adds it to the specified ad group. def create_display_upload_ad_group_ad ( client , customer_id , ad_group_id , ad_asset_resource_name ) # Creates an ad group ad for the new ad. operation = client . operation . create_resource . ad_group_ad do | aga | aga . ad = client . resource . ad do | ad | ad . name = "Ad for HTML 5" ad . final_urls << "http://example.com/html5" # Exactly one ad data field must be included to specify the ad type. See # https://developers.google.com/google-ads/api/reference/rpc/latest/Ad # for the full list of available types. ad . display_upload_ad = client . resource . display_upload_ad_info do | info | info . display_upload_product_type = :HTML5_UPLOAD_AD info . media_bundle = client . resource . ad_media_bundle_asset do | bundle | bundle . asset = ad_asset_resource_name end end aga . ad_group = client . path . ad_group ( customer_id , ad_group_id ) aga . status = :PAUSED end end # Issues a mutate request to add the ad group ad. response = client . service . ad_group_ad . mutate_ad_group_ads ( customer_id : customer_id , operations : [ operation ] , ) # Prints information about the newly created ad group ad. puts "Created ad group ad with resource name: " \ " #{ response . results . first . resource_name } " end if __FILE__ == $0 options = {} # The following parameter(s) should be provided to run the example. You can # either specify these by changing the INSERT_XXX_ID_HERE values below, or on # the command line. # # Parameters passed on the command line will override any parameters set in # code. # # Running the example with -h will print the command line usage. options [ :customer_id ] = 'INSERT_CUSTOMER_ID_HERE' options [ :ad_group_id ] = 'INSERT_AD_GROUP_ID_HERE' OptionParser . new do | opts | opts . banner = sprintf ( 'Usage: %s [options]' , File . basename ( __FILE__ )) opts . separator '' opts . separator 'Options:' opts . on ( '-C' , '--customer-id CUSTOMER-ID' , String , 'Customer ID' ) do | v | options [ :customer_id ] = v end opts . on ( '-A' , '--ad-group-id AD-GROUP-ID' , String , 'AdGroup ID' ) do | v | options [ :ad_group_id ] = v end opts . separator '' opts . separator 'Help:' opts . on_tail ( '-h' , '--help' , 'Show this message' ) do puts opts exit end end . parse! begin add_display_upload_ad ( options . fetch ( :customer_id ) . tr ( "-" , "" ), options [ :ad_group_id ] , ) rescue Google :: Ads :: GoogleAds :: Errors :: GoogleAdsError = > e e . failure . errors . each do | error | STDERR . printf ( "Error with message: %s \n " , error . message ) if error . location error . location . field_path_elements . each do | field_path_element | STDERR . printf ( " \t On field: %s \n " , field_path_element . field_name ) end end error . error_code . to_h . each do | k , v | next if v == :UNSPECIFIED STDERR . printf ( " \t Type: %s \n\t Code: %s \n " , k , v ) end end raise end end
Perl
#!/usr/bin/perl -w # # Copyright 2020, 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. # # This code example adds a display upload ad to a given ad group. # To get ad groups, run get_ad_groups.pl. # # This feature is only available to allowlisted accounts. # See https://support.google.com/google-ads/answer/1722096 for more details. use strict ; use warnings ; use utf8 ; use FindBin qw($Bin) ; use lib "$Bin/../../lib" ; use Google::Ads::GoogleAds::Client ; use Google::Ads::GoogleAds::Utils::GoogleAdsHelper ; use Google::Ads::GoogleAds::Utils::MediaUtils ; use Google::Ads::GoogleAds::V21::Resources::Ad ; use Google::Ads::GoogleAds::V21::Resources::AdGroupAd ; use Google::Ads::GoogleAds::V21::Resources::Asset ; use Google::Ads::GoogleAds::V21::Common::AdMediaBundleAsset ; use Google::Ads::GoogleAds::V21::Common::DisplayUploadAdInfo ; use Google::Ads::GoogleAds::V21::Common::MediaBundleAsset ; use Google::Ads::GoogleAds::V21::Enums::AdGroupAdStatusEnum qw(PAUSED) ; use Google::Ads::GoogleAds::V21::Enums::DisplayUploadProductTypeEnum qw(HTML5_UPLOAD_AD) ; use Google::Ads::GoogleAds::V21::Enums::AssetTypeEnum qw(MEDIA_BUNDLE) ; use Google::Ads::GoogleAds::V21::Services::AssetService::AssetOperation ; use Google::Ads::GoogleAds::V21::Services::AdGroupAdService::AdGroupAdOperation ; use Google::Ads::GoogleAds::V21::Utils::ResourceNames ; use Getopt::Long qw(:config auto_help) ; use Pod::Usage ; use Cwd qw(abs_path) ; # The HTML5 zip file contains all the HTML, CSS, and images needed for the # HTML5 ad. For help on creating an HTML5 zip file, check out Google Web # Designer (https://www.google.com/webdesigner/). use constant BUNDLE_URL = > "https://gaagl.page.link/ib87" ; # The following parameter(s) should be provided to run the example. You can # either specify these by changing the INSERT_XXX_ID_HERE values below, or on # the command line. # # Parameters passed on the command line will override any parameters set in # code. # # Running the example with -h will print the command line usage. my $customer_id = "INSERT_CUSTOMER_ID_HERE" ; my $ad_group_id = "INSERT_AD_GROUP_ID_HERE" ; sub add_display_upload_ad { my ( $api_client , $customer_id , $ad_group_id ) = @_ ; # There are several types of display upload ads. For this example, we will # create an HTML5 upload ad, which requires a media bundle. # The DisplayUploadProductType field lists the available display upload types: # https://developers.google.com/google-ads/api/reference/rpc/latest/DisplayUploadAdInfo # Create a new media bundle asset and return the resource name. my $ad_asset_resource_name = create_media_bundle_asset ( $api_client , $customer_id ); # Create a new display upload ad and associate it with the specified ad group. create_display_upload_ad_group_ad ( $api_client , $customer_id , $ad_group_id , $ad_asset_resource_name ); return 1 ; } # Creates a media bundle from the assets in a zip file. The zip file contains the # HTML5 components. sub create_media_bundle_asset { my ( $api_client , $customer_id ) = @_ ; # Create an HTML5 zip file media bundle content. my $bundle_content = get_base64_data_from_url ( BUNDLE_URL ); # Create an asset. my $asset = Google::Ads::GoogleAds::V21::Resources:: Asset - > new ({ name = > "Ad Media Bundle" , type = > MEDIA_BUNDLE , mediaBundleAsset = > Google::Ads::GoogleAds::V21::Common:: MediaBundleAsset - > new ({ data = > $bundle_content })}); # Create an asset operation. my $asset_operation = Google::Ads::GoogleAds::V21::Services::AssetService:: AssetOperation - > new ({ create = > $asset }); # Issue a mutate request to add the asset. my $assets_response = $api_client - > AssetService () - > mutate ({ customerId = > $customer_id , operations = > [ $asset_operation ]}); # Print out information about the newly added asset. my $asset_resource_name = $assets_response - > { results }[ 0 ]{ resourceName }; printf "The media bundle asset has been added with resource name: '%s'.\n" , $asset_resource_name ; return $asset_resource_name ; } # Creates a new HTML5 display upload ad and adds it to the specified ad group. sub create_display_upload_ad_group_ad { my ( $api_client , $customer_id , $ad_group_id , $ad_asset_resource_name ) = @_ ; # Create a display upload ad info. my $display_upload_ad_info = Google::Ads::GoogleAds::V21::Common:: DisplayUploadAdInfo - > new ({ displayUploadProductType = > HTML5_UPLOAD_AD , mediaBundle = > Google::Ads::GoogleAds::V21::Common:: AdMediaBundleAsset - > new ({ asset = > $ad_asset_resource_name , })}); # Create a display upload ad. my $display_upload_ad = Google::Ads::GoogleAds::V21::Resources:: Ad - > new ({ name = > "Ad for HTML5" , finalUrls = > [ "http://example.com/html5" ], # Exactly one ad data field must be included to specify the ad type. See # https://developers.google.com/google-ads/api/reference/rpc/latest/Ad for the # full list of available types. displayUploadAd = > $display_upload_ad_info , }); # Create an ad group ad. my $ad_group_ad = Google::Ads::GoogleAds::V21::Resources:: AdGroupAd - > new ({ ad = > $display_upload_ad , status = > PAUSED , adGroup = > Google::Ads::GoogleAds::V21::Utils::ResourceNames:: ad_group ( $customer_id , $ad_group_id )}); # Create an ad group ad operation. my $ad_group_ad_operation = Google::Ads::GoogleAds::V21::Services::AdGroupAdService:: AdGroupAdOperation - > new ({ create = > $ad_group_ad }); # Add the ad group ad. my $response = $api_client - > AdGroupAdService () - > mutate ({ customerId = > $customer_id , operations = > [ $ad_group_ad_operation ]}); # Display the resulting ad group ad's resource name. printf "Created new ad group ad '%s'.\n" , $response - > { results }[ 0 ]{ resourceName }; } # Don't run the example if the file is being included. if ( abs_path ( $0 ) ne abs_path ( __FILE__ )) { return 1 ; } # Get Google Ads Client, credentials will be read from ~/googleads.properties. my $api_client = Google::Ads::GoogleAds:: Client - > new (); # By default examples are set to die on any server returned fault. $api_client - > set_die_on_faults ( 1 ); # Parameters passed on the command line will override any parameters set in code. GetOptions ( "customer_id=s" = > \ $customer_id , "ad_group_id=i" = > \ $ad_group_id , ); # Print the help message if the parameters are not initialized in the code nor # in the command line. pod2usage ( 2 ) if not check_params ( $customer_id , $ad_group_id ); # Call the example. add_display_upload_ad ( $api_client , $customer_id =~ s/-//g r , $ad_group_id ); =pod =head1 NAME add_display_upload_ad =head1 DESCRIPTION This code example adds a display upload ad to a given ad group. To get ad groups, run get_ad_groups.pl This feature is only available to allowlisted accounts. See https://support.google.com/google-ads/answer/1722096 for more details. =head1 SYNOPSIS add_display_upload_ad.pl [options] -help Show the help message. -customer_id The Google Ads customer ID. -ad_group_id The ID of the ad group to which the new ad will be added. =cut
curl
# Copyright 2025 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 # https://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. # Creates a media bundle asset. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # # MEDIA_BUNDLE_DATA: A base64-encoded string for Media bundle ( ZIP file ) # asset data. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/assets:mutate" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "operations": [ { "create": { "mediaBundleAsset": { "data": "${MEDIA_BUNDLE_DATA}" }, "name": "Ad Media Bundle" } } ] } EOF # Adds a display upload ad to a given ad group. # # Variables: # API_VERSION, # CUSTOMER_ID, # DEVELOPER_TOKEN, # MANAGER_CUSTOMER_ID, # OAUTH2_ACCESS_TOKEN: # See https://developers.google.com/google-ads/api/rest/auth#request_headers # for details. # # FINAL_URL: The final URL of the ad. # AD_ASSET_RESOURCE_NAME: The resource name of the media bundle asset created # in the previous request. # AD_GROUP_RESOURCE_NAME: The resource name of the ad group to add the ad to. curl -f --request POST \ "https://googleads.googleapis.com/v${API_VERSION}/customers/${CUSTOMER_ID}/adGroupAds:mutate" \ --header "Content-Type: application/json" \ --header "developer-token: ${DEVELOPER_TOKEN}" \ --header "login-customer-id: ${MANAGER_CUSTOMER_ID}" \ --header "Authorization: Bearer ${OAUTH2_ACCESS_TOKEN}" \ --data @- <<EOF { "operations": [ { "create": { "status": "PAUSED", "ad": { "name": "Ad for HTML5", "finalUrls": [ "${FINAL_URL}" ], "displayUploadAd": { "mediaBundle": { "asset": "${AD_ASSET_RESOURCE_NAME}" }, "displayUploadProductType": "HTML5_UPLOAD_AD" } }, "adGroup": "${AD_GROUP_RESOURCE_NAME}" } } ] } EOF