Register for one of our Google Ads API Migration Workshops (October 5, 2021 - October 14, 2021)

Asset-based extensions

In addition to the traditional Feed-based extensions, you can also create Asset-based ad extensions in your Google Ads account. Currently, Callout, Lead Form, Promotion, Sitelink, and Structured Snippet Asset-based extensions are available. More Asset-based extension types will be available in the future.

Creating an extension

There are two steps to creating an Asset-based extension.

  1. Create a new asset.
  2. Associate the asset with a campaign, ad group, or customer.

We examine each of these steps by creating a Lead form extension.

Create an asset

You can create a Lead Form asset by creating an Asset object and populating the lead_form_asset field. Call the AssetService::MutateAssets() method to execute an AssetOperation with the create field set to the new asset object.

Java

private static String createLeadFormAsset(GoogleAdsClient googleAdsClient, long customerId) {
  // Creates the lead form asset.
  Asset leadFormAsset =
      Asset.newBuilder()
          .setName("Interplanetary Cruise #" + getPrintableDateTime() + " Lead Form")
          .setLeadFormAsset(
              LeadFormAsset.newBuilder()
                  // Specify the details of the extension that the users will see.
                  .setCallToActionType(LeadFormCallToActionType.BOOK_NOW)
                  .setCallToActionDescription("Latest trip to Jupiter!")
                  // Define the form details.
                  .setBusinessName("Interplanetary Cruise")
                  .setHeadline("Trip to Jupiter")
                  .setDescription("Our latest trip to Jupiter is now open for booking.")
                  .setPrivacyPolicyUrl("http://example.com/privacy")
                  // Define the fields to be displayed to the user.
                  .addFields(
                      LeadFormField.newBuilder()
                          .setInputType(LeadFormFieldUserInputType.FULL_NAME)
                          .build())
                  .addFields(
                      LeadFormField.newBuilder()
                          .setInputType(LeadFormFieldUserInputType.EMAIL)
                          .build())
                  .addFields(
                      LeadFormField.newBuilder()
                          .setInputType(LeadFormFieldUserInputType.PHONE_NUMBER)
                          .build())
                  .addFields(
                      LeadFormField.newBuilder()
                          .setInputType(LeadFormFieldUserInputType.PREFERRED_CONTACT_TIME)
                          .setSingleChoiceAnswers(
                              LeadFormSingleChoiceAnswers.newBuilder()
                                  .addAnswers("Before 9 AM")
                                  .addAnswers("Any time")
                                  .addAnswers("After 5 PM")
                                  .build())
                          .build())
                  .addFields(
                      LeadFormField.newBuilder()
                          .setInputType(LeadFormFieldUserInputType.TRAVEL_BUDGET)
                          .build())

                  // Optional: You can also specify a background image asset.
                  // To upload an asset, see Misc/UploadImageAsset.java.
                  // .setBackgroundImageAsset("INSERT_IMAGE_ASSET_HERE")

                  // Optional: Define the response page after the user signs up on the form.
                  .setPostSubmitHeadline("Thanks for signing up!")
                  .setPostSubmitDescription(
                      "We will reach out to you shortly. Visit our website "
                          + "to see past trip details.")
                  .setPostSubmitCallToActionType(LeadFormPostSubmitCallToActionType.VISIT_SITE)
                  // Optional: Display a custom disclosure that displays along with Google
                  // disclaimer on the form.
                  .setCustomDisclosure("Trip may get cancelled due to meteor shower.")
                  // Optional: Define a delivery method for form response. See
                  // https://developers.google.com/google-ads/webhook/docs/overview for more
                  // details on how to define a webhook.
                  .addDeliveryMethods(
                      LeadFormDeliveryMethod.newBuilder()
                          .setWebhook(
                              WebhookDelivery.newBuilder()
                                  .setAdvertiserWebhookUrl("http://example.com/webhook")
                                  .setGoogleSecret("interplanetary google secret")
                                  .setPayloadSchemaVersion(3L)
                                  .build())
                          .build())
                  .build())
          .addFinalUrls("http://example.com/jupiter")
          .build();

  // Creates an operation to add the asset.
  AssetOperation operation = AssetOperation.newBuilder().setCreate(leadFormAsset).build();

  // Issues a mutate request to add the asset and prints its information.
  try (AssetServiceClient client =
      googleAdsClient.getLatestVersion().createAssetServiceClient()) {
    MutateAssetsResponse response =
        client.mutateAssets(String.valueOf(customerId), ImmutableList.of(operation));
    String resourceName = response.getResultsList().get(0).getResourceName();
    System.out.printf("Created asset with resource name '%s'.%n", resourceName);
    return resourceName;
  }
}
      
      

