OpenRTB Protocol Buffer 2.6

  • The markdown content details the structure and fields of OpenRTB bid requests and responses, outlining objects like Imp, Publisher, Content, Regs, Data, and User.

  • It defines various enums used for categorizing ad placements, video properties, device types, and more, to standardize communication in the online advertising ecosystem.

  • It specifies native ad structures for requests and responses, outlining fields related to creative elements, impressions, and bidders.

  • It provides a technical specification for OpenRTB communication, crucial for ad exchanges and bidders, highlighting key elements and Google's support for them.

  • It defines data structures to represent geographical location, device information, and user agent details, providing detailed user and device context for potential advertisers.

View raw content Back to Reference page

option java_outer_classname = "OpenRtb";
package com.google.openrtb;

// OpenRTB extensions ("ext" fields in the spec & JSON representation)
// are represented here by Protocol Buffer extensions. This proto only
// reserves the range of IDs 100-9999 at every extensible object.
// Reserved ranges:
//   100-199:   Reserved for Google.
//   200-299:   Reserved for IAB's formal standard extensions.
//   300-999:   Free for use with other exchanges or projects.
//   1000-1999: Reserved for Google.
//   2000-9999: Free for use with other exchanges or projects.
//
// OpenRTB 2.0: The top-level bid request object contains a globally unique
// bid request or auction ID. This id attribute is required as is at least one
// impression object (Section 3.2.2). Other attributes in this top-level object
// establish rules and restrictions that apply to all impressions being offered.
//
// There are also several subordinate objects that provide detailed data to
// potential buyers. Among these are the Site and App objects, which describe
// the type of published media in which the impression(s) appear.
// These objects are highly recommended, but only one applies to a given
// bid request depending on whether the media is browser-based web content
// or a non-browser application, respectively.
message BidRequest {
  oneof distributionchannel_oneof {
    // Information about the publisher's website. Only applicable and
    // recommended for websites.
    // Supported by Google.
    Site site = 3;

    // Information about the publisher's app
    // (non-browser applications). Only applicable and recommended for apps.
    // Supported by Google.
    App app = 4;
  }

  // Unique ID of the bid request, provided by the exchange.
  // REQUIRED by the OpenRTB specification.
  // Supported by Google.
  required string id = 1;

  // OpenRTB 2.0: This object describes an ad placement or impression
  // being auctioned. A single bid request can include multiple Imp objects,
  // a use case for which might be an exchange that supports selling all
  // ad positions on a given page. Each Imp object has a required ID so that
  // bids can reference them individually.
  //
  // The presence of Banner (Section 3.2.3), Video (Section 3.2.4),
  // and/or Native (Section 3.2.5) objects subordinate to the Imp object
  // indicates the type of impression being offered. The publisher can choose
  // one such type which is the typical case or mix them at their discretion.
  // Any given bid for the impression must conform to one of the offered types.
  message Imp {
    // A unique identifier for this impression within the context of the bid
    // request (typically, value starts with 1, and increments up to n
    // for n impressions).
    // Supported by Google.
    required string id = 1;

    // OpenRTB 2.0: This object represents the most general type of
    // impression. Although the term "banner" may have very specific meaning
    // in other contexts, here it can be many things including a simple static
    // image, an expandable ad unit, or even in-banner video (refer to the Video
    // object in Section 3.2.4 for the more generalized and full featured video
    // ad units). An array of Banner objects can also appear within the Video
    // to describe optional companion ads defined in the VAST specification.
    //
    // The presence of a Banner as a subordinate of the Imp object indicates
    // that this impression is offered as a banner type impression.
    // At the publisher's discretion, that same impression may also be offered
    // as video and/or native by also including as Imp subordinates the Video
    // and/or Native objects, respectively. However, any given bid for the
    // impression must conform to one of the offered types.
    message Banner {
      // Exact width in device-independent pixels (DIPS); recommended if no
      // format objects are specified.
      // Supported by Google.
      optional int32 w = 1;

      // Exact height in device-independent pixels (DIPS); recommended if no
      // format objects are specified.
      // Supported by Google.
      optional int32 h = 2;

      // OpenRTB 2.4: This object represents an allowed size (
      // height and width combination) for a banner impression.
      // These are typically used in an array for an impression where
      // multiple sizes are permitted.
      message Format {
        // Width in device independent pixels (DIPS).
        // Supported by Google.
        optional int32 w = 1;

        // Height in device independent pixels (DIPS).
        // Supported by Google.
        optional int32 h = 2;

        // Relative width when expressing size as a ratio.
        // Not supported by Google.
        optional int32 wratio = 3;

        // Relative height when expressing size as a ratio.
        // Not supported by Google.
        optional int32 hratio = 4;

        // The minimum width in device independent pixels (DIPS) at
        // which the ad will be displayed when the size is expressed as a ratio.
        // Not supported by Google.
        optional int32 wmin = 5;
        extensions 100 to 9999;
      }

      // Array of format objects representing the banner sizes permitted.
      // If none are specified, then use of the h and w attributes
      // is highly recommended.
      // Supported by Google.
      repeated Format format = 15;

      // Unique identifier for this banner object. Recommended when Banner
      // objects are used with a Video object (Section 3.2.4) to represent
      // an array of companion ads. Values usually start at 1 and increase
      // with each object; should be unique within an impression.
      // Not supported by Google.
      optional string id = 3;

      // Ad position on screen.
      // Supported by Google.
      optional AdPosition pos = 4;

      // Blocked banner ad types.
      // Not supported by Google.
      repeated BannerAdType btype = 5 [packed = true];

      // Blocked creative attributes. See the full list of available attributes:
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--creative-attributes-
      // Supported by Google.
      repeated CreativeAttribute battr = 6 [packed = true];

      // Allowlist of content MIME types supported. Popular MIME types include,
      // but are not limited to "image/jpg", "image/gif" and
      // "application/x-shockwave-flash".
      // Supported by Google.
      repeated string mimes = 7;

      // Specify if the banner is delivered in the top frame (true)
      // or in an iframe (false).
      // Supported by Google.
      optional bool topframe = 8;

      // Directions in which the banner may expand.
      // Supported by Google.
      repeated ExpandableDirection expdir = 9 [packed = true];

      // List of supported API frameworks for this impression.
      // If an API is not explicitly listed, it is assumed not to be supported.
      // Supported by Google.
      repeated APIFramework api = 10 [packed = true];

      // Relevant only for Banner objects used with a Video object
      // (Section 3.2.7) in an array of companion ads. Indicates the
      // companion banner rendering mode relative to the associated
      // video, where false = concurrent, true = end-card.
      // Supported by Google.
      optional bool vcm = 16;

      // DEPRECATED in OpenRTB 2.4+, REMOVED in 2.6+; prefer the field format.
      // Maximum width in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 wmax = 11 [deprecated = true];

      // DEPRECATED in OpenRTB 2.4+, REMOVED in 2.6+; prefer the field format.
      // Maximum height in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 hmax = 12 [deprecated = true];

      // DEPRECATED in OpenRTB 2.4+, REMOVED in 2.6+; prefer the field format.
      // Minimum width in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 wmin = 13 [deprecated = true];

      // DEPRECATED in OpenRTB 2.4+, REMOVED in 2.6+; prefer the field format.
      // Minimum height in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 hmin = 14 [deprecated = true];
      extensions 100 to 9999;
    }

    // A Banner object (Section 3.2.3); required if this impression is
    // offered as a banner ad opportunity.
    // Supported by Google.
    optional Banner banner = 2;

    // Indicates a price floor which applies to video or audio creatives within
    // the specified duration range.
    message DurFloors {
      // An integer indicating the low end of a duration range in seconds,
      // inclusive. If this value is missing, the low end is unbounded,
      // indicating any positive duration. Either mindur or maxdur is required,
      // but not both.
      // Supported by Google.
      optional int32 mindur = 1;

      // An integer indicating the high end of a duration range in seconds,
      // exclusive. If this value is missing, the high end is unbounded. Either
      // mindur or maxdur is required, but not both.
      // Supported by Google.
      optional int32 maxdur = 2;

      // Minimum bid for a given impression opportunity, if bidding with a
      // creative in this duration range, expressed in CPM. For any creatives
      // whose durations are outside of the defined min/max, the bidfloor at
      // the Imp level will serve as the default floor. The minimum bid is
      // expressed in the currency indicated in BidRequest.imp.bidfloorcur.
      // Supported by Google.
      optional double bidfloor = 3;
    }

    // OpenRTB 2.0: This object represents an in-stream video impression.
    // Many of the fields are non-essential for minimally viable transactions,
    // but are included to offer fine control when needed. Video in OpenRTB
    // generally assumes compliance with the VAST standard. As such, the notion
    // of companion ads is supported by optionally including an array of Banner
    // objects (refer to the Banner object in Section 3.2.3) that define these
    // companion ads.
    //
    // The presence of a Video as a subordinate of the Imp object indicates
    // that this impression is offered as a video type impression. At the
    // publisher's discretion, that same impression may also be offered as
    // banner and/or native by also including as Imp subordinates the Banner
    // and/or Native objects, respectively. However, any given bid for the
    // impression must conform to one of the offered types.
    message Video {
      // Allowlist of content MIME types supported. Popular MIME types include,
      // but are not limited to "image/jpg", "image/gif" and
      // "application/x-shockwave-flash".
      // REQUIRED by the OpenRTB specification: at least 1 element.
      // Supported by Google.
      repeated string mimes = 1;

      // Minimum video ad duration in seconds.
      // This field is mutually exclusive with rqddurs; only one of
      // minduration and rqddurs may be in a bid request.
      // Supported by Google.
      optional int32 minduration = 3 [default = 0];

      // Maximum video ad duration in seconds.
      // This field is mutually exclusive with rqddurs; only one of
      // maxduration and rqddurs may be in a bid request.
      // Supported by Google.
      optional int32 maxduration = 4;

      // Indicates the start delay in seconds for pre-roll, mid-roll, or
      // post-roll ad placements.
      // Refer to enum StartDelay for generic values.
      // Supported by Google.
      optional int32 startdelay = 8;

      // The maximum number of ads that might be served into a dynamic video
      // ad pod. If poddur is set, but maxseq is unset or 0, you don't have a
      // restriction on how many ads can serve into a video pod. Google only
      // supports dynamic pods.
      // Supported by Google.
      optional int32 maxseq = 28;

      // Indicates the total amount of time in seconds that advertisers
      // may fill for a dynamic video ad pod. This field refers to the length
      // of the entire ad break, whereas minduration/maxduration/rqddurs are
      // constraints relating to the slots that make up the pod. If unset, the
      // ad slot is not part of a pod.
      // Supported by Google.
      optional int32 poddur = 29;

      // Array of supported video bid response protocols.
      // At least one supported protocol must be specified.
      // Supported by Google.
      repeated Protocol protocols = 21 [packed = true];

      // Width of the video player in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 w = 6;

      // Height of the video player in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 h = 7;

      // Unique identifier indicating that an impression opportunity
      // belongs to a video ad pod. If multiple impression opportunities
      // within a bid request share the same podid, this indicates that
      // those impression opportunities belong to the same video ad pod.
      // Not supported by Google.
      optional string podid = 30;

      // The sequence (position) of the video ad pod within a content stream.
      // Not supported by Google.
      optional PodSequence podseq = 31 [default = POD_SEQUENCE_ANY];

      // Precise acceptable durations for video creatives in
      // seconds. This field specifically targets the Live TV use case
      // where non-exact ad durations would result in undesirable dead air.
      // This field is mutually exclusive with minduration and maxduration;
      // if rqddurs is specified, minduration and maxduration must not be
      // specified and the other way around.
      // Not supported by Google.
      repeated int32 rqddurs = 32 [packed = true];

      // Deprecated. This will be removed in January 2025 per the IAB here:
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--placement-subtypes---video-
      // Placement type for the impression.
      // Supported by Google.
      optional VideoPlacementType placement = 26 [deprecated = true];

      // Video placement type declared by the publisher for this impression.
      // Introduced in OpenRTB 2.6 to reflect updated industry definitions
      // around different types of video ad placements. This field supersedes
      // the Video.placement field. May be unset if the publisher did not
      // declare a video placement type.
      // Supported by Google.
      optional Plcmt plcmt = 35 [default = PLCMT_UNKNOWN];

      // Indicates if the impression must be linear or nonlinear. If none
      // specified, assume all are allowed.
      // Supported by Google.
      optional VideoLinearity linearity = 2;

      // Indicates if the player will allow the video to be skipped.
      // If a bidder sends markup/creative that is itself skippable, the
      // Bid object should include the attr array with an element of
      // AD_CAN_BE_SKIPPED indicating skippable video.
      // Supported by Google.
      optional bool skip = 23;

      // Videos of total duration greater than this number of seconds
      // can be skippable; only applicable if the ad is skippable.
      // Not supported by Google.
      optional int32 skipmin = 24;

      // Number of seconds a video must play before skipping is
      // enabled; only applicable if the ad is skippable.
      // Not supported by Google.
      optional int32 skipafter = 25;

      // DEPRECATED in OpenRTB 2.6+; prefer the field podseq.
      // If multiple ad impressions are offered in the same bid request,
      // the sequence number will allow for the coordinated delivery of
      // multiple creatives.
      // Not supported by Google.
      optional int32 sequence = 9 [deprecated = true, default = 1];

      // For video ad pods, this value indicates that the seller can
      // guarantee delivery against the indicated slot position in the pod.
      // Not supported by Google.
      optional SlotPositionInPod slotinpod = 33 [default =
        SLOT_POSITION_POD_ANY];

      // Minimum CPM per second. This is a price floor for the
      // "dynamic" portion of a video ad pod, relative to the duration
      // of bids an advertiser may submit.
      // Not supported by Google.
      optional double mincpmpersec = 34;

      // Blocked creative attributes. See the full list of available attributes:
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--creative-attributes-
      // Supported by Google.
      repeated CreativeAttribute battr = 10 [packed = true];

      // Maximum extended video ad duration, if extension is allowed.
      // If blank or 0, extension is not allowed. If -1, extension is allowed,
      // and there is no time limit imposed. If greater than 0, then the value
      // represents the number of seconds of extended play supported beyond
      // the maxduration value.
      // Not supported by Google.
      optional int32 maxextended = 11;

      // Minimum bit rate in Kbps.
      // Supported by Google.
      optional int32 minbitrate = 12;

      // Maximum bit rate in Kbps.
      // Supported by Google.
      optional int32 maxbitrate = 13;

      // Indicates if letter-boxing of 4:3 content into a 16:9 window is
      // allowed.
      // Not supported by Google.
      optional bool boxingallowed = 14 [default = true];

      // Playback methods that may be in use. If none are specified, any
      // method may be used. Only one method is typically used in practice.
      // As a result, this array may be converted to an integer in a future
      // version of the specification. It is strongly advised to use only
      // the first element of this array in preparation for this change.
      // Supported by Google.
      repeated PlaybackMethod playbackmethod = 15 [packed = true];

      // The event that causes playback to end.
      // Supported by Google.
      optional PlaybackCessationMode playbackend = 27;

      // Supported delivery methods (for example, streaming, progressive).
      // Supported by Google.
      repeated ContentDeliveryMethod delivery = 16 [packed = true];

      // Ad position on screen.
      // Supported by Google.
      optional AdPosition pos = 17;

      // Array of Banner objects (Section 3.2.3) if companion ads are available.
      // Supported by Google.
      repeated Banner companionad = 18;

      // List of supported API frameworks for this impression.
      // If an API is not explicitly listed, it is assumed not to be supported.
      // Supported by Google.
      repeated APIFramework api = 19 [packed = true];

      // Supported VAST companion ad types. Recommended if companion Banner
      // objects are included through the companionad array.
      // Supported by Google.
      repeated CompanionType companiontype = 20 [packed = true];

      // An array of DurFloors objects indicating the floor prices for video
      // creatives of various durations that the buyer may bid with.
      // DurFloors objects are non-overlapping and sorted by mindur.
      // For example: < 16 seconds at a floor of $5, 16-30 seconds at a floor of
      // $10, and >= 31 seconds at a floor of $20.
      // Supported by Google.
      repeated DurFloors durfloors = 36;

      // DEPRECATED in OpenRTB 2.3+, REMOVED in 2.6.
      // Use the field <code>protocols</code>.
      // Not supported by Google.
      optional Protocol protocol = 5 [deprecated = true];
      extensions 100 to 9999;
    }

    // A Video object (Section 3.2.4); required if this impression is
    // offered as a video ad opportunity.
    // Supported by Google.
    optional Video video = 3;

    // This object represents an audio type impression. Many of the fields
    // are non-essential for minimally viable transactions, but are included
    // to offer fine control when needed. Audio in OpenRTB generally assumes
    // compliance with the DAAST standard. As such, the notion of companion
    // ads is supported by optionally including an array of Banner objects
    // that define these companion ads.
    //
    // The presence of a Audio as a subordinate of the Imp object indicates
    // that this impression is offered as an audio type impression.
    // At the publisher's discretion, that same impression may also be offered
    // as banner, video, and/or native by also including as Imp subordinates
    // objects of those types. However, any given bid for the impression must
    // conform to one of the offered types.
    message Audio {
      // Content MIME types supported (for example, "audio/mp4").
      // REQUIRED by the OpenRTB specification: at least 1 element.
      // Supported by Google.
      repeated string mimes = 1;

      // Minimum audio ad duration in seconds.
      // This field is mutually exclusive with rqddurs; only one of minduration
      // and rqddurs may be in a bid request.
      // Supported by Google.
      optional int32 minduration = 2 [default = 0];

      // Maximum audio ad duration in seconds.
      // This field is mutually exclusive with rqddurs; only one of maxduration
      // and rqddurs may be in a bid request.
      // Supported by Google.
      optional int32 maxduration = 3;

      // Indicates the total amount of time in seconds that advertisers may
      // fill for a "dynamic" audio ad pod, or the dynamic portion of a
      // "hybrid" ad pod. This field is required only for the dynamic
      // portion(s) of audio ad pods. This field refers to the length of the
      // entire ad break, whereas minduration/maxduration/rqddurs are
      // constraints relating to the slots that make up the pod.
      // Not supported by Google.
      optional int32 poddur = 25;

      // Array of supported audio protocols.
      // Supported by Google.
      repeated Protocol protocols = 4 [packed = true];

      // Indicates the start delay in seconds for pre-roll, mid-roll, or
      // post-roll ad placements.
      // Refer to enum StartDelay for generic values.
      // Supported by Google.
      optional int32 startdelay = 5;

      // Precise acceptable durations for audio creatives in seconds.
      // This field specifically targets the live audio/radio use case where
      // non-exact ad durations would result in undesirable dead air.
      // This field is mutually exclusive with minduration and
      // maxduration; if rqddurs is specified, minduration and
      // maxduration must not be specified and the other way around.
      // Not supported by Google.
      repeated int32 rqddurs = 26 [packed = true];

      // Unique identifier indicating that an impression opportunity
      // belongs to an audio ad pod. If multiple impression opportunities
      // within a bid request share the same podid, this indicates that
      // those impression opportunities belong to the same audio ad pod.
      // Not supported by Google.
      optional string podid = 27;

      // The sequence (position) of the audio ad pod within a content stream.
      // Not supported by Google.
      optional PodSequence podseq = 28 [default = POD_SEQUENCE_ANY];

      // DEPRECATED in OpenRTB 2.6+; prefer the field podseq.
      // If multiple ad impressions are offered in the same bid request,
      // the sequence number will allow for the coordinated delivery of
      // multiple creatives.
      // Not supported by Google.
      optional int32 sequence = 6 [deprecated = true, default = 1];

      // For audio ad pods, this value indicates that the seller can
      // guarantee delivery against the indicated sequence.
      // Not supported by Google.
      optional SlotPositionInPod slotinpod = 29 [default =
        SLOT_POSITION_POD_ANY];

      // Minimum CPM per second. This is a price floor for the
      // "dynamic" portion of an audio ad pod, relative to the duration
      // of bids an advertiser may submit.
      // Not supported by Google.
      optional double mincpmpersec = 30;

      // Blocked creative attributes. See the full list of available attributes:
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--creative-attributes-
      // Supported by Google.
      repeated CreativeAttribute battr = 7 [packed = true];

      // Maximum extended video ad duration, if extension is allowed.
      // If blank or 0, extension is not allowed. If -1, extension is allowed,
      // and there is no time limit imposed. If greater than 0, then the value
      // represents the number of seconds of extended play supported beyond
      // the maxduration value.
      // Not supported by Google.
      optional int32 maxextended = 8;

      // Minimum bit rate in Kbps.
      // Not supported by Google.
      optional int32 minbitrate = 9;

      // Maximum bit rate in Kbps.
      // Not supported by Google.
      optional int32 maxbitrate = 10;

      // Supported delivery methods (for example, streaming, progressive).
      // Supported by Google.
      repeated ContentDeliveryMethod delivery = 11 [packed = true];

      // Array of Banner objects if companion ads are available.
      // Supported by Google.
      repeated Banner companionad = 12;

      // List of supported API frameworks for this impression.
      // If an API is not explicitly listed, it is assumed not to be supported.
      // Supported by Google.
      repeated APIFramework api = 13 [packed = true];

      // Supported DAAST companion ad types. Recommended if companion Banner
      // objects are included through the companionad array.
      // Supported by Google.
      repeated CompanionType companiontype = 20 [packed = true];

      // The maximum number of ads that can be played in an ad pod.
      // Not supported by Google.
      optional int32 maxseq = 21;

      // Type of audio feed.
      // Supported by Google.
      optional FeedType feed = 22;

      // Indicates if the ad is stitched with audio content or delivered
      // independently.
      // Not supported by Google.
      optional bool stitched = 23;

      // Volume normalization mode.
      // Not supported by Google.
      optional VolumeNormalizationMode nvol = 24;

      // An array of DurFloors objects indicating the floor prices for audio
      // creatives of various durations that the buyer may bid with.
      // DurFloors objects are non-overlapping and sorted by mindur.
      // For example: < 16 seconds at a floor of $5, 16-30 seconds at a floor of
      // $10, and >= 31 seconds at a floor of $20.
      // Supported by Google.
      repeated DurFloors durfloors = 31;
      extensions 100 to 9999;
    }

    // An Audio object; required if this impression is offered
    // as an audio ad opportunity.
    // Supported by Google.
    optional Audio audio = 15;

    // Name of ad mediation partner, SDK technology, or player responsible
    // for rendering ad (typically video or mobile). Used by some ad servers
    // to customize ad code by partner. Recommended for video and/or apps.
    // Supported by Google.
    optional string displaymanager = 4;

    // Version of ad mediation partner, SDK technology, or player responsible
    // for rendering ad (typically video or mobile). Used by some ad servers
    // to customize ad code by partner. Recommended for video and/or apps.
    // Supported by Google.
    optional string displaymanagerver = 5;

    // true = the ad is interstitial or full screen, false = not interstitial.
    // Supported by Google.
    optional bool instl = 6;

    // Identifier for specific ad placement or ad tag that was used to
    // initiate the auction. This can be useful for debugging of any issues,
    // or for optimization by the buyer.
    // Supported by Google.
    optional string tagid = 7;

    // Minimum bid for this impression expressed in CPM.
    // Supported by Google.
    optional double bidfloor = 8 [default = 0];

    // The currency in which the bid floor is expressed. Specified using
    // ISO 4217 alpha codes.
    // Supported by Google.
    optional string bidfloorcur = 9 [default = "USD"];

    // Indicates the type of browser opened upon clicking the
    // creative in an app, where false = embedded, true = native.
    // Note that the Safari View Controller in iOS 9.x devices is considered
    // a native browser for purposes of this attribute.
    // Supported by Google.
    optional bool clickbrowser = 16;

    // Indicates if the impression requires secure HTTPS URL creative
    // assets and markup. If omitted, the secure state is unknown, but
    // non-secure HTTP support can be assumed.
    // Supported by Google.
    optional bool secure = 12;

    // Array of exchange-specific names of supported iframe busters.
    // Not supported by Google.
    repeated string iframebuster = 10;

    // Indicates whether the user receives a reward for viewing the ad.
    // Typically video ad implementations allow users to read an additional news
    // article for free, receive an extra life in a game, or get a sponsored
    // ad-free music session. The reward is typically distributed after the
    // video ad is completed.
    // Supported by Google.
    optional bool rwdd = 18 [default = false];

    // Indicates if server-side ad insertion (e.g., stitching an ad into an
    // audio or video stream) is in use and the impact of this on asset
    // and tracker retrieval.
    // Not supported by Google.
    optional ServerSideAdInsertionType ssai = 19 [default =
      SERVER_SIDE_AD_INSERTION_TYPE_UNKNOWN];

    // OpenRTB 2.2: This object is the private marketplace container for
    // direct deals between buyers and sellers that may pertain to this
    // impression. The actual deals are represented as a collection of
    // Deal objects. Refer to Section 7.2 for more details.
    message Pmp {
      // Indicator of auction eligibility to seats named in the Direct Deals
      // object, where false = all bids are accepted, true = bids are restricted
      // to the deals specified and the terms thereof.
      // Supported by Google.
      optional bool private_auction = 1 [default = false];

      // OpenRTB 2.2: This object constitutes a specific deal that was struck
      // a priori between a buyer and a seller. Its presence with the Pmp
      // collection indicates that this impression is available under the terms
      // of that deal. Refer to Section 7.2 for more details.
      message Deal {
        // A unique identifier for the direct deal.
        // REQUIRED by the OpenRTB specification.
        // Supported by Google.
        required string id = 1;

        // Minimum bid for this deal expressed in CPM.
        // Supported by Google.
        optional double bidfloor = 2 [default = 0];

        // The currency in which the deal floor is expressed. Specified using
        // ISO 4217 alpha codes.
        // Supported by Google.
        optional string bidfloorcur = 3 [default = "USD"];

        // Allowlist of buyer seats (for example, advertisers, agencies) that
        // can bid on this deal. IDs of seats and knowledge of the buyer's
        // customers to which they refer must be coordinated between bidders and
        // the exchange a priori. Omission implies no seat restrictions.
        // Supported by Google.
        repeated string wseat = 4;

        // Array of advertiser domains (for example, advertiser.com) allowed to
        // bid on this deal. Omission implies no advertiser restrictions.
        // Not supported by Google.
        repeated string wadomain = 5;

        // Optional override of the overall auction type of the bid request.
        // Supports the additional value FIXED_PRICE: the value passed in
        // bidfloor is the agreed upon deal price.
        // Supported by Google.
        optional AuctionType at = 6;
        extensions 100 to 9999;
      }

      // Array of Deal (Section 3.2.18) objects that convey the specific deals
      // applicable to this impression.
      // Supported by Google.
      repeated Deal deals = 2;
      extensions 100 to 9999;
    }

    // A Pmp object (Section 3.2.17) containing any private marketplace deals
    // in effect for this impression.
    // Supported by Google.
    optional Pmp pmp = 11;

    // OpenRTB 2.3: This object represents a native type impression.
    // Native ad units are intended to blend seamlessly into the surrounding
    // content (for example, a sponsored Twitter or Facebook post). As such, the
    // response must be well-structured to afford the publisher fine-grained
    // control over rendering.
    //
    // The Native Subcommittee has developed a companion specification to
    // OpenRTB called the Native Ad Specification. It defines the request
    // parameters and response markup structure of native ad units.
    // This object provides the means of transporting request parameters as an
    // opaque string so that the specific parameters can evolve separately
    // under the auspices of the Native Ad Specification. Similarly, the
    // ad markup served will be structured according to that specification.
    //
    // The presence of a Native as a subordinate of the Imp object indicates
    // that this impression is offered as a native type impression.
    // At the publisher's discretion, that same impression may also be offered
    // as banner and/or video by also including as Imp subordinates the Banner
    // and/or Video objects, respectively. However, any given bid for the
    // impression must conform to one of the offered types.
    message Native {
      oneof request_oneof {
        // Request payload complying with the Native Ad Specification.
        // Exactly one of {request, request_native} should be used;
        // this is the OpenRTB-compliant field for JSON serialization.
        string request = 1;

        // Request payload complying with the Native Ad Specification.
        // Exactly one of {request, request_native} should be used;
        // this is an alternate field preferred for Protobuf serialization.
        NativeRequest request_native = 50;
      }

      // Version of the Native Ad Specification to which request complies.
      optional string ver = 2;

      // List of supported API frameworks for this impression.
      // If an API is not explicitly listed, it is assumed not to be supported.
      repeated APIFramework api = 3 [packed = true];

      // Blocked creative attributes. See the full list of available attributes:
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--creative-attributes-
      repeated CreativeAttribute battr = 4 [packed = true];
      extensions 100 to 9999;
    }

    // A Native object (Section 3.2.5); required if this impression is
    // offered as a native ad opportunity.
    // Supported by Google.
    optional Native native = 13;

    // Advisory as to the number of seconds that may elapse
    // between the auction and the actual impression.
    // Supported by Google.
    optional int32 exp = 14;

    // OpenRTB 2.5: This object is associated with an impression as
    // an array of metrics. These metrics can offer insight into
    // the impression to assist with decisioning such as average recent
    // viewability, click-through rate, or another metric. Each metric is
    // identified by its type, reports the value of the metric, and optionally
    // identifies the source or vendor measuring the value.
    message Metric {
      // Type of metric being presented using exchange curated string
      // names which should be published to bidders a priori.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      optional string type = 1;

      // Number representing the value of the metric.
      // Probabilities must be in the range 0.0 - 1.0.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      optional double value = 2;

      // Source of the value using exchange curated string names
      // which should be published to bidders a priori.
      // If the exchange itself is the source versus a third party,
      // "EXCHANGE" is recommended.
      // Supported by Google.
      optional string vendor = 3;
      extensions 100 to 9999;
    }

    // An array of Metric object.
    // Supported by Google.
    repeated Metric metric = 17;

    // Details on automatic ad slot refreshes: frequency, triggers, and refresh
    // count since last page load for this specific slot.
    message Refresh {
      // Information on how often and what triggers an ad slot being refreshed.
      message RefSettings {
        // The type of the declared auto refresh. Refer to List: Auto Refresh
        // Trigger in AdCOM 1.0:
        // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list-auto-refresh-triggers-.
        // Supported by Google.
        optional int32 reftype = 1;

        // The minimum refresh interval in seconds. This applies to all refresh
        // types. This is the (uninterrupted) time the ad creative will be
        // rendered before refreshing to the next creative. If the field is
        // absent, the exposure time is unknown. This field does not account for
        // viewability or external factors such as a user leaving a page.
        // Supported by Google.
        optional int32 minint = 2;
      }

      // Describes the mechanics of how an ad placement automatically refreshes.
      // Supported by Google.
      repeated RefSettings refsettings = 1;

      // The number of times this ad slot had been refreshed since last page
      // load.
      // Supported by Google.
      optional int32 count = 2;
      extensions 100 to 9999;
    }

    // Details about ad slots being refreshed automatically.
    // Supported by Google.
    optional Refresh refresh = 22;
    extensions 100 to 9999;
  }

  // Array of Imp objects (Section 3.2.2) representing the impressions offered.
  // At least 1 Imp object is required.
  // Supported by Google.
  repeated Imp imp = 2;

  // OpenRTB 2.0: This object describes the publisher of the media in which
  // the ad will be displayed. The publisher is typically the seller
  // in an OpenRTB transaction.
  message Publisher {
    // Exchange-specific publisher ID.
    // Supported by Google.
    optional string id = 1;

    // Publisher name (may be aliased at publisher's request).
    // Not supported by Google.
    optional string name = 2;

    // The taxonomy in use for cat.
    // Not supported by Google.
    optional CategoryTaxonomy cattax = 5 [default = IAB_CONTENT_1_0];

    // Array of IAB content categories that describe the publisher.
    // The taxonomy to be used is defined by the cattax field.
    // Not supported by Google.
    repeated string cat = 3;

    // Highest level domain of the publisher (for example, "publisher.com").
    // Not supported by Google.
    optional string domain = 4;
    extensions 100 to 9999;
  }

  // OpenRTB 2.0: This object describes the content in which the impression
  // will appear, which may be syndicated or non-syndicated content.
  // This object may be useful when syndicated content contains impressions and
  // does not necessarily match the publisher's general content.
  // The exchange might or might not have knowledge of the page where the
  // content is running, as a result of the syndication method.
  // For example might be a video impression embedded in an iframe on an
  // unknown web property or device.
  message Content {
    // ID uniquely identifying the content.
    // Not supported by Google.
    optional string id = 1;

    // Content episode number (typically applies to video content).
    // Not supported by Google.
    optional int32 episode = 2;

    // Content title.
    // Video Examples: "Search Committee" (television), "A New Hope" (movie),
    // or "Endgame" (made for web).
    // Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
    // (Time magazine article).
    // Not supported by Google.
    optional string title = 3;

    // Content series.
    // Video Examples: "The Office" (television), "Star Wars" (movie),
    // or "Arby 'N' The Chief" (made for web).
    // Non-Video Example: "Ecocentric" (Time Magazine blog).
    // Not supported by Google.
    optional string series = 4;

    // Content season; typically for video content, for example, "Season 3".
    // Not supported by Google.
    optional string season = 5;

    // Artist credited with the content.
    // Not supported by Google.
    optional string artist = 21;

    // Comma-separated list of genres describing the content. Google uses names
    // from the IAB Content 2.2 Taxonomy, provided as
    // Publisher Provided Signals (PPS), for example,
    // "News,Cooking,Nutrition".
    // This is a beta implementation that is subject to change:
    // https://support.google.com/admanager/answer/12451124
    // Supported by Google.
    optional string genre = 22;

    // Album to which the content belongs; typically for audio.
    // Not supported by Google.
    optional string album = 23;

    // International Standard Recording Code conforming to ISO-3901.
    // Not supported by Google.
    optional string isrc = 24;

    // OpenRTB 2.0: This object defines the producer of the content in which
    // the ad will be shown. This is particularly useful when the content is
    // syndicated and may be distributed through different publishers and thus
    // when the producer and publisher are not necessarily the same entity.
    message Producer {
      // Content producer or originator ID. Useful if content is syndicated,
      // and may be posted on a site using embed tags.
      // Not supported by Google.
      optional string id = 1;

      // Content producer or originator name (for example, "Warner Bros").
      // Not supported by Google.
      optional string name = 2;

      // The taxonomy in use for cat.
      // Not supported by Google.
      optional CategoryTaxonomy cattax = 5 [default = IAB_CONTENT_1_0];

      // Array of IAB content categories that describe the content producer.
      // The taxonomy to be used is defined by the cattax field.
      // Not supported by Google.
      repeated string cat = 3;

      // Highest level domain of the content producer (for example,
      // "producer.com").
      // Supported by Google.
      optional string domain = 4;
      extensions 100 to 9999;
    }

    // Details about the content Producer (Section 3.2.10).
    // Supported by Google.
    optional Producer producer = 15;

    // URL of the content, for buy-side contextualization or review.
    // Supported by Google.
    optional string url = 6;

    // The taxonomy in use for cat.
    // Not supported by Google.
    optional CategoryTaxonomy cattax = 27 [default = IAB_CONTENT_1_0];

    // Array of IAB content categories that describe the content.
    // The taxonomy to be used is defined by the cattax field.
    // Not supported by Google.
    repeated string cat = 7;

    // Production quality.
    // Supported by Google.
    optional ProductionQuality prodq = 25;

    // Type of content (for example, game, video or text).
    // Not supported by Google.
    optional ContentContext context = 20;

    // Content rating.
    // Possible values: "DV-G", "DV-PG", "DV-T", "DV-MA".
    // Supported by Google.
    optional string contentrating = 10;

    // User rating of the content (for example, number of stars or likes).
    // Supported by Google.
    optional string userrating = 11;

    // Media rating per QAG guidelines.
    // Not supported by Google.
    optional QAGMediaRating qagmediarating = 17;

    // Comma separated list of keywords describing the content.
    // Only one of 'keywords' or 'kwarray' may be present.
    // Not supported by Google.
    optional string keywords = 9;

    // Array of keywords describing the content.
    // Only one of 'keywords' or 'kwarray' may be present.
    // Not supported by Google.
    repeated string kwarray = 32;

    // false = not live, true = content is live (for example, stream, live
    // blog).
    // Supported by Google.
    optional bool livestream = 13;

    // false = indirect, true = direct.
    // Not supported by Google.
    optional bool sourcerelationship = 14;

    // Length of content in seconds; appropriate for video or audio.
    // Supported by Google.
    optional int32 len = 16;

    // Content language using ISO-639-1-alpha-2.
    // Only one of language or langb should be present.
    // Supported by Google.
    optional string language = 19;

    // Content language using IETF BCP 47.
    // Only one of language or langb should be present.
    // Not supported by Google.
    optional string langb = 29;

    // Indicator of whether or not the content is embeddable (for example, an
    // embeddable video player).
    // Not supported by Google.
    optional bool embeddable = 18;

    // Additional content data. Each object represents a different data source.
    // Supported by Google. Used for Publisher Provided Signals:
    // https://support.google.com/admanager/answer/12451124
    repeated Data data = 28;

    // This object describes the network an ad will be displayed on.
    // A Network is defined as the parent entity of the Channel object's entity
    // for the purposes of organizing Channels. Examples are companies that own
    // and/or license a collection of content channels (Viacom, Discovery, CBS,
    // WarnerMedia, Turner and others), or studio that creates such content and
    // self-distributes content. Name is a human-readable field while domain and
    // id can be used for reporting and targeting purposes.
    message Network {
      // A unique identifier assigned by the publisher, for example "net-123".
      // This may not be a unique identifier across all supply sources.
      // Not supported by Google.
      optional string id = 1;

      // Network the content is on (e.g., a TV network like "ABC").
      // Not supported by Google.
      optional string name = 2;

      // The primary domain of the network (e.g. "abc.com" in the case
      // of the network ABC). It is recommended to include the top
      // private domain (PSL+1) for DSP targeting normalization purposes.
      // Not supported by Google.
      optional string domain = 3;
      extensions 100 to 9999;
    }

    // Details about the network the content is on.
    // Not supported by Google.
    optional Network network = 30;

    // This object describes the channel an ad will be displayed on.
    // A Channel is defined as the entity that curates a content library,
    // or stream within a brand name for viewers. Examples are specific view
    // selectable 'channels' within linear and streaming television
    // (MTV, HGTV, CNN, BBC One, etc) or a specific stream of audio content
    // commonly called 'stations.' Name is a human-readable field while domain
    // and id can be used for reporting and targeting purposes.
    message Channel {
      // A unique identifier assigned by the publisher, for example "ch-456".
      // This may not be a unique identifier across all supply sources.
      // Not supported by Google.
      optional string id = 1;

      // Channel the content is on (e.g., a local channel like "WABC-TV").
      // Not supported by Google.
      optional string name = 2;

      // The primary domain of the channel (e.g. "abc7ny.com" in the
      // case of the local channel WABC-TV). It is recommended to
      // include the top private domain (PSL+1) for DSP targeting
      // normalization purposes.
      // Not supported by Google.
      optional string domain = 3;
      extensions 100 to 9999;
    }

    // Details about the channel the content is on.
    // Not supported by Google.
    optional Channel channel = 31;

    // DEPRECATED in OpenRTB 2.4+. Prefer the field <code>prodq</code>.
    // Video quality per IAB's classification.
    // Not supported by Google.
    optional ProductionQuality videoquality = 8 [deprecated = true];
    extensions 100 to 9999;
  }

  // This object is present in the bid request when the impression will be
  // rendered on a website rather than a non-browser application.
  message Site {
    // Not supported by Google.
    optional string id = 1;

    // Not supported by Google.
    optional string name = 2;

    // Not supported by Google.
    optional string domain = 3;

    // Not supported by Google.
    optional CategoryTaxonomy cattax = 16 [default = IAB_CONTENT_1_0];

    // Not supported by Google.
    repeated string cat = 4;

    // Not supported by Google.
    repeated string sectioncat = 5;

    // Not supported by Google.
    repeated string pagecat = 6;

    // URL of the page where the impression will be shown with URL parameters
    // removed.
    // Supported by Google.
    optional string page = 7;

    // Not supported by Google.
    optional bool privacypolicy = 8;

    // Not supported by Google.
    optional string ref = 9;

    // Not supported by Google.
    optional string search = 10;

    // Details about the publisher of the site.
    // Supported by Google.
    optional Publisher publisher = 11;

    // Details about the content within the site.
    // Supported by Google.
    optional Content content = 12;

    // Not supported by Google.
    optional string keywords = 13;

    // Not supported by Google.
    repeated string kwarray = 18;

    // Indicates if the site has been programmed to optimize layout
    // when viewed on mobile devices.
    // Supported by Google.
    optional bool mobile = 15;
    extensions 100 to 9999;
  }

  // This object is present in the bid request when the impression will be
  // rendered in a non-browser application rather than a website.
  message App {
    // Not supported by Google.
    optional string id = 1;

    // Application name.
    // In Google's OpenRTB implementation, app names for SDK-less requests
    // (mostly from connected TVs) can be provided by the publisher directly in
    // the request.
    // Supported by Google.
    optional string name = 2;

    // Not supported by Google.
    optional string domain = 3;

    // Not supported by Google.
    optional CategoryTaxonomy cattax = 17 [default = IAB_CONTENT_1_0];

    // Not supported by Google.
    repeated string cat = 4;

    // Not supported by Google.
    repeated string sectioncat = 5;

    // Not supported by Google.
    repeated string pagecat = 6;

    // Version of the application specified in the bundle field (for example,
    // "2.0.1").
    // Supported by Google.
    optional string ver = 7;

    // A platform-specific application identifier intended to be
    // unique to the app and independent of the exchange. On Android,
    // this should be a bundle or package name (for example, com.foo.mygame).
    // On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
    // TVs), it can be provided by the publisher directly in the request.
    // Supported by Google.
    optional string bundle = 8;

    // Not supported by Google.
    optional bool privacypolicy = 9;

    // Not supported by Google.
    optional bool paid = 10;

    // Details about the publisher of the app.
    // Supported by Google.
    optional Publisher publisher = 11;

    // Details about the content within the app.
    // Supported by Google.
    optional Content content = 12;

    // Not supported by Google.
    optional string keywords = 13;

    // Not supported by Google.
    repeated string kwarray = 19;

    // App store URL for the app rendering the impression.
    // Supported by Google.
    optional string storeurl = 16;
    extensions 100 to 9999;
  }

  // In Google's implementation of OpenRTB, coarse device geolocation
  // information is approximated based on the IP address of the device the ad
  // request originated from. This information will typicallybut not alwaysbe
  // included in the bid request with lat/lon representing the center point of
  // a circle, where accuracy is its radius. To learn more about geolocation,
  // see the geotargeting guide:
  // https://developers.google.com/authorized-buyers/rtb/geotargeting.
  message Geo {
    // Approximate latitude from -90.0 to +90.0, where negative is south.
    // Supported by Google.
    optional double lat = 1;

    // Approximate longitude from -180.0 to +180.0, where negative is west.
    // Supported by Google.
    optional double lon = 2;

    // Country using ISO-3166-1 Alpha-3.
    // Supported by Google.
    optional string country = 3;

    // Region code using ISO-3166-2; 2-letter state code if USA.
    // Supported by Google.
    optional string region = 4;

    // Not supported by Google.
    optional string regionfips104 = 5;

    // Google metro code found in geo-table.csv:
    // https://storage.googleapis.com/adx-rtb-dictionaries/geo-table.csv
    // Supported by Google.
    optional string metro = 6;

    // City using United Nations Code for Trade & Transport Locations.
    // See Appendix A for a link to the codes.
    // (http://www.unece.org/cefact/locode/service/location.htm).
    // Supported by Google.
    optional string city = 7;

    // Zip/postal code.
    // Supported by Google.
    optional string zip = 8;

    // How geographic information was determined. Google's implementation
    // always sets this to IP (2).
    // Supported by Google.
    optional LocationType type = 9;

    // In Google's implementation, the radius in meters of a circle
    // approximating the location of a device, where the center point is
    // defined by lat/lon. This field is populated based on coarse IP-based
    // geolocation.
    // Supported by Google.
    optional int32 accuracy = 11;

    // Not supported by Google.
    optional int32 lastfix = 12;

    // Not supported by Google.
    optional LocationService ipservice = 13;

    // Local time as the number +/- of minutes from UTC.
    // Supported by Google.
    optional int32 utcoffset = 10;
    extensions 100 to 9999;
  }

  // This object provides information about the device that will render the
  // impression.
  message Device {
    // Location of the device based on IP geolocation. To learn more about
    // geolocation, see the Geotargeting guide:
    // https://developers.google.com/authorized-buyers/rtb/geotargeting
    // Supported by Google.
    optional Geo geo = 4;

    // Not supported by Google.
    optional bool dnt = 1;

    // If the user's device supports a "Limit Ad Tracking" setting, this field
    // indicates if it is enabled and is unset otherwise.
    //
    // "Limit Ad Tracking" is a commercially endorsed signal based on the
    // operating system or device settings, where `false` indicates that
    // tracking is unrestricted and `true` indicates that tracking must be
    // limited per commercial guidelines.
    //
    // This field is not populated for devices running iOS 14.5 and later. iOS
    // 14.5 replaced the Limit Ad Tracking setting with App Tracking
    // Transparency controls
    // (https://developer.apple.com/documentation/apptrackingtransparency),
    // which can be found in `BidRequest.device.ext.atts`.
    //
    // Supported by Google.
    optional bool lmt = 23;

    // Browser user agent string. Certain data may be redacted or replaced.
    // Supported by Google.
    optional string ua = 2;

    // Structured user agent information, which can be used when a client
    // supports User-Agent Client Hints: https://wicg.github.io/ua-client-hints/
    //
    // Note: When available, fields are sourced from Client Hints HTTP headers
    // or equivalent JavaScript accessors from the NavigatorUAData interface.
    // For agents that have no support for User-Agent Client Hints, an exchange
    // can also extract information from the parsed User-Agent header, so this
    // object can always be used as the source of the user agent information.
    message UserAgent {
      // Identifies a device's browser or similar software component, and the
      // user agent's execution platform or operating system.
      message BrandVersion {
        // A brand identifier, for example, "Chrome" or "Windows". The value may
        // be sourced from the User-Agent Client Hints headers, representing
        // either the user agent brand (from the Sec-CH-UA-Full-Version header)
        // or the platform brand (from the Sec-CH-UA-Platform header).
        // Supported by Google.
        optional string brand = 1;

        // A sequence of version components, in descending hierarchical order
        // (major, minor, micro, ...).
        // Supported by Google.
        repeated string version = 2;
      }

      // Each BrandVersion object identifies a browser or similar software
      // component.
      // Supported by Google.
      repeated BrandVersion browsers = 1;

      // Identifies the user agent's execution platform / OS.
      // Supported by Google.
      optional BrandVersion platform = 2;

      // true if the agent prefers a "mobile" version of the content if
      // available, meaning optimized for small screens or touch input. false if
      // the agent prefers the "desktop" or "full" content.
      // Supported by Google.
      optional bool mobile = 3;

      // Device's major binary architecture, for example, "x86" or "arm".
      // Supported by Google.
      optional string architecture = 4;

      // Device's bitness, for example, "64" for 64-bit architecture.
      // Supported by Google.
      optional string bitness = 5;

      // Device model.
      // Supported by Google.
      optional string model = 6;

      // The source of data for the User Agent information.
      // Supported by Google.
      optional UserAgentSource source = 7;
    }

    // Structured user agent information. If both Device.ua and Device.sua are
    // present in the bid request, Device.sua should be considered the more
    // accurate representation of the device attributes. This is because
    // Device.ua may contain a frozen or reduced user agent string.
    // Supported by Google.
    optional UserAgent sua = 31;

    // IPv4 address closest to device.
    // In Google's OpenRTB implementation, this is truncated to the first 3
    // octets, such as "X.X.X.0".
    // Supported by Google.
    optional string ip = 3;

    // IPv6 address closest to device.
    // In Googles OpenRTB implementation, this is truncated to the first 6
    // octets. For example, 1122:3344:5566::
    // Supported by Google.
    optional string ipv6 = 9;

    // The general type of device.
    // Supported by Google.
    optional DeviceType devicetype = 18;

    // Device make (for example, "Apple" or "Samsung").
    // Supported by Google.
    optional string make = 12;

    // Device model (for example, "pixel 7 pro"). For iPhone/iPad, this
    // field contains Apple's model identifier string (such as "iPhone12,1" and
    // "iPad13,8") if available. Otherwise this field contains the generic model
    // (either "iphone" or "ipad").
    // Supported by Google.
    optional string model = 13;

    // Device operating system (for example, "iOS").
    // Supported by Google.
    optional string os = 14;

    // Device operating system version (for example, "3.1.2").
    // Supported by Google.
    optional string osv = 15;

    // Hardware version of the device. For iPhone/iPad, this field contains
    // Apple's model identifier string (such as "iPhone12,1" and "iPad13,8") if
    // available.
    // Supported by Google.
    optional string hwv = 24;

    // Physical width of the screen in pixels.
    // Supported by Google.
    optional int32 w = 25;

    // Physical height of the screen in pixels.
    // Supported by Google.
    optional int32 h = 26;

    // Not supported by Google.
    optional int32 ppi = 27;

    // The ratio of physical pixels to device independent pixels.
    // Supported by Google.
    optional double pxratio = 28;

    // Not supported by Google.
    optional bool js = 16;

    // Not supported by Google.
    optional bool geofetch = 29;

    // Not supported by Google.
    optional string flashver = 19;

    // Not supported by Google.
    optional string language = 11;

    // Browser language using IETF BCP 47.
    // Only one of language or langb should be present.
    // Not supported by Google.
    optional string langb = 32;

    // Carrier or ISP (for example, "VERIZON") using exchange curated string
    // names which should be published to bidders a priori.
    // In Googles OpenRTB implementation, these IDs will be found in the
    // mobile carriers list:
    // https://storage.googleapis.com/adx-rtb-dictionaries/mobile-carriers.csv
    // Supported by Google.
    optional string carrier = 10;

    // Not supported by Google.
    optional string mccmnc = 30;

    // Network connection type.
    //
    // Google: For 5G connection type, we send CELL_4G instead of CELL_5G.
    // Supported by Google.
    optional ConnectionType connectiontype = 17;

    // Device advertising ID in the clear (not hashed).
    // In Googles OpenRTB implementation, this is typically a 36-character
    // UUID, where Android IDs are in lowercase and IDFA are in uppercase. For
    // Samsung devices, these are 32-character alphanumeric values. Either
    // dpidmd5 or ifa is available depending on the mobile SDK version.
    // Supported by Google.
    optional string ifa = 20;

    // Not supported by Google.
    optional string didsha1 = 5 [deprecated = true];

    // Not supported by Google.
    optional string didmd5 = 6 [deprecated = true];

    // Not supported by Google.
    optional string dpidsha1 = 7 [deprecated = true];

    // Device advertising ID hashed through MD5.
    // In Googles OpenRTB implementation, this is the hashed version of ifa,
    // represented in base16 with lowercase hexadecimal characters. Either
    // dpidmd5 or ifa is available depending on the mobile SDK version.
    // Supported by Google.
    optional string dpidmd5 = 8 [deprecated = true];

    // Not supported by Google.
    optional string macsha1 = 21 [deprecated = true];

    // Not supported by Google.
    optional string macmd5 = 22 [deprecated = true];
    extensions 100 to 9999;
  }

  // Information about the device the impression will be delivered to.
  // Supported by Google.
  optional Device device = 5;

  // OpenRTB 2.2: This object contains any legal, governmental, or industry
  // regulations that apply to the request. The coppa field signals whether
  // or not the request falls under the United States Federal Trade Commission's
  // regulations for the United States Children's Online Privacy Protection Act
  // ("COPPA"). Refer to Section 7.1 for more information.
  message Regs {
    // Indicates if this request is subject to the COPPA regulations
    // established by the USA FTC.
    // Not supported by Google.
    optional bool coppa = 1;

    // Contains the Global Privacy Platform's consent string. See the Global
    // Privacy Platform specification for more details:
    // https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform
    // Not supported by Google.
    optional string gpp = 2;

    // Each section represents a unique privacy signal, usually a unique
    // jurisdiction. Below are the supported discrete sections.
    enum GppSectionId {
      // EU TCF v1 section (deprecated)
      TCFEUV1 = 1;

      // EU TCF v2 section (see note below)
      TCFEUV2 = 2;

      // GPP Header section (REQUIRED, see note below)
      GPP_HEADER = 3;

      // GPP signal integrity section
      GPP_SIGNAL = 4;

      // Canadian TCF section
      TCFCA = 5;

      // USPrivacy String (Unencoded Format)
      USPV1 = 6;

      // US - national section
      USNAT = 7;

      // US - California section
      USCA = 8;

      // US - Virginia section
      USVA = 9;

      // US - Colorado section
      USCO = 10;

      // US - Utah section
      USUT = 11;

      // US - Connecticut section
      USCT = 12;
    }

    // Array of the section(s) of the string which should be applied for this
    // transaction. Generally will contain one and only one value, but there are
    // edge cases where more than one may apply. GPP Section 3 (Header) and 4
    // (Signal Integrity) do not need to be included. See enum GppSectionId.
    // Not supported by Google.
    repeated GppSectionId gpp_sid = 3 [packed = true];
    extensions 100 to 9999;
  }

  // A Regs object (Section 3.2.16) that specifies any industry, legal,
  // or governmental regulations in force for this request.
  // Supported by Google.
  optional Regs regs = 14;

  // OpenRTB 2.0: The data and segment objects together allow additional data
  // about the user to be specified. This data may be from multiple sources
  // whether from the exchange itself or third party providers as specified by
  // the id field. A bid request can mix data objects from multiple providers or
  // can have multiple data objects. The specific data providers in use should
  // be published by the exchange a priori to its bidders.
  //
  // Google: This is used to send Publisher Provided Signals and Topics to
  // bidders.
  message Data {
    // The Google assigned ID of the data provider. Only set for Data segments
    // from Publisher Provided Signals. For the list of data providers, see
    // https://storage.googleapis.com/adx-rtb-dictionaries/data_providers.txt.
    // Supported by Google.
    optional string id = 1;

    // Exchange-specific name for the data provider.
    // Not supported by Google.
    optional string name = 2;

    // OpenRTB 2.0: Segment objects are essentially key-value pairs that
    // convey specific units of data about the user. The parent Data object
    // is a collection of such values from a given data provider.
    // The specific segment names and value options must be published by the
    // exchange a priori to its bidders.
    message Segment {
      // ID of the data segment specific to the data provider.
      // Supported by Google.
      optional string id = 1;

      // Name of the data segment specific to the data provider.
      // Not supported by Google.
      optional string name = 2;

      // String representation of the data segment value.
      // Not supported by Google.
      optional string value = 3;
      extensions 100 to 9999;
    }

    // Array of Segment (Section 3.2.15) objects that contain the actual
    // data values.
    // Supported by Google.
    repeated Segment segment = 3;
    extensions 100 to 9999;
  }

  // In Google's OpenRTB implementation, this object contains fields relevant
  // to cookie-based identifiers, publisher first-party audience data and
  // identifiers, and secure signals
  message User {
    // Exchange-specific ID for the user.
    // In Google's OpenRTB implementation, this is the Google User ID.
    // Supported by Google.
    optional string id = 1;

    // Hosted match data uploaded with the Cookie Matching Service. By default,
    // this is specified in web-safe Base64 encoding without padding. Can
    // optionally be specified without encoding.
    // Supported by Google.
    optional string buyeruid = 2;

    // Not supported by Google.
    optional int32 yob = 3 [deprecated = true];

    // Not supported by Google.
    optional string gender = 4 [deprecated = true];

    // Not supported by Google.
    optional string keywords = 5;

    // Not supported by Google.
    repeated string kwarray = 9;

    // Hosted match data uploaded with the Cookie Matching Service. By default,
    // this is specified in base64 encoding without padding.
    // Supported by Google.
    optional string customdata = 6;

    // Not supported by Google.
    optional Geo geo = 7;

    // Additional user data. Each Data object (Section 3.2.14) represents a
    // different data source.
    // Supported by Google.
    // Used for Chrome Topics API and for Publisher Provided Signals:
    // https://developers.google.com/authorized-buyers/rtb/topics
    // https://support.google.com/admanager/answer/12451124
    repeated Data data = 8;

    // The web-safe base64-encoded IAB Transparency and Consent Framework (TCF)
    // v2 consent string fetched from the publisher's IAB Consent Management
    // Platform (CMP). The structure of the string is defined by the IAB TCF v2.
    // This field will be populated if the publisher has integrated with a CMP
    // for TCF v2 and that CMP indicates that GDPR applies to this ad request
    // and provides a valid consent string. See
    // https://support.google.com/authorizedbuyers/answer/9789378 for additional
    // information about the Google TCF v2 integration.
    //
    // See the IAB Global Vendor List at
    // https://vendor-list.consensu.org/v2/vendor-list.json for details about
    // the vendors listed in the consent string.
    optional string consent = 10;

    // Extended data, such as a publisher-provided identifier, that allows
    // buyers to use data made available by the publisher in real-time bidding.
    // This object can contain one or more UIDs from a single source or a
    // technology provider.
    message EID {
      // Source or technology provider responsible for the set of included data.
      // Supported by Google.
      optional string source = 1;

      // This object contains a single data item, such as a publisher-provided
      // identifier, provided as part of extended identifiers.
      message UID {
        // The data value, such as a publisher-provided identifier.
        // Supported by Google.
        optional string id = 1;

        // Type of user agent the ID is from.
        // Not supported by Google.
        optional AgentType atype = 2;
        extensions 100 to 9999;
      }

      // Array of extended ID UID objects from the given source.
      // Supported by Google.
      repeated UID uids = 2;

      // The canonical domain name of the entity
      // (publisher, publisher monetization company, SSP, Exchange, Header
      // Wrapper, etc.) that caused the ID array element to be added. This may
      // be the operational domain of the system, if that is different from 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. For ad tech intermediaries, this would be the domain as used in
      // ads.txt. For publishers, this would match the domain in the site or app
      // object.
      // Not supported by Google.
      optional string inserter = 3;

      // Technology providing the match method as defined in mm.
      // In some cases, this may be the same value as inserter.
      // When blank, it is assumed that the matcher is equal to the source
      // May be omitted when mm=0, 1, or 2.
      // Not supported by Google.
      optional string matcher = 4;

      // Match method used by the matcher.
      // Refer to List: ID Match Methods in AdCOM 1.0
      // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/develop/AdCOM%20v1.0%20FINAL.md#list-id-match-methods-
      // Not supported by Google.
      optional int32 mm = 5;
      extensions 100 to 9999;
    }

    // Data made available by the publisher, such as publisher-provided
    // identifiers.
    // Supported by Google. For Secure Signals, see extension
    // BidRequest.user.ext.eids.
    repeated EID eids = 11;
    extensions 100 to 9999;
  }

  // Information about the user of the device or the advertising audience.
  // Supported by Google.
  optional User user = 6;

  // Auction type: one of FIRST_PRICE or SECOND_PRICE.
  // Supported by Google.
  optional AuctionType at = 7 [default = SECOND_PRICE];

  // Maximum time in milliseconds to submit a bid to avoid timeout.
  // This value is commonly communicated offline.
  // Supported by Google.
  optional int32 tmax = 8;

  // Allowlist of buyer seats (for example, advertisers, agencies) that can bid
  // on this impression. IDs of seats and knowledge of the buyer's customers to
  // which they refer must be coordinated between bidders and the exchange a
  // priori. Omission implies no seat restrictions.
  // Supported by Google.
  repeated string wseat = 9;

  // Indicates if Exchange can verify that the impressions offered
  // represent all of the impressions available in context (for example, all on
  // the web page, all video spots such as pre/mid/post roll) to support
  // road-blocking. false = no or unknown, true = yes, the impressions offered
  // represent all that are available.
  // Not supported by Google.
  optional bool allimps = 10 [default = false];

  // Array of allowed currencies for bids on this bid request using ISO-4217
  // alpha codes. Recommended only if the exchange accepts multiple currencies.
  // Supported by Google.
  repeated string cur = 11;

  // Blocked advertiser categories using the IAB content categories.
  // The taxonomy to be used is defined by the cattax field.
  // Supported by Google.
  repeated string bcat = 12;

  // The taxonomy in use for bcat.
  // Supported by Google.
  optional CategoryTaxonomy cattax = 21 [default = IAB_CONTENT_1_0];

  // Block list of advertisers by their domains (for example, "ford.com").
  // Not supported by Google.
  repeated string badv = 13;

  // Block list of applications by their platform-specific exchange
  // independent application identifiers. On Android, these should
  // be bundle or package names (for example, com.foo.mygame).
  // On iOS, these are numeric IDs.
  // Supported by Google.
  repeated string bapp = 16;

  // Indicator of test mode in which auctions are not billable,
  // where false = live mode, true = test mode.
  // Supported by Google.
  optional bool test = 15 [default = false];

  // Block list of buyer seats (for example, advertisers, agencies) restricted
  // from bidding on this impression. IDs of seats and knowledge
  // of the buyer's customers to which they refer must be
  // coordinated between bidders and the exchange a priori.
  // At most, only one of wseat and bseat should be used in the
  // same request. Omission of both implies no seat restrictions.
  // Supported by Google.
  repeated string bseat = 17;

  // Allowed list of languages for creatives using ISO-639-1-alpha-2.
  // Omission implies no specific restrictions, but buyers would be
  // advised to consider language attribute in the Device and/or
  // Content objects if available.
  // Only one of wlang or wlangb should be present.
  // Supported by Google.
  repeated string wlang = 18;

  // Allowed list of languages for creatives using IETF BCP 47I.
  // Omission implies no specific restrictions, but buyers would be
  // advised to consider language attribute in the Device and/or
  // Content objects if available.
  // Only one of wlang or wlangb should be present.
  // Not supported by Google.
  repeated string wlangb = 20;

  // OpenRTB 2.5: This object describes the nature and behavior of the entity
  // that is the source of the bid request upstream from the exchange.
  // The primary purpose of this object is to define post-auction or upstream
  // decisioning when the exchange itself does not control the final decision.
  // A common example of this is header bidding, but it can also apply to
  // upstream server entities such as another RTB exchange, a mediation
  // platform, or an ad server combines direct campaigns with 3rd party
  // demand in decisioning.
  message Source {
    // Entity responsible for the final impression sale decision,
    // where false = exchange, true = upstream source
    // Not supported by Google.
    optional bool fd = 1;

    // Transaction ID that must be common across all participants in
    // this bid request (for example, potentially multiple exchanges).
    // Not supported by Google.
    optional string tid = 2;

    // Payment ID chain string containing embedded syntax
    // described in the TAG Payment ID Protocol v1.0.
    // Not supported by Google.
    optional string pchain = 3;

    // This object is composed of a set of nodes where each node represents a
    // specific entity that participates in the transacting of inventory.
    // The entire chain of nodes from beginning to end represents all entities
    // who are involved in the direct flow of payment for inventory. Detailed
    // implementation examples can be found here:
    // 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.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      optional bool complete = 1;

      // The identity of an entity participating in the supply chain.
      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.
        // REQUIRED by the OpenRTB specification.
        // Supported by Google.
        optional string asi = 1;

        // The identifier associated with the seller or reseller account
        // within the advertising system. This must contain the same value
        // used in transactions (OpenRTB bid requests) in the field
        // specified by the SSP/exchange. Typically, in OpenRTB, this is
        // publisher.id. For OpenDirect it is typically the publisher's
        // organization ID. Should be limited to 64 characters in length.
        // REQUIRED by the OpenRTB specification.
        // Supported by Google.
        optional string sid = 2;

        // The OpenRTB RequestId of the request as issued by this seller.
        // Not supported by Google.
        optional string rid = 3;

        // The name of the company (the legal entity) that has paid for
        // inventory transacted under the given seller_ID. This value is
        // optional and should NOT be included if it exists in the
        // advertising systems sellers.json file.
        // Supported for SupplyChain nodes upstream of Google if available.
        optional string name = 4;

        // The business domain name of the entity represented by this
        // node. This value is optional and should NOT be included if it
        // exists in the advertising systems sellers.json file.
        // Supported for SupplyChain nodes upstream of Google if available.
        optional string domain = 5;

        // Indicates whether this node will be involved in the flow of payment
        // for the inventory. When set to true, the advertising system in the
        // asi field pays the seller in the sid 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.
        // For version 1.0 of SupplyChain, this property should always be true.
        // Implementers should ensure that they propagate this field onwards
        // when constructing SupplyChain objects in bid requests sent to a
        // downstream advertising system.
        // Supported by Google.
        optional bool hp = 6;
        extensions 100 to 9999;
      }

      // 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, that is,
      // 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.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      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".
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      optional string ver = 3;
      extensions 100 to 9999;
    }

    // This object represents both the links in the supply chain as
    // well as an indicator whether or not the supply chain is complete.
    // Supported by Google.
    optional SupplyChain schain = 4;
    extensions 100 to 9999;
  }

  // A Source object (Section 3.2.2) that provides data about the
  // inventory source and which entity makes the final decision.
  // Supported by Google.
  optional Source source = 19;
  extensions 100 to 9999;
}

