Google Ads API で広告出稿 (REST API)

# はじめに
- ここでは、クライアントライブラリではなく、REST APIで使うJsonを書いた説明になります。
- 広告レポート取得の記事は多かったですが、広告を出す方の記事はあまり見なかったので、書くことにしました。
- クライアントライブラリを使うことが推奨されています。が、なんか難しいな、という方はJsonを送信する方が簡単かと思います。クライアントライブラリもクラスにパラメータを渡す感覚なので、Jsonで渡すパラメータを見れば、少しは理解が進むかもしれません。
- [公式ドキュメントはこちら](https://developers.google.com/google-ads/api/rest/overview?hl=ja)

# 事前準備

APIを使うまでに、アカウント作成から開発者トークン取得、Google Cloud APIの登録、認証などありますが、以下を参考にして下さい。

[公式ドキュメント　はじめに](https://developers.google.com/google-ads/api/docs/get-started/introduction?hl=ja)

[【完全入門】Google Ads APIにハマりまくったのでめちゃくちゃ丁寧に説明する](https://qiita.com/navyracooon/items/b1da436318876df50798)

- Googleアカウントは1つでよくて、MCCアカウント(マネージャーアカウント)の下に広告アカウントを作成します。
- テストアカウントの表示がなければ、実際に広告を出せるアカウント(本番用)です。

![q1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492652/8a25ce30-6c17-5558-3a3a-d6aa3acabe5c.png)

- 本番用アカウントにAPIでアクセスするには、申請してアクセス権をベーシックアクセスにしなければなりません。
申請後、2週間くらいで承認されるようですが、遅ければ開発者フォーラムで問い合わせるといいです。（開発者トークンは共通で使えます）

![q2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492652/1265b05e-47a6-4832-322a-2991239ee54f.png)

- テスト用のMCCアカウントの下にも広告アカウントを作成しますが、右上にあるアカウントアイコンをクリックしてもリストには出てきません。
作成したテスト用の広告アカウントは、キャンペーンの概要のアカウントの部分に表示されます。

![q3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492652/f930245b-b0e6-37d2-9fac-9e7a851fc682.png)


# 広告をだすには
- 広告の構造として、キャンペーンの下に広告グループがあり、その下に広告があります。
- 広告の部分はパフォーマンスにより、自動で出し分けされる部分です。ローテーションモードによる。
- 広告グループには、キーワードを設定して、検索にヒットするようにします。
- キャンペーンには、予算と出稿期間を設定します。
- キャンペーンを作成する前に、予算を作成する必要があります。
- 

[公式ドキュメント API構造](https://developers.google.com/google-ads/api/docs/concepts/api-structure?hl=ja)

# Google Ads API Json例
- バージョンは最新のものを使用して下さい。
- 実際に広告管理画面から出稿するとわかりますが、見出しや説明、画像は最大数設定した方が広告の質としては高くなります。
- ここでは、一般的な検索広告を出稿する例を書きます。すべてPOST送信です。
パラメータは様々あり、ここに載せる例は最適ではないかもしれません。
詳しくは公式ドキュメントを参照してください。

:::note info
リクエストヘッダーには、開発者トークン、アクセストークン、MCCアカウントのIDが必要です。
[公式ドキュメント リクエストヘッダー](https://developers.google.com/google-ads/api/rest/auth?hl=ja#developer_token)
:::

```headers.php
$headers = [
            "Content-Type: application/json", 
            "Accept: application/json",
            "Authorization: Bearer ". $access_token, 
            "developer-token: ". $developer_token,
            "login-customer-id: ". $mcc_account_id,
        ];
```


## 予算の作成
公式ドキュメント：[customers.campaignBudgets](https://developers.google.com/google-ads/api/rest/reference/rest/v17/customers.campaignBudgets/mutate?hl=ja)

URL：`https://googleads.googleapis.com/v17/customers/{customerId}/campaignBudgets:mutate`

```budget.json
{
    "operations": [
        {
            "create": {
                "deliveryMethod": "STANDARD",
                "period": "DAILY",
                "name": "予算名",
                "amountMicros": 1000000,
                "explicitlyShared": true
            }
        }
    ],
    "partialFailure": false,
    "validateOnly": false,
    "responseContentType": "MUTABLE_RESOURCE"
}
```
- deliveryMethod：キャンペーン予算の消費率を決定する配信方法。作成操作で指定されていない場合は、デフォルトで STANDARD になる。
- period：指定しない場合デフォルトでDAILYになる。変更不可。CUSTOM_PERIODの場合、totalAmountMicrosは必要。
- amountMicros：100万分の1円で計算される。
- explicitlyShared：キャンペーン間で予算を共有するかどうか。falseの場合1つのキャンペーンでしかこの予算は使えない。


## キャンペーンの作成
公式ドキュメント：[customers.campaigns.mutate](https://developers.google.com/google-ads/api/rest/reference/rest/v17/customers.campaigns/mutate?hl=ja)
URL：`https://googleads.googleapis.com/v17/customers/{customerId}/campaignAssets:mutate`

```campaign.json
{
    "operations": [
        {
            "create": {
                "status": "ENABLED",
                "adServingOptimizationStatus": "UNAVAILABLE",
                "name": "キャンペーン名",
                "campaignBudget": "customers/広告アカウントID/campaignBudgets/予算ID",
                "startDate": "yyyy-mm-dd",
                "endDate": "yyyy-mm-dd",
                "networkSettings": {
                    "targetGoogleSearch": true,
                    "targetSearchNetwork": true,
                    "targetContentNetwork": true
                },
                "manualCpc": {
                    "enhancedCpcEnabled": true
                }
            }
        }
    ],
    "partialFailure": false,
    "validateOnly": false,
    "responseContentType": "MUTABLE_RESOURCE"
}

```
- status : ENABLEDは作成後、審査を通ればそのまま有効になる。
- adServingOptimizationStatus：キャンペーンの最適化ステータス。OPTIMAIZEやROTATEなど。
- campaignBudget：作成した予算のリソース名
- networkSettings：キャンペーンの掲載ネットワークの設定。どこの広告を表示するか。
- manualCpc：キャンペーンの入札戦略の1つ。標準の個別クリック単価入札戦略。ユーザーがクリックごとに支払う、個別クリックベースの入札。いろいろあるがどれか1つ選ぶ。
- partialFailure：続けて実行する場合、トランザクションでの判定にするかどうか。
- validateOnly：バリデーションのみか、実行か。
- responseContentType：レスポンスに変更可能なフィールドを含めるかどうか。

## 広告グループの作成
公式ドキュメント：[customers.adGroups.mutate](https://developers.google.com/google-ads/api/rest/reference/rest/v17/customers.adGroups/mutate?hl=ja)

URL：`https://googleads.googleapis.com/v17/customers/{customerId}/adGroups:mutate`

```adGroups.json
{
    "operations": [
        {
            "create": {
                "status": "ENABLED",
                "type": "SEARCH_STANDARD",
                "adRotationMode": "OPTIMIZE",
                "name": "広告グループ名",
                "campaign": "customers/広告アカウントID/campaigns/キャンペーンID"
            }
        }
    ],
    "partialFailure": false,
    "validateOnly": false,
    "responseContentType": "MUTABLE_RESOURCE"
}
```

- type：検索キャンペーンならSEARCH_STANDARD。ほかにディスプレイキャンペーンやホテルキャンペーンのタイプがある。
- adRotationMode：広告ローテーション。クリック数やコンバージョン数に基づいて最適化するか、常に均等にローテーションするか。
- campaign：キャンペーンを作成した時にレスポンスで返されるリソース名


## 広告作成
公式ドキュメント：[customers.adGroupAds.mutate](https://developers.google.com/google-ads/api/rest/reference/rest/v17/customers.adGroupAds/mutate)

URL：`https://googleads.googleapis.com/v17/customers/{customerId}/adGroupAds:mutate`


```adGroupAd.json
{
    "operations": [
        {
            "create": {
                "status": "ENABLED",
                "ad": {
                    "finalUrls": [
                        "最終URL"
                    ],
                    "devicePreference": "UNSPECIFIED",
                    "name": "広告名",
                    "responsiveSearchAd": {
                        "headlines": [
                            {
                                "pinnedField": "HEADLINE_1",
                                "text": "見出し１"
                            },
                            {
                                "pinnedField": "HEADLINE_2",
                                "text": "見出し２"
                            },
                            {
                                "pinnedField": "HEADLINE_3",
                                "text": "見出し３"
                            }
                        ],
                        "descriptions": [
                            {
                                "pinnedField": "DESCRIPTION_1",
                                "text": "説明１"
                            },
                            {
                                "pinnedField": "DESCRIPTION_2",
                                "text": "説明２"
                            }
                        ],
                        "path1": "表示したいURLのほかのパス",
                        "path2": "例えば、/contactとか"
                    }
                },
                "adGroup": "customers/広告アカウントID/adGroups/広告グループID"
            }
        }
    ],
    "partialFailure": false,
    "validateOnly": false,
    "responseContentType": "MUTABLE_RESOURCE"
}

```

- devicePreference：指定しなければ、すべてのデバイスがターゲットになる。MOBILEにすれば、モバイルデバイスでほかの広告より優先される。なくてもいい。
- headlines：見出し。配列にして最大15個設定できる。
- descriptions：説明。最大4つ設定できる。
- path1：なくてもいい。最終URLに続くパス。
- adGroup：広告グループを作成した時のレスポンスにあるリソース名。

以上で広告は出せるが、検索広告なので検索キーワードが必要になる。

## キーワード作成
公式ドキュメント：[customers.adGroupCriteria.mutate](https://developers.google.com/google-ads/api/rest/reference/rest/v17/customers.adGroupCriteria/mutate)

URL：https://googleads.googleapis.com/v17/customers/{customerId}/adGroupCriteria:mutate

Criteria：条件とか基準とかって意味
このcriteriaでは、広告配置やターゲットなども設定できる。
キャンペーンにもCriteriaはあるが、キーワードは広告グループレベルで設定するのが一般的かと。

```setKeyword.json
{
    "operations": [
        {
            "create": {
                "status": "ENABLED",
                "negative": false,
                "adGroup": "customers/広告アカウントID/adGroups/広告グループID",
                "keyword": {
                    "text": "キーワード１ キーワード1－2",
                    "matchType": "BROAD"
                }
            }
        },
        {
            "create": {
                "status": "ENABLED",
                "negative": false,
                "campaign": "customers/広告アカウントID/adGroups/広告グループID",
                "keyword": {
                    "text": "キーワード２ キーワード2－2",
                    "matchType": "PHRASE"
                }
            }
        }
    ],
    "partialFailure": false,
    "validateOnly": false,
    "responseContentType": "MUTABLE_RESOURCE"
}

```
配列として、create部分をつなげれば、1度にいくつも設定できる。
matchType：BROAD：部分一致、PHRASE：フレーズ一致
最初は部分一致で様子を見るのがいい。
text：最大80文字、10単語まで登録可能。



以上です。

ほかに、MetaとTikTok広告のAPIについてもブログで書く予定です。
Googleのディスプレイ広告についても、書きます。
よろしくお願いします。[ブログ TikTok広告API](https://weekend-v.work/archives/827)