C#

private string CreateLeadFormAsset(GoogleAdsClient client, long customerId)
{
    AssetServiceClient assetService = client.GetService(Services.V8.AssetService);

    // Creates the lead form asset.
    Asset leadFormAsset = new Asset()
    {
        Name = $"Interplanetary Cruise #{ExampleUtilities.GetRandomString()} Lead Form",
        LeadFormAsset = new LeadFormAsset()
        {
            // Specify the details of the extension that the users will see.
            CallToActionType = LeadFormCallToActionType.BookNow,
            CallToActionDescription = "Latest trip to Jupiter!",

            // Define the form details.
            BusinessName = "Interplanetary Cruise",
            Headline = "Trip to Jupiter",
            Description = "Our latest trip to Jupiter is now open for booking.",
            PrivacyPolicyUrl = "http://example.com/privacy",

            // Define the fields to be displayed to the user.
            Fields = {
                new LeadFormField()
                {
                    InputType = LeadFormFieldUserInputType.FullName,
                },
                new LeadFormField()
                {
                    InputType = LeadFormFieldUserInputType.Email,
                },
                new LeadFormField()
                {
                    InputType = LeadFormFieldUserInputType.PhoneNumber,
                },
                new LeadFormField()
                {
                    InputType = LeadFormFieldUserInputType.PreferredContactTime,
                    SingleChoiceAnswers = new LeadFormSingleChoiceAnswers()
                    {
                        Answers = { "Before 9 AM", "Any time", "After 5 PM" }
                    }
                },
                new LeadFormField()
                {
                    InputType = LeadFormFieldUserInputType.TravelBudget,
                },
            },

            // Optional: You can also specify a background image asset. To upload an asset,
            // see Misc/UploadImageAsset.cs. BackgroundImageAsset =
            // "INSERT_IMAGE_ASSET_HERE",

            // Optional: Define the response page after the user signs up on the form.
            PostSubmitHeadline = "Thanks for signing up!",
            PostSubmitDescription = "We will reach out to you shortly. Visit our website " +
            "to see past trip details.",
            PostSubmitCallToActionType = LeadFormPostSubmitCallToActionType.VisitSite,

            // Optional: Display a custom disclosure that displays along with the Google
            // disclaimer on the form.
            CustomDisclosure = "Trip may get cancelled due to meteor shower.",

            // Optional: Define a delivery method for the form response. See
            // https://developers.google.com/google-ads/webhook/docs/overview for more
            // details on how to define a webhook.
            DeliveryMethods =
            {
                new LeadFormDeliveryMethod()
                {
                    Webhook = new WebhookDelivery()
                    {
                        AdvertiserWebhookUrl = "http://example.com/webhook",
                        GoogleSecret = "interplanetary google secret",
                        PayloadSchemaVersion = 3L
                    }
                }
            },
        },
        FinalUrls = { "http://example.com/jupiter" }
    };

    // Creates the operation.
    AssetOperation operation = new AssetOperation()
    {
        Create = leadFormAsset,
    };

    // Makes the API call.
    MutateAssetsResponse response = assetService.MutateAssets(customerId.ToString(),
        new[] { operation });

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

    // Displays the result.
    Console.WriteLine($"Asset with resource name = '{leadFormAssetResourceName}' " +
        "was created.");
    return leadFormAssetResourceName;
}
      
      

