עיבוד הבקשה

אינטראקציה של בידינג בזמן אמת מתחילה כש-Google שולחת בקשת הצעת מחיר לאפליקציה שלכם. המדריך הזה מסביר איך לקוד את האפליקציה כדי לעבד את הבקשה להצעת מחיר.

ניתוח הבקשה

Google שולחת בקשת הצעת מחיר כמאגר פרוטוקול סידורי שמצורף למטען הבינארי של בקשת HTTP POST. הערך בשדה Content-Type הוא application/octet-stream. כדי לקבל דוגמה, אפשר לעיין במאמר בקשה להצעת מחיר לדוגמה.

צריך לנתח את הבקשה הזאת למופע של ההודעה BidRequest. BidRequest מוגדר ב-realtime-bidding.proto, שאותו אפשר למצוא מהדף נתוני עזר. ניתן לנתח את ההודעה באמצעות השיטה ParseFromString() בכיתה שנוצרת עבור BidRequest. לדוגמה, הקוד C++ מנתח בקשה בהינתן מטען ייעודי (payload) של POST במחרוזת:

string post_payload = /* the payload from the POST request */;
BidRequest bid_request;
if (bid_request.ParseFromString(post_payload)) {
  // Process the request.
}

ברגע שתקבלו את BidRequest, תוכלו לעבוד איתו כאובייקט, לחלץ אותו ולפרש אותו. לדוגמה, ב-C++:

for (int i = 0; i < bid_request.adslot_size(); ++i) {
  const BidRequest_AdSlot& adslot = bid_request.adslot(i);
  // Decide what to bid on adslot.
}

נתונים מסוימים שנשלחים ב-BidRequest, כמו מזהה המשתמש, השפה או המיקום הגיאוגרפי ב-Google, לא תמיד זמינים. אם יש לכם קבוצות מודעות שמטרגטות מראש ומשתמשים במידע שלא ידוע על חשיפה מסוימת, היא לא תתאים לקבוצות של המודעות. במקרים שבהם הפרטים החסרים לא משפיעים על התנאים של הטירגוט מראש, הבקשות להצעות מחיר נשלחות עם הפרטים המושמטים.

מידע על קבוצת מודעות לטירגוט מראש זמין בקבוצה MatchingAdData של כל AdSlot. הוא מכיל את מזהה קבוצת המודעות התואם הראשון של קבוצת המודעות שמטרגטת מראש, ושגרמה ל-Google לשלוח את הבקשה להצעת המחיר. כלומר, קבוצת המודעות והקמפיין שחויבו אם התגובה שלכם זכתה במכרז על החשיפה. בנסיבות מסוימות, צריך לציין באופן מפורש את billing_id לשיוך (Attribution) בBidResponse.AdSlot. לדוגמה, כשלBidRequest.AdSlot יש יותר מ-matching_ad_data אחד. למידע נוסף על המגבלות על תוכן הצעת המחיר, אפשר לעיין בrealtime-bidding.proto.

קובצי מילון

בבקשת הצעת המחיר נעשה שימוש במזהים שהוגדרו בקובצי מילון, שזמינים בדף נתוני עזר.

פקודות מאקרו של כתובת URL להצעת מחיר

אפשר להוסיף חלק מהשדות של BidRequest לכתובת ה-URL שמופיעה בבקשת ה-HTTP POST. אפשרות זו שימושית, לדוגמה, אם אתם משתמשים בממשק קצה קל שטוען את העומסים על מספר קצוות עורפיים באמצעות ערך מהבקשה. צרו קשר עם מנהל החשבונות הטכני כדי לבקש תמיכה לפקודות מאקרו חדשות.

Macroתיאור
%%GOOGLE_USER_ID%%

הוחלף ב-google_user_id מ-BidRequest. לדוגמה, כתובת ה-URL של מגיש הצעת המחיר

http://google.bidder.com/path?gid=%%GOOGLE_USER_ID%%
תוחלף במשהו כמו
http://google.bidder.com/path?gid=dGhpyBhbiBleGFtGxl
בזמן הבקשה.

אם ה‐User‐ID ב‐Google לא ידוע, המחרוזת החלופית תוחלף בתוצאה דומה ל-

http://google.bidder.com/path?gid=
%%HAS_MOBILE%%

הוחלף ב-1 או ב-0 כשמתקשרים אל has_mobile() ב-BidRequest.

%%HAS_VIDEO%%

הוחלף ב-1 (True) או ב-0 (False), במהלך ה-has_video() של BidRequest.

%%HOSTED_MATCH_DATA%%

בוצעה החלפה בערך של השדה hosted_match_data מה-BidRequest.

%%MOBILE_IS_APP%%

בוצעה החלפה בערך 1 (True) או 0 (False) מהשדה mobile.is_app של BidRequest.

איתור המזהה של האפליקציה לנייד מכתובת ה-URL של העסקה

עסקאות באפליקציות לנייד ידווחו על כתובות URL שנראות כך:

mbappgewtimrzgyytanjyg4888888.com

כדי לפענח את החלק של המחרוזת המודגשת, צריך להשתמש במפענח בסיס 32 (gewtimrzgyytanjyg4888888).

אתם יכולים להשתמש במפענח אונליין, אבל צריך להשתמש באותיות רישיות באותיות רישיות ולהחליף את הערכים של 8 בסוף הערכים בערך =.

לכן, פענוח הערך הזה:

GEWTIMRZGYYTANJYG4======
תוצאות ב:
1-429610587
המחרוזת 429610587 היא מזהה האפליקציה לאפליקציה ל-iOS iFunny.

הנה דוגמה נוספת. כתובת ה-URL המדווחת היא:

mbappgewtgmjug4ytmmrtgm888888.com
פענוח הערך הזה:
GEWTGMJUG4YTMMRTGM======
תוצאות ב:
1-314716233
התוצאה 314716233 היא מזהה האפליקציה לאפליקציה ל-iOS TextNow.

איתור השם של האפליקציה לנייד מכתובת ה-URL של העסקה

הנה דוגמה לקבלת שם האפליקציה. כתובת ה-URL המדווחת היא:

mbappMFUXELTDN5WS42DZOBQWQLTJN4XHG3DJORUGK4Q888.com
פענוח הערך הזה:
MFUXELTDN5WS42DZOBQWQLTJN4XHG3DJORUGK4Q===
התוצאות ב:
air.com.hypah.io.slither
התוצאה מקבילה לאפליקציה ל-Android slither.io.

שדות Open Bidding

בקשות להצעות מחיר שנשלחות למתחרים ולמגישי הצעות מחיר ברשת שמשתתפים ב-Open Bidding דומים לבקשות של Authorized Buyers שמשתתפות בבידינג בזמן אמת. לקוחות Open Bidding יקבלו מספר קטן של שדות נוספים, ובמספר שדות קיימים יהיו שימושים חלופיים. למשל:

נתוני OpenRTB Authorized Buyers פרטים
BidRequest.imp[].ext.dfp_ad_unit_code BidRequest.adslot[].dfp_ad_unit_code

מכיל את קוד הרשת של בעלי התוכן הדיגיטלי ב-Ad Manager, ואחריו היררכיית יחידות המודעות שמופרדות בקו נטוי.

בדוגמה הבאה, הפורמט יהיה: /1234/cruises/mars.

BidRequest.user.data[].segment[] BidRequest.adslot[].exchange_bidding.key_value[]

צמדי מפתח/ערך חוזרים שנשלחו מבעל התוכן הדיגיטלי למגיש הצעות המחיר ב-Exchange.

