API การจําลอง RTB ของ TURTLEDOVE

ในฐานะส่วนหนึ่งของ Privacy Sandbox ที่ Chrome เสนอ TURTLEDOVE ซึ่งเป็น API ในเบราว์เซอร์ที่มุ่งให้ผู้ลงโฆษณาและบริษัทเทคโนโลยีโฆษณาแสดงโฆษณาที่กําหนดกลุ่มเป้าหมายตามความสนใจได้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม เพื่อปกป้องผู้ใช้จากการติดตามข้ามเว็บไซต์ ก่อนที่ Chrome จะใช้ TURTLEDOVE ทีม Google RTB ก็มีการจําลอง TURTLEDOVE API ฝั่งเซิร์ฟเวอร์ที่อนุญาตให้พาร์ทเนอร์ RTB ของตน (พาร์ทเนอร์ Authorized Buyers และการเสนอราคาแบบเปิด) ทําการทดสอบกับ API ได้ การจําลองช่วยให้พาร์ทเนอร์และ Google ได้เรียนรู้เกี่ยวกับประสิทธิภาพของรูปแบบสไตล์ TURTLEDOVE เพื่อสร้างความคิดเห็นที่เกี่ยวข้องเกี่ยวกับการปรับปรุง API ที่เป็นไปได้ในฟอรัมสาธารณะ และช่วยลดความซับซ้อนของการเปลี่ยนไปใช้การสนับสนุนโฆษณาที่ปรับตามโปรไฟล์ของผู้ใช้โดยไม่ต้องอาศัยคุกกี้ของบุคคลที่สาม

ในช่วงแรกของการจําลอง ผู้เสนอราคาจะโฮสต์การเป็นสมาชิกกลุ่มความสนใจ ผู้เสนอราคายังเสนอฟังก์ชันการเสนอราคาให้ Google ล่วงหน้าผ่าน API อีกด้วย ในขณะที่ Google แยกคําขอราคาเสนอแต่ละรายการออกเป็นขอบเขตในการจําลองออกเป็น 2 คําขอ ได้แก่ คําขอตามบริบทและคําขอตามความสนใจ คําขอตามบริบทจะคล้ายกับคําขอราคาเสนอปัจจุบัน แต่ไม่มีตัวระบุผู้ใช้ (เช่น google_user_id,hosted_match_data ช่อง) คําขอของกลุ่มความสนใจไม่มีข้อมูลบริบทและมีเพียงช่องที่ระบุผู้ใช้ (ขึ้นอยู่กับการควบคุมความเป็นส่วนตัวที่มีอยู่) ราคาเสนอของกลุ่มความสนใจไม่มีค่า CPM แต่อ้างอิงฟังก์ชันการเสนอราคาที่ Google เรียกใช้ฝั่งเซิร์ฟเวอร์ในสภาพแวดล้อมแซนด์บ็อกซ์ การประมูลจะทํางานตามปกติโดยมีราคาเสนอตามบริบทและราคาเสนอที่คํานวณจากฟังก์ชันการเสนอราคา

ในช่วงแรกของการจําลอง Google จะส่ง User-ID ที่ระบุตัวบุคคลไม่ได้ในคําขอตามความสนใจ วัตถุประสงค์คือการลดการดําเนินการทั้ง 2 ฝั่งเพื่อให้เราสามารถเริ่มการทดสอบได้เร็วขึ้น การมีอยู่ของตัวระบุผู้ใช้ในคําขอตามความสนใจจะขึ้นอยู่กับการคุ้มครองความเป็นส่วนตัวและการควบคุมที่มีอยู่ (เช่น เมื่อผู้ใช้เลือกไม่ใช้โฆษณาที่ปรับตามโปรไฟล์ของผู้ใช้)

น้ำไหล

