API Simulasi RTB TURTLEDOVE

Sebagai bagian dari Privacy Sandbox, Chrome mengusulkan TURTLEDOVE—API dalam browser yang bertujuan untuk memungkinkan pengiklan dan perusahaan teknologi iklan menampilkan iklan yang ditargetkan grup minat tanpa mengandalkan cookie pihak ketiga, sehingga melindungi pengguna dari pelacakan lintas situs. Sebelum Chrome menerapkan TURTLEDOVE, tim Google RTB menawarkan simulasi TURTLEDOVE API sisi server yang memungkinkan partner RTB-nya (partner Resmi dan Bidding Terbuka) bereksperimen dengan API. Simulasi ini memungkinkan partner dan Google mempelajari keefektifan alur bergaya TURTLEDOVE, menghasilkan masukan yang relevan tentang potensi peningkatan API di forum publik, dan memudahkan transisi untuk mendukung iklan yang dipersonalisasi tanpa mengandalkan cookie pihak ketiga.

Pada fase pertama simulasi, bidder menghosting keanggotaan grup minat. Bidder juga menyediakan fungsi bidding ke Google terlebih dahulu melalui API. Pada waktu penayangan, Google membagi setiap permintaan bid dalam cakupan untuk simulasi menjadi dua permintaan: permintaan kontekstual dan permintaan berbasis minat. Permintaan kontekstual akan serupa dengan permintaan bid saat ini, tetapi tanpa ID pengguna (seperti kolom google_user_id dan hosted_match_data) yang tersedia. Permintaan grup minat tidak berisi informasi kontekstual apa pun dan hanya berisi kolom pengidentifikasi pengguna (tunduk pada kontrol privasi yang ada). Bid grup minat tidak berisi nilai CPM, tetapi merujuk ke fungsi bidding yang Google menjalankan sisi server pada lingkungan dengan sandbox. Lelang berjalan normal dengan bid kontekstual dan bid yang dihitung oleh fungsi bidding.

Selama fase pertama simulasi, Google akan mengirimkan ID pengguna pseudonim pada permintaan berbasis minat. Tujuannya adalah untuk meminimalkan pekerjaan penerapan di kedua sisi sehingga kami dapat memulai eksperimen lebih cepat. Tidak ada ID pengguna dalam permintaan berbasis minat akan tunduk pada perlindungan dan kontrol privasi yang ada (seperti ketika pengguna memilih tidak mengikuti iklan yang dipersonalisasi).

Alur

diagram alir

  1. Bidder RTB bekerja sama dengan pengiklan untuk membuat, mempertahankan, dan menghosting grup minat untuk setiap pengiklan dan keanggotaan pengguna dalam grup minat tersebut.
  2. Saat pengguna mengunjungi halaman web penayang, browser pengguna akan mendownload tag iklan Google. Browser pengguna meminta iklan dari platform penayang Google.
  3. Bidder RTB menyediakan satu atau beberapa fungsi bidding (sebagai fungsi JavaScript) sebelum waktunya ke Google. (Lihat bagian: Fungsi bidding).
  4. Untuk sebagian kecil permintaan dalam cakupan eksperimen, Google akan mengirimkan permintaan bid kontekstual dan permintaan bid berbasis minat terpisah kepada setiap bidder yang berpartisipasi dalam eksperimen (Lihat bagian: Permintaan bid).
  5. Bidder menggunakan ID pengguna pseudonim yang tersedia di permintaan bid grup minat dan memetakannya ke grup minat yang sesuai. Bidder RTB akan menampilkan respons bid kontekstual dan respons bid berbasis minat (Lihat bagian: Respons bid).
    1. Respons bid kontekstual akan mirip dengan respons bid saat ini dengan bid nol atau yang lebih kontekstual; selain itu, respons bid kontekstual dapat memberikan sinyal kontekstual kustom bidder yang akan diberikan ke fungsi bidding sebagai input.
    2. Respons bid berbasis minat tidak akan menentukan bid, tetapi akan menentukan nama fungsi bidding. Google akan menjalankan fungsi bidding untuk mendapatkan bid.
  6. Google menjalankan lelang sisi server dengan kandidat berikut:

    1. Bid dari respons kontekstual.
    2. Bid dari respons grup minat dengan harga bid yang dihitung dengan menjalankan fungsi bidding.
    3. Bid reguler dari bidder lain.

    Perhatikan bahwa ini adalah lelang yang sama seperti hari ini.

  7. Google menampilkan iklan pemenang ke browser pengguna, yang akan dirender secara normal.

Fungsi bidding