אפשר לקבוע שהערכים הם צמדי מפתח/ערך שנשלחו על ידי בעל התוכן הדיגיטלי כאשר הערך של BidRequest.user.data[].name הוא “Publisher Passed”.

הצהרה על ספקים המורשים

ספקים של טכנולוגיות פרסום שמספקים שירותים כמו מחקר, רימרקטינג והצגת מודעות יכולים למלא תפקיד באינטראקציה בין קונים לבתי עסק. מותר להשתמש רק בספקים ש-Google בדקה כדי ליצור אינטראקציות עם Authorized Buyers.

כדי להבין את BidRequest וליצור את BidResponse, צריך לשים לב לשתי האפשרויות השונות להצהרה על ספקי טכנולוגיה:

  1. אין צורך להצהיר על ספקים מסוימים. הספקים האלה מפורטים בדף העזרה של Authorized Buyers.
  2. ספקים אחרים יכולים להשתתף רק אם הוכרזו ב-BidRequest וגם ב-BidResponse:
    • בשדה BidRequest, השדה allowed_vendor_type מציין אילו ספקים מותר לספק. הספקים שיישלחו בשדה allowed_vendor_type של BidRequest מופיעים בקובץ המילוני Vendors.txt.
    • בBidResponse, השדה vendor_type מציין באילו מהספקים המורשים שהקונה מעוניין להשתמש בהם.

דוגמה לבקשת הצעת מחיר

הדוגמאות הבאות מייצגות דגימות שניתנות לקריאה על ידי אנשים של Protobuf ו-JSON.

Google

OpenRTB JSON

פרוטוקול OpenRTB ל-Protobuf

כדי להמיר את הבקשה להצעת מחיר לטופס בינארי, כמו קבלת מטען ייעודי (payload) של POST בבקשה אמיתית, אפשר לבצע את הפעולות הבאות (ב-C++ ). עם זאת, שימו לב שהדבר אינו רלוונטי ל-OpenRTB JSON.

string text_format_example = /* example from above */;
BidRequest bid_request;
if (TextFormat::ParseFromString(text_format_example, &bid_request)) {
  string post_payload;
  if (bid_request.SerializeToString(&post_payload)) {
    // post_payload is a binary serialization of the protocol buffer
  }
}

רימרקטינג

Authorized Buyers מעביר מזהה פרסום בנייד בבקשות להצעות מחיר מתוך אפליקציה לנייד. מזהה הפרסום בנייד יכול להיות מזהה עבור מפרסמים (IDFA) ב-iOS או מזהה הפרסום של Android. המזהה נשלח באמצעות המאקרו %%EXTRA_TAG_DATA%% בתג JavaScript שמנוהל על ידי Authorized Buyers.

המאקרו %%ADVERTISING_IDENTIFIER%% מאפשר לקונים לקבל מזהה IDFA של iOS או מזהה פרסום של Android בעת עיבוד החשיפה. הפונקציה מחזירה מאגר אב מוצפן MobileAdvertisingId כמו %%EXTRA_TAG_DATA%%:

message MobileAdvertisingId {
  optional bytes advertising_id = 1;
  optional int32 user_id_type = 2;
}

השדה user_id_type הוא אחד מהערכים שמוגדרים ב-enum AdxMobileIdType:

enum AdxMobileIdType {
  MOBILE_ID_UNKNOWN = 0,
  IDFA = 1,
  ANDROID_ID = 2,
};

תוכלו ליצור רשימות משתמשים ממזהי פרסום בנייד באמצעות מזהי פרסום שאספתם במהלך הצגת החשיפות. תוכלו לשמור את רשימות המשתמשים האלה בשרת שלכם או שלנו. כדי ליצור רשימות משתמשים בשרתים של Google, אתם יכולים להשתמש במתקן שלנו להעלאה בכמות גדולה.

כאשר מזהה הפרסום בנייד תואם לרשימת משתמשים, אפשר להשתמש בו כדי להפעיל רימרקטינג.

משוב בזמן אמת

משוב בזמן אמת זמין לקונים מורשים, וגם לבורסות פרסום ולרשתות שמשתמשות ב-Open Bidding.

משוב נוסף על התגובות להצעת מחיר נתמך בבקשת הבקשה הבאה, גם לגבי פרוטוקול Zapier וגם עבור OpenRTB. נתוני OpenRTB נשלחים באמצעות BidRequestExt.

בנוסף לשדות ברירת המחדל שנשלחים במשוב על הצעות המחיר, ניתן גם לשלוח נתונים מותאמים אישית בתגובת הצעת המחיר (ב-Zapier Proto או ב-OpenRTB), באמצעות event_notification_token שמוחזר ב-BidResponse. event_notification_token הוא נתונים שרירותיים שידועים רק למגיש הצעות המחיר שיכולים לעזור לניפוי באגים. לדוגמה: מזהה טירגוט חדש או מזהה בידינג חדש שמייצג טקטיקה חדשה, או מטא-נתונים שמשויכים לקריאייטיב שידוע רק למגיש הצעות המחיר. פרטים נוספים זמינים במאמר OpenRTB Extensions Protocol Buffer ל-RTB ו-JavaScript Proto ל-Zapier.

