Add Prices

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.assets;

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.v20.common.Money;
import com.google.ads.googleads.v20.common.PriceAsset;
import com.google.ads.googleads.v20.common.PriceOffering;
import com.google.ads.googleads.v20.enums.AssetFieldTypeEnum.AssetFieldType;
import com.google.ads.googleads.v20.enums.PriceExtensionPriceQualifierEnum.PriceExtensionPriceQualifier;
import com.google.ads.googleads.v20.enums.PriceExtensionPriceUnitEnum.PriceExtensionPriceUnit;
import com.google.ads.googleads.v20.enums.PriceExtensionTypeEnum.PriceExtensionType;
import com.google.ads.googleads.v20.errors.GoogleAdsError;
import com.google.ads.googleads.v20.errors.GoogleAdsException;
import com.google.ads.googleads.v20.resources.Asset;
import com.google.ads.googleads.v20.resources.CustomerAsset;
import com.google.ads.googleads.v20.services.AssetOperation;
import com.google.ads.googleads.v20.services.AssetServiceClient;
import com.google.ads.googleads.v20.services.CustomerAssetOperation;
import com.google.ads.googleads.v20.services.CustomerAssetServiceClient;
import com.google.ads.googleads.v20.services.MutateAssetsResponse;
import com.google.ads.googleads.v20.services.MutateCustomerAssetsResponse;
import com.google.common.collect.ImmutableList;
import java.io.FileNotFoundException;
import java.io.IOException;

/** Adds a price asset and associates it with an account. */
public class AddPrices {

  public static class AddPricesParams extends CodeSampleParams {
    @Parameter(names = ArgumentNames.CUSTOMER_ID)
    private long customerId;
  }