// OpenRTB 2.0: This object is the top-level bid response object (for example,
// the unnamed outer JSON object). The id attribute is a reflection of the bid
// request ID for logging purposes. Similarly, bidid is an optional response
// tracking ID for bidders. If specified, it can be included in the subsequent
// win notice call if the bidder wins. At least one seatbid object is required,
// which contains at least one bid for an impression. Other attributes are
// optional. To express a "no-bid", the options are to return an empty response
// with HTTP 204. Alternately if the bidder wants to convey to the exchange a
// reason for not bidding, just a BidResponse object is returned with a
// reason code in the nbr attribute.
message BidResponse {
  // ID of the bid request to which this is a response.
  // REQUIRED by the OpenRTB specification.
  // Supported by Google.
  required string id = 1;

  // OpenRTB 2.0: A bid response can contain multiple SeatBid objects, each on
  // behalf of a different bidder seat and each containing one or more
  // individual bids. If multiple impressions are presented in the request, the
  // group attribute can be used to specify if a seat is willing to accept any
  // impressions that it can win (default) or if it is only interested in
  // winning any if it can win them all as a group.
  message SeatBid {
    // OpenRTB 2.0: A SeatBid object contains one or more Bid objects,
    // each of which relates to a specific impression in the bid request
    // through the impid attribute and constitutes an offer to buy that
    // impression for a given price.
    message Bid {
      oneof adm_oneof {
        // Optional means of conveying ad markup in case the bid wins;
        // supersedes the win notice if markup is included in both.
        // For native ad bids, exactly one of {adm, adm_native} should be used.
        // Supported by Google. Standard field, should be used for OpenRTB/JSON.
        string adm = 6;

        // Native ad response.
        // For native ad bids, exactly one of {adm, adm_native} should be used.
        // Supported by Google. Extension, should be used for OpenRTB/Protobuf.
        NativeResponse adm_native = 50;
      }

      // Bidder generated bid ID to assist with logging/tracking.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      required string id = 1;

      // ID of the Imp object in the related bid request.
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      required string impid = 2;

      // Bid price expressed as CPM although the actual transaction is for a
      // unit impression only. Note that while the type indicates float, integer
      // math is highly recommended when handling currencies
      // (for example, BigDecimal in Java).
      // REQUIRED by the OpenRTB specification.
      // Supported by Google.
      required double price = 3;

      // Win notice URL called by the exchange if the bid wins; optional means
      // of serving ad markup.
      // Ignored by Google.
      optional string nurl = 5;

      // Billing notice URL called by the exchange when a winning bid
      // becomes billable based on exchange-specific business policy
      // (for example, delivered or viewed).
      // Substitution macros (Section 4.4) may be included.
      // Supported by Google.
      optional string burl = 22;

      // Loss notice URL called by the exchange when a bid is known to
      // have been lost. Substitution macros (Section 4.4) may be
      // included. Exchange-specific policy may preclude support for
      // loss notices or the disclosure of winning clearing prices
      // resulting in ${AUCTION_PRICE} macros being removed (meaning,
      // replaced with a zero-length string).
      // Ignored by Google.
      optional string lurl = 23;

      // ID of a preloaded ad to serve if the bid wins.
      // Ignored by Google.
      optional string adid = 4;

      // Advertiser domain for block list checking (for example, "ford.com").
      // This can be an array of for the case of rotating creatives. Exchanges
      // can mandate that only one domain is allowed.
      // Supported by Google.
      repeated string adomain = 7;

      // The store ID of the app in an app store such as Apple App Store, Google
      // Play. See OTT/CTV Store Assigned App Identification Guidelines for
      // more details about expected strings for CTV app stores. For mobile apps
      // in Google Play Store, these should be bundle or package names, such as
      // com.foo.mygame. For apps in Apple App Store, these should be a numeric
      // ID.
      //
      // Google: In addition to this field, set bid.ext.app_promotion_type field
      // to take advantage of features specific to app promotion types.
      // Supported by Google.
      optional string bundle = 14;

      // URL without cache-busting to an image that is representative of the
      // content of the campaign for ad quality/safety checking.
      // Ignored by Google.
      optional string iurl = 8;

      // Campaign ID to assist with ad quality checking; the collection of
      // creatives for which iurl should be representative.
      // Ignored by Google.
      optional string cid = 9;

      // Creative ID to assist with ad quality checking.
      // Supported by Google.
      optional string crid = 10;

      // Tactic ID to enable buyers to label bids for reporting to the
      // exchange the tactic through which their bid was submitted.
      // The specific usage and meaning of the tactic ID should be
      // communicated between buyer and exchanges a priori.
      // Ignored by Google.
      optional string tactic = 24;

      // The taxonomy in use for cat.
      // Ignored by Google.
      optional CategoryTaxonomy cattax = 30 [default = IAB_CONTENT_1_0];

      // IAB content categories of the creative.
      // The taxonomy to be used is defined by the cattax field.
      // Supported by Google.
      repeated string cat = 15;

      // Set of attributes describing the creative.
      // Supported by Google.
      repeated CreativeAttribute attr = 11 [packed = true];

      // List of supported APIs for the markup. If an API is not explicitly
      // listed, it is assumed to be unsupported.
      // Supported by Google.
      repeated APIFramework apis = 31 [packed = true];

      // DEPRECATED in OpenRTB 2.6+; prefer the field apis.
      // API required by the markup if applicable.
      // Supported by Google.
      optional APIFramework api = 18 [deprecated = true];

      // Video response protocol of the markup if applicable.
      // Ignored by Google.
      optional Protocol protocol = 19;

      // Creative media rating per QAG guidelines.
      // Ignored by Google.
      optional QAGMediaRating qagmediarating = 20;

      // Language of the creative using ISO-639-1-alpha-2. The nonstandard
      // code "xx" may also be used if the creative has no
      // linguistic content (for example, a banner with just a company logo).
      // Only one of language or langb should be present.
      // Ignored by Google.
      optional string language = 25;

      // Language of the creative using IETF BCP 47.
      // Only one of language or langb should be present.
      // Ignored by Google.
      optional string langb = 29;

      // Reference to the deal.id from the bid request if this bid pertains to a
      // private marketplace direct deal.
      // Supported by Google.
      optional string dealid = 13;

      // Width of the creative in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 w = 16;

      // Height of the creative in device independent pixels (DIPS).
      // Supported by Google.
      optional int32 h = 17;

      // Relative width of the creative when expressing size as a ratio.
      // Required for Flex Ads.
      // Ignored by Google.
      optional int32 wratio = 26;

      // Relative height of the creative when expressing size as a ratio.
      // Required for Flex Ads.
      // Ignored by Google.
      optional int32 hratio = 27;

      // Advisory as to the number of seconds the bidder is willing to
      // wait between the auction and the actual impression.
      // Ignored by Google.
      optional int32 exp = 21;

      // Duration of the video or audio creative in seconds.
      // Ignored by Google.
      optional int32 dur = 32;

      // Indicates that the bid is only eligible
      // for a specific position within the pod.
      // This field is currently only supported for rewarded video pods
      // requests.
      optional SlotPositionInPod slotinpod = 28;

      // Type of the creative markup so that it can properly be
      // associated with the right sub-object of the BidRequest.Imp.
      // Ignored by Google.
      optional CreativeMarkupType mtype = 33;
      extensions 100 to 9999;
    }

    // Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
    // Multiple bids can relate to the same impression.
    // Supported by Google.
    repeated Bid bid = 1;

    // ID of the buyer seat (for example, advertiser, agency) on whose behalf
    // this bid is made.
    //
    // This ID will be used to breakdown spend and invalid traffic metrics in
    // IVT transparency reporting, given that it is no longer than 64 bytes.
    // Supported by Google.
    optional string seat = 2;

    // false = impressions can be won individually;
    // true = impressions must be won or lost as a group.
    // Ignored by Google.
    optional bool group = 3 [default = false];
    extensions 100 to 9999;
  }

  // Array of seatbid objects; 1+ required if a bid is to be made.
  // Supported by Google.
  repeated SeatBid seatbid = 2;

  // Bidder generated response ID to assist with logging/tracking.
  // Supported by Google.
  optional string bidid = 3;

  // Bid currency using ISO-4217 alpha codes.
  //
  // Supported by Google. 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 BidResponse.seatbid.bid.ext.billing_id extension
  // field 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 cur = 4;

  // Optional feature to allow a bidder to set data in the exchange's cookie.
  // The string must be in base85 cookie safe characters and be in any format.
  // Proper JSON encoding must be used to include "escaped" quotation marks.
  // Ignored by Google.
  optional string customdata = 5;

  // Reason for not bidding.
  // Supported by Google.
  optional NoBidReason nbr = 6;
  extensions 100 to 9999;
}