כאשר Authorized Buyers שולח למגיש הצעות המחיר בקשה, מגיש הצעות המחיר משיב עם BidResponse. אם מגיש הצעת המחיר הפעיל משוב בזמן אמת, אז בבקשת הצעת מחיר שתוגש לאחר מכן, Authorized Buyers ישלח משוב על התגובה בהודעה של BidResponseFeedback, כפי שמפורט בהמשך:

  // Feedback on bids submitted in previous responses. This is only set if
  // real-time feedback is enabled for your bidder. Contact your account
  // manager if you want to enable real-time feedback.
  message BidResponseFeedback {
    // The unique id from BidRequest.id
    optional bytes request_id = 1;

    // The index of the BidResponse_Ad if there was more than one. The index
    // starts at zero for the first creative.
    optional int32 creative_index = 2;

    // The status code for the ad. See creative-status-codes.txt in the
    // technical documentation for a list of ids.
    optional int32 creative_status_code = 3;

    // If the bid won the auction, this is the price paid in your account
    // currency. If the bid participated in the auction but was out-bid, this
    // is the CPM that should have been exceeded in order to win. This is not
    // set if the bid was filtered prior to the auction, if the publisher or
    // winning bidder has opted out of price feedback or if your account has
    // opted out of sharing winning prices with other bidders. For first-price
    // auctions, minimum_bid_to_win is populated instead of this field.
    optional int64 cpm_micros = 4;

    // The minimum bid value necessary to have won the auction, in micros of
    // your account currency. If your bid won the auction, this is the second
    // highest bid that was not filtered (including the floor price). If your
    // bid did not win the auction, this is the winning candidate's bid. This
    // field will only be populated if your bid participated in a first-price
    // auction, and will not be populated if your bid was filtered prior to the
    // auction.
    optional int64 minimum_bid_to_win = 7;

    // When a publisher uses an RTB auction and waterfall-based SDK mediation on
    // the same query, the winner of the real-time auction must also compete in
    // a mediation waterfall (which is ordered by price) to win the impression.
    // If the bid participated in the auction and there was no waterfall, the
    // value of this field is 0. If the bid participated in the auction and
    // there was a waterfall, the value of this field is a price representing a
    // sample bid from the eligible mediation networks that were higher than the
    // auction winner, weighted by expected fill rate. This field can be used
    // in conjunction with minimum_bid_to_win to train bidding models. The CPM
    // is in micros of your account currency.
    optional int64 sampled_mediation_cpm_ahead_of_auction_winner = 10;

    // Event notification token that was included in the bid response.
    optional bytes event_notification_token = 5;

    // Buyer creative ID that was included in the bid response.
    optional string buyer_creative_id = 6;
  }
  repeated BidResponseFeedback bid_response_feedback = 44;

  // How many milliseconds Google will wait for a response before ignoring it.
  optional int32 response_deadline_ms = 57;

  // -----------------------------------------------------------
  // Testing options.
  //
  // If true, then this is a test request. Results will not be displayed to
  // users and you will not be billed for a response even if it wins the
  // auction. You should still do regular processing since the request may be
  // used to evaluate latencies or for other testing. During your initial
  // testing with Google traffic any response that you make will be filtered
  // out of the auction whether this option has a value of true or false.
  optional bool is_test = 15 [default = false];

  // If true, then this request is intended to measure network latency.
  // Return an empty BidResponse with only processing_time_ms set as quickly as
  // possible without executing any bidding logic.
  optional bool is_ping = 17 [default = false];

  // If true, then the callout model predicted that you will not bid
  // on this request. We send a sampled percentage of such requests so that we
  // can automatically update the model when bidding patterns change.
  optional bool is_predicted_to_be_ignored = 45 [default = false];

  // SupplyChain object. For more information, see
  // https://github.com/InteractiveAdvertisingBureau/openrtb/blob/master/supplychainobject.md.
  message SupplyChain {
    // Indicates whether the chain contains all nodes involved in the
    // transaction leading back to the owner of the site, app or other medium of
    // the inventory.
    optional bool complete = 1;

    message SupplyChainNode {
      // The canonical domain name of the SSP, Exchange, Header Wrapper, etc
      // system that bidders connect to. This may be the operational domain of
      // the system, if that is different than the parent corporate domain, to
      // facilitate WHOIS and reverse IP lookups to establish clear ownership of
      // the delegate system. This should be the same value as used to identify
      // sellers in an ads.txt file if one exists.
      optional string advertising_system_identifier = 1;

      // The identifier associated with the seller or reseller account within
      // the advertising system. This must contain the same value used in
      // transactions, specifically the publisher_id field in the Google
      // protocol. Should be limited to 64 characters in length.
      optional string seller_identifier = 2;

      // Indicates whether this node will be involved in the flow of payment for
      // the inventory. When set to true, the advertising system in the
      // advertising_system_identifier field pays the seller in the
      // seller_identifier field, who is responsible for paying the previous
      // node in the chain. When set to false, this node is not involved in the
      // flow of payment for the inventory.
      optional bool handles_payment = 6;
    }

    // Array of SupplyChainNode objects in the order of the chain. In a complete
    // supply chain, the first node represents the initial advertising system
    // and seller ID involved in the transaction, for example, the owner of the
    // site, app, or other medium. In an incomplete supply chain, it represents
    // the first known node. The last node represents the entity sending this
    // bid request.
    repeated SupplyChainNode nodes = 2;

    // Version of the supply chain specification in use, in the format of
    // "major.minor". For example, for version 1.0 of the spec, use the string
    // "1.0".
    optional string version = 3;
  }
  optional SupplyChain supply_chain = 69;

  // Experimental feature; may be subject to change. See
  // https://support.google.com/authorizedbuyers/answer/10890762 for more
  // information.
  //
  // Describes the scope of frequency cap enforcement available for this
  // request. Frequency caps to be enforced for a bid can be specified in the
  // BidResponse.ad.adslot.frequency_cap field.
  enum FrequencyCappingScope {
    // Default value which should not be used, or which can indicate that
    // frequency cap scope could not be reliably determined.
    FREQUENCY_CAPPING_SCOPE_UNKNOWN = 0;

    // Frequency capping based on bid response specifications is not available
    // for this request. A frequency-capped bid for a bid request with no
    // frequency cap availability will be filtered prior to the auction.
    FREQUENCY_CAPPING_SCOPE_NONE = 1;

    // Frequency capping enforcement is available across multiple sites within
    // the same browser.
    FREQUENCY_CAPPING_SCOPE_BROWSER = 2;

    // Frequency capping enforcement is available across multiple apps on the
    // device, excluding browsers.
    FREQUENCY_CAPPING_SCOPE_DEVICE = 3;

    // Frequency capping enforcement is available within a single app.
    FREQUENCY_CAPPING_SCOPE_APP = 4;

    // Frequency capping enforcement is available within a single site.
    FREQUENCY_CAPPING_SCOPE_SITE = 5;
  }
  optional FrequencyCappingScope frequency_capping_scope = 70;
}

