ในฐานะส่วนหนึ่งของ 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 ฝั่งเพื่อให้เราสามารถเริ่มการทดสอบได้เร็วขึ้น การมีอยู่ของตัวระบุผู้ใช้ในคําขอตามความสนใจจะขึ้นอยู่กับการคุ้มครองความเป็นส่วนตัวและการควบคุมที่มีอยู่ (เช่น เมื่อผู้ใช้เลือกไม่ใช้โฆษณาที่ปรับตามโปรไฟล์ของผู้ใช้)
น้ำไหล
- ผู้เสนอราคา RTB ทํางานร่วมกับผู้ลงโฆษณาเพื่อสร้าง รักษา และโฮสต์กลุ่มความสนใจของผู้ลงโฆษณาและการเป็นสมาชิกของผู้ใช้แต่ละรายในกลุ่มความสนใจเหล่านั้น
- เมื่อผู้ใช้เข้าชมหน้าเว็บของผู้เผยแพร่โฆษณา เบราว์เซอร์ของผู้ใช้จะดาวน์โหลดแท็กโฆษณาของ Google เบราว์เซอร์ของผู้ใช้จะขอโฆษณาจากแพลตฟอร์มผู้เผยแพร่โฆษณาของ Google
- ผู้เสนอราคา RTB มีฟังก์ชันการเสนอราคาอย่างน้อย 1 รายการ (เป็นฟังก์ชัน JavaScript) ให้ Google ทราบล่วงหน้า (ดูส่วนฟังก์ชันการเสนอราคา)
- สําหรับส่วนน้อยของคําขอในขอบเขตการทดสอบ Google จะส่งคําขอราคาเสนอตามบริบทและคําขอราคาเสนอตามความสนใจไปยังผู้เสนอราคาที่เข้าร่วมการทดสอบแต่ละราย (ดูส่วนคําขอราคาเสนอ)
- ผู้เสนอราคาใช้รหัสผู้ใช้ที่ระบุตัวบุคคลไม่ได้ซึ่งมีอยู่ในคําขอราคาเสนอของกลุ่มความสนใจและแมปกับกลุ่มความสนใจที่เกี่ยวข้อง ผู้เสนอราคา RTB จะแสดงการเสนอราคาตอบตามบริบทและการเสนอราคาตอบตามความสนใจ (ดูส่วน: การเสนอราคาตอบ)
- การเสนอราคาตอบตามบริบทจะคล้ายกับการเสนอราคาตอบของวันนี้ที่มีราคาเสนอตามบริบทอย่างน้อย 0 ขึ้นไป นอกจากนี้ การเสนอราคาตอบตามบริบทอาจมีสัญญาณบริบทที่กําหนดเองของผู้เสนอราคา ซึ่งจะมอบให้แก่ฟังก์ชันการเสนอราคาเป็นอินพุต
- การเสนอราคาตอบตามความสนใจจะไม่ระบุราคาเสนอ แต่ระบุชื่อฟังก์ชันการเสนอราคา Google จะเรียกใช้ฟังก์ชันการเสนอราคาเพื่อเสนอราคา
Google เรียกใช้การประมูลฝั่งเซิร์ฟเวอร์โดยมีผู้สมัครต่อไปนี้
- ราคาเสนอจากการตอบกลับตามบริบท
- ราคาเสนอจากการตอบสนองของกลุ่มความสนใจด้วยราคาเสนอที่คํานวณโดยการเรียกใช้ฟังก์ชันการเสนอราคา
- ราคาเสนอปกติจากผู้เสนอราคารายอื่นๆ
โปรดทราบว่านี่เป็นการประมูลเดียวกันกับวันนี้
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 ของฟังก์ชันการเสนอราคา ซึ่งมีข้อกําหนดต่อไปนี้
- ขนาดไม่เกิน 5 MiB
- เป็นไปตามข้อกําหนดของอินเทอร์เฟซฟังก์ชันการเสนอราคา
- ต้องรองรับการดําเนินการโดยไม่ต้องมีอินพุตระหว่างการสร้างครั้งแรกในแซนด์บ็อกซ์
เช่น
{
"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": ...
}
}
...
]
}