// OpenRTB Native 1.0: The Native Object defines the native advertising
// opportunity available for bid through this bid request. It must be included
// directly in the impression object if the impression offered for auction
// is a native ad format.
message NativeRequest {
  // Version of the Native Markup version in use.
  optional string ver = 1;

  // The context in which the ad appears.
  optional ContextType context = 7;

  // A more detailed context in which the ad appears.
  optional ContextSubtype contextsubtype = 8;

  // The design/format/layout of the ad unit being offered.
  optional PlacementType plcmttype = 9;

  // The number of identical placements in this Layout.
  optional int32 plcmtcnt = 4 [default = 1];

  // 0 for the first ad, 1 for the second ad, and so on. Note this would
  // generally NOT be used in combination with plcmtcnt - either you are
  // auctioning multiple identical placements (in which case
  // plcmtcnt>1, seq=0) or you are holding separate auctions for distinct
  // items in the feed (in which case plcmtcnt=1, seq>=1).
  optional int32 seq = 5 [default = 0];

  // OpenRTB Native 1.0: The main container object for each asset requested or
  // supported by Exchange on behalf of the rendering client.
  // Any object that is required is to be flagged as such. Only one of the
  // {title,img,video,data} objects should be present in each object.
  // All others should be null/absent. The id is to be unique within the
  // Asset array so that the response can be aligned.
  message Asset {
    oneof asset_oneof {
      // Title object for title assets.
      Title title = 3;

      // Image object for image assets.
      Image img = 4;

      // Video object for video assets.
      // Note that in-stream video ads are not part of Native.
      // Native ads may contain a video as the ad creative itself.
      BidRequest.Imp.Video video = 5;

      // Data object for brand name, description, ratings, prices or other
      // similar elements.
      Data data = 6;
    }

    // Unique asset ID, assigned by exchange. Typically a counter for the array.
    // REQUIRED by the OpenRTB Native specification.
    required int32 id = 1;

    // Set to true if asset is required
    // (exchange will not accept a bid without it).
    optional bool required = 2 [default = false];

    // OpenRTB Native 1.0: The Title object is to be used for title element
    // of the Native ad.
    message Title {
      // Maximum length of the text in the title element.
      // RECOMMENDED that the value be either of: 25, 90, 140.
      // REQUIRED by the OpenRTB Native specification.
      required int32 len = 1;
      extensions 100 to 9999;
    }

    // OpenRTB Native 1.0: The Image object to be used for all image elements
    // of the Native ad, such as Icons or Main Image.
    // RECOMMENDED sizes and aspect ratios are included in ImageAssetType.
    message Image {
      // Type ID of the image element supported by the publisher.
      // The publisher can display this information in an appropriate format.
      optional ImageAssetType type = 1;

      // Width of the image in pixels.
      optional int32 w = 2;

      // Height of the image in pixels.
      optional int32 h = 3;

      // The minimum requested width of the image in pixels. This option should
      // be used for any rescaling of images by the client. Either w or wmin
      // should be transmitted. If only w is included, it should be considered
      // an exact requirement.
      optional int32 wmin = 4;

      // The minimum requested height of the image in pixels. This option should
      // be used for any rescaling of images by the client. Either h or hmin
      // should be transmitted. If only h is included, it should be considered
      // an exact requirement.
      optional int32 hmin = 5;

      // Allowlist of content MIME types supported. Popular MIME types include,
      // but are not limited to "image/jpg" and "image/gif". Each implementing
      // Exchange should have their own list of supported types in the
      // integration docs. See Wikipedia's MIME page for more information and
      // links to all IETF RFCs. If blank, assume all types are allowed.
      repeated string mimes = 6;
      extensions 100 to 9999;
    }

    // OpenRTB Native 1.0: The Data Object is to be used for all non-core
    // elements of the native unit, such as Ratings, Review Count, Stars,
    // Download count, descriptions or other similar elements. It is also
    // generic for future of Native elements not contemplated at the time of the
    // writing of this specification.
    message Data {
      // Type ID of the element supported by the publisher. The publisher can
      // display this information in an appropriate format.
      // REQUIRED by the OpenRTB Native specification.
      required DataAssetType type = 1;

      // Maximum length of the text in the element's response. Longer strings
      // may be truncated and ellipsized by Ad Exchange or the publisher during
      // rendering.
      optional int32 len = 2;
      extensions 100 to 9999;
    }
    extensions 100 to 9999;
  }

  // Any bid must comply with the array of elements expressed by the Exchange.
  // REQUIRED by the OpenRTB Native specification: at least 1 element.
  repeated Asset assets = 6;

  // Whether the supply source / impression supports returning an assetsurl
  // instead of an asset object. false or the absence of the field indicates no
  // such support.
  optional bool aurlsupport = 11;

  // Whether the supply source / impression supports returning a DCO URL
  // instead of an asset object. false or the absence of the field indicates no
  // such support. Beta feature.
  optional bool durlsupport = 12;

  // OpenRTB Native 1.2: The EventTrackers object specifies the type of events
  // the bidder can request to be tracked in the bid response, and which types
  // of tracking are available for each event type, and is included as an array
  // in the request.
  message EventTrackers {
    // Type of event available for tracking.
    // REQUIRED by the OpenRTB Native specification.
    required EventType event = 1;

    // Array of types of tracking available for the given event.
    // REQUIRED by the OpenRTB Native specification.
    repeated EventTrackingMethod methods = 2;
    extensions 100 to 9999;
  }

  // Specifies what type of event tracking is supported.
  repeated EventTrackers eventtrackers = 13;

  // Set to true when the native ad supports buyer-specific privacy notice.
  // Set to false (or field absent) when the native ad doesn't support custom
  // privacy links or if support is unknown.
  optional bool privacy = 14;

  // DEPRECATED in OpenRTB Native 1.1, REMOVED in 1.2+.
  // Use field <code>plcmttype</code>.
  optional LayoutId layout = 2 [deprecated = true];

  // DEPRECATED in OpenRTB Native 1.1, REMOVED in 1.2+.
  // Use fields <code>context</code> and <code>contextsubtype</code>.
  optional AdUnitId adunit = 3 [deprecated = true];
  extensions 100 to 9999;
}