// This is the message that you return in response to a BidRequest. You may
// specify zero or more ads. For each ad, you should provide an ad slot on
// which the ad can run. An ad slot is identified by the AdSlot.id from the
// BidRequest. If you do not want to bid, submit a response with no ads and
// with only the processing_time_ms set.
message BidResponse {

  message Ad {
    // The event notification token is sent to AdX by bidders for
    // troubleshooting. AdX will include the token in real-time feedback for the
    // bid. The content of the token will not be logged by AdX. AdX will ignore
    // any token longer than 128 bytes.
    optional bytes event_notification_token = 25;

    // A unique identifier chosen by you for the creative in this response.
    // This must always be set, must be limited to at most 64 bytes, and must be
    // a valid UTF8 string. Every buyer_creative_id you use must always be
    // associated with the same creative. This field is used to communicate
    // approval statuses when issues are found. Do not specify the same id for
    // different creatives, or all creatives will be disapproved if a problem
    // with a single creative is found. Do not specify different ids for the
    // same creative in different responses or no creatives will be served since
    // approval status is assigned on a per-id basis.
    optional string buyer_creative_id = 10;

    // Only one of the following should be set:
    // 1) html_snippet, 2) video_url, 3) native_ad, or 4) sdk_rendered_ad.
    //
    // The HTML snippet that will be placed on the web page to display the ad.
    // Use BidResponse.Ad.AdSlot.billing_id to indicate which billing id
    // this snippet is attributed to.
    optional string html_snippet = 1;

    // The URL to fetch a video ad. The URL should return an XML response that
    // conforms to the VAST 2.0 or 3.0 standard. Use
    // BidResponse.Ad.AdSlot.billing_id to indicate which billing id to
    // attribute this ad to. Only one of the following should be set:
    // html_snippet, video_url. Only set this field if the BidRequest is for an
    // in-video ad (BidRequest.video is present).
    optional string video_url = 9;

    // The VAST document to be returned. This document should conform to the
    // VAST 2.0 or 3.0 standard. Use BidResponse.Ad.AdSlot.billing_id to
    // indicate which billing ID to attribute this ad to.
    // Only set this field if the BidRequest is for an in-video ad and the
    // response is VAST XML.
    optional string video_vast_xml = 24;

    // The URL to fetch an AMPHTML ad. Only one of the following should be set:
    // html_snippet, video_url, amp_ad_url, native_ad.
    optional string amp_ad_url = 23;

    // The content of a native ad. Native ads consist of multiple building
    // blocks, which are rendered by the publisher. Only one of the following
    // should be set: html_snippet, video_url, or native_ad.
    // Only set this field if the BidRequest is for a native ad
    // (BidRequest.adslot.native is present).
    message NativeAd {
      // A video in the form of either a URL for a VAST tag, or an in-line VAST
      // tag. Only set this field if VIDEO is required or recommended in the
      // BidRequest's NativeAdTemplate.
      oneof video {
        // The URL to fetch a video ad. The URL should return an XML response
        // that conforms to VAST standards.
        string video_url = 13;

        // The VAST document to be returned. Max size is 100kB.
        string video_vast_xml = 16;
      }

      // A short title for the ad.
      optional string headline = 1;

      // A long description of the ad.
      optional string body = 2;

      // A label for the button that the user is supposed to click
      optional string call_to_action = 3;

      // The name of the advertiser or sponsor, to be displayed in the ad
      // creative.
      optional string advertiser = 4;

      message Image {
        optional string url = 1;

        // Image width and height are specified in pixels. You may provide a
        // larger image than was requested, so long as the aspect ratio is
        // preserved.
        optional int32 width = 2;
        optional int32 height = 3;
      }

      // A large image.
      optional Image image = 5;

      // A smaller image, for the advertiser's logo.
      optional Image logo = 6;

      // The app icon, for app download ads.
      optional Image app_icon = 7;

      // The app rating in the app store. Must be in the range [0-5].
      optional double star_rating = 8;

      // The URL that the browser/SDK will load when the user clicks the ad.
      // This can be the landing page directly, or the first step of a redirect
      // chain that eventually leads to it. For backward compatibility, if this
      // is not set, the first Ad.click_through_url is used.
      optional string click_link_url = 14;

      // This field is deprecated in favor of the repeated click_tracking_urls
      // field at the BidResponse.Ad level. It will be removed at the end of
      // Q2 2022.
      // The URL to use for click tracking. The SDK pings click tracking url on
      // a background thread. When resolving the url, HTTP 30x redirects are
      // followed. The SDK ignores the contents of the response; this URL
      // has no effect on the landing page for the user.
      optional string DEPRECATED_click_tracking_url = 11 [deprecated = true];

      // This field is deprecated in favor of the click_tracking_urls
      // field at the BidResponse.Ad level. It will be removed at the end of
      // Q2 2022.
      // The URLs to use for click tracking. This will be used throughout the
      // serving stack and will incorporate any URL in click_tracking_url.
      repeated string DEPRECATED_click_tracking_urls = 15 [deprecated = true];

      // The price of the promoted app including the currency info.
      optional string price = 10;
    }
    optional NativeAd native_ad = 18;

    // The set of destination URLs for the snippet. This includes the URLs that
    // the user will go to if they click on the displayed ad, and any URLs that
    // are visible in the rendered ad. Do not include intermediate calls to the
    // adserver that are unrelated to the inal landing page. A BidResponse that
    // returns a snippet or video ad but declares no click_through_url will be
    // discarded. Only set this field if html_snippet or video_url or native_ad
    // are set. This data is used as a destination URL declaration, for example
    // for post-filtering of publisher-blocked URLs or ad categorization.
    //
    // For non-native ads, it is not used for click tracking or any
    // other ad functionality; it is only used as a destination URL
    // declaration.
    //
    // For native ads, if NativeAd.click_link_url is not set, the first
    // value of click_through_url is used to direct the user to the landing
    // page. In addition, all values are used as destination
    // URL declarations (similar to the non-native case).
    repeated string click_through_url = 4;

    // All vendor types for the ads that may be shown from this snippet. You
    // should only declare vendor ids listed in the vendors.txt file in the
    // technical documentation. We will check to ensure that the vendors you
    // declare are in the allowed_vendor_type list sent in the BidRequest for
    // AdX publishers.
    repeated int32 vendor_type = 5;

    // All attributes for the ads that may be shown from this snippet. See
    // buyer-declarable-creative-attributes.txt in the technical documentation
    // for a list of ids. We will check to ensure none of these attributes are
    // in the excluded_attribute list in the BidRequest.
    repeated int32 attribute = 6;

    // All sensitive categories for the ads that may be shown from this snippet.
    // See ad-sensitive-categories.txt in the technical documentation for a list
    // of ids. We will check to ensure none of these categories were in the
    // excluded_sensitive_category list in the BidRequest.
    repeated int32 category = 7;

    // All restricted categories for the ads that may be shown from this
    // snippet. See ad-restricted-categories.txt in the technical documentation
    // for a list of ids. We will check to ensure these categories were listed
    // in the allowed_restricted_category list in the BidRequest. If you are
    // bidding with ads in restricted categories you MUST ALWAYS declare them
    // here.
    repeated int32 restricted_category = 17;

    // All names of the ad's advertisers.
    repeated string advertiser_name = 11;

    // The width and the height in pixels of the ad. Setting these is optional.
    // However, these must be set if the bid BidRequest.AdSlot has more than one
    // width and height or if BidRequest.Mobile.is_interstitial_request is true.
    optional int32 width = 14;
    optional int32 height = 15;

    // The Agency associated with this ad. See agencies.txt file in the
    // technical documentation for a list of ids. If this ad has no associated
    // agency then the value NONE (agency_id: 1) should be used rather than
    // leaving this field unset.
    optional int64 agency_id = 16;

    message AdSlot {
      // The slot id from the BidRequest that the ad may appear in.
      required int32 id = 1;

      // The maximum CPM you want to be charged if you win the auction for this
      // ad slot, expressed in micros of the specified currency or default
      // bidding currency. For example, to bid a CPM of 1.29 USD, set
      // max_cpm_micros = 1290000. Winning bids are rounded up to billable
      // units. For example, in USD, bids are rounded up to the next multiple
      // of 10,000 micros (one cent).
      required int64 max_cpm_micros = 2;

      // The minimum CPM you want to be charged if you win the auction for this
      // ad slot, expressed in micros of the specified currency or default
      // bidding currency. This may represent a second price if you choose
      // max_cpm_micros as the highest of several bids, or some form of reserve
      // price if you want to override the reserve price set by the publisher.
      // The bid must be less than or equal to max_cpm_micros or it will be
      // ignored. This field is optional and does not need to be set. This
      // field is not applicable when responding to bid requests with
      // auction_type set to FIRST_PRICE.
      optional int64 min_cpm_micros = 3;

      // The currency used by max_cpm_micros and min_cpm_micros, using ISO-4217
      // alpha codes. If this field is populated, the specified currency will
      // be used to interpret the bid. Otherwise, the default bidding currency
      // will be used, which is determined in the following priority:
      // 1. The bidder-level currency, if configured in RTB account settings.
      // 2. The buyer-level currency. The buyer will be determined by the
      // billing ID specified in the billing_id field of the bid response if it
      // is populated, otherwise it will be based on the sole billing ID sent
      // in the bid request.
      //
      // The currency of a buyer account is set on account creation and can be
      // checked by contacting a Technical Account Manager.
      optional string currency = 15;

      // Billing id to attribute this impression to. The value must be in the
      // set of billing ids for this slot that were sent in the
      // BidRequest.AdSlot.matching_ad_data.billing_id. This must always be set
      // if the BidRequest has more than one
      // BidRequest.AdSlot.matching_ad_data.billing_id or if the bidder has
      // active child seats.
      optional int64 billing_id = 4;

      // The deal id that you want this bid to participate in. Leave unset
      // or set it to "1" if a deal is available but you want to
      // ignore the deal and participate in the open auction.
      optional int64 deal_id = 5 [default = 0];

      // For exchange bidders (third party exchanges doing real-time bidding on
      // DFP), the deal id from the exchange's namespace that is associated with
      // this bid and reported to publishers. Leave unset if there is no
      // associated deal. This is arbitrary UTF8 text and must be at most 64
      // bytes.
      optional string exchange_deal_id = 6;

      // When exchange_deal_id is set, the type of deal. This is reported to
      // publishers and affects how the deal is treated in the auction.
      enum ExchangeDealType {
        OPEN_AUCTION = 0;
        PRIVATE_AUCTION = 1;
        PREFERRED_DEAL = 2;
        EXCHANGE_AUCTION_PACKAGE = 3;
      }
      optional ExchangeDealType exchange_deal_type = 7 [default = OPEN_AUCTION];

      // The seat ID in the bidder's namespace representing the seat on whose
      // behalf this bid was made.
      optional string seat_id = 25;

      // Buyer declared ID which will be used to break down spend and invalid
      // traffic metrics in IVT transparency reporting in Query Tool. Note that
      // IDs with fewer than 1000 impressions will not be used to break down
      // metrics. IDs longer than 64 bytes will be ignored.
      optional string buyer_reporting_id = 8;

      // Token used to identify end third party buyer information if an
      // exchange as an open bidder is an intermediary. This is obtained from
      // the third party buyer and must be passed to Google unaltered in the bid
      // response.
      optional string third_party_buyer_token = 12;

      // Experimental feature; may be subject to change. See
      // https://support.google.com/authorizedbuyers/answer/10890762 for more
      // information.
      //
      // Specifies frequency capping to be applied to the bid. Impressions for
      // each user are capped at the level specified by frequency_cap_id. A bid
      // will not participate in the auction if an additional impression for the
      // user would violate any of the specified caps. Multiple frequency caps
      // can be specified for the same frequency_cap_id.
      //
      // A bid is filtered before the auction if the frequency cap is malformed.
      // Instances where the cap is malformed include:
      //  - frequency_cap_id is empty or is very long
      //  - max_mpressions or time_range are non-positive
      //  - there are a large number of frequency caps for a single bid
      //  - time_unit is not specified
      //
      // Note that if a subsequent bid with the same frequency_cap_id uses a
      // different duration (represented by time_unit and time_range) then
      // impressions counted against the old frequency cap will not count
      // against the new one, and the impressions counted against the new
      // frequency cap with a different time_unit and time_range will not count
      // against the old frequency cap..
      message FrequencyCap {
        // An ID that can represent a bidder's use-case for frequency capping.
        // For example, it could represent their campaign, ad, line item, or
        // some other entity. It should not contain any user-specific
        // information or identifiers and should not be longer than 64
        // characters.
        optional string frequency_cap_id = 1;

        // The time units for which frequency caps can be enforced.
        enum TimeUnit {
          UNKNOWN_TIME_UNIT = 0;
          MINUTE = 1;
          DAY = 2;
          WEEK = 3;
          MONTH = 4;

          // When INDEFINITE is used, time_range will be ignored. INDEFINITE
          // means the frequency cap will be applied for a long period of time,
          // (longer than a month) but not necessarily forever.
          INDEFINITE = 5;
        }

        // The unit of time used to specify the time window for which a
        // frequency cap applies.
        optional TimeUnit time_unit = 2;

        // The length of the time window, in units specified by time_unit, for
        // which the frequency cap applies. For instance, if time_unit=WEEK and
        // time_range=3, then capping is applied for a three week period. If the
        // time_unit=INDEFINITE, this will be ignored.
        optional int32 time_range = 3 [default = 1];

        // The maximum number of impressions allowed to be shown to a user for
        // the provided frequency_cap_id within the time window described by
        // time_unit and time_range.
        optional int32 max_impressions = 4;
      }
      repeated FrequencyCap frequency_cap = 16;
    }
    repeated AdSlot adslot = 3;

    // The URLs to call when the impression is rendered. This is supported for
    // all inventory types and all formats.
    repeated string impression_tracking_url = 19;

    // The URLs to call when the user clicks on the ad. Currently supported only
    // for native ads and Programmatic Guaranteed deals with publisher-
    // managed creatives. In the publisher managed case, these click trackers
    // will be sent to the bidder server to server. In all other cases, these
    // will be sent from the user's device. For more information on
    // publisher-managed creatives, see
    // https://support.google.com/admanager/answer/9243220.
    repeated string click_tracking_urls = 30;

    // Link to ad preferences page. This is only supported for native ads.
    // If present, a standard AdChoices icon is added to the native creative and
    // linked to this URL.
    optional string ad_choices_destination_url = 21;

    message ImpressionTrackingResource {
      // The URL of a Javascript resource. The URLs should not contain script
      // tags. For example: "https://mycdn.com/tracker.js".
      optional string script_url = 1;

      // Additional context provided for rendering.
      enum Context {
        UNKNOWN_CONTEXT = 0;

        // Currently not supported.
        OMID = 1;
      }
      repeated Context context = 2;

      // Parameters associated with the resource that will be passed to the
      // resource when it is loaded. The format of the parameters is dependent
      // on the script vendor.
      optional string verification_parameters = 3;

      // Used to uniquely identify the verification script provider.
      optional string vendor_key = 4;
    }

    // Resources to invoke when the impression is rendered. This is supported
    // for native and banner formats only and explicitly allowed scripts
    // only.
    repeated ImpressionTrackingResource impression_tracking_resource = 26;

    // An ad that will be rendered by an SDK known to the buyer. This can only
    // be used when the BidRequest included a mobile.installed_sdk submessage.
    message SdkRenderedAd {
      // The identifier for the SDK that will render the ad. Must match a
      // mobile.installed_sdk.id sent in the corresponding bid request.
      optional string id = 1;

      // Data to pass to the SDK in order to render the ad. This data is opaque
      // to the publisher and to Google.
      optional string rendering_data = 2;

      // Declared ad assets to support creative scanning, classification, and
      // enforcement of ad policy and publisher blocks for ads rendered with a
      // custom SDK.
      message DeclaredAd {
        // Ad content used by SDK to render an ad.
        oneof content {
          // The HTML snippet representative of the SDK-rendered ad.
          string html_snippet = 1;

          // The URL to the VAST asset used in the SDK-rendered ad.
          string video_url = 2;

          // The VAST document used to render custom SDK-rendered ad. This
          // document should conform to the VAST 2.0 or 3.0 standard.
          string video_vast_xml = 5;

          // The content of a native ad. Native ads consist of multiple building
          // blocks (such as image and text), which are rendered by the buyer
          // SDK.
          NativeAd native_ad = 6;
        }

        // The final landing pages of the SDK-rendered ad.
        repeated string click_through_url = 4;
      }
      optional DeclaredAd declared_ad = 6;
    }
    optional SdkRenderedAd sdk_rendered_ad = 27;

    // Advertiser's SKAdNetwork information to support app installation
    // attribution for iOS 14 and later. Apple's SKAdNetwork API helps
    // advertisers measure ad-driven app installation by sending a postback
    // to the ad network after a successful install. Ad networks will need
    // to send their network ID and signed advertiser information to allow
    // an install to be attributed to the ad impression.
    // For more info visit:
    // https://developer.apple.com/documentation/storekit/skadnetwork
    message SKAdNetworkResponse {
      // Version of SKAdNetwork supported by the advertiser. Also used to
      // specify how the signature was generated by the advertiser. This
      // should match the version from BidRequest.mobile.skad.version.
      optional string version = 1;

      // Ad network identifier used in signature. This should match one of the
      // items in BidRequest.mobile.skad.skadnetids.
      optional string network = 2;

      // Campaign ID compatible with Apple's spec. Used in SKAdNetwork 3.0 and
      // below. Replaced by Source Identifier (`source_identifier` field) in
      // SKAdNetwork 4.0 and above.
      optional int64 campaign = 3;

      // A four-digit integer that ad networks define to represent the ad
      // campaign. Used in SKAdNetwork 4.0+ and replaces the `campaign` field.
      optional int64 source_identifier = 11;

      // ID of advertiser's app in Apple's app store.
      optional string itunesitem = 4;

      // ID of custom product page to display (for iOS 15 or later).
      // If not specified, default product page will be displayed.
      // See https://developer.apple.com/app-store/custom-product-pages/
      // for more details about custom product pages.
      optional string product_page_id = 12;

      // SKAdNetwork API starting from version 2.2 supports multiple ad
      // presentation options specified by the `fidelity-type` parameter of the
      // SKAdNetwork signature. This holds parameters used to generate the
      // signature that would be different for each fidelity type supported.
      // For more info visit:
      // https://developer.apple.com/documentation/storekit/skadnetwork/signing_and_providing_ads
      message Fidelity {
        // The fidelity type of the attribution to track.
        optional SKAdNetworkFidelityType fidelity_type = 1 [default =
          STOREKIT_RENDERED_ADS];

        // A unique all-lowercase UUID generated by the advertiser to use for
        // generating the signature.
        optional string nonce = 2;

        // Unix time in millis used at the time of signature generation.
        optional int64 timestamp = 3;

        // SKAdNetwork signature as specified by Apple.
        optional string signature = 4;
      }
      repeated Fidelity fidelities = 9;

      // A unique all-lowercase UUID generated by the advertiser to use for
      // generating the signature.
      // Note:  This field will be deprecated in favor of the
      // BidResponse.ad.skadn.fidelities.nonce field to support multiple
      // fidelity types.
      optional string nonce = 5;

      // ID of publisher's app in Apple's app store. This should match the ID
      // from BidRequest.mobile.skad.sourceapp.
      optional string sourceapp = 6;

      // Unix time in millis used at the time of signature generation.
      // Note:  This field will be deprecated in favor of the
      // BidResponse.ad.skadn.fidelities.timestamp field to support multiple
      // fidelity types.
      optional int64 timestamp = 7;

      // SKAdNetwork signature as specified by Apple.
      // Note:  This field will be deprecated in favor of the
      // BidResponse.ad.skadn.fidelities.signature field to support multiple
      // fidelity types.
      optional string signature = 8;

      // These options indicate how to present SKOverlay recommending the
      // advertised app.
      // Supported by iOS 14 and later.
      //
      // For more info visit:
      // https://developer.apple.com/documentation/storekit/skoverlay
      message SKOverlay {
        // Delay in seconds after the ad begins before presenting the overlay.
        // If this field is set to 0, the overlay will be shown immediately
        // after the ad begins. If this field is unset, the overlay will not
        // be shown for the ad.
        optional int32 delay_seconds = 1;

        // Delay in seconds after the endcard shows before presenting the
        // overlay. (This field only applies to rewarded or interstitial video
        // creatives.) If this field is set to 0, the overlay will be shown
        // immediately after the endcard shows. If this field is unset,
        // the overlay will not be shown for the endcard.
        // If both `delay_seconds` and `endcard_delay_seconds` are set,
        // the overlay will be automatically dismissed when the ad ends,
        // and shown again after the endcard shows.
        optional int32 endcard_delay_seconds = 2;

        // Whether this overlay can be dismissed by the user.
        optional bool dismissible = 3 [default = true];
      }
      optional SKOverlay skoverlay = 13;

      // Google Mobile Ads SDK options for SKAdNetwork handling.
      message SKAdNetworkOptions {
        // By default, SKAdNetwork attribution will only be initiated if the
        // click-through URL lands on the app store, either as a direct link to
        // the app store or as the final destination of a server-side redirect
        // chain. Enables GMA SDK to always initiate SKAdNetwork
        // attribution on-click regardless of the detected click's final
        // destination URL. Note that enabling this will launch the app store
        // even for clicks that are not meant to open the app store, for example
        // clicks on Ad Choices icon. For more info, see:
        // https://developers.google.com/authorized-buyers/rtb/skadnetwork
        optional bool always_open_appstore = 1 [default = false];
      }
      optional SKAdNetworkOptions skadn_options = 10;
    }
    optional SKAdNetworkResponse skadn = 29;

    // ID of the advertised app (only for app promotion).
    // On Android, this should be a bundle or package name such as
    // com.foo.mygame. On iOS, it is a numeric ID.
    //
    // In addition to this field, set the app_promotion_type field below to take
    // advantage of features specific to app promotion types.
    optional string advertised_app_id = 32;

    // Possible types of app promotion.
    enum AppPromotionType {
      UNKNOWN_APP_PROMOTION_TYPE = 0;

      // For encouraging new users to download and install the advertised app.
      // Clicking this ad will show the app store listing as an overlay (for
      // supported formats), without leaving the publisher app.
      // Click through URL for this ad points to the app store listing.
      INSTALLS = 1;

      // Other types of app promotion that do not fall into the categories
      // above. No features specific to app promotion types will apply.
      OTHER = 3;
    }

    // Type of the app promotion corresponding to the advertised app specified
    // in the advertised_app_id field above.
    // If the advertised app is not specified, this field will be ignored.
    //
    // Setting advertised_app_id field without this field will be treated as if
    // this field were set to OTHER.
    optional AppPromotionType app_promotion_type = 33;
  }
  repeated Ad ad = 2;

  // If is_test was set in the BidRequest, then you may return debug information
  // as plain text in this field. Don't set this field under normal
  // conditions, or set it to values longer than 100 characters. You should only
  // use this field when asked to do so as part of troubleshooting particular
  // problems.
  optional string debug_string = 5;

  // Set this to the processing time in milliseconds from when you
  // received the request to when you returned the response.
  optional int32 processing_time_ms = 4;

  // An optional, bidder-specified reason for not submitting a bid. This field
  // is equivalent to BidResponse.nbr in the OpenRTB protocol and uses the same
  // namespace of no-bid reason codes. See
  // https://developers.google.com/authorized-buyers/rtb/downloads/no-bid-reasons.txt
  // for the full set of no-bid reason codes.
  optional int32 no_bid_reason = 6;
}