PHP

private static function createLeadFormAsset(
    GoogleAdsClient $googleAdsClient,
    int $customerId
): string {
    // Creates the lead form asset.
    $leadFormAsset = new Asset([
        'name' => 'Interplanetary Cruise #' . Helper::getPrintableDatetime() . ' Lead Form',
        'lead_form_asset' => new LeadFormAsset([
            // Specifies the details of the extension that the users will see.
            'call_to_action_type' => LeadFormCallToActionType::BOOK_NOW,
            'call_to_action_description' => 'Latest trip to Jupiter!',
            // Defines the form details.
            'business_name' => 'Interplanetary Cruise',
            'headline' => 'Trip to Jupiter',
            'description' => 'Our latest trip to Jupiter is now open for booking.',
            'privacy_policy_url' => 'http://example.com/privacy',
            // Defines the fields to be displayed to the user.
            'fields' => [
                new LeadFormField(['input_type' => LeadFormFieldUserInputType::FULL_NAME]),
                new LeadFormField(['input_type' => LeadFormFieldUserInputType::EMAIL]),
                new LeadFormField(['input_type' => LeadFormFieldUserInputType::PHONE_NUMBER]),
                new LeadFormField([
                    'input_type' => LeadFormFieldUserInputType::PREFERRED_CONTACT_TIME,
                    'single_choice_answers' => new LeadFormSingleChoiceAnswers([
                        'answers' => ['Before 9 AM', 'Any time', 'After 5 PM']
                    ])
                ]),
                new LeadFormField(['input_type' => LeadFormFieldUserInputType::TRAVEL_BUDGET])
            ],
            // Optional: You can also specify a background image asset.
            // To upload an asset, see Misc/UploadImageAsset.php.
            // 'background_image_asset' => 'INSERT_IMAGE_ASSET_RESOURCE_NAME_HERE',

            // Optional: Defines the response page after the user signs up on the form.
            'post_submit_headline' => 'Thanks for signing up!',
            'post_submit_description' => 'We will reach out to you shortly. '
                . 'Visit our website to see past trip details.',
            'post_submit_call_to_action_type' => LeadFormPostSubmitCallToActionType::VISIT_SITE,
            // Optional: Displays a custom disclosure that displays along with Google
            // disclaimer on the form.
            'custom_disclosure' => 'Trip may get cancelled due to meteor shower.',
            // Optional: Defines a delivery method for form response. See
            // https://developers.google.com/google-ads/webhook/docs/overview for more
            // details on how to define a webhook.
            'delivery_methods' => [new LeadFormDeliveryMethod([
                'webhook' => new WebhookDelivery([
                    'advertiser_webhook_url' => 'http://example.com/webhook',
                    'google_secret' => 'interplanetary google secret',
                    'payload_schema_version' => 3
                ])
            ])]
        ]),
        'final_urls' => ['http://example.com/jupiter']
    ]);

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

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

    return $assetResourceName;
}
      
      

Python