Fungsi bidding adalah fungsi yang disediakan oleh bidder yang akan menampilkan nilai bid untuk iklan berbasis grup minat tertentu dan slot iklan . Dalam proposal TURTLEDOVE asli, fungsi ini akan disimpan di browser pengguna. Dalam simulasi ini, bidder akan mengupload Fungsi Bidding ke Google menggunakan API sebelum penayangan iklan. Selama penayangan iklan, respons Grup Minat akan menentukan nama fungsi bidding. Google akan menjalankan fungsi bidding tersebut di lingkungan sandbox untuk mendapatkan nilai bid. Nilai bid berbasis minat ini akan memasuki lelang yang sama dengan bid kontekstual.

Antarmuka fungsi bidding

Fungsi bidding harus berupa fungsi bebas efek samping murni yang diterapkan di JavaScript yang akan dijalankan di sandbox yang disediakan oleh bursa. Fungsi bidding tidak memiliki akses ke jaringan, penyimpanan, atau bentuk I/O lainnya dan tidak dapat mempertahankan status apa pun di antara pemanggilan untuk permintaan bid yang berbeda. Fungsi bidding menghitung dan menampilkan CPM harga bid untuk kandidat iklan tertentu secara algoritmis berdasarkan kombinasi data kontekstual dan data grup minat.

Fungsi bidding harus menerima dan berjalan dengan objek kosong sebagai parameter inputnya. Input kosong diberikan ke fungsi bidding selama inisialisasi satu kali. Pada waktu inisialisasi, snapshot fungsi bidding dibuat dan dipanggil beberapa kali untuk memungkinkan compiler JIT (tepat waktu) mengoptimalkan hot spot dalam kode.

/**
 * Returns a bid price CPM for a given ad candidate.
 *
 * @param {Object} inputs an object with the
 *                 following named fields:
 *                   - openrtbContextualBidRequest or googleContextualBidRequest
 *                   - customContextualSignal
 *                   - interestBasedBidData
 */
function biddingFunction(inputs) {
  ...
  return inputs.interestBasedBidData.cpm
      * inputs.customContextualSignals.placementMultiplier;
}

Kolom bernama di Argumen objek inputs mencakup (dapat berubah saat eksperimen berlangsung):

openrtbContextualBidRequest (Objek JS) Permintaan bid kontekstual dalam protokol OpenRTB. Bidder yang menggunakan protokol RTB Authorized Buyers harus mengabaikan input ini dan tidak boleh menggunakannya dalam fungsi bidding.
googleContextualBidRequest (Objek JS) Permintaan bid kontekstual dalam protokol Authorized Buyers Google. Bidder yang menggunakan protokol OpenRTB harus mengabaikan input ini dan tidak boleh menggunakannya dalam fungsi bidding.
customContextualSignal (Objek JS) Data kustom yang disediakan oleh bidder dalam respons bid kontekstual. Bidder menentukan formatnya.
interestBasedBidData (Objek JS) Data kustom yang disediakan oleh bidder dalam respons bid grup minat. Bidder menentukan formatnya.

Mengelola fungsi bidding melalui API

Resource API eksperimental ini memungkinkan bidder mengupload fungsi bidding ke Google dan mengelola fungsi ini.

Endpoint Layanan Dasar: https://realtimebidding.googleapis.com

Resource: Fungsi bidding

{
  "name": string,
  "biddingFunction": string
}

Kolom, name, mewakili nama fungsi bidding, harus mengikuti format: bidders/{bidderAccountId}/biddingFunctions/{biddingFunctionName}, dengan biddingFunctionName dipilih oleh bidder.

Kolom biddingFunction adalah kode sumber JavaScript dari fungsi bidding, dengan persyaratan berikut:

  • Ukuran < 5 MiB.
  • Mengikuti persyaratan Antarmuka fungsi bidding.
  • Harus mendukung eksekusi tanpa input apa pun selama pembuatan awal di sandbox.

Contoh:

{
  "name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
  "biddingFunction": "(function(inputs) {return 1.23;})"
}

Membuat fungsi bidding

Fungsi bidding akan tersedia untuk digunakan dalam respons grup minat dalam waktu sekitar satu jam setelah panggilan CreateBiddingFunction API yang berhasil.

POST https://realtimebidding.googleapis.com/v1alpha/{parent=bidders/*}/biddingFunctions
Parameter jalur
parent String dalam format bidders/{bidderAccountId}
Body: Fungsi bidding yang akan dibuat
{
  "name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
  "biddingFunction": "(function(inputs) {return 1.23;})"
}
Respons (fungsi bidding)
{
  "name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
  "biddingFunction": "(function(inputs) {return 1.23;};)"
}

Mencantumkan fungsi bidding yang ada