// SKAdNetwork API starting from version 2.2 supports multiple ad
// presentation options specified by the `fidelity-type` parameter of the
// SKAdNetwork signature. The following are the fidelity types supported by
// Apple. For more info visit:
// https://developer.apple.com/documentation/storekit/skadnetwork/signing_and_providing_ads
enum SKAdNetworkFidelityType {
  // Attribution for app installs within 24 hours of viewing an ad for at least
  // 3 seconds. Supported for SKAdnetwork version 2.2 and up. For more info see:
  // https://developer.apple.com/documentation/storekit/skadnetwork/generating_the_signature_to_validate_view-through_ads
  VIEW_THROUGH_ADS = 0;

  // Attribution for app installs initiated from the StoreKit-rendered App Store
  // product page driven by ad clicks. Supported for all SKAdNetwork versions.
  // For more info see:
  // https://developer.apple.com/documentation/storekit/skadnetwork/generating_the_signature_to_validate_storekit-rendered_ads
  STOREKIT_RENDERED_ADS = 1;
}

בהודעה הזו, השדה הראשון שכדאי לבדוק הוא bid_response_feedback.creative_status_code. ניתן למצוא את משמעות הקוד ב- creative-status-codes.txt. שימו לב שאם תבטלו את הצעת המחיר, תוכלו לבטל את ההסכמה לשליחת משוב על מחירים. מידע נוסף זמין במאמר איך לבטל את ההסכמה לשימוש בקובצי cookie.