  public static void main(String[] args) {
    AddPricesParams params = new AddPricesParams();
    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");
    }

    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 AddPrices().runExample(googleAdsClient, params.customerId);
    } 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. */
  private void runExample(GoogleAdsClient googleAdsClient, long customerId) {
    // Creates a PriceAsset.
    String priceAssetResourceName = createPriceAsset(googleAdsClient, customerId);
    // Links the asset at the Customer level, allowing the asset to serve in all eligible
    // campaigns. For more detail about linking assets at customer, campaign and ad group level
    // see
    // https://developers.google.com/google-ads/api/docs/assets/overview#asset_types_linked_to_customers_campaigns_and_ad_groups.
    linkPriceAssetToCustomer(googleAdsClient, priceAssetResourceName, customerId);
  }

  /** Creates a PriceAsset. */
  private String createPriceAsset(GoogleAdsClient googleAdsClient, long customerId) {
    PriceAsset priceAsset =
        PriceAsset.newBuilder()
            .setType(PriceExtensionType.SERVICES)
            // Optional: sets a qualifier text to show with the price asset.
            .setPriceQualifier(PriceExtensionPriceQualifier.FROM)
            .setLanguageCode("en")
            // To create a price asset, at least three price offerings are needed.
            .addPriceOfferings(
                createPriceOffering(
                    "Scrubs",
                    "Body Scrub, Salt Scrub",
                    60000000, // 60 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_HOUR,
                    "http://www.example.com/scrubs",
                    "http://m.example.com/scrubs"))
            .addPriceOfferings(
                createPriceOffering(
                    "Hair Cuts",
                    "Once a month",
                    75000000, // 75 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_MONTH,
                    "http://www.example.com/haircuts",
                    "http://m.example.com/haircuts"))
            .addPriceOfferings(
                createPriceOffering(
                    "Skin Care Package",
                    "Four times a month",
                    250000000, // 250 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_MONTH,
                    "http://www.example.com/skincarepackage",
                    null))
            .build();
    // Wraps the PriceAsset in an Asset.
    Asset asset =
        Asset.newBuilder()
            .setPriceAsset(priceAsset)
            .setTrackingUrlTemplate("http://tracker.example.com/?u={lpurl}")
            .build();
    // Creates an AssetOperation to add the new Asset.
    AssetOperation operation = AssetOperation.newBuilder().setCreate(asset).build();
    // Creates the service client.
    try (AssetServiceClient client =
        googleAdsClient.getLatestVersion().createAssetServiceClient()) {
      // Sends the mutate request.
      MutateAssetsResponse response =
          client.mutateAssets(String.valueOf(customerId), ImmutableList.of(operation));
      // Prints some information about the result.
      String resourceName = response.getResults(0).getResourceName();
      System.out.printf("Created price asset with resource name '%s'.%n", resourceName);
      return resourceName;
    }
  }

  /** Links an Asset to Customer, allowing it to serve in all campaigns under the customer. */
  private void linkPriceAssetToCustomer(
      GoogleAdsClient googleAdsClient, String priceAssetResourceName, long customerId) {
    // Creates the CustomerAsset link.
    CustomerAsset customerAsset =
        CustomerAsset.newBuilder()
            .setAsset(priceAssetResourceName)
            .setFieldType(AssetFieldType.PRICE)
            .build();
    // Creates an CustomerAssetOperation to add the link.
    CustomerAssetOperation operation =
        CustomerAssetOperation.newBuilder().setCreate(customerAsset).build();
    // Creates the service client.
    try (CustomerAssetServiceClient client =
        googleAdsClient.getLatestVersion().createCustomerAssetServiceClient()) {
      // Sends the mutate request.
      MutateCustomerAssetsResponse response =
          client.mutateCustomerAssets(String.valueOf(customerId), ImmutableList.of(operation));
      // Prints some information about the result.
      String resourceName = response.getResults(0).getResourceName();
      System.out.printf("Created customer asset with resource name '%s'.%n", resourceName);
    }
  }

  /** Creates a PriceOffering with the specified fields. */
  private PriceOffering createPriceOffering(
      String header,
      String description,
      int priceInMicros,
      String currencyCode,
      PriceExtensionPriceUnit unit,
      String finalUrl,
      String finalMobileUrl) {
    PriceOffering.Builder builder =
        PriceOffering.newBuilder()
            .setHeader(header)
            .setDescription(description)
            .setFinalUrl(finalUrl)
            .setPrice(
                Money.newBuilder().setAmountMicros(priceInMicros).setCurrencyCode(currencyCode))
            .setUnit(unit);
    if (finalMobileUrl != null) {
      builder.setFinalMobileUrl(finalMobileUrl);
    }
    return builder.build();
  }
}

      

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.GoogleAds.Lib;
using Google.Ads.GoogleAds.V20.Common;
using Google.Ads.GoogleAds.V20.Enums;
using Google.Ads.GoogleAds.V20.Errors;
using Google.Ads.GoogleAds.V20.Resources;
using Google.Ads.GoogleAds.V20.Services;
using System;
using System.Collections.Generic;
using static Google.Ads.GoogleAds.V20.Enums.PriceExtensionPriceQualifierEnum.Types;
using static Google.Ads.GoogleAds.V20.Enums.PriceExtensionPriceUnitEnum.Types;
using static Google.Ads.GoogleAds.V20.Enums.PriceExtensionTypeEnum.Types;

namespace Google.Ads.GoogleAds.Examples.V20
{
    /// <summary>
    /// This code example adds a price extension and associates it with an account.
    /// </summary>
    public class AddPrices : ExampleBase
    {
        /// <summary>
        /// Command line options for running the <see cref="AddPrices"/> example.
        /// </summary>
        public class Options : OptionsBase
        {
            /// <summary>
            /// The customer ID for which the call is made.
            /// </summary>
            [Option("customerId", Required = true, HelpText =
                "The customer ID for which the call is made.")]
            public long CustomerId { 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);

            AddPrices codeExample = new AddPrices();
            Console.WriteLine(codeExample.Description);
            codeExample.Run(new GoogleAdsClient(), options.CustomerId);
        }