โฟลว์ชาร์ต

  1. ผู้เสนอราคา RTB ทํางานร่วมกับผู้ลงโฆษณาเพื่อสร้าง รักษา และโฮสต์กลุ่มความสนใจของผู้ลงโฆษณาและการเป็นสมาชิกของผู้ใช้แต่ละรายในกลุ่มความสนใจเหล่านั้น
  2. เมื่อผู้ใช้เข้าชมหน้าเว็บของผู้เผยแพร่โฆษณา เบราว์เซอร์ของผู้ใช้จะดาวน์โหลดแท็กโฆษณาของ Google เบราว์เซอร์ของผู้ใช้จะขอโฆษณาจากแพลตฟอร์มผู้เผยแพร่โฆษณาของ Google
  3. ผู้เสนอราคา RTB มีฟังก์ชันการเสนอราคาอย่างน้อย 1 รายการ (เป็นฟังก์ชัน JavaScript) ให้ Google ทราบล่วงหน้า (ดูส่วนฟังก์ชันการเสนอราคา)
  4. สําหรับส่วนน้อยของคําขอในขอบเขตการทดสอบ Google จะส่งคําขอราคาเสนอตามบริบทและคําขอราคาเสนอตามความสนใจไปยังผู้เสนอราคาที่เข้าร่วมการทดสอบแต่ละราย (ดูส่วนคําขอราคาเสนอ)
  5. ผู้เสนอราคาใช้รหัสผู้ใช้ที่ระบุตัวบุคคลไม่ได้ซึ่งมีอยู่ในคําขอราคาเสนอของกลุ่มความสนใจและแมปกับกลุ่มความสนใจที่เกี่ยวข้อง ผู้เสนอราคา RTB จะแสดงการเสนอราคาตอบตามบริบทและการเสนอราคาตอบตามความสนใจ (ดูส่วน: การเสนอราคาตอบ)
    1. การเสนอราคาตอบตามบริบทจะคล้ายกับการเสนอราคาตอบของวันนี้ที่มีราคาเสนอตามบริบทอย่างน้อย 0 ขึ้นไป นอกจากนี้ การเสนอราคาตอบตามบริบทอาจมีสัญญาณบริบทที่กําหนดเองของผู้เสนอราคา ซึ่งจะมอบให้แก่ฟังก์ชันการเสนอราคาเป็นอินพุต
    2. การเสนอราคาตอบตามความสนใจจะไม่ระบุราคาเสนอ แต่ระบุชื่อฟังก์ชันการเสนอราคา Google จะเรียกใช้ฟังก์ชันการเสนอราคาเพื่อเสนอราคา
  6. Google เรียกใช้การประมูลฝั่งเซิร์ฟเวอร์โดยมีผู้สมัครต่อไปนี้

    1. ราคาเสนอจากการตอบกลับตามบริบท
    2. ราคาเสนอจากการตอบสนองของกลุ่มความสนใจด้วยราคาเสนอที่คํานวณโดยการเรียกใช้ฟังก์ชันการเสนอราคา
    3. ราคาเสนอปกติจากผู้เสนอราคารายอื่นๆ

    โปรดทราบว่านี่เป็นการประมูลเดียวกันกับวันนี้

  7. Google ส่งโฆษณาที่ชนะกลับไปยังเบราว์เซอร์ของผู้ใช้ ซึ่งจะแสดงผลตามปกติ

ฟังก์ชันการเสนอราคา

ฟังก์ชันการเสนอราคาเป็นฟังก์ชันจากผู้เสนอราคาซึ่งจะแสดงผลค่าราคาเสนอของโฆษณาตามความสนใจ และช่องโฆษณาที่กําหนด ในข้อเสนอ TURTLEDOVE เดิม ระบบจะจัดเก็บฟังก์ชันนี้ไว้ในเบราว์เซอร์ของผู้ใช้ ในการจําลองนี้ ผู้เสนอราคาจะอัปโหลดฟังก์ชันการเสนอราคาไปยัง Google โดยใช้ API ก่อนการแสดงโฆษณา ในระหว่างการแสดงโฆษณา การตอบสนองของกลุ่มความสนใจจะระบุชื่อฟังก์ชันการเสนอราคา Google จะใช้ฟังก์ชันการเสนอราคานั้นในสภาพแวดล้อมแซนด์บ็อกซ์เพื่อรับมูลค่าราคาเสนอ มูลค่าราคาเสนอตามความสนใจนี้จะเข้าสู่การประมูลเดียวกับการเสนอราคาตามบริบท

อินเทอร์เฟซฟังก์ชันการเสนอราคา

