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

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.v3.common.AdScheduleInfo;
import com.google.ads.googleads.v3.common.Money;
import com.google.ads.googleads.v3.common.PriceFeedItem;
import com.google.ads.googleads.v3.common.PriceOffer;
import com.google.ads.googleads.v3.enums.DayOfWeekEnum.DayOfWeek;
import com.google.ads.googleads.v3.enums.ExtensionTypeEnum.ExtensionType;
import com.google.ads.googleads.v3.enums.MinuteOfHourEnum.MinuteOfHour;
import com.google.ads.googleads.v3.enums.PriceExtensionPriceQualifierEnum.PriceExtensionPriceQualifier;
import com.google.ads.googleads.v3.enums.PriceExtensionPriceUnitEnum.PriceExtensionPriceUnit;
import com.google.ads.googleads.v3.enums.PriceExtensionTypeEnum.PriceExtensionType;
import com.google.ads.googleads.v3.errors.GoogleAdsError;
import com.google.ads.googleads.v3.errors.GoogleAdsException;
import com.google.ads.googleads.v3.resources.CustomerExtensionSetting;
import com.google.ads.googleads.v3.resources.ExtensionFeedItem;
import com.google.ads.googleads.v3.services.CustomerExtensionSettingOperation;
import com.google.ads.googleads.v3.services.CustomerExtensionSettingServiceClient;
import com.google.ads.googleads.v3.services.ExtensionFeedItemOperation;
import com.google.ads.googleads.v3.services.ExtensionFeedItemServiceClient;
import com.google.ads.googleads.v3.services.MutateCustomerExtensionSettingsResponse;
import com.google.ads.googleads.v3.services.MutateExtensionFeedItemsResponse;
import com.google.ads.googleads.v3.utils.ResourceNames;
import com.google.common.collect.ImmutableList;
import com.google.protobuf.Int32Value;
import com.google.protobuf.Int64Value;
import com.google.protobuf.StringValue;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Adds a price extension and associates it with an account. Campaign targeting is also set using
 * the specified campaign ID. To get campaigns, run GetCampaigns.
 */
public class AddPrices {

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