        /// <summary>
        /// Returns a description about the code example.
        /// </summary>
        public override string Description =>
            "This example adds a price extension and associates it with an account.";

        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="client">The Google Ads client.</param>
        /// <param name="customerId">The customer ID for which the call is made.</param>
        public void Run(GoogleAdsClient client, long customerId)
        {
            try
            {
                // Create a new price asset.
                string priceAssetResourceName = CreatePriceAsset(client, customerId);

                // Add the new price asset to the account, so it will serve all
                // campaigns under the account.
                AddExtensionToAccount(client, customerId, priceAssetResourceName);
            }
            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 price asset.
        /// </summary>
        /// <param name="client">The Google Ads client.</param>
        /// <param name="customerId">The customer ID for which the call is made.</param>
        /// <returns>the resource name of the newly created price asset.</returns>
        private string CreatePriceAsset(GoogleAdsClient client, long customerId)
        {
            PriceAsset priceAsset = new PriceAsset
            {
                Type = PriceExtensionType.Services,
                // Price qualifier is optional.
                PriceQualifier = PriceExtensionPriceQualifier.From,
                LanguageCode = "en",
                PriceOfferings = {
                    CreatePriceOffering(
                        "Scrubs",
                        "Body Scrub, Salt Scrub",
                        "http://www.example.com/scrubs",
                        "http://m.example.com/scrubs",
                        60000000, // 60 USD
                        "USD",
                        PriceExtensionPriceUnit.PerHour
                    ),
                    CreatePriceOffering(
                        "Hair Cuts",
                        "Once a month",
                        "http://www.example.com/haircuts",
                        "http://m.example.com/haircuts",
                        250000000, // 60 USD
                        "USD",
                        PriceExtensionPriceUnit.PerMonth
                    ),
                    CreatePriceOffering(
                        "Skin Care Package",
                        "Four times a month",
                        "http://www.example.com/skincarepackage",
                        null,
                        250000000, // 250 USD
                        "USD",
                        PriceExtensionPriceUnit.PerMonth
                    ),
                },
            };

            Asset asset = new Asset
            {
                Name = "Price Asset #" + ExampleUtilities.GetRandomString(),
                TrackingUrlTemplate = "http://tracker.example.com/?u={lpurl}",
                PriceAsset = priceAsset,
            };

            AssetOperation operation = new AssetOperation
            {
                Create = asset,
            };

            AssetServiceClient assetClient = client.GetService(Services.V20.AssetService);
            MutateAssetsResponse response = assetClient.MutateAssets(customerId.ToString(),
                new[] { operation });
            string resourceName = response.Results[0].ResourceName;

            Console.WriteLine($"Created price asset with resource name '{resourceName}'.");

            return resourceName;
        }

        /// <summary>
        /// Adds the price asset to the customer account, allowing it to serve all campaigns under
        /// the account.
        /// </summary>
        /// <param name="client">The Google Ads client.</param>
        /// <param name="customerId">The customer ID for which the call is made.</param>
        /// <param name="priceAssetResourceName">The price asset resource name for which the call is
        /// made.</param>
        private void AddExtensionToAccount(GoogleAdsClient client, long customerId,
            string priceAssetResourceName)
        {
            CustomerAsset customerAsset = new CustomerAsset
            {
                Asset = priceAssetResourceName,
                FieldType = AssetFieldTypeEnum.Types.AssetFieldType.Price,
            };

            // Issues the create request to add the callout.
            CustomerAssetServiceClient customerAssetServiceClient =
                client.GetService(Services.V20.CustomerAssetService);
            CustomerAssetOperation operation = new CustomerAssetOperation
            {
                Create = customerAsset,
            };

            CustomerAssetServiceClient assetClient =
              client.GetService(Services.V20.CustomerAssetService);
            MutateCustomerAssetsResponse response =
              assetClient.MutateCustomerAssets(customerId.ToString(), new[] { operation });

            string resourceName = response.Results[0].ResourceName;

            Console.WriteLine($"Created customer asset with resource name '{resourceName}'.");
        }

        /// <summary>
        /// Creates a new price offering with the specified attributes.
        /// </summary>
        /// <param name="header">The header for the price offering.</param>
        /// <param name="description">The description for the price offering.</param>
        /// <param name="finalUrl">The final url for the price offering.</param>
        /// <param name="finalMobileUrl">The final mobile url for the price offering. Can be set to
        /// null.</param>
        /// <param name="priceInMicros">The price in micros.</param>
        /// <param name="currencyCode">The currency code.</param>
        /// <param name="unit">The price unit.</param>
        private PriceOffering CreatePriceOffering(string header, string description,
            string finalUrl, string finalMobileUrl, long priceInMicros,
            string currencyCode, PriceExtensionPriceUnit unit)
        {
            PriceOffering priceOffering = new PriceOffering
            {
                Header = header,
                Description = description,
                FinalUrl = finalUrl,
                Price = new Money
                {
                    AmountMicros = priceInMicros,
                    CurrencyCode = currencyCode,
                },
                Unit = unit,
            };

            if (finalMobileUrl != null)
            {
                priceOffering.FinalMobileUrl = finalMobileUrl;
            }

            return priceOffering;
        }
    }
}
      

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\Extensions;

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\V20\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V20\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V20\GoogleAdsException;
use Google\Ads\GoogleAds\V20\Common\Money;
use Google\Ads\GoogleAds\V20\Common\PriceAsset;
use Google\Ads\GoogleAds\V20\Common\PriceOffering;
use Google\Ads\GoogleAds\V20\Enums\AssetFieldTypeEnum\AssetFieldType;
use Google\Ads\GoogleAds\V20\Enums\PriceExtensionPriceQualifierEnum\PriceExtensionPriceQualifier;
use Google\Ads\GoogleAds\V20\Enums\PriceExtensionPriceUnitEnum\PriceExtensionPriceUnit;
use Google\Ads\GoogleAds\V20\Enums\PriceExtensionTypeEnum\PriceExtensionType;
use Google\Ads\GoogleAds\V20\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V20\Resources\Asset;
use Google\Ads\GoogleAds\V20\Resources\CustomerAsset;
use Google\Ads\GoogleAds\V20\Services\AssetOperation;
use Google\Ads\GoogleAds\V20\Services\CustomerAssetOperation;
use Google\Ads\GoogleAds\V20\Services\MutateAssetsRequest;
use Google\Ads\GoogleAds\V20\Services\MutateCustomerAssetsRequest;
use Google\ApiCore\ApiException;

/**
 * This example adds a price asset and associates it with an account.
 */
class AddPrices
{
    private const CUSTOMER_ID = 'INSERT_CUSTOMER_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
        ]);

        // 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
            );
        } 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 client customer ID
     */
    public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId)
    {
        // Creates a PriceAsset.
        $priceAssetResourceName = self::createPriceAsset($googleAdsClient, $customerId);
        // Links the asset at the Customer level, allowing the asset to serve in all
        // eligible campaigns. For more detail about linking assets at customer, campaign and
        // ad group level see
        // https://support.google.com/google-ads/answer/7106946?hl=en&ref_topic=3119125
        self::linkPriceAssetToCustomer($googleAdsClient, $priceAssetResourceName, $customerId);
    }

    /**
     * Creates a PriceAsset.
     *
     * @param GoogleAdsClient $googleAdsClient the Google Ads API client
     * @param int $customerId the client customer ID
     * @return string the created PriceAsset's resource name
     */
    private static function createPriceAsset(GoogleAdsClient $googleAdsClient, int $customerId)
    {
        $priceAsset = new PriceAsset([
            'type' => PriceExtensionType::SERVICES,
            // Optional: Sets price qualifier.
            'price_qualifier' => PriceExtensionPriceQualifier::FROM,
            'language_code' => 'en'
        ]);

        // To create a price asset, at least three price offerings are needed.
        $priceAsset->setPriceOfferings([
            self::createPriceOffering(
                'Scrubs',
                'Body Scrub, Salt Scrub',
                60000000, // 60 USD
                'USD',
                PriceExtensionPriceUnit::PER_HOUR,
                'http://www.example.com/scrubs',
                'http://m.example.com/scrubs'
            ),
            self::createPriceOffering(
                'Hair Cuts',
                'Once a month',
                75000000, // 75 USD
                'USD',
                PriceExtensionPriceUnit::PER_MONTH,
                'http://www.example.com/haircuts',
                'http://m.example.com/haircuts'
            ),
            self::createPriceOffering(
                'Skin Care Package',
                'Four times a month',
                250000000, // 250 USD
                'USD',
                PriceExtensionPriceUnit::PER_MONTH,
                'http://www.example.com/skincarepackage'
            )
        ]);

        // Wraps the PriceAsset in an Asset.
        $asset = new Asset([
            'price_asset' => $priceAsset,
            'tracking_url_template' => 'http://tracker.example.com/?u={lpurl}'
        ]);

        // Creates an asset operation.
        $assetOperation = new AssetOperation();
        $assetOperation->setCreate($asset);

        // Issues a mutate request to add the asset and print its information.
        $assetServiceClient = $googleAdsClient->getAssetServiceClient();
        $response = $assetServiceClient->mutateAssets(
            MutateAssetsRequest::build($customerId, [$assetOperation])
        );
        $assetResourceName = $response->getResults()[0]->getResourceName();
        printf(
            "Created price asset with resource name: '%s'.%s",
            $assetResourceName,
            PHP_EOL
        );

        return $assetResourceName;
    }

    /**
     * Links an asset to customer, allowing it to serve in all campaigns under the customer.
     *
     * @param GoogleAdsClient $googleAdsClient the Google Ads API client
     * @param string $priceAssetResourceName the price asset's resource name to link
     * @param int $customerId the customer ID to link the price asset to
     */
    private static function linkPriceAssetToCustomer(
        GoogleAdsClient $googleAdsClient,
        string $priceAssetResourceName,
        int $customerId
    ) {
        // Creates the CustomerAsset.
        $customerAsset = new CustomerAsset([
            'asset' => $priceAssetResourceName,
            'field_type' => AssetFieldType::PRICE
        ]);

        // Creates a customer asset operation.
        $customerAssetOperation = new CustomerAssetOperation();
        $customerAssetOperation->setCreate($customerAsset);

        // Issues a mutate request to add the customer asset and print its information.
        $customerAssetServiceClient = $googleAdsClient->getCustomerAssetServiceClient();
        $response = $customerAssetServiceClient->mutateCustomerAssets(
            MutateCustomerAssetsRequest::build($customerId, [$customerAssetOperation])
        );
        printf(
            "Created customer asset with resource name: '%s'.%s",
            $response->getResults()[0]->getResourceName(),
            PHP_EOL
        );
    }

    /**
     * Creates a price offering with the specified parameters.
     *
     * @param string $header the header
     * @param string $description the description
     * @param int $priceInMicros the price in micros
     * @param string $currencyCode the currency code
     * @param int $unit the enum value of unit
     * @param string $finalUrl the final URL
     * @param null|string $finalMobileUrl the final mobile URL
     * @return PriceOffering the created price offering
     */
    private static function createPriceOffering(
        string $header,
        string $description,
        int $priceInMicros,
        string $currencyCode,
        int $unit,
        string $finalUrl,
        string $finalMobileUrl = null
    ) {
        $priceOffering = new PriceOffering([
            'header' => $header,
            'description' => $description,
            'final_url' => $finalUrl,
            'price' => new Money([
                'amount_micros' => $priceInMicros,
                'currency_code' => $currencyCode
            ]),
            'unit' => $unit
        ]);

        if (!is_null($finalMobileUrl)) {
            $priceOffering->setFinalMobileUrl($finalMobileUrl);
        }

        return $priceOffering;
    }
}