GET https://realtimebidding.googleapis.com/v1alpha/bidders/{bidderAccountId}/biddingFunctions
Parameter jalur
parent String dalam format bidders/{bidderAccountId}.
Parameter kueri
pageToken Token string yang mengidentifikasi halaman hasil yang harus ditampilkan server. Nilai ini diterima dari respons panggilan ListBiddingFunctions sebelumnya, jika hasilnya tidak sesuai di satu halaman.
Tanggapan
{
  "biddingFunctions": [
    {
      object (BiddingFunction)
    }
  ],
  "nextPageToken": string
}
Contoh panggilan
GET https://realtimebidding.googleapis.com/v1alpha/bidders/123456789/biddingFunctions

Perubahan protokol RTB simulasi TURTLEDOVE

Protokol RTB Authorized Buyers

Permintaan bid

Permintaan bid kontekstual dalam eksperimen akan terlihat sama seperti permintaan bid konvensional, tetapi dengan ID pengguna pseudonim disamarkan.

// All fields will be filled unless otherwise specified.
message BidRequest {
  // Fields below would not be populated in the experiment
  optional string google_user_id = ...;
  optional uint32 cookie_version = ...;
  optional int32 cookie_age_seconds = ...;
  optional bytes hosted_match_data = ...;
  optional string session_id = ...;

  // Contextual fields below will be populated
  optional string publisher_id = ...;
  optional string url = ...;
  ...
  message Mobile {
    // Device advertising identifiers below would not be populated
    // in the contextual requests in the experiment
    optional bytes encrypted_advertising_id = ...;
    optional bytes advertising_id = ...;
    ...
    optional bytes encrypted_hashed_idfa = ...;
    optional bytes hashed_idfa = ...;
    ...
  }
  ...
  message AdSlot {
    message MatchingAdData {
      repeated int64 billing_id = ...;
      ...
    }
    ...
  }
  repeated AdSlot adslot = ...;
  ...
}

Contoh:

{
  id: "_\321\326\000\n\301\207\n\323\n\227",
  ip: "S\030\347",
  user_agent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
  publisher_country: "RU",
  geo_criteria_id: 9061060,
   adslot: [{
    id: 1,
    ad_block_key: 3613182520,
    width:   [240,200,120],
    height:   [400,200,240],
    matching_ad_data:   [{
      billing_id:     [923487589],
      minimum_cpm_micros: 850000
    }]
  }]
}

Permintaan berbasis minat dalam eksperimen ini akan berisi ID pengguna pseudonim konvensional, yang tunduk pada semua perlindungan dan kontrol privasi yang ada, tetapi tidak akan berisi informasi kontekstual (URL halaman, ID penayang, dll.).

// Most fields would not be populated in the experiment unless otherwise specified.
message BidRequest {
   // Will be provided, subject to the existing privacy controls.
  optional string google_user_id = ...;
  optional uint32 cookie_version = ...;
  optional int32 cookie_age_seconds = ...;
  optional bytes hosted_match_data = ...;

  message AdSlot {
    // Will be filled.
    repeated int32 width = ...;
    repeated int32 height = ...;
    optional ConsentedProvidersSettings consented_providers_settings = ...;
    optional bool regs_gdpr = ...;
    optional bool regs_lgpd = ...;

    message MatchingAdData {
      // Will be filled.
      repeated int64 billing_id = ...;
      ...
    }
    ...
  }
  repeated AdSlot adslot = ...;
  ...
}

Contoh:

id: "_\322\207\000\003\320\n\031\177C\307\215\035"
adslot {
  id: 1
  width: 1200
  height: 60
  consented_providers_settings {
    consented_providers: 292
    tcf_consent_string: "CO-eDrRO-eDrREkAAAAAAAAeYwf95y3p-wzhheMCY70-vv__7v3ff_3g"
  }
  regs_gdpr: true
  matching_ad_data {
    billing_id: 9833784997
  }
}
google_user_id: "ABCDEF1"
hosted_match_data: "ABCABCABC2"

Respons bid

Respons bid kontekstual dapat berisi data kontekstual kustom khusus bidder dalam format arbitrer yang akan diteruskan ke fungsi bidding nanti.

message BidResponse {
  message Ad {
    message AdSlot {
      required int64 max_cpm_micros = ...;
      ...
    }
    repeated AdSlot adslot = ...;
    ...
  }
  repeated Ad ad = ...;
  // Contains contextual signals that will be passed to the bidding function.
  // This can be any JSON value. For example:
  // {"foo": "bar", "base": [1, 2, 3]}
  optional google.protobuf.Value custom_contextual_signal = ...;

  ...
}

Misalnya,