def _create_lead_form_asset(client, customer_id):
    """Creates a lead form asset using the given customer ID.

    Args:
        client: An initialized GoogleAdsClient instance.
        customer_id: The Google Ads customer ID.

    Returns:
        A str of the resource name for the newly created lead form asset.
    """
    asset_service = client.get_service("AssetService")
    asset_operation = client.get_type("AssetOperation")
    asset = asset_operation.create
    asset.name = f"Interplanetary Cruise #{uuid4()} Lead Form"
    asset.final_urls.append("http://example.com/jupiter")

    # Creates a new LeadFormAsset instance.
    lead_form_asset = asset.lead_form_asset

    # Specify the details of the extension that the users will see.
    lead_form_asset.call_to_action_type = (
        client.enums.LeadFormCallToActionTypeEnum.BOOK_NOW
    )
    lead_form_asset.call_to_action_description = "Latest trip to Jupiter!"

    # Define the form details.
    lead_form_asset.business_name = "Interplanetary Cruise"
    lead_form_asset.headline = "Trip to Jupiter"
    lead_form_asset.description = (
        "Our latest trip to Jupiter is now open for booking."
    )
    lead_form_asset.privacy_policy_url = "http://example.com/privacy"

    # Define the fields to be displayed to the user.
    input_type_enum = client.enums.LeadFormFieldUserInputTypeEnum
    lead_form_field_1 = client.get_type("LeadFormField")
    lead_form_field_1.input_type = input_type_enum.FULL_NAME
    lead_form_asset.fields.append(lead_form_field_1)

    lead_form_field_2 = client.get_type("LeadFormField")
    lead_form_field_2.input_type = input_type_enum.EMAIL
    lead_form_asset.fields.append(lead_form_field_2)

    lead_form_field_3 = client.get_type("LeadFormField")
    lead_form_field_3.input_type = input_type_enum.PHONE_NUMBER
    lead_form_asset.fields.append(lead_form_field_3)

    lead_form_field_4 = client.get_type("LeadFormField")
    lead_form_field_4.input_type = input_type_enum.PREFERRED_CONTACT_TIME
    lead_form_field_4.single_choice_answers.answers.extend(
        ["Before 9 AM", "Anytime", "After 5 PM"]
    )
    lead_form_asset.fields.append(lead_form_field_4)

    # Optional: You can also specify a background image asset.
    # To upload an asset, see misc/upload_image.py.
    # lead_form_asset.background_image_asset = "INSERT_IMAGE_ASSET_HERE"

    # Optional: Define the response page after the user signs up on the form.
    lead_form_asset.post_submit_headline = "Thanks for signing up!"
    lead_form_asset.post_submit_description = (
        "We will reach out to you shortly. Visit our website to see past trip "
        "details."
    )
    lead_form_asset.post_submit_call_to_action_type = (
        client.enums.LeadFormPostSubmitCallToActionTypeEnum.VISIT_SITE
    )

    # Optional: Display a custom disclosure that displays along with the Google
    # disclaimer on the form.
    lead_form_asset.custom_disclosure = (
        "Trip may get cancelled due to meteor shower"
    )

    # Optional: Define a delivery method for the form response. See
    # https://developers.google.com/google-ads/webhook/docs/overview for more
    # details on how to define a webhook.
    delivery_method = client.get_type("LeadFormDeliveryMethod")
    delivery_method.webhook.advertiser_webhook_url = (
        "http://example.com/webhook"
    )
    delivery_method.webhook.google_secret = "interplanetary google secret"
    delivery_method.webhook.payload_schema_version = 3
    lead_form_asset.delivery_methods.append(delivery_method)

    asset_service = client.get_service("AssetService")
    response = asset_service.mutate_assets(
        customer_id=customer_id, operations=[asset_operation]
    )
    resource_name = response.results[0].resource_name

    print(f"Asset with resource name {resource_name} was created.")

    return resource_name
      
      

Ruby