AddPrices::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.
"""This example adds a price asset and associates it with an account."""


import argparse
from typing import List, Optional, Sequence
import sys
from uuid import uuid4

from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
from google.ads.googleads.v20.services.types.asset_service import AssetOperation
from google.ads.googleads.v20.resources.types.asset import Asset
from google.ads.googleads.v20.common.types.asset_types import PriceAsset
from google.ads.googleads.v20.enums.types.price_extension_type import PriceExtensionTypeEnum
from google.ads.googleads.v20.enums.types.price_extension_price_qualifier import PriceExtensionPriceQualifierEnum
from google.ads.googleads.v20.common.types.asset_types import PriceOffering
from google.ads.googleads.v20.enums.types.price_extension_price_unit import PriceExtensionPriceUnitEnum
from google.ads.googleads.v20.services.types.customer_asset_service import CustomerAssetOperation
from google.ads.googleads.v20.resources.types.customer_asset import CustomerAsset
from google.ads.googleads.v20.enums.types.asset_field_type import AssetFieldTypeEnum


def main(client: GoogleAdsClient, customer_id: str) -> None:
    """The main method that creates all necessary entities for the example.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
    """
    # Create a new price asset.
    price_asset_resource_name: str = create_price_asset(client, customer_id)

    # Add the new price asset to the account.
    add_asset_to_account(client, customer_id, price_asset_resource_name)


