To generate a new Search campaign from scratch, you must at the minimum create
the following:

- A [budget](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBudget)
- The [campaign](https://developers.google.com/google-ads/api/reference/rpc/v26/Campaign) itself
- An [ad group](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroup)
- [Keywords](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterion)
- An [ad group ad](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupAd) containing an [ad](https://developers.google.com/google-ads/api/reference/rpc/v26/Ad)

The campaign and budget are useful for creating all sorts of campaign types,
while some settings within the ad group ads will be specifically useful for
creating Search campaigns. Visit the [Search assets guide](https://developers.google.com/google-ads/scripts/docs/campaigns/search/assets) to see how
assets can be created using scripts.

Make sure you're familiar with the [mutate strategy](https://developers.google.com/google-ads/scripts/docs/campaigns/search/mutate-strategy), as this
guide will only provide the JavaScript objects to be used in the mutates.

## Budget

The budget must not be shared, and must have a unique name in your account. Use
a [`CampaignBudgetOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBudgetOperation) to create
your budget.

    const budgetOperation = {
      "campaignBudgetOperation": {
        "create": {
          "resourceName": `customers/${customerId}/campaignBudgets/${getNextTempId()}`,
          "name": "Search campaign budget",
          "amountMicros": "10000000",
          "deliveryMethod": "STANDARD",
          "explicitlyShared": false
        }
      }
    }
    operations.push(budgetOperation);

## Campaign

The campaign must reference a budget, so you will need the exact budget resource
name you created in the previous step to identify and use that specific budget
object. Use a [`CampaignOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignOperation). In this
example we also set the [`AiMaxSetting`](https://developers.google.com/google-ads/api/reference/rpc/v26/Campaign.AiMaxSetting) to
enable AI Max for Search, and the
[`NetworkSettings`](https://developers.google.com/google-ads/api/reference/rpc/v26/Campaign.NetworkSettings).

    const campaignOperation = {
      "campaignOperation": {
        "create": {
          "resourceName": `customers/${customerId}/campaigns/${getNextTempId()}`,
          "name": "Search campaign",
          "status": "PAUSED",
          "advertisingChannelType": "SEARCH",
          "campaignBudget": budgetOperation.campaignBudgetOperation.create.resourceName,
          "biddingStrategyType": "MANUAL_CPC",
          "startDate": "20240314",
          "endDate": "20250313",
          "manualCpc": {
            "enhancedCpcEnabled": true
          },
          "aiMaxSetting": {
            "enableAiMax": true
          },
          "networkSettings": {
            "targetGoogleSearch": true,
            "targetSearchNetwork": true
          },
          "containsEuPoliticalAdvertising": "DOES_NOT_CONTAIN_EU_POLITICAL_ADVERTISING"
        }
      }
    }
    operations.push(campaignOperation);

## Ad group

The ad group must reference the previously created campaign, so you will need
the exact resource name you set in the previous step to identify the campaign
previously created in this request. You will also need a temp ID for the ad
group itself, which is best stored as a new variable so it can be used when
creating keywords and ad group ads. Use an
[`AdGroupOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupOperation).

    const adGroupId = getNextTempId();
    const adGroupOperation = {
      "adGroupOperation": {
        "create": {
          "resourceName": `customers/${customerId}/adGroups/${adGroupId}`,
          "name": "Search ad group",
          "status": "PAUSED",
          "campaign": campaignOperation.campaignOperation.create.resourceName,
          "type": "SEARCH_STANDARD"
        }
      }
    }
    operations.push(adGroupOperation);

## Keywords

Keywords are required to trigger your ads on search results. They are added as
criteria to an ad group using
[`AdGroupCriterionOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupCriterionOperation). You need
to reference the ad group created in the previous step.

    const keywordOperation = {
      "adGroupCriterionOperation": {
        "create": {
          "adGroup": adGroupOperation.adGroupOperation.create.resourceName,
          "status": "ENABLED",
          "keyword": {
            "text": "flowers",
            "matchType": "BROAD"
          }
        }
      }
    }
    operations.push(keywordOperation);

## Ad group ad with ad

This step creates an ad group ad, which joins an ad group with an ad. The ad
group ad must reference the ad group, so you will need the exact resource name
you set in the previous step. You can create an ad within the same operation,
and use either previously created text assets or create them within the same
operation as well. The example shown here creates a Responsive Search Ad using
[`ResponsiveSearchAdInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/ResponsiveSearchAdInfo). This requires
text assets for headlines and descriptions to have been created, as shown in the
[Assets](https://developers.google.com/google-ads/scripts/docs/campaigns/search/assets) guide.

To create the ad group ad, use an
[`AdGroupAdOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupAdOperation).

    const adGroupAdOperation = {
      "adGroupAdOperation": {
        "create": {
          "resourceName": `customers/${customerId}/adGroupAds/${adGroupId}~${getNextTempId()}`,
          "adGroup": adGroupOperation.adGroupOperation.create.resourceName,
          "status": "PAUSED",
          "ad": {
            "name": "Search RSA ad",
            "finalUrls": [
              "http://www.example.com"
            ],
            "responsiveSearchAd": {
              "headlines": [
                {
                  "text": textAsset.assetOperation.create.resourceName
                },
                {
                  "text": "Headline 2"
                },
                {
                  "text": "Headline 3"
                }
              ],
              "descriptions": [
                {
                  "text": "Description 1"
                },
                {
                  "text": "Description 2"
                }
              ]
            }
          }
        }
      }
    }
    operations.push(adGroupAdOperation);