def create_lead_form_asset(client, customer_id)
  operation = client.operation.create_resource.asset do |a|
    a.name = "Interplanetary Cruise #{(Time.new.to_f * 1000).to_i} Lead Form"
    a.final_urls << "http://example.com/jupiter"

    a.lead_form_asset = client.resource.lead_form_asset do |lfa|
      lfa.call_to_action_type = :BOOK_NOW
      lfa.call_to_action_description = "Latest trip to Jupiter!"

      lfa.business_name = "Interplanetary Cruise"
      lfa.headline = "Trip to Jupiter"
      lfa.description = "Our latest trip to Jupiter is now open for booking."
      lfa.privacy_policy_url = "http://example.com/privacy"

      lfa.fields << client.resource.lead_form_field do |lff|
        lff.input_type = :FULL_NAME
      end
      lfa.fields << client.resource.lead_form_field do |lff|
        lff.input_type = :EMAIL
      end
      lfa.fields << client.resource.lead_form_field do |lff|
        lff.input_type = :PHONE_NUMBER
      end
      lfa.fields << client.resource.lead_form_field do |lff|
        lff.input_type = :PREFERRED_CONTACT_TIME
        lff.single_choice_answers = client.resource.lead_form_single_choice_answers do |sca|
          sca.answers += ["Before 9 AM", "Anytime", "After 5 PM"]
        end
      end

      # Optional: You can also specify a background image asset.
      # To upload an asset, see misc/upload_image_asset.rb.
      # lfa.background_image_asset = "INSERT_IMAGE_ASSET_HERE"

      # Optional: Define the response page after the user signs up on the form.
      lfa.post_submit_headline = "Thanks for signing up!"
      lfa.post_submit_description = "We will reach out to you shortly. " \
        "Visit our website to see past trip details."
      lfa.post_submit_call_to_action_type = :VISIT_SITE

      # Optional
      # lfa.custom_disclosure = "Trip may get cancelled due to meteor shower."

      # Optional: Define a delivery method for the form response. See
      # https://developers.google.com/google-ads/webhook/docs/overview for more
      # details on how to define a webhook.
      lfa.delivery_methods << client.resource.lead_form_delivery_method do |lfdm|
        lfdm.webhook = client.resource.webhook_delivery do |wd|
          wd.advertiser_webhook_url = "http://example.com/webhook"
          wd.google_secret = "interplanetary google secret"
          wd.payload_schema_version = 3
        end
      end
    end
  end

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

  puts "Asset with resource name #{asset_name} was created."
  asset_name
end
      
      

Perl

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

  # Create the lead form asset.
  my $lead_form_asset = Google::Ads::GoogleAds::V8::Resources::Asset->new({
      name          => "Interplanetary Cruise Lead Form #" . uniqid(),
      leadFormAsset => Google::Ads::GoogleAds::V8::Common::LeadFormAsset->new({
          # Specify the details of the extension that the users will see.
          callToActionType        => BOOK_NOW,
          callToActionDescription => "Latest trip to Jupiter!",

          # Define the form details.
          businessName => "Interplanetary Cruise",
          headline     => "Trip to Jupiter",
          description  => "Our latest trip to Jupiter is now open for booking.",
          privacyPolicyUrl => "http://example.com/privacy",

          # Define the fields to be displayed to the user.
          fields => [
            Google::Ads::GoogleAds::V8::Common::LeadFormField->new({
                inputType => FULL_NAME
              }
            ),
            Google::Ads::GoogleAds::V8::Common::LeadFormField->new({
                inputType => EMAIL
              }
            ),
            Google::Ads::GoogleAds::V8::Common::LeadFormField->new({
                inputType => PHONE_NUMBER
              }
            ),
            Google::Ads::GoogleAds::V8::Common::LeadFormField->new({
                inputType           => PREFERRED_CONTACT_TIME,
                singleChoiceAnswers =>
                  Google::Ads::GoogleAds::V8::Common::LeadFormSingleChoiceAnswers
                  ->new({
                    answers => ["Before 9 AM", "Any time", "After 5 PM"]})}
            ),
            Google::Ads::GoogleAds::V8::Common::LeadFormField->new({
                inputType => TRAVEL_BUDGET
              })
          ],

          # Optional: You can also specify a background image asset.
          # To upload an asset, see misc/upload_image_asset.pl.
          # backgroundImageAsset => "INSERT_IMAGE_ASSET_HERE",

          # Optional: Define the response page after the user signs up on the form.
          postSubmitHeadline    => "Thanks for signing up!",
          postSubmitDescription => "We will reach out to you shortly. " .
            "Visit our website to see past trip details.",
          postSubmitCallToActionType => VISIT_SITE,

          # Optional: Display a custom disclosure that displays along with the
          # Google disclaimer on the form.
          customDisclosure => "Trip may get cancelled due to meteor shower.",

          # Optional: Define a delivery method for the form response. See
          # https://developers.google.com/google-ads/webhook/docs/overview for
          # more details on how to define a webhook.
          deliveryMethods => [
            Google::Ads::GoogleAds::V8::Common::LeadFormDeliveryMethod->new({
                webhook =>
                  Google::Ads::GoogleAds::V8::Common::WebhookDelivery->new({
                    advertiserWebhookUrl => "http://example.com/webhook",
                    googleSecret         => "interplanetary google secret",
                    payloadSchemaVersion => 3
                  })})]}
      ),
      finalUrls => ["http://example.com/jupiter"]});

  # Create the operation.
  my $asset_operation =
    Google::Ads::GoogleAds::V8::Services::AssetService::AssetOperation->new({
      create => $lead_form_asset
    });

  my $assets_response = $api_client->AssetService()->mutate({
      customerId => $customer_id,
      operations => [$asset_operation]});

  my $lead_form_asset_resource_name =
    $assets_response->{results}[0]{resourceName};

  # Display the result.
  printf "Asset with resource name = '%s' was created.\n",
    $lead_form_asset_resource_name;
  return $lead_form_asset_resource_name;
}
      
      