    @Parameter(names = ArgumentNames.CAMPAIGN_ID)
    private long campaignId;
  }

  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");
      params.campaignId = Long.parseLong("INSERT_CAMPAIGN_ID_HERE");
    }

    GoogleAdsClient googleAdsClient;
    try {
      googleAdsClient = GoogleAdsClient.newBuilder().fromPropertiesFile().build();
    } catch (FileNotFoundException fnfe) {
      System.err.printf(
          "Failed to load GoogleAdsClient configuration from file. Exception: %s%n", fnfe);
      return;
    } catch (IOException ioe) {
      System.err.printf("Failed to create GoogleAdsClient. Exception: %s%n", ioe);
      return;
    }

    try {
      new AddPrices().runExample(googleAdsClient, params.customerId, params.campaignId);
    } 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);
      }
    }
  }

  /**
   * Runs the example.
   *
   * @param googleAdsClient the client to use for API calls.
   * @param customerId the customer ID for which to add extensions.
   */
  private void runExample(GoogleAdsClient googleAdsClient, long customerId, long campaignId) {
    // Creates an extension feed item as price.
    String extensionFeedItemResourceName =
        createExtensionFeedItem(googleAdsClient, customerId, campaignId);

    // Creates a customer extension setting using the previously created extension
    // feed item. This associates the price extension to your account.
    CustomerExtensionSetting customerExtensionSetting =
        CustomerExtensionSetting.newBuilder()
            .setExtensionType(ExtensionType.PRICE)
            .addExtensionFeedItems(StringValue.of(extensionFeedItemResourceName))
            .build();

    // Creates an operation to add the extension setting.
    CustomerExtensionSettingOperation operation =
        CustomerExtensionSettingOperation.newBuilder().setCreate(customerExtensionSetting).build();

    // Issues a mutate request to add the customer extension setting and prints its information.
    try (CustomerExtensionSettingServiceClient client =
        googleAdsClient.getLatestVersion().createCustomerExtensionSettingServiceClient()) {
      MutateCustomerExtensionSettingsResponse response =
          client.mutateCustomerExtensionSettings(
              String.valueOf(customerId), ImmutableList.of(operation));
      System.out.printf(
          "Created customer extension setting with resource name: %s",
          response.getResults(0).getResourceName());
    }
  }

  /**
   * Creates an extension feed item for price extension.
   *
   * @param googleAdsClient the client to use for API calls.
   * @param customerId the customer ID for which to add extensions.
   * @return the resource name of the newly created extension feed item.
   */
  private String createExtensionFeedItem(
      GoogleAdsClient googleAdsClient, long customerId, long campaignId) {
    // Creates the price extension feed item.
    PriceFeedItem priceFeedItem =
        PriceFeedItem.newBuilder()
            .setType(PriceExtensionType.SERVICES)
            // Optional: sets a qualifier text to show with the price extension.
            .setPriceQualifier(PriceExtensionPriceQualifier.FROM)
            .setTrackingUrlTemplate(StringValue.of("http://tracker.example.com/?u={lpurl}"))
            .setLanguageCode(StringValue.of("en"))
            // To create a price extension, at least three price offerings are needed.
            .addPriceOfferings(
                createPriceOffer(
                    "Scrubs",
                    "Body Scrub, Salt Scrub",
                    60000000, // 60 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_HOUR,
                    "http://www.example.com/scrubs",
                    "http://m.example.com/scrubs"))
            .addPriceOfferings(
                createPriceOffer(
                    "Hair Cuts",
                    "Once a month",
                    75000000, // 75 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_MONTH,
                    "http://www.example.com/haircuts",
                    "http://m.example.com/haircuts"))
            .addPriceOfferings(
                createPriceOffer(
                    "Skin Care Package",
                    "Four times a month",
                    250000000, // 250 USD
                    "USD",
                    PriceExtensionPriceUnit.PER_MONTH,
                    "http://www.example.com/skincarepackage",
                    null))
            .build();

    // Creates an extension feed item from the price feed item.
    ExtensionFeedItem extensionFeedItem =
        ExtensionFeedItem.newBuilder()
            .setExtensionType(ExtensionType.PRICE)
            .setPriceFeedItem(priceFeedItem)
            .setTargetedCampaign(StringValue.of(ResourceNames.campaign(customerId, campaignId)))
            .addAdSchedules(
                createAdSchedule(DayOfWeek.SUNDAY, 10, MinuteOfHour.ZERO, 18, MinuteOfHour.ZERO))
            .addAdSchedules(
                createAdSchedule(DayOfWeek.SATURDAY, 10, MinuteOfHour.ZERO, 22, MinuteOfHour.ZERO))
            .build();

    // Creates an operation to add the feed item.
    ExtensionFeedItemOperation operation =
        ExtensionFeedItemOperation.newBuilder().setCreate(extensionFeedItem).build();

    // Issues a mutate request to add the extension feed item and prints its information.
    try (ExtensionFeedItemServiceClient client =
        googleAdsClient.getLatestVersion().createExtensionFeedItemServiceClient()) {
      MutateExtensionFeedItemsResponse response =
          client.mutateExtensionFeedItems(String.valueOf(customerId), ImmutableList.of(operation));
      String resourceName = response.getResultsList().get(0).getResourceName();
      System.out.printf("Created extension feed item with resource name: %s", resourceName);
      return resourceName;
    }
  }

  /**
   * Creates a new ad schedule info with the specified parameters.
   *
   * @param dayOfWeek the day of week for which the schedule is enabled.
   * @param startHour the hour at which the schedule takes effect.
   * @param startMinute the minute past the hour at which the schedule takes effect.
   * @param endHour the hour at which the schedule stops running.
   * @param endMinute the minute past the hour at which the schedule stops running.
   * @return a newly created ad schedule object.
   */
  private AdScheduleInfo createAdSchedule(
      DayOfWeek dayOfWeek,
      int startHour,
      MinuteOfHour startMinute,
      int endHour,
      MinuteOfHour endMinute) {
    return AdScheduleInfo.newBuilder()
        .setDayOfWeek(dayOfWeek)
        .setStartHour(Int32Value.of(startHour))
        .setStartMinute(startMinute)
        .setEndHour(Int32Value.of(endHour))
        .setEndMinute(endMinute)
        .build();
  }

  /**
   * Creates a new price offer with the specified parameters.
   *
   * @param header the headline for the price extension.
   * @param description a detailed description line that may show on the price extension.
   * @param priceInMicros the price to display, measured in micros (e.g. 1_000_000 micros = 1 USD).
   * @param currencyCode the currency code representing the unit of currency.
   * @param unit optionally set a unit describing the quantity obtained for the price.
   * @param finalUrl the final URL to which a click on the price extension drives traffic.
   * @param finalMobileUrl the final URL to which mobile clicks on the price extension drives
   *     traffic.
   * @return a newly created price offer object.
   */
  private PriceOffer createPriceOffer(
      String header,
      String description,
      int priceInMicros,
      String currencyCode,
      PriceExtensionPriceUnit unit,
      String finalUrl,
      String finalMobileUrl) {
    PriceOffer.Builder priceBuilder =
        PriceOffer.newBuilder()
            .setHeader(StringValue.of(header))
            .setDescription(StringValue.of(description))
            .addFinalUrls(StringValue.of(finalUrl))
            .setPrice(
                Money.newBuilder()
                    .setAmountMicros(Int64Value.of(priceInMicros))
                    .setCurrencyCode(StringValue.of(currencyCode)))
            .setUnit(unit);

    // Optional: Sets the final mobile URLs.
    if (finalMobileUrl != null) {
      priceBuilder.addFinalMobileUrls(StringValue.of(finalMobileUrl));
    }
    return priceBuilder.build();
  }
}
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\V3\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V3\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\V3\GoogleAdsException;
use Google\Ads\GoogleAds\Util\V3\ResourceNames;
use Google\Ads\GoogleAds\V3\Common\AdScheduleInfo;
use Google\Ads\GoogleAds\V3\Common\Money;
use Google\Ads\GoogleAds\V3\Common\PriceFeedItem;
use Google\Ads\GoogleAds\V3\Common\PriceOffer;
use Google\Ads\GoogleAds\V3\Enums\DayOfWeekEnum\DayOfWeek;
use Google\Ads\GoogleAds\V3\Enums\ExtensionTypeEnum\ExtensionType;
use Google\Ads\GoogleAds\V3\Enums\MinuteOfHourEnum\MinuteOfHour;
use Google\Ads\GoogleAds\V3\Enums\PriceExtensionPriceQualifierEnum\PriceExtensionPriceQualifier;
use Google\Ads\GoogleAds\V3\Enums\PriceExtensionPriceUnitEnum\PriceExtensionPriceUnit;
use Google\Ads\GoogleAds\V3\Enums\PriceExtensionTypeEnum\PriceExtensionType;
use Google\Ads\GoogleAds\V3\Errors\GoogleAdsError;
use Google\Ads\GoogleAds\V3\Resources\CustomerExtensionSetting;
use Google\Ads\GoogleAds\V3\Resources\ExtensionFeedItem;
use Google\Ads\GoogleAds\V3\Services\CustomerExtensionSettingOperation;
use Google\Ads\GoogleAds\V3\Services\ExtensionFeedItemOperation;
use Google\ApiCore\ApiException;
use Google\Protobuf\Int32Value;
use Google\Protobuf\Int64Value;
use Google\Protobuf\StringValue;