ฟังก์ชันการเสนอราคาควรเป็นฟังก์ชันฟรีเอฟเฟกต์เพียงอย่างเดียวซึ่งติดตั้งใช้งานใน JavaScript ซึ่งจะเรียกใช้ในแซนด์บ็อกซ์ที่ได้รับจาก Exchange ฟังก์ชันการเสนอราคาไม่มีสิทธิ์เข้าถึงเครือข่าย พื้นที่เก็บข้อมูล หรือไฟล์ I/O รูปแบบอื่นๆ และจะไม่สามารถคงสถานะใดๆ ระหว่างการเรียกใช้คําขอราคาเสนอได้ ฟังก์ชันการเสนอราคาจะคํานวณและแสดงผล CPM ราคาเสนอของตัวเลือกโฆษณาหนึ่งๆ ตามอัลกอริทึม โดยอิงตามชุดค่าผสมของข้อมูลบริบทและข้อมูลความสนใจ

ฟังก์ชันการเสนอราคาต้องยอมรับและเรียกใช้ด้วยออบเจ็กต์ว่างเป็นพารามิเตอร์อินพุต อินพุตว่างมีให้สําหรับฟังก์ชันการเสนอราคาระหว่างการเริ่มต้นแบบครั้งเดียว ในช่วงเริ่มต้น ระบบจะสร้างสแนปชอตของฟังก์ชันการเสนอราคาและเรียกใช้ภายใน 2-3 ครั้งเพื่อให้คอมไพเลอร์ JIT (แบบทันท่วงที) เพิ่มประสิทธิภาพฮอตสปอตในโค้ด