המשוב בזמן אמת כולל את מזהה הבקשה להצעת מחיר, ואת אחת מהאפשרויות הבאות:

תוצאת המכרז משוב בזמן אמת
הקונה לא הגיש הצעת מחיר. שום דבר.
הקונה הגיש הצעת מחיר שסונן לפני שהוא הגיע למכרז. קוד הסטטוס של הקריאייטיב (ראו creative-status-codes.txt).
הקונה הגיש הצעת מחיר אבל איבד את המכרז. קוד הסטטוס של הקריאייטיב 79 (ניתן להגיש הצעת מחיר במכרז).
הקונה הגיש הצעת מחיר שזכתה במכרז. מחיר הסליקה וקוד הסטטוס של הקריאייטיב 1

להופעה של אפליקציה ולקוד הסטטוס של הקריאייטיב, 53, יכול להיות שבעל האפליקציה השתמש ב-Waterfall של תהליך בחירת הרשת (Mediation), ולכן הצעת המחיר הזוכה הייתה מתחרה בביקוש אחר בשרשרת ה-fabackback של בעלי התוכן הדיגיטלי ב-Waterfall. כאן מוסבר איך משתמשים ב-sampled_mediation_cpm_ahead_of_auction_winner כשמגישים הצעות מחיר.

דוגמה