// OpenRTB Native 1.0: The native response object is the top level JSON object
// which identifies an native response.
message NativeResponse {
  // Version of the Native Markup version in use.
  optional string ver = 1;

  // OpenRTB Native 1.0: Used for "call to action" assets, or other links from
  // the Native ad. This Object should be associated to its peer object in the
  // parent Asset Object or as the primary link in the top level NativeResponse
  // object. When that peer object is activated (clicked) the action should take
  // the user to the location of the link.
  message Link {
    // Landing URL of the clickable link.
    // REQUIRED by the OpenRTB Native specification.
    required string url = 1;

    // List of third-party tracker URLs to be fired on click of the URL.
    repeated string clicktrackers = 2;

    // Fallback URL for deeplink. To be used if the URL given in url is not
    // supported by the device.
    optional string fallback = 3;
    extensions 100 to 9999;
  }

  // OpenRTB Native 1.0: Corresponds to the Asset Object in the request.
  // The main container object for each asset requested or supported by Exchange
  // on behalf of the rendering client. Any object that is required is to be
  // flagged as such. Only one of the {title,img,video,data} objects should be
  // present in each object. All others should be null/absent. The id is to be
  // unique within the Asset array so that the response can be aligned.
  message Asset {
    oneof asset_oneof {
      // Title object for title assets.
      Title title = 3;

      // Image object for image assets.
      Image img = 4;

      // Video object for video assets.
      // Note that in-stream video ads are not part of Native.
      // Native ads may contain a video as the ad creative itself.
      Video video = 5;

      // Data object for ratings, prices or other similar elements.
      Data data = 6;
    }

    // Unique asset ID, assigned by exchange, must match one of the asset IDs
    // in request.
    // REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
    required int32 id = 1;

    // Set to true if asset is required. (bidder requires it to be displayed).
    optional bool required = 2 [default = false];

    // OpenRTB Native 1.0: Corresponds to the Title Object in the request,
    // with the value filled in.
    // If using assetsurl or dcourl response rather than embedded asset
    // response, it is recommended that three title objects be provided, the
    // length of each is less than or equal to the three recommended maximum
    // title lengths (25,90,140).
    message Title {
      // The text associated with the text element.
      // REQUIRED by the OpenRTB Native specification.
      required string text = 1;

      // The length of the title being provided.
      // REQUIRED if using assetsurl/dcourl representation.
      optional int32 len = 2;
      extensions 100 to 9999;
    }

    // OpenRTB Native 1.0: Corresponds to the Image Object in the request.
    // The Image object to be used for all image elements of the Native ad,
    // such as Icons or Main Image.
    // It is recommended that if assetsurl/dcourl is being used rather than
    // embbedded assets, that an image of each recommended aspect ratio
    // (per ImageType enum) be provided for image type 3 (MAIN_IMAGE).
    message Image {
      // The type of image element being submitted from the ImageType enum.
      // REQUIRED for assetsurl or dcourl responses,
      // not required to embedded asset responses.
      optional ImageAssetType type = 4;

      // URL of the image asset.
      // REQUIRED by the OpenRTB Native specification.
      required string url = 1;

      // Width of the image in pixels.
      // RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
      // REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
      // of the same type submitted.
      optional int32 w = 2;

      // Height of the image in pixels.
      // RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
      // REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
      // of the same type submitted.
      optional int32 h = 3;
      extensions 100 to 9999;
    }

    // OpenRTB Native 1.0: Corresponds to the Video Object in the request,
    // yet containing a value of a conforming VAST tag as a value.
    message Video {
      // VAST xml.
      // REQUIRED by the OpenRTB Native specification.
      required string vasttag = 1;
      extensions 100 to 9999;
    }

    // OpenRTB Native 1.0: Corresponds to the Data Object in the request, with
    // the value filled in. The Data Object is to be used for all miscellaneous
    // elements of the native unit such as Brand Name, Ratings, Review Count,
    // Stars, Downloads, and other elements. It is also generic for future of
    // native elements not contemplated at the time of the writing of this
    // document.
    message Data {
      // The type of data element being submitted from the DataAssetTypes enum.
      // REQUIRED in 1.2 for assetsurl or dcourl responses.
      optional DataAssetType type = 3;

      // The length of the data element being submitted. Where applicable, must
      // comply with the recommended maximum lengths in the DataAssetType enum.
      // REQUIRED in 1.2 for assetsurl or dcourl responses.
      optional int32 len = 4;

      // DEPRECATED in OpenRTB Native 1.2+. No replacement.
      // The optional formatted string name of the data type to be displayed.
      optional string label = 1 [deprecated = true];

      // The formatted string of data to be displayed. Can contain a formatted
      // value such as "5 stars" or "$10" or "3.4 stars out of 5".
      // REQUIRED by the OpenRTB Native specification.
      required string value = 2;
      extensions 100 to 9999;
    }

    // Link object for call to actions.
    // This link object applies if the asset item is activated (clicked).
    // If there is no link object on the asset, the parent link object on the
    // bid response apply.
    optional Link link = 7;
    extensions 100 to 9999;
  }

  // List of native ad's assets.
  // RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
  // REQUIRED in 1.2, if not assetsurl is provided.
  repeated Asset assets = 2;

  // URL of alternate source for the assets object. The expected response is a
  // JSON object mirroring the asset object in the bid response, subject to
  // certain requirements as specified in the individual objects.
  // Where present, overrides the assets object in the response.
  optional string assetsurl = 6;

  // URL where a dynamic creative specification may be found for populating this
  // ad, per the Dynamic Content Ads Specification.
  // Note this is a beta option as the interpretation of the Dynamic Content Ads
  // Specification and how to assign those elementes into a native ad is outside
  // the scope of this spec and must be agreed offline between parties or as may
  // be specified in a future revision of the Dynamic Content Ads spec.
  // Where present, overrides the assets object in the response.
  optional string dcourl = 7;

  // Destination Link. This is default link object for the ad.
  // Individual assets can also have a link object which applies if the asset is
  // activated (clicked). If the asset doesn't have a link object, the parent
  // link object applies.
  // See ResponseLink definition.
  // REQUIRED by the OpenRTB Native specification.
  required Link link = 3;

  // DEPRECATED in OpenRTB Native 1.2+. Prefer object <code>EventTracker</code>.
  // Array of impression tracking URLs, expected to return a 1x1 image or
  // 204 response - typically only passed when using 3rd party trackers.
  repeated string imptrackers = 4 [deprecated = true];

  // DEPRECATED in OpenRTB Native 1.2+. Prefer object <code>EventTracker</code>.
  // Optional javascript impression tracker. Contains <script> tags to be
  // executed at impression time where it can be supported.
  optional string jstracker = 5 [deprecated = true];

  // OpenRTB Native 1.2: The event trackers response is an array of objects and
  // specifies the types of events the bidder wants to track and the
  // URLs/information to track them. Bidder must only respond with methods
  // indicated as available in the request. Note that most javascript trackers
  // expect to be loaded at impression time, so it's not generally recommended
  // for the buyer to respond with javascript trackers on other events, but the
  // appropriateness of this is up to each buyer.
  message EventTracker {
    // Type of event to track.
    // REQUIRED if embedded asset is being used.
    optional EventType event = 1;

    // Type of tracking requested.
    // REQUIRED if embedded asset is being used.
    required EventTrackingMethod method = 2;

    // The URL of the image or js.
    // REQUIRED for image or js, optional for custom.
    optional string url = 3;
    extensions 100 to 9999;
  }

  // Array of response event trackers to run with the ad, in response to the
  // declared supported methods in the NativeRequest. Replaces imptrackers and
  // jstrackers.
  repeated EventTracker eventtrackers = 8;

  // If support was indicated in the request, URL of a page informing the user
  // about the buyer's targeting activity.
  optional string privacy = 9;
  extensions 100 to 9999;
}