ad {
  html_snippet: "<iframe src=\"http://example.com/something" width=\"300\" height=\"250\" scrolling=\"no\" frameBorder=\"0\" ></iframe>"
  adslot {
    id: 1
    max_cpm_micros: 100000
    billing_id: 1234567890
  }
  click_through_url: "https://www.example.com.pl"
  attribute: 47
  buyer_creative_id: "FFI399F3HI9HFH"
  width: 300
  height: 250
  impression_tracking_url: "http://example.com/impression"
}
custom_contextual_signal {
 struct_value {
   fields {
     name: "string_data_name"
     value {
       string_value: "string_value_1"
     }
   }
   fields {
     name: "bool_data_name"
     value {
       bool_value: true
     }
   }
 }
}
processing_time_ms: 1

Bid berbasis grup minat

Setiap bid dalam respons bid grup minat akan berisi referensi ke fungsi bidding berdasarkan namanya. Fungsi bidding akan disediakan oleh bidder terlebih dahulu.

// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
message BidResponse {
  // Ad HTML code that will be rendered normally upon winning.
  optional string html_snippet = ...;

  message Ad {
    message AdSlot {
      // Should not be populated for interest group-based bids.
      required int64 max_cpm_micros = ...;
      ...
    }
    repeated AdSlot adslot = ...;

    // Will be filled.
    // This is the bidding function name that references a bidding function
    // that is provided ahead of time through Bidding functions API resource.
    optional string bidding_function_name = ...;

    // Contains interest group-related data that will be passed
    // to the bidding function. This can be any JSON value.
    optional google.protobuf.Value interest_group_data = ...;
    ...
  }
  repeated Ad ad = ...;
  ...
}

Contoh:

ad {
  html_snippet: "<iframe src=\"http://example.com/something" width=\"300\" height=\"250\" scrolling=\"no\" frameBorder=\"0\" ></iframe>"
  adslot {
    id: 1
    max_cpm_micros: 0
    billing_id: 1234567890
    bidding_function_name: "bidders/123/biddingFunctions/my_bidding_function_1"
    interest_group_data {
      struct_value {
        fields {
          name: "string_data_name"
          value {
            string_value: "string_value_1"
          }
        }
        fields {
          name: "bool_data_name"
          value {
            bool_value: true
          }
        }
      }
    }
  }
  click_through_url: "https://www.example.com.pl"
  attribute: 47
  buyer_creative_id: "FFI399F3HI9HFH"
  width: 300
  height: 250
  impression_tracking_url: "http://example.com/impression"
}
processing_time_ms: 1

OpenRTB

Permintaan bid

Permintaan kontekstual (di JSON)
// All fields will be filled unless otherwise specified.
{
  // Fields below would not be populated in the experiment
  "user": {...}

  "device": {
    // Fields below would not be populated in the experiment
    "ifa": ...
    "dpidsha1": ...
    "dpidmd5": ...


    // Other fields will not be affected by the experiment
    ...
  }

  // Other fields will not be affected by the experiment
  ...
}
Permintaan berbasis minat (di JSON)
// Most fields would not be populated in the experiment unless otherwise specified.
{
  // Will be provided, subject to the existing privacy controls.
  "user": {
    "id": "BFEUKH3"
    "buyeruid": "FEI3F3I29"
    "ext": {
      "consented_providers": [ 292 ]
      "tcf_consent_string": "CO-eDrRO-eDrREkAAilsbO2dYGD9Pn8HT3ZCY70-vv__7v3ff_3g"
    }
  }

  "imp": {
    // Will be provided, subject to the existing privacy controls.
    "banner": {
      "w": ...
      "h": ...
    }

    "ext": {
      // Will be provided, subject to the existing privacy controls.
      "billing_id": [...]

      // Other fields will not be provided by the experiment
      ...
    }
  }
}

Respons bid

Respons bid kontekstual dapat berisi data kontekstual kustom khusus bidder yang akan diteruskan ke fungsi bidding nanti.

// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
{
  ...
  "seatbid": [{
     "bid": [...],
     ...
  }],
  ...
  "ext": {
    // Contains contextual signals that will be passed to the bidding function.
    // This signal can be any JSON blob. For example:
    // {"foo", "bar", "base": [1, 2, 3]}
    "custom_contextual_signal": ...
  }
}

Respons bid berbasis grup minat

Setiap bid dalam respons bid grup minat akan berisi referensi ke fungsi bidding berdasarkan namanya. Fungsi bidding akan disediakan oleh bidder terlebih dahulu.

// All fields should be filled by a bidder as discussed in
// https://developers.google.com/authorized-buyers/rtb/response-guide
// unless otherwise specified.
{
  "bid": [{
       "id": ...
       ...
       "ext": {
         // This is the bidding function name that references a bidding function
         // that is provided ahead of time through Bidding functions API resource.
         "bidding_function_name": ...

         // Contains interest group related data that will be passed to the
         // bidding function.
         // This signal can be any JSON blob. For example:
         // {"foo", "bar", "base": [1, 2, 3]}
         "interest_group_data": ...
       }
    }
    ...
  ]
}