Google Ads scripts support the following ad extensions:

- [Mobile apps](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_mobileapp)
- [Phone numbers](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_phonenumber)
- [Callouts](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_callout)
- [Prices](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_price)
- [Snippets](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_snippet)
- [Sitelinks](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_sitelink)

To learn more about ad extensions, visit the
[help center](https://support.google.com/google-ads/answer/2375499).

Google Ads scripts let you access supported ad extensions in your account.
For example, the following code snippet accesses sitelinks:

    const sitelinkIterator = AdsApp.extensions().sitelinks().get();
    for (const sitelink of sitelinkIterator) {
      // Do something with each sitelink
    }

You can retrieve other supported ad extensions similarly using their respective
[iterators](https://developers.google.com/google-ads/scripts/docs/elements/iterators).

## Creation

Google Ads scripts let you create supported ad extensions using [builders](https://developers.google.com/google-ads/scripts/docs/elements/builders).
For example, the following code snippet uses a phone number builder to create a
phone number in your account:

    const phoneNumberBuilder = AdsApp.extensions().newPhoneNumberBuilder();
    const newPhoneNumber = phoneNumberBuilder
      .withCountry("US")
      .withPhoneNumber("6502530000")
      .withCallOnly(false)
      .build()
      .getResult();

When `build()` is called, the phone number is created in the account, but it
won't show alongside any ads just yet. You need to add it to a campaign or an
ad group first:

    // Add a phone number to a campaign.
    campaign.addPhoneNumber(newPhoneNumber);

    // Add a phone number to an ad group.
    adGroup.addPhoneNumber(newPhoneNumber);

Other supported ad extensions can be created and associated to campaigns or ad
groups in the same way with their respective builders.

## Get stats

Google Ads scripts let you access stats for supported ad extensions at the
account, campaign, or ad group level.

For example, to get sitelink stats:

    // Account-level stats
    // Get a sitelink in the account.
    const sitelinkIterator = AdsApp.extensions().sitelinks().get();
    const sitelink = sitelinkIterator.next();
    const sitelinkStats = sitelink.getStatsFor("LAST_30_DAYS");
    console.log(sitelinkStats.getClicks());

    // Campaign-level stats.
    // Get a sitelink in a campaign.
    const campaignSitelinkIterator = campaign.extensions().sitelinks().get();
    const campaignSitelink = campaignSitelinkIterator.next();
    const campaignSitelinkStats = campaignSitelink.getStatsFor("LAST_30_DAYS");
    console.log(campaignSitelinkStats.getClicks());

    // Ad-group-level stats.
    // Get a sitelink in an ad group.
    const adGroupSitelinkIterator = adGroup.extensions().sitelinks().get();
    const adGroupSitelink = adGroupSitelinkIterator.next();
    const adGroupSitelinkStats = adGroupSitelink.getStatsFor("LAST_30_DAYS");
    console.log(adGroupSitelinkStats.getClicks());

Stats for other supported ad extensions can be accessed in a similar way.

## Modify ad extensions

Existing supported ad extensions can be modified with Google Ads scripts. For
example, the following code snippet will modify an existing sitelink:

    // Get a sitelink in the account.
    const sitelinkIterator = AdsApp.extensions().sitelinks().get();
    const sitelink = sitelinkIterator.next();
    console.log(sitelink.getLinkText()); // "original text"

    // Get a sitelink from a campaign. Assume it's the same one as before.
    const campaignSitelinkIterator = campaign.extensions().sitelinks().get();
    const campaignSitelink = campaignSitelinkIterator.next();
    console.log(campaignSitelink.getLinkText()); // "original text"

    // Get a sitelink from an ad group. Assume it's the same one as before.
    const adGroupSitelinkIterator = adGroup.extensions().sitelinks().get();
    const adGroupSitelink = adGroupSitelinkIterator.next();
    console.log(adGroupSitelink.getLinkText()); // "original text"

    // Change the sitelink's link text. This change will affect all the campaigns
    // and ad groups to which the sitelink belongs.
    campaignSitelink.setLinkText("new link text");

    // Same text!
    console.log(campaignSitelink.getLinkText()); // "new link text"
    console.log(adGroupSitelink.getLinkText()); // "new link text"
    console.log(sitelink.getLinkText()); // "new link text"

> [!NOTE]
> **Note:** If you modify a [`Sitelink`](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_sitelink), it will affect ads serving in all the campaigns and ad groups that the sitelink is associated with. This rule applies whether you retrieved the sitelink directly from the account, from a [`CampaignSitelink`](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_campaignsitelink) of an associated campaign, or from an [`AdGroupSitelink`](https://developers.google.com/google-ads/scripts/docs/reference/adsapp/adsapp_adgroup) of an associated ad group. The preceding code example demonstrates this behavior.

The same concepts apply for other supported ad extensions.

## Access ad-group-level ad extensions

Google Ads scripts let you access ad-group-level ad extensions. The following
method call will return phone numbers that have been explicitly added to an ad
group. Note that if phone numbers have been added to the campaign to which the
ad group belongs, the following method call will *not* return them even when the
phone numbers are eligible to appear on ads served from that ad group.

    // This will return phone numbers that have been explicitly added to this
    // ad group.
    const adGroupPhoneNumberIterator = adGroup.extensions().phoneNumbers().get();

Other supported ad extensions can be accessed at the ad group level in a similar
way.

## Access account-level ad extensions

Google Ads scripts let you access account-level ad extensions. Callouts, mobile
apps, and reviews can be added as account-level ad extensions, but account-level
sitelinks and phone numbers are not available. The following method call will
return callouts that have been explicitly added to your account.

    // This will return callouts that have been explicitly added to your account.
    const accountCalloutIterator =
        AdsApp.currentAccount().extensions().callouts().get();

Account-level mobile apps and reviews can be accessed in a similar way.

Adding account-level ad extensions is similar to adding campaign-level or
ad-group-level ad extensions. The following example demonstrates how to add an
account-level callout extension:

    // Create a new callout in the account. Without adding the new callout as an ad
    // group, campaign or account extension, it won't actually serve.
    const calloutBuilder = AdsApp.extensions().newCalloutBuilder();
    const newCallout = calloutBuilder.withText("Sample Text").build().getResult();

    // Add the new callout as an account-level extension. This enables it to serve
    // for all campaigns in the account.
    AdsApp.currentAccount().addCallout(newCallout);

Account-level mobile apps and reviews can be added in a similar way.

## Remove campaign, ad group, and account ad extensions

Supported ad extensions can be removed from campaigns and ad groups at the
account level. Google Ads scripts don't support removing ad extensions from an
account all at once.

    // Get a mobile app from a campaign.
    const campaignMobileAppIterator = campaign.extensions().mobileApps().get();
    const campaignMobileApp = campaignMobileAppIterator.next();

    // Remove the mobile app.
    campaign.removeMobileApp(campaignMobileApp);

    // The mobile app still exists in the account and will be returned in the
    // following iterator.
    const mobileAppIterator = AdsApp.extensions().mobileApps().get();

Similarly, to remove an ad-group-level or account-level mobile app:

    // Get a mobile app from an ad group.
    const adGroupMobileAppIterator = adGroup.extensions().mobileApps().get();
    const adGroupMobileApp = adGroupMobileAppIterator.next();

    // Remove the mobile app.
    adGroup.removeMobileApp(adGroupMobileApp);

    // Get an account-level mobile app.
    const accountMobileAppIterator =
        AdsApp.currentAccount().extensions().mobileApps().get();
    const accountMobileApp = accountMobileAppIterator.next();

    // Remove the mobile app.
    // Note that this removes the mobile app from the account level, so it won't
    // serve as an account-level extension, but it will still exist in the
    // account. It can still be added to an AdGroup or Campaign, or again as an
    // account-level extension in the future.
    AdsApp.currentAccount().removeMobileApp(accountMobileApp);

If all mobile apps are removed from a campaign, the campaign will no longer have
a mobile app extension. To remove all mobile apps from your campaign, you need
to retrieve the list of mobile apps for that campaign and remove them one at a
time. The procedure is the same for other supported ad extensions.