// ***** OpenRTB Core enums ****************************************************
enum AuctionType {
  FIRST_PRICE = 1;
  SECOND_PRICE = 2;
  FIXED_PRICE = 3;
}

// OpenRTB 2.0: types of ads that can be accepted by the exchange unless
// restricted by publisher site settings.
enum BannerAdType {
  // "Usually mobile".
  XHTML_TEXT_AD = 1;

  // "Usually mobile".
  XHTML_BANNER_AD = 2;

  // Javascript must be valid XHTML (ie, script tags included).
  JAVASCRIPT_AD = 3;

  // Iframe.
  IFRAME = 4;
}

// OpenRTB 2.0: The following table specifies a standard list of creative
// attributes that can describe an ad being served or serve as restrictions
// of thereof.
enum CreativeAttribute {
  AUDIO_AUTO_PLAY = 1;
  AUDIO_USER_INITIATED = 2;
  EXPANDABLE_AUTOMATIC = 3;
  EXPANDABLE_CLICK_INITIATED = 4;
  EXPANDABLE_ROLLOVER_INITIATED = 5;
  VIDEO_IN_BANNER_AUTO_PLAY = 6;
  VIDEO_IN_BANNER_USER_INITIATED = 7;

  // Pop (for example, Over, Under, or upon Exit).
  POP = 8;
  PROVOCATIVE_OR_SUGGESTIVE = 9;