def create_price_asset(client: GoogleAdsClient, customer_id: str) -> str:
    """Creates a price asset and returns its resource name.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.

    Returns:
        a PriceAsset resource name.
    """
    # Create an asset operation.
    asset_operation: AssetOperation = client.get_type("AssetOperation")
    # Create an asset.
    asset: Asset = asset_operation.create
    asset.name = f"Price Asset #{uuid4()}"
    asset.tracking_url_template = "http://tracker.example.com/?u={lpurl}"

    # Create the price asset.
    price_asset: PriceAsset = asset.price_asset
    price_asset.type_ = client.enums.PriceExtensionTypeEnum.SERVICES
    # Price qualifier is optional.
    price_asset.price_qualifier = (
        client.enums.PriceExtensionPriceQualifierEnum.FROM
    )
    price_asset.language_code = "en"
    price_asset.price_offerings.extend(
        [
            create_price_offering(
                client,
                "Scrubs",
                "Body Scrub, Salt Scrub",
                "http://www.example.com/scrubs",
                "http://m.example.com/scrubs",
                60000000,  # 60 USD
                "USD",
                client.enums.PriceExtensionPriceUnitEnum.PER_HOUR,
            ),
            create_price_offering(
                client,
                "Hair Cuts",
                "Once a month",
                "http://www.example.com/haircuts",
                "http://m.example.com/haircuts",
                75000000,  # 75 USD
                "USD",
                client.enums.PriceExtensionPriceUnitEnum.PER_MONTH,
            ),
            create_price_offering(
                client,
                "Skin Care Package",
                "Four times a month",
                "http://www.example.com/skincarepackage",
                None,
                250000000,  # 250 USD
                "USD",
                client.enums.PriceExtensionPriceUnitEnum.PER_MONTH,
            ),
        ]
    )

    # Issue a mutate request to create the price asset.
    asset_service = client.get_service("AssetService")
    response = asset_service.mutate_assets(
        customer_id=customer_id, operations=[asset_operation]
    )
    resource_name: str = response.results[0].resource_name

    print(f"Created a price asset with resource name '{resource_name}'.")

    return resource_name