לפניכם דוגמה למשוב בזמן אמת, כפי שהוא נראה בפרוטוקולים נתמכים:

Google

OpenRTB JSON

פרוטוקול OpenRTB ל-Protobuf

יצירת מודל בידינג למכרזים במודל "מחיר ראשון"

אחרי ששולחים הצעת מחיר במכרז במודל "מחיר ראשון", מקבלים משוב בזמן אמת כולל השדות minimum_bid_to_win ו-sampled_mediation_cpm_ahead_of_auction_winner, אם הצעת המחיר לא סוננה מהמכרז. האותות האלה יכולים לשמש כדי לעדכן את הלוגיקה של הגשת הצעות המחיר בנוגע להצעת המחיר הגבוהה או הנמוכה ביותר הנדרשת כדי לזכות בחשיפה.

  • minimum_bid_to_win: הצעת המחיר המינימלית שהייתה יכולה להיות זוכה במכרז הבידינג בזמן אמת. אם זכיתם במכרז, תהיה זו הצעת המחיר הנמוכה ביותר שהייתם יכולים להגיש בזמן הזכייה. אם תפסידו את המכירה הפומבית, זו תהיה הצעת המחיר הזוכה.
  • sampled_mediation_cpm_ahead_of_auction_winner: אם יש רשתות אחרות בשרשרת לבחירת רשת, הערך בשדה הזה הוא מחיר שמייצג הצעת מחיר לדוגמה מתוך אחת מהרשתות הכשירות לבחירת רשת שהייתה גבוהה יותר מזו של הזוכה במכרז, בשקלול לפי שיעור המילוי הצפוי. יוגדר הערך 0 אם אף אחת מהרשתות בשרשרת לבחירת הרשת לא צפויה להתמלא, או אם בעל האפליקציה לא משתמש בתהליך בחירת הרשת ב-SDK.

איך זה עובד

כדי לתאר את החישובים המשמשים לקביעת הערכים האפשריים של minimum_bid_to_win ושל sampled_mediation_cpm_ahead_of_auction_winner, תחילה עלינו להגדיר את הדברים הבאים:

  • הנתונים הבאים מייצגים את העלויות לאלף חשיפות בשרשרת של תהליך בחירת הרשת, בסדר יורד:
    \[C_1, C_2, …, C_n\]
  • בדוגמה הבאה מוצגים שיעורי המילוי של עלויות לאלף חשיפות בשרשרת לבחירת רשת:
    \[f_1, f_2, …, f_n\]
  • הפונקציה הבאה קובעת את העלות הצפויה לאלף חשיפות ואת ההסתברות שלה מהרכיב 'שרשרת לבחירת רשת' \(i\), על סמך שיעור המילוי הנתון:
    \(X_i = \{C_i\) עם הסתברות \(f_i\); \(0\) עם הסתברות \(1 - f_i\}\)
  • שרשרת בחירת הרשת המנצחת הסופית תהיה:
    \[\{C_1, C_2, …, C_K, W\}\]
    כאשר \(W\) היא הצעת המחיר הזוכה, וגם \(C_K > W >= C_{K+1}\)
  • מחיר ההזמנה (או הסף התחתון) מסומן כ- \(F\).
  • הצעת המחיר על המקום השני מסומנת כ- \(R\).
חישובים לזוכה במכרז
שדה חישוב
minimum_bid_to_win
\(max\{F, R, X_{K+1}, …, X_n\}\)
sampled_mediation_cpm_ahead_
of_auction_winner
\(\{C_i\) בהסתברות \(\prod_{j=1}^{i-1}(1-f_j) \cdot f_i \div \prod_{j=1}^{K}(1-f_j)\}\)
עבור \(1 <= i <= K\).

חישובים למפסידים במכירה פומבית
שדה חישוב
minimum_bid_to_win
\(max\{F, W\}\)
sampled_mediation_cpm_ahead_
of_auction_winner
\(max\{X_1, …, X_K\}\)

דוגמה עם שרשרת פשוטה לבחירת רשת

נניח שבעל האפליקציה משתמש בבידינג בזמן אמת וגם בשרשרת לבחירת רשת (Mediation) ב-SDK באופן הבא:

שרשרת לבחירת רשת ב-SDK עלות צפויה לאלף חשיפות קצב מילוי
רשת 1 \(C_1 = $3.00\) \(f_1 = 5\%\)
רשת 2 \(C_2 = $2.00\) \(f_2 = 45\%\)
רשת 3 \(C_3 = $0.50\) \(f_3 = 80\%\)
רשת 4 \(C_4 = $0.10\) \(f_4 = 85\%\)

נניח שבעקבות המכרז של שיטת ה-RTB:

מכירה פומבית של RTB עלות לאלף חשיפות (CPM)
זוכה במכרז (W) 4 ש"ח
מקום שני במכרז (R) 0.20 ש"ח
מחיר מינימום / קומה (F) 0$
הצעת המחיר שזכתה במכרז

בדוגמה הבאה אפשר לראות איך מחושבים הערכים וההסתברויות של minimum_bid_to_win ושל sampled_mediation_cpm_ahead_of_auction_winner עבור הצעת המחיר שזכתה.

minimum_bid_to_win Probability
\(max(F, R, C_3) = $0.50\) \(f_3 = 80\%\)
\(max(F, R, C_4) = $0.10\) \((1-f_3) \cdot f_4 = 17\%\)
\(max(F, R, 0) = $0.05\) \((1-f_3) \cdot (1-f_4) = 3\%\)
sampled_mediation_cpm_
ahead_of_auction_winner
Probability
\(C_1 = $3.00\) \(f_1 \div (1-(1-f_1) \cdot (1-f_2)) =~ 10.5\%\)
\(C_2 = $2.00\) \(((1-f_1) \cdot f_2) \div (1-(1-f_1) \cdot (1-f_2)) =~ 89.5\%\)
הצעות מחיר שהפסידו במכירה הפומבית

בדוגמה הבאה אפשר לראות איך החישוב של הערכים וההסתברות של minimum_bid_to_win ושל sampled_mediation_cpm_ahead_of_auction_winner עבור הצעות המחיר שאבדו.