  // Defined as "Shaky, Flashing, Flickering, Extreme Animation, Smileys".
  ANNOYING = 10;
  SURVEYS = 11;
  TEXT_ONLY = 12;

  // For example, embedded games.
  USER_INTERACTIVE = 13;
  WINDOWS_DIALOG_OR_ALERT_STYLE = 14;
  HAS_AUDIO_ON_OFF_BUTTON = 15;

  // Ad provides skip button (for example, VPAID-rendered skip button
  // on pre-roll video).
  AD_CAN_BE_SKIPPED = 16;

  // Adobe Flash
  FLASH = 17;

  // Responsive, sizeless and fluid. Dynamically resizes to environment.
  RESPONSIVE = 18;

  // Values specific to Google's exchange.
  //
  // Orientation of video creatives.
  // These values are experimental and subject to change.
  // Video creative in landscape mode (width greater than height).
  VIDEO_ORIENTATION_LANDSCAPE = 500;

  // Video creative in portrait mode (height greater than width).
  VIDEO_ORIENTATION_PORTRAIT = 501;

  // Video creative in square mode (width equal to height).
  VIDEO_ORIENTATION_SQUARE = 502;
}

// OpenRTB 2.0: The following table is a list of API frameworks supported
// by the publisher. Note that MRAID-1 is a subset of MRAID-2.
// In OpenRTB 2.1 and prior, value "3" was "MRAID". However, not all
// MRAID capable APIs understand MRAID-2 features and as such the only
// safe interpretation of value "3" is MRAID-1. In OpenRTB 2.2, this was
// made explicit and MRAID-2 has been added as value "5".
enum APIFramework {
  // Video Player-Ad Interface Definition Version 1.0. See
  // https://iabtechlab.com/wp-content/uploads/2016/03/VPAID_1.0_Final.pdf
  VPAID_1 = 1;

