Bid on Behalf of Multiple Accounts

A bidder can purchase inventory for multiple buyers in a single bid response. For example, a demand-side platform (DSP) might use its bidding application to purchase inventory for several marketers or agencies who are buyers. This guide explains how to code your bidder to process a single request sent on behalf of multiple buyers.

Background

In some scenarios, an ad network or agency trading desk may choose to work with one or more DSPs. There are two options available for buyers who work through a DSP:

  • The DSP purchases inventory for marketers or agencies that are not buyers. In this case, the DSP receives one bid request and responds with one bid. Google bills the DSP directly.
  • The DSP purchases inventory for marketers or agencies that are buyers. The DSP receives one bid request including multiple billing IDs associated with eligible buyers, and can place distinct bids for each buyer they intend to bid on behalf of. In this model, Google bills the buyer, not the DSP. The rest of this guide focuses on this scenario.

Setup and pretargeting

Google will send a bid request containing one or more billing IDs associated with buyers and pretargeting configurations that targeted the impression. These can be found with the BidRequest.imp.ext.billing_id field.

When responding to a BidRequest that contains billing IDs from multiple buyers, BidResponse.seatbid.bid.ext.billing_id is required so that Google knows which account to associate with the bid. Any response that does not set the field is filtered. The field remains optional for any BidRequest that only includes a single billing ID.

Pretargeting example

A bidder bids on behalf of two buyers, one having a billing ID of 123, and the other with billing ID 124. The bidder configures one pretargeting configuration with billing ID 213 to target the English language, and another with billing ID 231 to target personal computers. The following describes the billing IDs that appear in bid requests for different kinds of impressions.

Impression description Billing IDs in bid request
Japanese language content on a personal computer. 123, 124, 231
English language content on a mobile phone. 123, 124, 213
English language content on a personal computer. 123, 124, 213, 231

Example BidRequests

Below are examples of a BidRequest. You'll note that there are multiple billing IDs in these requests because the requests are applicable to multiple accounts.