minimum_bid_to_win Probability
\(max(F, W) = $1.00\) \(100\%\)
sampled_mediation_cpm_
ahead_of_auction_winner
Probability
\(C_1 = $3.00\) \(f_1 = 5\%\)
\(C_2 = $2.00\) \((1-f_1) \cdot f_2 =~ 42.8\%\)
\(0\) \((1-f_1) \cdot (1-f_2) =~ 52.2\%\)

הקטנת הצעת מחיר

איחוד הצעות המחיר מתאר את העיבוד של מתחם יחידBidRequest למספר בקשות להצעות מחיר שנשלחות לאפליקציה שלכם. מאחר שיש להם מזהים זהים (BidRequest.google_query_id בפרוטוקול RTB של Authorized Buyers או BidRequestExt.google_query_id בפרוטוקול OpenRTB), אפשר לקבוע אילו בקשות להצעות מחיר מתואמות אחרי השטוח.

פורמטים של מודעות

הזדמנויות מסוימות למודעות יכולות לקבל מספר פורמטים. באמצעות התאמת הצעת המחיר, כל פורמט נשלח בבקשה נפרדת להצעת מחיר, כאשר מאפיינים כגון מזהי חיוב כשירים רלוונטיים לפורמט שצוין בבקשה.

בקשות להצעות מחיר שמכילות את הפורמטים הבאים יועברו כבקשות נפרדות להצעות מחיר:

  • באנר
  • וידאו
  • אודיו
  • מותאמת

דוגמה לשטח של פורמט מודעה

בהמשך מוצגת דוגמה לבקשה פשוטה של הצעת מחיר מסוג OpenRTB JSON ללא פורמט מודעה שטוח, בהשוואה לקבוצה מקבילה של בקשות שטוחות:

שטוח

לאחר השטוח

מבצעים

הזדמנות להצגת מודעה עבור מגיש הצעות מחיר נתון יכולה לחול על סוגים שונים של עסקאות, בנוסף למכרז הפתוח. באמצעות איחוד הצעות המחיר לעסקאות, בקשה אחת להצעת מחיר תישלח למכירה הפומבית הפתוחה, ובקשה אחת לכל סוג של עסקה במחיר קבוע. בפועל, האילוצים של המודעות עשויים להיות שונים בין מכרזים לבין סוגי עסקאות עם מחיר קבוע. לדוגמה, אם מדובר בהזדמנות של מודעה עם וידאו שזמינה גם למכירה פומבית פתוחה וגם למבצע במחיר קבוע, מגיש הצעת המחיר יקבל בקשות נפרדות להצעות מחיר לכל אחד מהאילוצים, כמו מגבלת זמן מקסימלית של מודעות והאם מותר להציג מודעות ניתנות לדילוג. כתוצאה מכך, שטח אחיד שמוחלט על הזדמנויות המודעות מאפשר לכם לזהות בקלות יותר את האילוצים של המודעה במכירה הפומבית הפתוחה ובעסקה במחיר קבוע.

משך סרטון מקסימלי שניתן לדלג עליו

הפרוטוקול של Google והטמעת OpenRTB תומכים בשדות הבאים: משך הסרטון ואפשרות הדילוג:

משך הסרטון משך הזמן שניתן לדלג עליו מודעות שניתן לדלג עליהן
פרוטוקול Google max_ad_duration skippable_max_ad_duration video_ad_skippable
נתוני OpenRTB maxduration לא רלוונטי skip

פירוש הדבר הוא שבעוד שפרוטוקול Google יכול לכלול משך זמן מפורט שלא ניתן לדלג עליו, אבל להטמעה של OpenRTB יש רק ערך אחד של משך זמן מקסימלי.

לפני הקטנת הצעת המחיר, הערך maxduration של OpenRTB יוגדר לחלק התחתון בשדות max_ad_duration ו-skippable_max_ad_duration של פרוטוקול Google. עכשיו ההתנהגות הזו משתנה לשליחת שתי בקשות נפרדות להצעות מחיר, כאשר הערכים האלה שונים: אחד שמייצג את maxduration עבור מודעות שניתן לדלג עליהן, והשני עבור הזדמנויות שלא ניתן לדלג עליהן.

הדוגמאות הבאות מראות איך בקשה של פרוטוקול Google מתורגמת ל-OpenRTB לפני ואחרי התאמת הצעת המחיר. לבקשת הפרוטוקול המקבילה ב-Google יש max_ad_duration מתוך 15 ו-skippable_max_ad_duration ב-60.

דוגמה max_ad_duration skip (נכון או לא נכון)
הבקשה המקורית ללא שטח 15 true
בקשה שטוחה מס' 1: לא ניתנת לדילוג 15 false
בקשה שטוחה מס' 2: ניתנת לדילוג 60 true

סגירה של בקשה להצעת מחיר למשך סרטון שניתן לדלג עליה תתרחש רק כאשר מתקיימים התנאים הבאים:

  • הבקשה מאפשרת וידאו.
  • ניתן לדלג גם על סרטונים שלא ניתן לדלג עליהם וגם על שני הדילוגים, ששניהם זהים.
  • בקשה זו כשירה להשתתף במכירה פומבית פרטית או במכירה פומבית פתוחה.
  • בחשבון של מגיש הצעת המחיר יש נקודות קצה פעילות של OpenRTB.

כדי לבטל את ההסכמה לשטח הזה, יש לפנות למנהל החשבון הטכני.

רכיבי Pod של וידאו

בקשות להצעות מחיר עבור Pod של סרטון עם מספר הזדמנויות של מודעות שטוחות, כך שכל בקשה להצעת מחיר היא הזדמנות של מודעה בודדת מתוך Pod זה. כך אתם יכולים להגיש הצעות מחיר להזדמנויות מרובות עם מודעות עבור תא מסוים.

פתיחת המדידה

שירות Open Measurement מאפשר לציין ספקי צד שלישי שמספקים שירותי מדידה ואימות עצמאיים עבור מודעות שמוצגות בסביבות של אפליקציות לנייד.

כדי לבדוק אם בעל אפליקציה תומך במדידה פתוחה בבקשה להצעת מחיר, צריך לבדוק אם הזדמנות המודעה מחריגה את המאפיין OmsdkType: OMSDK 1.0 שנמצא במאפייני קריאייטיב בלעדיים למוציא לאור. פרוטוקול Authorized Buyers יופיע בכתובת BidRequest.adslot[].excluded_attribute. עבור פרוטוקול OpenRTB, המאפיין הזה יופיע תחת המאפיין battr ב-banner או ב-Video, בהתאם לפורמט.

למידע נוסף על המשמעות של בקשות להצעות מחיר שמכילות אותות Open Bidding, מומלץ לעיין במאמר Open Measurement SDK SDK במרכז העזרה.

בקשות להצעות מחיר לדוגמה

בקטעים הבאים מוצגות דוגמאות לבקשות להצעות מחיר לסוגים שונים של מודעות.

באנר של אפליקציה

Google

OpenRTB JSON

פרוטוקול OpenRTB ל-Protobuf

מעברון באפליקציה

Google

OpenRTB JSON

פרוטוקול OpenRTB ל-Protobuf

סרטון מעברון באפליקציה

Google

פרוטוקול OpenRTB ל-Protobuf

מותאם לאפליקציה

Google

OpenRTB JSON

פרוטוקול OpenRTB ל-Protobuf

סרטונים באינטרנט

Google

מודעת באנר באינטרנט לנייד להגשת הצעות מחיר של Exchange

פרוטוקול OpenRTB ל-Protobuf