GMOアドマーケティングのT.Nです。
弊社が提供しているDSPのReeMoでは、
2018年のサービス開始から約3年間、GMO SSPへの入札に注力してきましたが、
今年から外部SSPへの入札にも注力するようになりました。
その中の一つにGoogleのAuthorized Buyersがあるのですが、
Authorized Buyersでは新しいクリエイティブで入札した際に、
しばらくの間クリエイティブの審査期間があり、
審査を通過した場合に落札できるようになります。
不承認になったクリエイティブで入札しても落札できないため、
該当するクリエイティブの情報をAPIで取得しておき、
入札しないようにする必要があります。
今回は不承認になったクリエイティブを取得するためのAPIの使用方法をまとめました。
弊社ではJavaを使用することが多いので、Javaでの実装方法をまとめています。
記事の内容は2022年4月時点での仕様に基づいています。
Authorized Buyersのポリシーについて
Authorized Buyersには以下の遵守すべきポリシーがあります。
- dealsPolicyCompliance
- networkPolicyCompliance
- platformPolicyCompliance
- russiaPolicyCompliance
- chinaPolicyCompliance
上の三つが中国とロシア以外に適用されるポリシーで、中国とロシアは個別にポリシーがあるようです。
弊社は主に日本を対象にして入札しているため、
上の三つのいずれかのポリシーで不承認になっているクリエイティブを取得条件にしました。
取得できるデータは、過去7日間の入札データのようです。
サンプルコード
GitHubのサンプルコードを参考にして実装しました。
クリエイティブ情報の取得にはgoogle-api-services-realtimebiddingというライブラリを使用しています。
GCPの認証情報を使用する場合は事前にReal-time Bidding APIを有効にしておく必要があります。
Gradleの設定
1 2 3 4 5 6 7 8 |
// https://mvnrepository.com/artifact/com.google.apis/google-api-services-realtimebidding implementation group: 'com.google.apis', name: 'google-api-services-realtimebidding', version: 'v1-rev20220319-1.32.1' // https://mvnrepository.com/artifact/com.google.auth/google-auth-library-oauth2-http implementation group: 'com.google.auth', name: 'google-auth-library-oauth2-http', version: '1.6.0' // https://mvnrepository.com/artifact/com.google.code.gson/gson implementation group: 'com.google.code.gson', name: 'gson', version: '2.9.0' |
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package com.example.reemo; import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.realtimebidding.v1.RealTimeBidding; import com.google.api.services.realtimebidding.v1.model.Creative; import com.google.api.services.realtimebidding.v1.model.ListCreativesResponse; import com.google.auth.http.HttpCredentialsAdapter; import com.google.auth.oauth2.GoogleCredentials; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.List; public class AuthorizedBuyersCreativeListTask { // User-Agentに含めるアプリケーション名を指定する private static final String APPLICATION_NAME = "*****"; private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance(); // アカウントIDを指定する private static final String PARENT = "buyers/*********"; // 検索条件を指定する private static final String FILTER = """ creativeServingDecision.dealsPolicyCompliance.status = DISAPPROVED OR creativeServingDecision.networkPolicyCompliance.status = DISAPPROVED OR creativeServingDecision.platformPolicyCompliance.status = DISAPPROVED """; // GCPの認証ファイルのパスを指定する private static final String CREDENTIAL_FILE_PATH = "/credential.json"; public static void main(String... args) throws IOException, GeneralSecurityException { RealTimeBidding realTimeBidding = createRealTimeBidding(); if (realTimeBidding == null) { System.out.println("Failed to create RealTimeBidding."); return; } ListCreativesResponse creativesResponse = realTimeBidding.buyers() .creatives() .list(PARENT) .setFilter(FILTER) .execute(); List<Creative> creatives = creativesResponse.getCreatives(); System.out.println(creatives); } private static RealTimeBidding createRealTimeBidding() throws IOException, GeneralSecurityException { GoogleCredentials credentials = authorize(); if (credentials == null) { return null; } HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials); return new RealTimeBidding.Builder(httpTransport, JSON_FACTORY, requestInitializer) .setApplicationName(APPLICATION_NAME) .build(); } private static GoogleCredentials authorize() throws IOException { try (var stream = AuthorizedBuyersCreativeListTask.class.getResourceAsStream(CREDENTIAL_FILE_PATH)) { if (stream != null) { return GoogleCredentials.fromStream(stream); } } return null; } } |
setFilterに渡す文字列で、取得するデータの条件を指定できます。
今回は以下のいずれかがDISAPPROVEDであるという条件を指定しました。
- creativeServingDecision.dealsPolicyCompliance.status
- creativeServingDecision.networkPolicyCompliance.status
- creativeServingDecision.platformPolicyCompliance.status
また、今回はデータを全件取得していますが、データの取得件数を指定することもできます。
詳細な仕様はAuthorized Buyersのドキュメントに記載されています。
まとめ
Authorized Buyersのクリエイティブ情報をAPIで取得する方法を紹介しました。
今回はクリエイティブ情報の取得だけを行いましたが、
APIではプレターゲティングの設定など、他の操作も行うことができます。
今後もAPIを活用しながら、Authorized Buyersへの入札を増やしていけると良いです。