/**
 * This example adds a price extension and associates it with an account. Campaign
 * targeting is also set using the specified campaign ID. To get campaigns, run GetCampaigns.php
 */
class AddPrices
{
    private const CUSTOMER_ID = 'INSERT_CUSTOMER_ID_HERE';
    private const CAMPAIGN_ID = 'INSERT_CAMPAIGN_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::CAMPAIGN_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::CAMPAIGN_ID] ?: self::CAMPAIGN_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
     * @param int $campaignId the campaign ID
     */
    public static function runExample(
        GoogleAdsClient $googleAdsClient,
        int $customerId,
        int $campaignId
    ) {
        // Creates an extension feed item as price.
        $extensionFeedItemResourceName =
            self::createExtensionFeedItem($googleAdsClient, $customerId, $campaignId);

        // Creates a customer extension setting using the previously created extension
        // feed item. This associates the price extension to your account.
        $customerExtensionSetting = new CustomerExtensionSetting([
            'extension_type' => ExtensionType::PRICE,
            'extension_feed_items' => [new StringValue(['value' => $extensionFeedItemResourceName])]
        ]);
        // Creates a customer extension setting operation.
        $customerExtensionSettingOperation = new CustomerExtensionSettingOperation();
        $customerExtensionSettingOperation->setCreate($customerExtensionSetting);

        // Issues a mutate request to add the customer extension setting and print its information.
        $customerExtensionSettingServiceClient =
            $googleAdsClient->getCustomerExtensionSettingServiceClient();
        $response = $customerExtensionSettingServiceClient->mutateCustomerExtensionSettings(
            $customerId,
            [$customerExtensionSettingOperation]
        );
        printf(
            "Created customer extension setting with resource name: '%s'.%s",
            $response->getResults()[0]->getResourceName(),
            PHP_EOL
        );
    }