def create_price_offering(
    client: GoogleAdsClient,
    header: str,
    description: str,
    final_url: str,
    final_mobile_url: Optional[str],
    price_in_micros: int,
    currency_code: str,
    unit: PriceExtensionPriceUnitEnum.PriceExtensionPriceUnit,
) -> PriceOffering:
    """Creates a PriceOffering instance and returns it.

    Args:
        client: an initialized GoogleAdsClient instance.
        header: The header of the price offering.
        description: The description of the price offering.
        final_url: The final_url of the price offering.
        final_mobile_url: The final_mobile_url of the price offering.
        price_in_micros: The price of the price offering.
        currency_code: The currency_code of the price offering.
        unit: The price unit of the price offering.

    Returns:
        A PriceOffering instance.
    """
    price_offering: PriceOffering = client.get_type("PriceOffering")
    price_offering.header = header
    price_offering.description = description
    price_offering.final_url = final_url
    # Check if this exists, since we pass None for one of the PriceOfferings
    # in the _create_price_asset method and assigning None to this field
    # raises an error.
    if final_mobile_url:
        price_offering.final_mobile_url = final_mobile_url
    price_offering.price.amount_micros = price_in_micros
    price_offering.price.currency_code = currency_code
    price_offering.unit = unit
    return price_offering


def add_asset_to_account(
    client: GoogleAdsClient, customer_id: str, price_asset_resource_name: str
) -> None:
    """Adds a new Asset to the given user account.

    Adding the Asset to an account allows it to serve in all campaigns under
    that account.

    Args:
        client: an initialized GoogleAdsClient instance.
        customer_id: a client customer ID.
        price_asset_resource_name: a resource name for an Asset containing
            a PriceAsset.
    """
    # Create a customer asset operation.
    customer_asset_operation: CustomerAssetOperation = client.get_type(
        "CustomerAssetOperation"
    )
    # Create a customer asset, set its type to PRICE and attach price asset.
    asset: CustomerAsset = customer_asset_operation.create
    asset.field_type = client.enums.AssetFieldTypeEnum.PRICE
    asset.asset = price_asset_resource_name

    # Issue a mutate request to create the customer asset.
    customer_asset_service = client.get_service("CustomerAssetService")
    response = customer_asset_service.mutate_customer_assets(
        customer_id=customer_id, operations=[customer_asset_operation]
    )
    resource_name: str = response.results[0].resource_name

    print(
        "Created customer asset with resource name "
        f"'{response.results[0].resource_name}'."
    )