Associate the asset with a resource

Next, associate the asset with a resource by creating a CampaignAsset, AdGroupAsset, or CustomerAsset object. This example demonstrates how to associate the asset with a campaign.

Set the field_type field to LEAD_FORM. Call the CampaignAssetService::MutateCampaignAssets() method to execute a CampaignAssetOperation with the create field set to the new CampaignAsset object.

Java

private static void createLeadFormExtension(
    GoogleAdsClient googleAdsClient,
    long customerId,
    long campaignId,
    String leadFormAssetResourceName) {
  // Creates the campaign asset for the lead form.
  CampaignAsset campaignAsset =
      CampaignAsset.newBuilder()
          .setAsset(leadFormAssetResourceName)
          .setFieldType(AssetFieldType.LEAD_FORM)
          .setCampaign(ResourceNames.campaign(customerId, campaignId))
          .build();

  // Creates an operation to add the campaign asset.
  CampaignAssetOperation operation =
      CampaignAssetOperation.newBuilder().setCreate(campaignAsset).build();

  // Issues a mutate request to add the campaign asset and prints its information.
  try (CampaignAssetServiceClient client =
      googleAdsClient.getLatestVersion().createCampaignAssetServiceClient()) {
    MutateCampaignAssetsResponse response =
        client.mutateCampaignAssets(String.valueOf(customerId), ImmutableList.of(operation));
    System.out.printf(
        "Created campaign asset with resource name '%s' for campaign ID %d.%n",
        response.getResultsList().get(0).getResourceName(), campaignId);
  }
}
      
      

C#

private void CreateLeadFormExtension(GoogleAdsClient client, long customerId,
    long campaignId, string leadFormAssetResourceName)
{
    CampaignAssetServiceClient campaignAssetService = client.GetService(
        Services.V8.CampaignAssetService);

    // Creates the campaign asset for the lead form.
    CampaignAsset campaignAsset = new CampaignAsset()
    {
        Asset = leadFormAssetResourceName,
        FieldType = AssetFieldTypeEnum.Types.AssetFieldType.LeadForm,
        Campaign = ResourceNames.Campaign(customerId, campaignId),
    };

    CampaignAssetOperation operation = new CampaignAssetOperation()
    {
        Create = campaignAsset
    };

    MutateCampaignAssetsResponse response = campaignAssetService.MutateCampaignAssets(
        customerId.ToString(), new[] { operation });

    foreach (MutateCampaignAssetResult result in response.Results)
    {
        Console.WriteLine("Created campaign asset with resource name =" +
            $" '{result.ResourceName}' for campaign ID {campaignId}.");
    }
}
      
      

PHP