    /**
     * Creates an extension feed item for price extension.
     *
     * @param GoogleAdsClient $googleAdsClient the Google Ads API client
     * @param int $customerId the client customer ID
     * @param int $campaignId the campaign ID
     * @return string the created extension feed item's resource name
     */
    private static function createExtensionFeedItem(
        GoogleAdsClient $googleAdsClient,
        int $customerId,
        int $campaignId
    ) {
        // Creates the price extension feed item.
        $priceFeedItem = new PriceFeedItem([
            'type' => PriceExtensionType::SERVICES,
            // Optional: Sets price qualifier.
            'price_qualifier' => PriceExtensionPriceQualifier::FROM,
            'tracking_url_template' => new StringValue([
                'value' => 'http://tracker.example.com/?u={lpurl}']),
            'language_code' => new StringValue(['value' => 'en'])
        ]);

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

        // Creates an extension feed item from the price feed item.
        $extensionFeedItem = new ExtensionFeedItem([
            'extension_type' => ExtensionType::PRICE,
            'price_feed_item' => $priceFeedItem,
            'targeted_campaign' => ResourceNames::forCampaign($customerId, $campaignId),
            'ad_schedules' => [
                self::createAdScheduleInfo(
                    DayOfWeek::SUNDAY,
                    10,
                    MinuteOfHour::ZERO,
                    18,
                    MinuteOfHour::ZERO
                ),
                self::createAdScheduleInfo(
                    DayOfWeek::SATURDAY,
                    10,
                    MinuteOfHour::ZERO,
                    22,
                    MinuteOfHour::ZERO
                )
            ]
        ]);

        // Creates an extension feed item operation.
        $extensionFeedItemOperation = new ExtensionFeedItemOperation();
        $extensionFeedItemOperation->setCreate($extensionFeedItem);

        // Issues a mutate request to add the extension feed item and print its information.
        $extensionFeedItemServiceClient = $googleAdsClient->getExtensionFeedItemServiceClient();
        $response = $extensionFeedItemServiceClient->mutateExtensionFeedItems(
            $customerId,
            [$extensionFeedItemOperation]
        );
        $extensionFeedItemResourceName = $response->getResults()[0]->getResourceName();
        printf(
            "Created extension feed item with resource name: '%s'.%s",
            $extensionFeedItemResourceName,
            PHP_EOL
        );

        return $extensionFeedItemResourceName;
    }

    /**
     * Creates a new price offer 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 PriceOffer the created price offer
     */
    private static function createPriceOffer(
        string $header,
        string $description,
        int $priceInMicros,
        string $currencyCode,
        int $unit,
        string $finalUrl,
        string $finalMobileUrl = null
    ) {
        $priceOffer = new PriceOffer([
            'header' => new StringValue(['value' => $header]),
            'description' => new StringValue(['value' => $description]),
            'final_urls' => [new StringValue(['value' => $finalUrl])],
            'price' => new Money([
                'amount_micros' => new Int64Value(['value' => $priceInMicros]),
                'currency_code' => new StringValue(['value' => $currencyCode])
            ]),
            'unit' => $unit
        ]);

        // Optional: Sets the final mobile URLs.
        if (!is_null($finalMobileUrl)) {
            $priceOffer->setFinalMobileUrls([new StringValue(['value' => $finalMobileUrl])]);
        }

        return $priceOffer;
    }