  // Video Player-Ad Interface Definition Version 2.0. See
  // https://iabtechlab.com/wp-content/uploads/2016/04/VPAID_2_0_Final_04-10-2012.pdf
  VPAID_2 = 2;

  // Mobile Rich Media Ad Interface Definitions Version 1.0. See
  // https://www.iab.com/guidelines/mraid/.
  MRAID_1 = 3;

  // Open Rich Media Mobile Advertising. See
  // https://code.google.com/archive/p/ormma/
  ORMMA = 4;

  // Mobile Rich Media Ad Interface Definitions Version 2.0. See
  // https://www.iab.com/guidelines/mraid/.
  MRAID_2 = 5;

  // Mobile Rich Media Ad Interface Definitions Version 3.0. See
  // https://www.iab.com/guidelines/mraid/.
  MRAID_3 = 6;

  // Open Measurement Interface Definition Version 1.0. See
  // https://iabtechlab.com/standards/open-measurement-sdk/.
  OMID_1 = 7;

  // Secure Interactive Media Interface Definition Version 1.0.
  // See https://iabtechlab.com/simid/.
  SIMID_1_0 = 8;

  // Secure Interactive Media Interface Definition Version 1.1.
  // See https://iabtechlab.com/simid/.
  SIMID_1_1 = 9;
}

// OpenRTB 2.0: The following table specifies the position of the ad as a
// relative measure of visibility or prominence.
//
// This OpenRTB table has values derived from the IAB Quality Assurance
// Guidelines (QAG). Practitioners should keep in sync with updates to the
// QAG values as published on IAB.net. Values "3" - "6" apply to apps
// per the mobile addendum to QAG version 1.5.
enum AdPosition {
  UNKNOWN = 0;

  // Google expects that, once the content loads, the user will be able to view
  // the ad without needing to scroll.
  ABOVE_THE_FOLD = 1;

  // Fixed position.
  LOCKED = 2;

  // Google expects that, once the content loads, the user will need to scroll
  // in order to view the ad.
  BELOW_THE_FOLD = 3;

  // Horizontal ad that sticks on the top of the screen when user scrolls.
  HEADER = 4;

  // Horizontal ad that sticks on the bottom of the screen when user scrolls.
  FOOTER = 5;

  // Sidebar that sticks on screen when user scrolls.
  SIDEBAR = 6;

  // Full screen interstitial ad.
  AD_POSITION_FULLSCREEN = 7;
}

// OpenRTB 2.0: The following table indicates the options for video
// linearity. "In-stream" or "linear" video refers to pre-roll, post-roll,
// or mid-roll video ads where the user is forced to watch ad in order to
// see the video content. "Overlay" or "non-linear" refer to ads that are
// shown on top of the video content.
//
// This field is optional. The following is the interpretation of the
// bidder based upon presence or absence of the field in the bid request:
// - If no value is set, any ad (linear or not) can be present
//   in the response.
// - If a value is set, only ads of the corresponding type can be present
//   in the response.
//
// This OpenRTB table has values derived from the IAB Quality Assurance
// Guidelines (QAG). Practitioners should keep in sync with updates to the
// QAG values as published on IAB.net.
enum VideoLinearity {
  // Linear/In-stream
  LINEAR = 1;

  // Non-linear/Overlay
  NON_LINEAR = 2;
}

// OpenRTB 2.0: The following table lists the options for the various
// bid response protocols that could be supported by an exchange.
enum Protocol {
  VAST_1_0 = 1;
  VAST_2_0 = 2;
  VAST_3_0 = 3;
  VAST_1_0_WRAPPER = 4;
  VAST_2_0_WRAPPER = 5;
  VAST_3_0_WRAPPER = 6;
  VAST_4_0 = 7;
  VAST_4_0_WRAPPER = 8;
  DAAST_1_0 = 9;
  DAAST_1_0_WRAPPER = 10;
  VAST_4_1 = 11;
  VAST_4_1_WRAPPER = 12;
  VAST_4_2 = 13;
  VAST_4_2_WRAPPER = 14;
}

// OpenRTB 2.0: The following table lists the various playback methods.
enum PlaybackMethod {
  // Initiates on Page Load with Sound On.
  AUTO_PLAY_SOUND_ON = 1;

  // Initiates on Page Load with Sound Off by Default.
  AUTO_PLAY_SOUND_OFF = 2;

  // Initiates on Click with Sound On.
  CLICK_TO_PLAY = 3;

  // Initiates on Mouse-Over with Sound On.
  MOUSE_OVER = 4;

  // Initiates on Entering Viewport with Sound On.
  ENTER_SOUND_ON = 5;

  // Initiates on Entering Viewport with Sound Off by Default.
  ENTER_SOUND_OFF = 6;

  // Media playback is set to play additional media automatically without
  // user interaction. The media player will keep playing additional media
  // (playlist or generated) for the user until the user actively stops this
  // from happening.
  CONTINUOUS = 7;
}

// OpenRTB 2.0: The following table lists the various options for the
// audio/video start delay. If the start delay value is greater than 0,
// then the position is mid-roll and the value indicates the start delay.
enum StartDelay {
  PRE_ROLL = 0;
  GENERIC_MID_ROLL = -1;
  GENERIC_POST_ROLL = -2;
}

// OpenRTB 2.5: The following table lists the various types of video placements
// derived largely from the IAB Digital Video Guidelines.
enum VideoPlacementType {
  // The video placement is not defined.
  // Default value.
  UNDEFINED_VIDEO_PLACEMENT = 0;

  // Played before, during or after the streaming video content
  // that the consumer has requested.
  // For example: Pre-roll, Mid-roll, Post-roll.
  IN_STREAM_PLACEMENT = 1;

  // Exists within a web banner that leverages the banner space
  // to deliver a video experience as opposed to another static
  // or rich media format.
  // The format relies on the existence of display ad inventory
  // on the page for its delivery.
  IN_BANNER_PLACEMENT = 2;

  // Loads and plays dynamically between paragraphs of editorial content;
  // existing as a standalone branded message.
  IN_ARTICLE_PLACEMENT = 3;

  // In-Feed - Found in content, social, or product feeds.
  IN_FEED_PLACEMENT = 4;

  // Interstitial/Slider/Floating.
  // Covers the entire or a portion of screen area,
  // but is always on screen while displayed
  // (for example, cannot be scrolled out of view).
  // Note that a full-screen interstitial (for example, in mobile)
  // can be distinguished from a floating/slider unit by the imp.instl field.
  FLOATING_PLACEMENT = 5;
}

// Possible video placement types. See:
// https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--plcmt-subtypes---video-
enum Plcmt {
  PLCMT_UNKNOWN = 0;

  // Pre-roll, mid-roll, and post-roll ads that are played before, during or
  // after the streaming video content that the consumer has requested. Instream
  // video must be set to sound on by default at player start, or have
  // explicitly clear user intent to watch the video content. While there may be
  // other content surrounding the player, the video content must be the focus
  // of the users visit. It should remain the primary content on the page and
  // the only video player in-view capable of audio when playing. If the player
  // converts to floating/sticky, subsequent ad calls should accurately convey
  // the updated player size.
  PLCMT_INSTREAM = 1;

  // Pre-roll, mid-roll, and post-roll ads that are played before, during, or
  // after streaming video content. The video player loads and plays before,
  // between, or after paragraphs of text or graphical content, and starts
  // playing only when it enters the viewport. Accompanying content should only
  // start playback upon entering the viewport. It may convert to a
  // floating/sticky player as it scrolls off the page.
  PLCMT_ACCOMPANYING_CONTENT = 2;

  // Video ads that are played without video content. During playback, it must
  // be the primary focus of the page and take up the majority of the viewport
  // and cannot be scrolled out of view. This can be in placements like in-app
  // video or slideshows.
  PLCMT_INTERSTITIAL = 3;

  // Video ads that are played without streaming video content. This can be in
  // placements like slideshows, native feeds, in-content or sticky/floating.
  PLCMT_NO_CONTENT_STANDALONE = 4;
}

// OpenRTB 2.5: The various modes for when playback terminates.
enum PlaybackCessationMode {
  // On Video Completion or when Terminated by User
  COMPLETION_OR_USER = 1;

  // On Leaving Viewport or when Terminated by User
  LEAVING_OR_USER = 2;

  // On Leaving Viewport Continues as a Floating/Slider Unit until
  // Video Completion or when Terminated by User
  LEAVING_CONTINUES_OR_USER = 3;
}

// OpenRTB 2.6: Slot Position in Pod.
enum SlotPositionInPod {
  // Any position in the pod.
  SLOT_POSITION_POD_ANY = 0;

  // Last position in the pod.
  SLOT_POSITION_POD_LAST = -1;

  // First position in the pod.
  SLOT_POSITION_POD_FIRST = 1;

  // First or last position in the pod.
  SLOT_POSITION_POD_FIRST_OR_LAST = 2;
}

// OpenRTB 2.6: The values for the pod sequence field, for use in audio and
// video content streams with one or more ad pods.
enum PodSequence {
  // Any pod in the content stream
  POD_SEQUENCE_ANY = 0;

  // Last pod in the content stream
  POD_SEQUENCE_LAST = -1;

  // First pod in the content stream
  POD_SEQUENCE_FIRST = 1;
}

// OpenRTB 2.0: The following table lists the various options for the
// type of device connectivity.
enum ConnectionType {
  CONNECTION_UNKNOWN = 0;

  // Ethernet; Wired Connection
  ETHERNET = 1;

  // WiFi
  WIFI = 2;

  // Mobile Network - Unknown Generation
  CELL_UNKNOWN = 3;

  // Mobile Network - 2G
  CELL_2G = 4;

  // Mobile Network - 3G
  CELL_3G = 5;

  // Mobile Network - 4G
  CELL_4G = 6;

  // Mobile Network - 5G
  CELL_5G = 7;
}

// OpenRTB 2.0: The following table lists the directions in which an
// expandable ad may expand, given the positioning of the ad unit on the
// page and constraints imposed by the content.
enum ExpandableDirection {
  LEFT = 1;
  RIGHT = 2;
  UP = 3;
  DOWN = 4;
  EXPANDABLE_FULLSCREEN = 5;

  // Resize/Minimize (make smaller).
  RESIZE_MINIMIZE = 6;
}

// OpenRTB 2.0: The following table lists the various options for the
// delivery of video content. These values are defined by the IAB -
// https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--delivery-methods-.
enum ContentDeliveryMethod {
  // Content is transferred continuously by the network; clients receive
  // real-time content for playback while connected. Example: broadcast TV.
  STREAMING = 1;

  // Content is transferred incrementally as client's playback requires.
  // Example: on-demand movies, podcasts, or music.
  PROGRESSIVE = 2;

  // Content should be transferred completely prior to use/playback.
  // Example: content downloaded to the user's device for offline
  // consumption.
  DOWNLOAD = 3;
}

// OpenRTB 2.0: The following table lists the various options for
// indicating the type of content in which the impression will appear.
//
// This OpenRTB table has values derived from the IAB Quality Assurance
// Guidelines (QAG). Practitioners should keep in sync with updates to the
// QAG values as published on IAB.net.
enum ContentContext {
  VIDEO = 1;
  GAME = 2;
  MUSIC = 3;
  APPLICATION = 4;
  TEXT = 5;
  OTHER = 6;
  CONTEXT_UNKNOWN = 7;
}

// OpenRTB 2.0: The following table lists the options for content quality.
// These values are defined by the IAB -
// https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list--production-qualities-.
enum ProductionQuality {
  QUALITY_UNKNOWN = 0;

  // Content that is usually created or produced by media and entertainment
  // companies using professional-grade equipment, talent, and production
  // crews that hold or maintain the rights for distribution and syndication.
  PROFESSIONAL = 1;

  // Consumer or user-generated content that has professional or industrial
  // qualities (e.g. shot with professional-grade equipment, using
  // professional talent, etc.).
  PROSUMER = 2;

  // Publicly available video content that is created or produced by
  // end users.
  USER_GENERATED = 3;
}

// OpenRTB 2.0: The following table lists the options to indicate how the
// geographic information was determined.
enum LocationType {
  // GPS / Location Services.
  GPS_LOCATION = 1;

  // IP Geolocation.
  IP = 2;

  // User-provided, for example, registration data.
  USER_PROVIDED = 3;
}

// OpenRTB 2.4: The following table lists the services and/or vendors used for
// resolving IP addresses to geolocations.
enum LocationService {
  IP2LOCATION = 1;
  NEUSTAR = 2;
  MAXMIND = 3;
  NETACUITY = 4;
}

// OpenRTB 2.0: The following table lists the type of device from which the
// impression originated.
//
// OpenRTB version 2.2 of the specification added distinct values for Mobile
// and Tablet. It is recommended that any bidder adding support for 2.2
// treat a value of 1 as an acceptable alias of 4 & 5.
//
// This OpenRTB table has values derived from the IAB Quality Assurance
// Guidelines (QAG). Practitioners should keep in sync with updates to the
// QAG values as published on IAB.net.
enum DeviceType {
  // Mobile (OpenRTB 2.2+: obsolete, alias for PHONE or TABLET).
  MOBILE = 1;