id: "n9YFp0D9qE02Q5A49bo68a"
imp {
  id: "1"
  banner {
    w: 320
    h: 50
    pos: ABOVE_THE_FOLD
    api: MRAID_1
    api: MRAID_2
    format {
      w: 320
      h: 50
    }
  }
  displaymanager: "GoogleMobileAds-iOS"
  displaymanagerver: "11.2.0"
  tagid: "2913643481"
  bidfloor: 0.04
  bidfloorcur: "USD"
  secure: true
  exp: 3600
  clickbrowser: true
  metric {
    type: "click_through_rate"
    value: 0.0003642654628492892
    vendor: "EXCHANGE"
  }
  metric {
    type: "viewability"
    value: 0.98
    vendor: "EXCHANGE"
  }
  [com.google.doubleclick.imp] {
    billing_id: 41048190734
    billing_id: 87998475627
    publisher_settings_list_id: 5889715199959683550
    publisher_settings_list_id: 3379823455061055318
    allowed_vendor_type: 566
    allowed_vendor_type: 113
    ampad: AMP_AD_NOT_ALLOWED
    skadn {
      sourceapp: "com.google.testapp"
      skadnetids: "6ZVs3vs4"
      versions: "2.0"
      versions: "2.1"
      fidelities: VIEW_THROUGH_ADS
      fidelities: STOREKIT_RENDERED_ADS
    }
    creative_enforcement_settings {
      policy_enforcement: POLICY_ENFORCEMENT_NETWORK_AND_PLATFORM_POLICY
      publisher_blocks_enforcement: PUBLISHER_BLOCKS_ENFORCEMENT_APPLIES
    }
    auction_environment: SERVER_SIDE_AUCTION
    ae: SERVER_SIDE_AUCTION
  }
}
app {
  name: "Test App"
  bundle: "com.google.testapp"
  publisher {
    id: "pub-6227762759521589"
    [com.google.doubleclick.publisher] {
      country: "US"
    }
  }
  content {
    url: "https://www.google.com"
    livestream: false
    language: "en"
  }
  storeurl: "https://www.google.com"
  [com.google.doubleclick.app] {
    inventorypartnerdomain: "OMITTED"
  }
}
device {
  ua: "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
  ip: "192.168.1.0"
  geo {
    lat: 0.0
    lon: 0.0
    country: "USA"
    region: "TX"
    metro: "623"
    city: "Lewisville"
    type: IP
    utcoffset: -300
    accuracy: 6225
  }
  make: "Apple"
  model: "iPhone13,2"
  os: "iOS"
  osv: "17.4.1"
  connectiontype: WIFI
  devicetype: HIGHEND_PHONE
  lmt: true
  hwv: "iPhone13,2"
  w: 390
  h: 844
  pxratio: 3.0
  sua {
    browsers {
      brand: "Mozilla"
      version: "5"
      version: "0"
    }
    browsers {
      brand: "AppleWebKit"
      version: "605"
      version: "1"
    }
    platform {
      brand: "iPhone"
      version: "17"
      version: "4"
    }
    mobile: true
    bitness: "64"
    model: "iPhone"
    source: USER_AGENT_STRING
  }
  [com.google.doubleclick.device] {
    atts: 2
  }
}
at: FIRST_PRICE
tmax: 1000
cur: "USD"
bcat: "IAB18-5"
bcat: "IAB23-4"
bapp: "359917414"
bapp: "1446254576"
source {
  schain {
    complete: true
    nodes {
      asi: "testssp.com"
      sid: "pub-1111111111111111"
      hp: true
    }
    ver: "1.0"
  }
  [com.google.doubleclick.source] {
    omidpn: "Google"
    omidpv: "afma-sdk-i-v11.2.0"
    schain {
      complete: 1
      nodes {
        asi: "testssp.com"
        sid: "pub-1111111111111111"
        hp: 1
      }
      ver: "1.0"
    }
  }
}
[com.google.doubleclick.bid_request] {
  google_query_id: "ANy-z17251-40u3eXfXPL5j3MDPa7n6Ree92uf7354o71FP67Rk5i3G30Ez7p39Ze1722D8H"
  fcap_scope: FREQUENCY_CAPPING_SCOPE_APP
  privacy_treatments {
    allow_user_data_collection: true
  }
}
{
  "id": "pu96xf0D7otnT4Q317588G",
  "imp": [
    {
      "id": "1",
      "banner": {
        "w": 320,
        "h": 50,
        "pos": 1,
        "expdir": [
          1,
          2,
          3,
          4
        ],
        "api": [
          3,
          5
        ],
        "format": [
          {
            "w": 320,
            "h": 50
          },
          {
            "w": 320,
            "h": 100
          }
        ]
      },
      "displaymanager": "GoogleMobileAds-iOS",
      "displaymanagerver": "10.5.0",
      "tagid": "1077633402",
      "bidfloor": 0.01,
      "bidfloorcur": "USD",
      "secure": 1,
      "exp": 3600,
      "clickbrowser": 1,
      "metric": [
        {
          "type": "viewability",
          "value": 0.74,
          "vendor": "EXCHANGE"
        },
        {
          "type": "session_depth",
          "value": 1,
          "vendor": "EXCHANGE"
        }
      ],
      "ext": {
        "billing_id": [
          "77621228638",
          "75301362736"
        ],
        "dfp_ad_unit_code": "/9041646/google/test",
        "ampad": 2,
        "buyer_generated_request_data": [
          {
            "source_app": {
              "id": "com.google.ads.mediation.test.TestAdapter"
            },
            "data": "Test Data"
          }
        ],
        "excluded_creatives": [
          {
            "buyer_creative_id": "EXCLUDED_BUYER_CREATIVE_ID"
          },
          {
            "buyer_creative_id": "EXCLUDED_BUYER_CREATIVE_ID"
          }
        ],
        "creative_enforcement_settings": {
          "policy_enforcement": 1,
          "publisher_blocks_enforcement": 2
        },
        "billable_event_rate_adjustment": 1,
        "auction_environment": 0,
        "ad_unit_mapping": [
          {
            "keyvals": [
              {
                "key": "OMITTED",
                "value": "OMITTED"
              },
              {
                "key": "OMITTED",
                "value": "OMITTED"
              }
            ],
            "format": 1
          }
        ],
        "ae": 0
      }
    }
  ],
  "app": {
    "name": "Test App",
    "bundle": "com.google.testapp",
    "publisher": {
      "id": "pub-3858090347872942",
      "ext": {
        "country": "JP"
      }
    },
    "content": {
      "url": "https://www.google.com",
      "livestream": 0,
      "language": "ja"
    },
    "storeurl": "https://www.google.com",
    "ext": {
      "installed_sdk": [
        {
          "id": "com.google.ads.mediation.test.TestAdapter",
          "sdk_version": {
            "major": 5,
            "minor": 2,
            "micro": 6
          },
          "adapter_version": {
            "major": 5,
            "minor": 2,
            "micro": 600
          }
        }
      ],
      "inventorypartnerdomain": "OMITTED"
    }
  },
  "device": {
    "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",
    "ip": "192.168.1.0",
    "geo": {
      "lat": 0.0,
      "lon": 0.0,
      "country": "JPN",
      "region": "JP-11",
      "city": "Wako",
      "type": 2,
      "utcoffset": 540,
      "accuracy": 1656
    },
    "make": "Apple",
    "model": "iPhone13,2",
    "os": "iOS",
    "osv": "17.4.1",
    "connectiontype": 2,
    "devicetype": 4,
    "ifa": "644t6oo9K5630T4P55UhH3U6QwBvyR8434j1",
    "lmt": 0,
    "hwv": "iPhone13,2",
    "w": 390,
    "h": 844,
    "pxratio": 3,
    "sua": {
      "browsers": [
        {
          "brand": "Mozilla",
          "version": [
            "5",
            "0"
          ]
        },
        {
          "brand": "AppleWebKit",
          "version": [
            "605",
            "1"
          ]
        }
      ],
      "platform": {
        "brand": "iPhone",
        "version": [
          "17",
          "4"
        ]
      },
      "mobile": 1,
      "bitness": "64",
      "model": "iPhone",
      "source": 3
    },
    "ext": {
      "atts": 3
    }
  },
  "user": {
    "id": "wr62bT596f06jhZ1V77n3I1b63h",
    "data": [
      {
        "id": "pub-9226299926337762",
        "name": "Publisher Passed",
        "segment": [
          {
            "name": "TEST_NAME",
            "value": "TEST_VALUE"
          },
          {
            "name": "TEST_NAME",
            "value": "TEST_VALUE"
          }
        ]
      }
    ],
  },
  "at": 1,
  "tmax": 1000,
  "cur": [
    "USD"
  ],
  "source": {
    "schain": {
      "complete": 1,
      "nodes": [
        {
          "asi": "testssp.com",
          "sid": "pub-1111111111111111",
          "hp": 1
        }
      ],
      "ver": "1.0"
    },
    "ext": {
      "omidpn": "Google",
      "omidpv": "afma-sdk-i-v10.5.0",
      "schain": {
        "complete": 1,
        "nodes": [
          {
            "asi": "testssp.com",
            "sid": "pub-1111111111111111",
            "hp": 1
          }
        ],
        "ver": "1.0"
      }
    }
  },
  "ext": {
    "google_query_id": "ANy-z3D398-yn1l2uC2D50Bl9f19AQ3nSQAI82307LmCWc646P925n10EqSpUdQ1wt1IxQj7",
    "fcap_scope": 1
  }
}
id: "\330\334\201\343\345\\jN\3313`V^\214\207\003\345\022GP\023\323\251"
user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"
url: "https://www.google.com"
detected_language: "it"
adslot {
  id: 1
  width: 414
  width: 320
  height: 50
  height: 50
  excluded_attribute: 15
  excluded_attribute: 22
  allowed_vendor_type: 489
  allowed_vendor_type: 550
  excluded_sensitive_category: 36
  excluded_sensitive_category: 4
  matching_ad_data {
    billing_id: 97713609660
    billing_id: 60373602214
    minimum_cpm_micros: 40000
  }
  matching_ad_data {
    billing_id: 84882034591
    billing_id: 74365219129
    minimum_cpm_micros: 520000
  }
  slot_visibility: ABOVE_THE_FOLD
  ad_block_key: 4252652432
  publisher_settings_list_id: 8511095895255592384
  excluded_creatives {
    buyer_creative_id: "EXCLUDED_BUYER_CREATIVE_ID"
  }
  excluded_creatives {
    buyer_creative_id: "EXCLUDED_BUYER_CREATIVE_ID"
  }
  viewability: 89
  click_through_rate: 0.0027791813
  allowed_ad_types: ALLOWED_AD_TYPE_BANNER
  is_amp_page: DIALECT_HTML
  amp_ad_requirement_type: AMP_AD_NOT_ALLOWED
  consented_providers_settings {
    consented_providers: 196
    consented_providers: 153
    additional_consent_string: "OMITTED"
  }
  regs_gdpr: true
  api: OMID_1
  api: MRAID_1
  omidpn: "Google"
  omidpv: "afma-sdk-i-v9.0.0"
  creative_enforcement_settings {
    policy_enforcement: POLICY_ENFORCEMENT_NETWORK_AND_PLATFORM_POLICY
    publisher_blocks_enforcement: PUBLISHER_BLOCKS_ENFORCEMENT_APPLIES
  }
  auction_environment: SERVER_SIDE_AUCTION
  impression_expiration_seconds: 3600
  supported_auction_environment: SERVER_SIDE_AUCTION
  display_manager: "GoogleMobileAds-iOS"
  display_manager_version: "9.0.0"
}
is_test: false
timezone_offset: 120
mobile {
  app_id: "116395214"
  is_app: true
  app_name: "Test App"
}
postal_code: "10011"
geo_criteria_id: 20524
publisher_settings_list_id: 9033154688577085139
publisher_type: PUBLISHER_OWNED_AND_OPERATED
partner_id: 8689962800479104672
device {
  device_type: HIGHEND_PHONE
  platform: "iphone"
  brand: "Apple"
  model: "iPhone9,4"
  os_version {
    major: 15
    minor: 8
    micro: 2
  }
  carrier_id: 0
  screen_width: 414
  screen_height: 736
  screen_pixel_ratio_millis: 3000
  screen_orientation: PORTRAIT
  hardware_version: "iPhone9,4"
  limit_ad_tracking: true
  app_tracking_authorization_status: DENIED
  connection_type: WIFI
}
publisher_country: "IT"
publisher_id: "pub-1111111111111111"
response_deadline_ms: 1000
google_query_id: "ANy-z17d1Q-rs050w92ve6V2Lm2820pMZ0517u12jT7m02AURu7dw0XbsQ0pK5EAd173Cm1Q"
auction_type: FIRST_PRICE
geo {
  lat: 42.85
  lon: 13.7
  country: "ITA"
  region: "IT-AP"
  zip: "63082"
  utcoffset: 120
  accuracy: 19730
}
user_agent_data {
  platform {
    brand: "iPhone"
    version: "15"
    version: "0"
  }
  mobile: true
  model: "iPhone"
  browsers {
    brand: "Mozilla"
    version: "5"
    version: "0"
  }
  browsers {
    brand: "AppleWebKit"
    version: "605"
    version: "1"
  }
  bitness: "64"
  source: USER_AGENT_STRING
}
supply_chain {
  complete: true
  nodes {
    advertising_system_identifier: "testdomain.com"
    seller_identifier: "pub-1111111111111111"
    handles_payment: true
  }
  version: "1.0"
}
frequency_capping_scope: FREQUENCY_CAPPING_SCOPE_NONE
privacy_treatments {
  ip: IP_REDACTED
  user_agent: USER_AGENT_COARSENED
  non_personalized_ads_reason: PUBLISHER_DECLARED_NPA
  allow_user_data_collection: false
  device_storage_restriction_reason: INSUFFICIENT_USER_CONSENT
}
inventory_partner_domain: "OMITTED"