    /**
     * Creates a new ad schedule info with the specified parameters.
     *
     * @param int $dayOfWeek the enum value of day of the schedule
     * @param int $startHour the start hour of the schedule
     * @param int $startMinute the enum value of start minute of the schedule
     * @param int $endHour the end hour of the schedule
     * @param int $endMinute the enum value of end minute of the schedule
     * @return AdScheduleInfo the created schedule info
     */
    private static function createAdScheduleInfo(
        int $dayOfWeek,
        int $startHour,
        int $startMinute,
        int $endHour,
        int $endMinute
    ) {
        return new AdScheduleInfo([
            'day_of_week' => $dayOfWeek,
            'start_hour' => new Int32Value(['value' => $startHour]),
            'start_minute' => $startMinute,
            'end_hour' => new Int32Value(['value' => $endHour]),
            'end_minute' => $endMinute
        ]);
    }
}

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 extension and associates it with an account.

Campaign targeting is also set using the specified campaign ID. To get
campaigns, run basic_operations/get_campaigns.py
"""


import argparse
import sys

from google.ads.google_ads.client import GoogleAdsClient
from google.ads.google_ads.errors import GoogleAdsException


def main(client, customer_id, campaign_id):
    """The main method that creates all necessary entities for the example."""
    # Create the price extension feed item
    price_feed_item = client.get_type('PriceFeedItem', version='v3')
    price_feed_item.type = (
        client.get_type('PriceExtensionTypeEnum', version='v3').SERVICES)
    # Optional: set price qualifier
    price_feed_item.price_qualifier = (
        client.get_type('PriceExtensionPriceQualifierEnum').FROM)
    price_feed_item.tracking_url_template.value = (
        'http://tracker.example.com/?u={lpurl}')
    price_feed_item.language_code.value = 'en'

    # To create a price extension, at least three price offerings are needed.
    price_extension_price_unit_enum = (
        client.get_type('PriceExtensionPriceUnitEnum'))
    price_feed_item.price_offerings.extend([
        _create_price_offer(client,
                            'Scrubs',
                            'Body Scrub, Salt Scrub',
                            60000000,  # 60 USD
                            'USD',
                            price_extension_price_unit_enum.PER_HOUR,
                            'http://www.example.com/scrubs',
                            'http://m.example.com/scrubs'),
        _create_price_offer(client,
                            'Hair Cuts',
                            'Once a month',
                            75000000,  # 75 USD
                            'USD',
                            price_extension_price_unit_enum.PER_MONTH,
                            'http://www.example.com/haircuts',
                            'http://m.example.com/haircuts'),
        _create_price_offer(client,
                            'Skin Care Package',
                            'Four times a month',
                            250000000,  # 250 USD
                            'USD',
                            price_extension_price_unit_enum.PER_MONTH,
                            'http://www.example.com/skincarepackage')
    ])

    # Create a customer extension setting using the previously created
    # extension feed item. This associates the price extension to your
    # account.
    campaign_service = client.get_service('CampaignService', version='v3')
    extension_feed_item_operation = (
        client.get_type('ExtensionFeedItemOperation', version='v3'))
    extension_feed_item = extension_feed_item_operation.create
    extension_feed_item.extension_type = (
        client.get_type('ExtensionTypeEnum').PRICE)
    extension_feed_item.price_feed_item.CopyFrom(price_feed_item)
    extension_feed_item.targeted_campaign.value = (
        campaign_service.campaign_path(customer_id, campaign_id))
    day_of_week_enum = client.get_type('DayOfWeekEnum', version='v3')
    minute_of_hour_enum = client.get_type('MinuteOfHourEnum', version='v3')
    extension_feed_item.ad_schedules.extend([
        _create_ad_schedule_info(client,
                                 day_of_week_enum.SUNDAY,
                                 10,
                                 minute_of_hour_enum.ZERO,
                                 18,
                                 minute_of_hour_enum.ZERO),
        _create_ad_schedule_info(client,
                                 day_of_week_enum.SATURDAY,
                                 10,
                                 minute_of_hour_enum.ZERO,
                                 22,
                                 minute_of_hour_enum.ZERO)
    ])

    # Add the extension
    try:
        feed_service = client.get_service('ExtensionFeedItemService',
                                          version='v3')
        # Issues a mutate request to add the customer extension setting and
        # print its information.
        feed_response = (
            feed_service.mutate_extension_feed_items(customer_id,
                [extension_feed_item_operation])
        )
    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)

    print('Created extension feed with resource name {}.'
          .format(feed_response.results[0].resource_name))


def _create_price_offer(client, header, description, price_in_micros,
                        currency_code, unit, in_final_url,
                        in_final_mobile_url=None):
    """Create a price offer."""
    price_offer = client.get_type('PriceOffer', version='v3')
    price_offer.header.value = header
    price_offer.description.value = description
    final_url = price_offer.final_urls.add()
    final_url.value = in_final_url
    price_offer.price.amount_micros.value = price_in_micros
    price_offer.price.currency_code.value = currency_code
    price_offer.unit = unit
    # Optional: set the final mobile URLs
    if in_final_mobile_url:
        final_mobile_url = price_offer.final_mobile_urls.add()
        final_mobile_url.value = in_final_mobile_url
    return price_offer


def _create_ad_schedule_info(client, day_of_week, start_hour, start_minute,
                             end_hour, end_minute):
    """Create a new ad schedule info with the specified parameters."""
    ad_schedule_info = client.get_type('AdScheduleInfo', version='v3')
    ad_schedule_info.day_of_week = day_of_week
    ad_schedule_info.start_hour.value = start_hour
    ad_schedule_info.start_minute = start_minute
    ad_schedule_info.end_hour.value = end_hour
    ad_schedule_info.end_minute = end_minute
    return ad_schedule_info


if __name__ == '__main__':
    # GoogleAdsClient will read the google-ads.yaml configuration file in the
    # home directory if none is specified.
    google_ads_client = GoogleAdsClient.load_from_storage()

    parser = argparse.ArgumentParser(
        description='Add price extension 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')
    parser.add_argument('-i', '--campaign_id', type=str,
                        required=True, help='The campaign ID.')
    args = parser.parse_args()

    main(google_ads_client, args.customer_id, args.campaign_id)
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 extension and associates it with an account. Campaign
# targeting is also set using the specified campaign ID. To get campaigns, run
# get_campaigns.pl.

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::V3::Resources::CustomerExtensionSetting;
use Google::Ads::GoogleAds::V3::Resources::ExtensionFeedItem;
use Google::Ads::GoogleAds::V3::Common::PriceFeedItem;
use Google::Ads::GoogleAds::V3::Common::PriceOffer;
use Google::Ads::GoogleAds::V3::Common::Money;
use Google::Ads::GoogleAds::V3::Common::AdScheduleInfo;
use Google::Ads::GoogleAds::V3::Enums::ExtensionTypeEnum qw(PRICE);
use Google::Ads::GoogleAds::V3::Enums::PriceExtensionTypeEnum qw(SERVICES);
use Google::Ads::GoogleAds::V3::Enums::PriceExtensionPriceQualifierEnum
  qw(FROM);
use Google::Ads::GoogleAds::V3::Enums::PriceExtensionPriceUnitEnum
  qw(PER_HOUR PER_MONTH);
use Google::Ads::GoogleAds::V3::Enums::DayOfWeekEnum qw(SATURDAY SUNDAY);
use Google::Ads::GoogleAds::V3::Enums::MinuteOfHourEnum qw(ZERO);
use
  Google::Ads::GoogleAds::V3::Services::CustomerExtensionSettingService::CustomerExtensionSettingOperation;
use
  Google::Ads::GoogleAds::V3::Services::ExtensionFeedItemService::ExtensionFeedItemOperation;
use Google::Ads::GoogleAds::V3::Utils::ResourceNames;

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

# 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 $campaign_id = "INSERT_CAMPAIGN_ID_HERE";

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

  # Create an extension feed item as price.
  my $extension_feed_item =
    create_extension_feed_item($api_client, $customer_id, $campaign_id);

  # Create a customer extension setting using the previously created extension
  # feed item. This associates the price extension to your account.
  my $customer_extension_setting =
    Google::Ads::GoogleAds::V3::Resources::CustomerExtensionSetting->new({
      extensionType      => PRICE,
      extensionFeedItems => [$extension_feed_item]});

  # Create a customer extension setting operation.
  my $customer_extension_setting_operation =
    Google::Ads::GoogleAds::V3::Services::CustomerExtensionSettingService::CustomerExtensionSettingOperation
    ->new({
      create => $customer_extension_setting
    });

  # Add the customer extension setting.
  my $customer_extension_setting_response =
    $api_client->CustomerExtensionSettingService()->mutate({
      customerId => $customer_id,
      operations => [$customer_extension_setting_operation]});

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

  return 1;
}

# Creates an extension feed item.
sub create_extension_feed_item {
  my ($api_client, $customer_id, $campaign_id) = @_;

  # Create the price extension feed item.
  my $price_feed_item = Google::Ads::GoogleAds::V3::Common::PriceFeedItem->new({
    type => SERVICES,
    # Price qualifier is optional.
    priceQualifier      => FROM,
    trackingUrlTemplate => "http://tracker.example.com/?u={lpurl}",
    languageCode        => "en"
  });

  # To create a price extension, at least three price offerings are needed.
  $price_feed_item->{priceOfferings} = [
    create_price_offer(
      "Scrubs",
      "Body Scrub, Salt Scrub",
      "http://www.example.com/scrubs",
      "http://m.example.com/scrubs",
      60000000,    # 60 USD
      "USD",
      PER_HOUR
    ),
    create_price_offer(
      "Hair Cuts",
      "Once a month",
      "http://www.example.com/haircuts",
      "http://m.example.com/haircuts",
      75000000,    # 75 USD
      "USD",
      PER_MONTH
    ),
    create_price_offer(
      "Skin Care Package",
      "Four times a month",
      "http://www.example.com/skincarepackage",
      undef,
      250000000,    # 250 USD
      "USD",
      PER_MONTH
    )];

  # Create an extension feed item from the price feed item.
  my $extension_feed_item =
    Google::Ads::GoogleAds::V3::Resources::ExtensionFeedItem->new({
      extensionType => PRICE,
      priceFeedItem => $price_feed_item,
      targetedCampaign =>
        Google::Ads::GoogleAds::V3::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
        ),
      adSchedules => [
        create_ad_schedule_info(SUNDAY,   10, ZERO, 18, ZERO),
        create_ad_schedule_info(SATURDAY, 10, ZERO, 22, ZERO),
      ]});

  # Create an extension feed item operation.
  my $extension_feed_item_operation =
    Google::Ads::GoogleAds::V3::Services::ExtensionFeedItemService::ExtensionFeedItemOperation
    ->new({
      create => $extension_feed_item
    });

  # Add the extension feed item.
  my $extension_feed_item_response =
    $api_client->ExtensionFeedItemService()->mutate({
      customerId => $customer_id,
      operations => [$extension_feed_item_operation]});

  my $extension_feed_item_resource_name =
    $extension_feed_item_response->{results}[0]{resourceName};
  printf "Created extension feed item with resource name '%s'.\n",
    $extension_feed_item_resource_name;

  return $extension_feed_item_resource_name;
}

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

  my $price_offer = Google::Ads::GoogleAds::V3::Common::PriceOffer->new({
      header      => $header,
      description => $description,
      finalUrls   => [$final_url],
      price       => Google::Ads::GoogleAds::V3::Common::Money->new({
          amountMicros => $price_in_micros,
          currencyCode => $currency_code
        }
      ),
      unit => $unit
    });

  # Optional: set the final mobile URLs.
  $price_offer->{finalMobileUrls} = [$final_mobile_url] if $final_mobile_url;

  return $price_offer;
}

# Creates a new ad schedule info with the specified attributes.
sub create_ad_schedule_info {
  my ($day, $start_hour, $start_minute, $end_hour, $end_minute) = @_;

  return Google::Ads::GoogleAds::V3::Common::AdScheduleInfo->new({
    dayOfWeek   => $day,
    startHour   => $start_hour,
    startMinute => $start_minute,
    endHour     => $end_hour,
    endMinute   => $end_minute
  });
}

# 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({version => "V3"});

# 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, "campaign_id=i" => \$campaign_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, $campaign_id);

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

=pod

=head1 NAME

add_prices

=head1 DESCRIPTION

This example adds a price extension and associates it with an account. Campaign
targeting is also set using the specified campaign ID. To get campaigns, run
get_campaigns.pl.

=head1 SYNOPSIS

add_prices.pl [options]

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

=cut