  // Personal Computer.
  PERSONAL_COMPUTER = 2;

  // Connected TV.
  CONNECTED_TV = 3;

  // Phone.
  HIGHEND_PHONE = 4;

  // Tablet.
  TABLET = 5;

  // Connected device.
  CONNECTED_DEVICE = 6;

  // Set top box.
  SET_TOP_BOX = 7;

  // Out-of-home advertising, for example digital billboards.
  OOH_DEVICE = 8;
}

// OpenRTB 2.1: The following table lists the options for the
// video quality. These values are defined by the IAB -
// http://www.iab.net/media/file/long-form-video-final.pdf.
enum CompanionType {
  STATIC = 1;
  HTML = 2;
  COMPANION_IFRAME = 3;
}

// OpenRTB 2.1: The following table lists the media ratings used in
// describing content based on the QAG categorization.
// Refer to http://www.iab.net/ne_guidelines for more information.
enum QAGMediaRating {
  ALL_AUDIENCES = 1;
  EVERYONE_OVER_12 = 2;
  MATURE = 3;
}

// OpenRTB 2.2: The following table lists the options for a bidder to signal
// the exchange as to why it did not offer a bid for the impression.
enum NoBidReason {
  UNKNOWN_ERROR = 0;
  TECHNICAL_ERROR = 1;
  INVALID_REQUEST = 2;
  KNOWN_WEB_SPIDER = 3;
  SUSPECTED_NONHUMAN_TRAFFIC = 4;
  CLOUD_DATACENTER_PROXYIP = 5;
  UNSUPPORTED_DEVICE = 6;
  BLOCKED_PUBLISHER = 7;
  UNMATCHED_USER = 8;
  DAILY_READER_CAP = 9;
  DAILY_DOMAIN_CAP = 10;
}

// OpenRTB 2.5: The following table lists the options for an exchange
// to inform a bidder as to the reason why they did not win an impression.
enum LossReason {
  BID_WON = 0;
  INTERNAL_ERROR = 1;
  IMP_EXPIRED = 2;
  INVALID_BID = 3;
  INVALID_DEAL_ID = 4;
  INVALID_AUCTION_ID = 5;
  INVALID_ADOMAIN = 6;
  MISSING_MARKUP = 7;
  MISSING_CREATIVE_ID = 8;
  MISSING_PRICE = 9;
  MISSING_MIN_CREATIVE_APPROVAL_DATA = 10;
  BID_BELOW_FLOOR = 100;
  BID_BELOW_DEAL_FLOOR = 101;
  LOST_HIGHER_BID = 102;
  LOST_PMP_DEAL = 103;
  SEAT_BLOCKED = 104;
  CREATIVE_REASON_UNKNOWN = 200;
  CREATIVE_PENDING = 201;
  CREATIVE_DISAPPROVED = 202;
  CREATIVE_SIZE = 203;
  CREATIVE_FORMAT = 204;
  CREATIVE_ADVERTISER_EXCLUSION = 205;
  CREATIVE_APP_EXCLUSION = 206;
  CREATIVE_NOT_SECURE = 207;
  CREATIVE_LANGUAGE_EXCLUSION = 208;
  CREATIVE_CATEGORY_EXCLUSION = 209;
  CREATIVE_ATTRIBUTE_EXCLUSION = 210;
  CREATIVE_ADTYPE_EXCLUSION = 211;
  CREATIVE_ANIMATION_LONG = 212;
  CREATIVE_NOT_ALLOWED_PMP = 213;
}

// OpenRTB 2.4: The following table lists the types of feeds,
// typically for audio. These values are defined by the IAB -
// https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/master/AdCOM%20v1.0%20FINAL.md#list--feed-types-.
enum FeedType {
  // Music streaming service.
  MUSIC_SERVICE = 1;

  // Live content broadcast over the air but also available through online
  // streaming.
  BROADCAST = 2;

  // Original, pre-recorded content distributed as episodes in a series.
  PODCAST = 3;
}

// OpenRTB 2.4: The following table lists the types of volume normalization
// modes, typically for audio.
enum VolumeNormalizationMode {
  NONE = 0;
  AVERAGE_VOLUME = 1;
  PEAK_VOLUME = 2;
  LOUDNESS = 3;
  CUSTOM_VOLUME = 4;
}

// Possible sources for User-Agent data.
enum UserAgentSource {
  UNKNOWN_SOURCE = 0;

  // User-Agent Client Hints (only low-entropy headers were available).
  CLIENT_HINTS_LOW_ENTROPY = 1;

  // User-Agent Client Hints (with high-entropy headers available).
  CLIENT_HINTS_HIGH_ENTROPY = 2;

  // Parsed from User-Agent header.
  USER_AGENT_STRING = 3;
}

// OpenRTB 2.6: Creative markup types.
enum CreativeMarkupType {
  // Ad markup returned as HTML code in response to the BidRequest.imp.banner
  // object specification.
  CREATIVE_MARKUP_BANNER = 1;

  // VAST URL or inline VAST XML document returned that represents a video ad in
  // response to the BidRequest.imp.video object specification.
  CREATIVE_MARKUP_VIDEO = 2;

  // VAST URL or inline VAST XML document that represents an audio ad returned
  // in response to the BidRequest.imp.audio object specification.
  CREATIVE_MARKUP_AUDIO = 3;

  // Native markup response object returned as per for the BidRequest.imp.native
  // object specification.
  CREATIVE_MARKUP_NATIVE = 4;
}

// OpenRTB 2.6: Server-side ad insertion type.
enum ServerSideAdInsertionType {
  // Status unknown.
  SERVER_SIDE_AD_INSERTION_TYPE_UNKNOWN = 0;

  // All clientside (not server-side).
  CLIENT_SIDE_ONLY = 1;

  // Assets stitched server-side but tracking pixels fired client-side.
  SERVER_SIDE_STITCHED_CLIENT_TRACKER = 2;

  // All server-side.
  SERVER_SIDE_ONLY = 3;
}

// OpenRTB 2.6: The user agent types a user identifier is from.
// Not supported by Google.
enum AgentType {
  // An ID which is tied to a specific web browser or device (cookie-based,
  // probabilistic, or other).
  BROWSER_OR_DEVICE = 1;

  // In-app impressions, which will typically contain a type of device ID
  // (or rather, the privacy-compliant versions of device IDs).
  IN_APP_IMPRESSION = 2;

  // An identifier that is the same across devices.
  STABLE_ID = 3;
}

// OpenRTB 2.6: The options for taxonomies that can be used to describe content,
// audience, and ad creative categories.
enum CategoryTaxonomy {
  // DEPRECATED in OpenRTB 2.6+.
  // IAB Tech Lab Content Category Taxonomy 1.0.
  IAB_CONTENT_1_0 = 1 [deprecated = true];

  // DEPRECATED in OpenRTB 2.6+.
  // IAB Tech Lab Content Category Taxonomy 2.0.
  IAB_CONTENT_2_0 = 2 [deprecated = true];

  // IAB Tech Lab Ad Product Taxonomy 1.0. See:
  // https://iabtechlab.com/wp-content/uploads/2020/10/IABTL-Ad-Product-Taxonomy-1.0-Final.xlsx
  IAB_PRODUCT_1_0 = 3;

  // IAB Tech Lab Audience Taxonomy 1.1. See:
  // https://iabtechlab.com/standards/audience-taxonomy/
  IAB_AUDIENCE_1_1 = 4;

  // IAB Tech Lab Content Taxonomy 2.1. See:
  // https://iabtechlab.com/standards/content-taxonomy/
  IAB_CONTENT_2_1 = 5;

  // IAB Tech Lab Content Taxonomy 2.2. See:
  // https://iabtechlab.com/standards/content-taxonomy/
  IAB_CONTENT_2_2 = 6;

  // Google Categories, which includes Google product, sensitive, and
  // restricted categories. For a full list of categories, see below:
  // https://storage.googleapis.com/adx-rtb-dictionaries/ad-product-categories.txt
  // https://storage.googleapis.com/adx-rtb-dictionaries/ad-sensitive-categories.txt
  // https://storage.googleapis.com/adx-rtb-dictionaries/ad-restricted-categories.txt
  GOOGLE_CATEGORIES = 500;

  // Exchange-specific values above 500.
  //
  // Chromium Topics API taxonomy. See:
  // https://github.com/patcg-individual-drafts/topics/blob/main/taxonomy_v1.md
  CHROME_TOPICS = 600;
}

// ***** OpenRTB Native enums **************************************************
//
// DEPRECATED in OpenRTB Native 1.1, REMOVED in 1.2+.
enum LayoutId {
  CONTENT_WALL = 1;
  APP_WALL = 2;
  NEWS_FEED = 3;
  CHAT_LIST = 4;
  CAROUSEL = 5;
  CONTENT_STREAM = 6;
  GRID = 7;
}

// DEPRECATED in OpenRTB Native 1.1, REMOVED in 1.2+.
enum AdUnitId {
  PAID_SEARCH_UNIT = 1;
  RECOMMENDATION_WIDGET = 2;
  PROMOTED_LISTING = 3;
  IAB_IN_AD_NATIVE = 4;
  ADUNITID_CUSTOM = 5;
}

// OpenRTB Native 1.1: The context in which the ad appears - what type
// of content is surrounding the ad on the page at a high level.
// This maps directly to the new Deep Dive on In-Feed Ad Units.
// This denotes the primary context, but does not imply other content
// may not exist on the page - for example, it's expected that most
// content platforms have some social components.
enum ContextType {
  // Content-centric context such as newsfeed, article, image gallery,
  // video gallery, or similar.
  CONTENT = 1;

  // Social-centric context such as social network feed, email,
  // chat, or similar.
  SOCIAL = 2;

  // Product context such as product listings, details, recommendations,
  // reviews, or similar.
  PRODUCT = 3;
}

// OpenRTB Native 1.1: Next-level context in which the ad appears.
// Again this reflects the primary context, and does not imply no presence
// of other elements. For example, an article is likely to contain images
// but is still first and foremost an article. SubType should only be
// combined with the primary context type as indicated (ie for a context
// type of 1, only context subtypes that start with 1 are valid).
enum ContextSubtype {
  CONTENT_GENERAL_OR_MIXED = 10;
  CONTENT_ARTICLE = 11;
  CONTENT_VIDEO = 12;
  CONTENT_AUDIO = 13;
  CONTENT_IMAGE = 14;
  CONTENT_USER_GENERATED = 15;
  SOCIAL_GENERAL = 20;
  SOCIAL_EMAIL = 21;
  SOCIAL_CHAT_IM = 22;
  PRODUCT_SELLING = 30;
  PRODUCT_MARKETPLACE = 31;
  PRODUCT_REVIEW = 32;
}

// OpenRTB Native 1.1: The FORMAT of the ad you are purchasing,
// separate from the surrounding context.
enum PlacementType {
  // In the feed of content - for example as an item inside the organic
  // feed/grid/listing/carousel.
  IN_FEED = 1;

  // In the atomic unit of the content - IE in the article page
  // or single image page.
  ATOMIC_UNIT = 2;

  // Outside the core content - for example in the ads section on the
  // right rail, as a banner-style placement near the content, or another
  // placement type.
  OUTSIDE = 3;

  // Recommendation widget, most commonly presented below
  // the article content.
  RECOMMENDATION = 4;
}

// OpenRTB Native 1.0: Common asset element types of native advertising.
// This list is non-exhaustive and intended to be extended by the buyers
// and sellers as the format evolves. An implementing exchange may not
// support all asset variants or introduce new ones unique to that system.
enum DataAssetType {
  // Sponsored By message where response should contain the brand name
  // of the sponsor.
  // Format: Text; Max length: 25 or longer.
  SPONSORED = 1;

  // Descriptive text associated with the product or service being advertised.
  // Format: Text; Max length: 140 or longer.
  DESC = 2;

  // Rating of the product being offered to the user.
  // For example an app's rating in an app store from 0-5.
  // Format: Number (1-5 digits) formatted as string.
  RATING = 3;

  // Number of social ratings or "likes" of product being offered to the user.
  // Format: Number formatted as string.
  LIKES = 4;

  // Number downloads/installs of this product.
  // Format: Number formatted as string.
  DOWNLOADS = 5;

  // Price for product / app / in-app purchase.
  // Value should include currency symbol in localised format.
  // Format: Number formatted as string.
  PRICE = 6;

  // Sale price that can be used together with price to indicate a discounted
  // price compared to a regular price. Value should include currency symbol
  // in localised format.
  // Format: Number formatted as string.
  SALEPRICE = 7;

  // Phone number.
  // Format: Formatted string.
  PHONE = 8;

  // Address.
  // Format: Text.
  ADDRESS = 9;

  // Additional descriptive text associated with the product or service
  // being advertised.
  // Format: Text.
  DESC2 = 10;

  // Display URL for the text ad.
  // Format: Text.
  DISPLAYURL = 11;

  // Text describing a 'call to action' button for the destination URL.
  // Format: Text.
  CTATEXT = 12;
}

// OpenRTB Native 1.0: Common image asset element types of native advertising
// at the time of writing this spec. This list is non-exhaustive and intended
// to be extended by the buyers and sellers as the format evolves.
enum ImageAssetType {
  // Icon image.
  // Max height: at least 50; Aspect ratio: 1:1.
  ICON = 1;

  // DEPRECATED in OpenRTB Native 1.2+. Prefer type <code>ICON</code>.
  // Logo image for the brand/app.
  LOGO = 2 [deprecated = true];

  // Large image preview for the ad.
  // At least one of 2 size variants required:
  // Small Variant: max height: 200+, max width: 200+, 267, or 382,
  //                aspect ratio: 1:1, 4:3, or 1.91:1.
  // Large Variant: max height: 627+, max width: 627+, 836, or 1198,
  //                aspect ratio: 1:1, 4:3, or 1.91:1.
  MAIN = 3;
}

// OpenRTB Native 1.2.
enum EventType {
  // Impression
  IMPRESSION = 1;

  // Visible impression using MRC definition at 50% in view for 1 second.
  VIEWABLE_MRC_50 = 2;

  // 100% in view for 1 second (ie GroupM standard).
  VIEWABLE_MRC_100 = 3;

  // Visible impression for video using MRC definition at 50% in view
  // for 2 seconds.
  VIEWABLE_VIDEO_50 = 4;

  // Exchange-specific values above 500.
  //
  // Open Measurement. See:
  // https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/OpenRTB%20support%20for%20OMSDK.md#specific-guidance-for-native-ads
  OMID = 555;
}

// OpenRTB Native 1.2.
enum EventTrackingMethod {
  // Image-pixel tracking - URL provided will be insterted as a 1x1 pixel at the
  // time of the event.
  IMG = 1;

  // Javascript-based tracking - URL provided will be insterted as a js tag at
  // the time of the event.
  JS = 2;
}