/**
 * 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;
}

ช่องที่มีชื่อในอาร์กิวเมนต์ออบเจ็กต์ inputs ประกอบด้วย (อาจเปลี่ยนแปลงเมื่อการทดสอบอยู่ระหว่างดําเนินการ)

openrtbContextualBidRequest (ออบเจ็กต์ JS) คําขอราคาเสนอตามบริบทในโปรโตคอล OpenRTB ผู้เสนอราคาที่ใช้โปรโตคอล RTB ของ Authorized Buyers ไม่ควรสนใจอินพุตนี้ และไม่ควรใช้ในฟังก์ชันการเสนอราคา
googleContextualBidRequest (ออบเจ็กต์ JS) คําขอราคาเสนอตามบริบทในโปรโตคอล Google Authorized Buyers ผู้เสนอราคาที่ใช้โปรโตคอล OpenRTB ไม่ควรสนใจอินพุตนี้ และไม่ควรใช้ในฟังก์ชันการเสนอราคา
customContextualSignal (ออบเจ็กต์ JS) ข้อมูลที่กําหนดเองที่ผู้เสนอราคามีให้ในการเสนอราคาตอบตามบริบท ผู้เสนอราคาจะกําหนดรูปแบบ
interestBasedBidData (ออบเจ็กต์ JS) ข้อมูลที่กําหนดเองที่ผู้เสนอราคามีให้ในการเสนอราคาตอบของกลุ่มความสนใจ ผู้เสนอราคาจะกําหนดรูปแบบ

การจัดการฟังก์ชันการเสนอราคาผ่าน API

ทรัพยากร API ทดลองนี้ช่วยให้ผู้เสนอราคาอัปโหลดฟังก์ชันการเสนอราคาไปยัง Google และจัดการฟังก์ชันเหล่านี้ได้

ปลายทางบริการพื้นฐาน: https://realtimebidding.googleapis.com

ทรัพยากร: ฟังก์ชันการเสนอราคา

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

ช่อง name ซึ่งแสดงชื่อของฟังก์ชันการเสนอราคาควรเป็นไปตามรูปแบบ bidders/{bidderAccountId}/biddingFunctions/{biddingFunctionName} ซึ่งผู้เสนอราคาเลือกbiddingFunctionName

ช่อง biddingFunction คือซอร์สโค้ด JavaScript ของฟังก์ชันการเสนอราคา ซึ่งมีข้อกําหนดต่อไปนี้

เช่น

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

การสร้างฟังก์ชันการเสนอราคา

ฟังก์ชันการเสนอราคาจะพร้อมใช้งานในการตอบสนองของกลุ่มความสนใจภายในประมาณ 1 ชั่วโมงหลังจากการเรียกใช้ CreateBiddingFunction API ที่สําเร็จ

POST https://realtimebidding.googleapis.com/v1alpha/{parent=bidders/*}/biddingFunctions
พารามิเตอร์เส้นทาง
parent สตริงในรูปแบบ bidders/{bidderAccountId}
Body: ฟังก์ชันการเสนอราคาที่จะสร้าง
{
  "name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
  "biddingFunction": "(function(inputs) {return 1.23;})"
}
การตอบสนอง (ฟังก์ชันการเสนอราคา)
{
  "name": "bidders/1234567678/biddingFunctions/my_bidding_function_name",
  "biddingFunction": "(function(inputs) {return 1.23;};)"
}

แสดงรายการฟังก์ชันการเสนอราคาที่มีอยู่

GET https://realtimebidding.googleapis.com/v1alpha/bidders/{bidderAccountId}/biddingFunctions
พารามิเตอร์เส้นทาง
parent สตริงในรูปแบบ bidders/{bidderAccountId}
พารามิเตอร์การค้นหา
pageToken โทเค็นสตริงที่ระบุหน้าผลการค้นหาที่เซิร์ฟเวอร์ควรส่งคืน ค่านี้รับจากการตอบกลับการโทร ListBiddingFunctions ก่อนหน้า หากผลลัพธ์ไม่ตรงกับหน้าเว็บเดียว
คำตอบ
{
  "biddingFunctions": [
    {
      object (BiddingFunction)
    }
  ],
  "nextPageToken": string
}
ตัวอย่างการโทร
GET https://realtimebidding.googleapis.com/v1alpha/bidders/123456789/biddingFunctions

การเปลี่ยนแปลงโปรโตคอล RTB ของการจําลอง TURTLEDOVE

โปรโตคอล RTB ของ Authorized Buyers

คําขอราคาเสนอ

คําขอราคาเสนอตามบริบทในการทดสอบจะมีลักษณะเหมือนกับคําขอราคาเสนอทั่วไป แต่มีการปกปิดตัวระบุผู้ใช้แบบประมวลผลข้อมูลเพื่อไม่ให้ระบุตัวบุคคลนั้นได้

// 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 = ...;
  ...
}

เช่น

{
  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
    }]
  }]
}

คําขอตามความสนใจในการทดสอบจะมีตัวระบุผู้ใช้แบบต่อไปที่เป็นนามธรรม โดยขึ้นอยู่กับการคุ้มครองความเป็นส่วนตัวและการควบคุมทั้งหมดที่มีอยู่ แต่จะไม่มีข้อมูลตามบริบท (URL ของหน้าเว็บ รหัสผู้เผยแพร่โฆษณา ฯลฯ)

// 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 = ...;
  ...
}

เช่น

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"

การเสนอราคาตอบ

การเสนอราคาตอบตามบริบทอาจมีข้อมูลบริบทที่กําหนดเองสําหรับผู้เสนอราคาโดยเฉพาะในรูปแบบที่กําหนดเองซึ่งจะส่งไปยังฟังก์ชันการเสนอราคาในภายหลัง

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 = ...;

  ...
}

ตัวอย่างเช่น

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

ราคาเสนอตามความสนใจ

ราคาเสนอแต่ละรายการในการเสนอราคาตอบของกลุ่มความสนใจจะมีการอ้างอิงฟังก์ชันการเสนอราคาตามชื่อ ผู้เสนอราคาจะใช้ฟังก์ชันดังกล่าวล่วงหน้า

// 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 = ...;
  ...
}

เช่น

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

คําขอราคาเสนอ

คําขอตามบริบท (ใน 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
  ...
}
คําขอตามความสนใจ (ใน 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
      ...
    }
  }
}

การเสนอราคาตอบ

การเสนอราคาตอบตามบริบทอาจมีข้อมูลบริบทที่กําหนดเองสําหรับผู้เสนอราคาโดยเฉพาะซึ่งจะส่งไปยังฟังก์ชันการเสนอราคาในภายหลัง

// 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": ...
  }
}

การเสนอราคาตอบที่อิงตามกลุ่มความสนใจ

ราคาเสนอแต่ละรายการในการเสนอราคาตอบของกลุ่มความสนใจจะมีการอ้างอิงฟังก์ชันการเสนอราคาตามชื่อ ผู้เสนอราคาจะใช้ฟังก์ชันดังกล่าวล่วงหน้า

// 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": ...
       }
    }
    ...
  ]
}