private static function createLeadFormExtension(
    GoogleAdsClient $googleAdsClient,
    int $customerId,
    int $campaignId,
    string $leadFormAssetResourceName
) {
    // Creates the campaign asset for the lead form.
    $campaignAsset = new CampaignAsset([
        'asset' => $leadFormAssetResourceName,
        'field_type' => AssetFieldType::LEAD_FORM,
        'campaign' => ResourceNames::forCampaign($customerId, $campaignId)
    ]);

    // Creates an operation to add the campaign asset.
    $campaignAssetOperation = new CampaignAssetOperation();
    $campaignAssetOperation->setCreate($campaignAsset);

    // Issues a mutate request to add the campaign asset and prints its information.
    $campaignAssetServiceClient = $googleAdsClient->getCampaignAssetServiceClient();
    $response = $campaignAssetServiceClient->mutateCampaignAssets(
        $customerId,
        [$campaignAssetOperation]
    );
    printf(
        "Created a campaign asset with resource name '%s' for campaign ID %d.%s",
        $response->getResults()[0]->getResourceName(),
        $campaignId,
        PHP_EOL
    );
}
      
      

Python

def _create_lead_form_extension(
    client, customer_id, campaign_id, lead_form_asset_resource_name
):
    """Creates the lead form extension.

    Args:
        client: An initialized GoogleAdsClient instance.
        customer_id: The Google Ads customer ID.
        campaign_id: The ID for a Campaign belonging to the given customer.
    """
    campaign_service = client.get_service("CampaignService")
    campaign_asset_service = client.get_service("CampaignAssetService")
    campaign_asset_operation = client.get_type("CampaignAssetOperation")
    campaign_asset = campaign_asset_operation.create
    campaign_asset.asset = lead_form_asset_resource_name
    campaign_asset.field_type = client.enums.AssetFieldTypeEnum.LEAD_FORM
    campaign_asset.campaign = campaign_service.campaign_path(
        customer_id, campaign_id
    )

    response = campaign_asset_service.mutate_campaign_assets(
        customer_id=customer_id, operations=[campaign_asset_operation]
    )
    for result in response.results:
        print(
            "Created campaign asset with resource name "
            f'"{result.resource_name}" for campaign with ID {campaign_id}'
        )
      
      

Ruby

def create_lead_form_extension(client, customer_id, campaign_id, lead_form_asset)
  operation = client.operation.create_resource.campaign_asset do |ca|
    ca.asset = lead_form_asset
    ca.field_type = :LEAD_FORM
    ca.campaign = client.path.campaign(customer_id, campaign_id)
  end

  response = client.service.campaign_asset.mutate_campaign_assets(
    customer_id: customer_id,
    operations: [operation],
  )

  puts "Created campaign asset #{response.results.first.resource_name} for " \
    "campaign #{campaign_id}."
end
      
      

Perl

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

  # Create the campaign asset for the lead form.
  my $campaign_asset =
    Google::Ads::GoogleAds::V8::Resources::CampaignAsset->new({
      asset     => $lead_form_asset_resource_name,
      fieldType => LEAD_FORM,
      campaign  => Google::Ads::GoogleAds::V8::Utils::ResourceNames::campaign(
        $customer_id, $campaign_id
      )});

  my $campaign_asset_operation =
    Google::Ads::GoogleAds::V8::Services::CampaignAssetService::CampaignAssetOperation
    ->new({
      create => $campaign_asset
    });

  my $campaign_assets_response = $api_client->CampaignAssetService()->mutate({
      customerId => $customer_id,
      operations => [$campaign_asset_operation]});

  printf
    "Created campaign asset with resource name = '%s' for campaign ID %d.\n",
    $campaign_assets_response->{results}[0]{resourceName}, $campaign_id;
}
      
      

Updating the extension

To update the underlying extension properties, update the Asset using the MutateAssets method from AssetService. To remove the extension from a campaign, remove the CampaignAsset.

Report types

The contents of an individual asset can be fetched by issuing a Google Ads Query Language query to the asset report.

Asset-based extension performance statistics can be requested from the asset_field_type_view report.