if __name__ == "__main__":
    parser: argparse.ArgumentParser = argparse.ArgumentParser(
        description="Add price asset for the specified customer id."
    )
    # 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",
    )
    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="v20"
    )

    try:
        main(googleads_client, args.customer_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'\tError with message "{error.message}".')
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

      

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.
#
# Adds a price asset and associates it with an account.

require 'optparse'
require 'google/ads/google_ads'
require 'date'

def add_prices(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

  # Create a new price asset.
  price_asset_resource_name = create_price_asset(client, customer_id)

  # Add the new price asset to the account.
  add_asset_to_account(client, customer_id, price_asset_resource_name)
end

def create_price_asset(client, customer_id)
  operation = client.operation.create_resource.asset do |asset|
    asset.name = "Price Asset ##{(Time.new.to_f * 1000).to_i}"
    asset.tracking_url_template = 'http://tracker.example.com/?u={lpurl}'
    asset.price_asset = client.resource.price_asset do |price|
      price.type = :SERVICES
      # Optional: set price qualifier.
      price.price_qualifier = :FROM
      price.language_code = 'en'

      # To create a price asset, at least three price offerings are needed.
      price.price_offerings << create_price_offer(
          client, 'Scrubs', 'Body Scrub, Salt Scrub', 60_000_000, # 60 USD
          'USD', :PER_HOUR, 'http://www.example.com/scrubs',
          'http://m.example.com/scrubs')
      price.price_offerings << create_price_offer(
          client, 'Hair Cuts', 'Once a month', 75_000_000, # 75 USD
          'USD', :PER_MONTH, 'http://www.example.com/haircuts',
          'http://m.example.com/haircuts')
      price.price_offerings << create_price_offer(
          client, 'Skin Care Package',
          'Four times a month', 250_000_000, # 250 USD
          'USD', :PER_MONTH, 'http://www.example.com/skincarepackage')
    end
  end

  response = client.service.asset.mutate_assets(
    customer_id: customer_id,
    operations: [operation],
  )

  resource_name = response.results.first.resource_name
  puts "Created asset with resource name '#{resource_name}'"

  resource_name
end

def create_price_offer(
    client, header, description, price_in_micros,
    currency_code, unit, final_url, final_mobile_url=nil)
  client.resource.price_offering do |po|
    po.header = header
    po.description = description
    po.final_url = final_url
    po.price = client.resource.money do |pr|
      pr.amount_micros = price_in_micros
      pr.currency_code = currency_code
    end
    po.unit = unit
    # Optional: set the final mobile URLs
    unless final_mobile_url.nil?
      po.final_mobile_url = final_mobile_url
    end
  end
end

def add_asset_to_account(client, customer_id, asset)
  operation = client.operation.create_resource.customer_asset do |ca|
    ca.asset = asset
    ca.field_type = :PRICE
  end

  response = client.service.customer_asset.mutate_customer_assets(
    customer_id: customer_id,
    operations: [operation],
  )

  puts "Created customer asset 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'

  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.separator ''
    opts.separator 'Help:'

    opts.on_tail('-h', '--help', 'Show this message') do
      puts opts
      exit
    end
  end.parse!

  begin
    add_prices(options.fetch(:customer_id).tr("-", ""))
  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("\tOn 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("\tType: %s\n\tCode: %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 example adds a price asset and associates it with an account.

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::V20::Resources::Asset;
use Google::Ads::GoogleAds::V20::Resources::CustomerAsset;
use Google::Ads::GoogleAds::V20::Common::PriceAsset;
use Google::Ads::GoogleAds::V20::Common::PriceOffering;
use Google::Ads::GoogleAds::V20::Common::Money;
use Google::Ads::GoogleAds::V20::Enums::PriceExtensionTypeEnum qw(SERVICES);
use Google::Ads::GoogleAds::V20::Enums::PriceExtensionPriceQualifierEnum
  qw(FROM);
use Google::Ads::GoogleAds::V20::Enums::PriceExtensionPriceUnitEnum
  qw(PER_HOUR PER_MONTH);
use Google::Ads::GoogleAds::V20::Enums::AssetFieldTypeEnum qw(PRICE);
use Google::Ads::GoogleAds::V20::Services::AssetService::AssetOperation;
use
  Google::Ads::GoogleAds::V20::Services::CustomerAssetService::CustomerAssetOperation;

use Getopt::Long qw(:config auto_help);
use Pod::Usage;
use Cwd          qw(abs_path);
use Data::Uniqid qw(uniqid);

# 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";

sub add_prices {
  my ($api_client, $customer_id) = @_;

  # Create a new price asset.
  my $price_asset_resource_name = create_price_asset($api_client, $customer_id);

  # Add the new price asset to the account, so it will serve all campaigns
  # under the account.
  add_asset_to_account($api_client, $customer_id, $price_asset_resource_name);

  return 1;
}

# Creates a price asset.
sub create_price_asset {
  my ($api_client, $customer_id) = @_;

  # Create the price asset.
  my $price_asset = Google::Ads::GoogleAds::V20::Common::PriceAsset->new({
      type => SERVICES,
      # Price qualifier is optional.
      priceQualifier => FROM,
      languageCode   => "en",
      priceOfferings => [
        create_price_offering(
          "Scrubs",
          "Body Scrub, Salt Scrub",
          "http://www.example.com/scrubs",
          "http://m.example.com/scrubs",
          60000000,    # 60 USD
          "USD",
          PER_HOUR
        ),
        create_price_offering(
          "Hair Cuts",
          "Once a month",
          "http://www.example.com/haircuts",
          "http://m.example.com/haircuts",
          75000000,    # 75 USD
          "USD",
          PER_MONTH
        ),
        create_price_offering(
          "Skin Care Package",
          "Four times a month",
          "http://www.example.com/skincarepackage",
          undef,
          250000000,    # 250 USD
          "USD",
          PER_MONTH
        )]});

  # Create an asset.
  my $asset = Google::Ads::GoogleAds::V20::Resources::Asset->new({
    name                => "Price Asset #" . uniqid(),
    trackingUrlTemplate => "http://tracker.example.com/?u={lpurl}",
    priceAsset          => $price_asset
  });

  # Create an asset operation.
  my $operation =
    Google::Ads::GoogleAds::V20::Services::AssetService::AssetOperation->new({
      create => $asset
    });

  # Issue a mutate request to add the price asset and print some information.
  my $response = $api_client->AssetService()->mutate({
      customerId => $customer_id,
      operations => [$operation]});

  printf
    "Created price asset with resource name '%s'.\n",
    $response->{results}[0]{resourceName};

  return $response->{results}[0]{resourceName};
}

# Adds the price asset to the customer account, allowing it to serve all campaigns
# under the account.
sub add_asset_to_account {
  my ($api_client, $customer_id, $price_asset_resource_name) = @_;

  # Create a customer asset, set its type to PRICE and attach the price asset.
  my $customer_asset =
    Google::Ads::GoogleAds::V20::Resources::CustomerAsset->new({
      asset     => $price_asset_resource_name,
      fieldType => PRICE
    });

  # Create a customer asset operation.
  my $operation =
    Google::Ads::GoogleAds::V20::Services::CustomerAssetService::CustomerAssetOperation
    ->new({
      create => $customer_asset
    });

  # Issue a mutate request to add the customer asset and print some information.
  my $response = $api_client->CustomerAssetService()->mutate({
      customerId => $customer_id,
      operations => [$operation]});

  printf "Created customer asset with resource name '%s'.\n",
    $response->{results}[0]{resourceName};
}

# Creates a new price offering with the specified attributes.
sub create_price_offering {
  my ($header, $description, $final_url, $final_mobile_url, $price_in_micros,
    $currency_code, $unit)
    = @_;

  my $price_offering = Google::Ads::GoogleAds::V20::Common::PriceOffering->new({
      header      => $header,
      description => $description,
      finalUrl    => $final_url,
      price       => Google::Ads::GoogleAds::V20::Common::Money->new({
          amountMicros => $price_in_micros,
          currencyCode => $currency_code
        }
      ),
      unit => $unit
    });

  # Optional: set the final mobile URL.
  $price_offering->{finalMobileUrl} = $final_mobile_url if $final_mobile_url;

  return $price_offering;
}

# 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);

# 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);

# Call the example.
add_prices($api_client, $customer_id =~ s/-//gr);

=pod

=head1 NAME

add_prices

=head1 DESCRIPTION

This example adds a price asset and associates it with an account.

=head1 SYNOPSIS

add_prices.pl [options]

    -help                       Show the help message.
    -customer_id                The Google Ads customer ID.

=cut