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"