This repository has been archived by the owner on Sep 27, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathopenrtb-adx.proto
1271 lines (1108 loc) · 55.4 KB
/
openrtb-adx.proto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// Protocol version: v.84
import "openrtb.proto";
option java_outer_classname = "AdxExt";
package com.google.doubleclick;
// Copyright 2021 Google Inc. All Rights Reserved.
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
// Protocol buffer for Ad Exchange OpenRTB specification.
// Ad Exchange extensions for the Imp object.
message ImpExt {
// [AdX: BidRequest.AdSlot.MatchingAdData.billing_id]
repeated int64 billing_id = 1;
// [AdX: BidRequest.publisher_settings_list_id]
// [AdX: BidRequest.AdSlot.publisher_settings_list_id]
repeated fixed64 publisher_settings_list_id = 2;
// [AdX: BidRequest.AdSlot.allowed_vendor_type]
repeated int32 allowed_vendor_type = 3 [packed = true];
// A creative that is disallowed to bid on this impression due to Ad
// Exchange policies or creative disapproval, excluded creative attributes,
// excluded product or sensitive categories, allowed vendor types,
// restricted categories or languages applicable to the bid request.
message ExcludedCreative {
// Buyer creative ID of the disallowed creative.
optional string buyer_creative_id = 1;
}
// Creatives that are disallowed for the impression. Submitting a bid with
// one of the creatives in this list will result in such bid being filtered
// before the auction. Please contact your account manager if you would like
// to enable this feature.
repeated ExcludedCreative excluded_creatives = 10;
// This field is deprecated due to being unused and will be removed
// August 2021.
// [AdX: BidRequest.AdSlot.ExchangeBidding.publisher_parameter]
repeated string DEPRECATED_publisher_parameter = 4 [deprecated = true];
// [AdX: BidRequest.AdSlot.dfp_ad_unit_code]
optional string dfp_ad_unit_code = 6;
// [AdX: BidRequest.AdSlot.is_rewarded]
optional bool is_rewarded_inventory = 7;
// Possible requirement types for AMP ads.
enum AmpAdRequirementType {
// AMP ad requirements unknown.
UNKNOWN_AMP_AD_REQUIREMENT_TYPE = 1;
// AMP ads are not allowed.
AMP_AD_NOT_ALLOWED = 2;
// Either AMP ads or non-AMP ads are allowed;
// AMP ads are not early rendered.
AMP_AD_ALLOWED_AND_NOT_EARLY_RENDERED = 3;
// Either AMP ads or non-AMP ads are allowed;
// AMP ads are early rendered.
AMP_AD_ALLOWED_AND_EARLY_RENDERED = 4;
// AMP ads are required.
// Ads that are non-AMP may be rejected by the publisher.
AMP_AD_REQUIRED = 5;
// Exchange-specific values above 500.
}
optional AmpAdRequirementType ampad = 8
[default = UNKNOWN_AMP_AD_REQUIREMENT_TYPE];
// Data, opaque to Google and to the publisher, generated by the buyer
// within the publisher's mobile application.
message BuyerGeneratedRequestData {
// Identification for the source of the buyer generated request data when
// that source is from within an application.
message SourceApp {
// Identifier for the SDK that generated this data. It will match the id
// in AppExt.InstalledSdk.id.
optional string id = 1;
}
// The source of the data.
oneof source {
SourceApp source_app = 1;
}
// Data sent from the buyer's source within the publisher's domain to the
// bidder. This data is opaque to the publisher and to Google.
optional string data = 2;
}
repeated BuyerGeneratedRequestData buyer_generated_request_data = 9;
// For ads rendered using a custom SDK only: multiplier applied to bid in
// the auction. The adjustment reflects the likelihood that your bid would
// generate a billable event (i.e. the ad renders successfully) if it won
// the auction, relative to the probability that other bids generate a
// billable event if they won the auction. This adjustment can be larger or
// smaller than 1. This affects the final ranking in the auction only; in
// particular, this multiplier does not affect the payment.
optional double billable_event_rate_adjustment = 16 [default = 1.0];
// Parameters related to Open Bidding.
message OpenBidding {
// This field is set to true if the publisher set up a yield group or a
// mediation group that targets this adslot and this bidder. See
// https://support.google.com/admanager/answer/7128453 for information on
// Open Bidding and its effects on the bidding process.
optional bool is_open_bidding = 2;
}
optional OpenBidding open_bidding = 12;
// The allowed restricted ad categories. See
// https://storage.googleapis.com/adx-rtb-dictionaries/ad-restricted-categories.txt
// for a list of ids. If you bid with an ad in a restricted category, you MUST
// ALWAYS declare the category in the bid response regardless of the values in
// this field.
repeated int32 allowed_restricted_category = 13;
// Publisher's SKAdNetwork information to support app installation
// attribution for iOS 14 and later. Apple's SKAdNetwork API helps
// advertisers measure ad-driven app installation by sending a postback
// to the ad network after a successful install. Publishers will need
// to configure supported ad networks in their app's property list
// (Info.plist) to allow an install to be attributed to the ad impression.
// For more info visit:
// https://developer.apple.com/documentation/storekit/skadnetwork
message SKAdNetworkRequest {
// Version of SKAdNetwork supported. Dependent on both the OS version
// and the SDK version.
// Note: This field will be replaced by the
// BidRequest.mobile.skadn.versions field to support a list of version
// numbers.
optional string version = 1;
// List of SKAdNetwork versions supported, depending on the OS version
// and the SDK version.
repeated string versions = 4;
// ID of publisher app in Apple’s App Store.
optional string sourceapp = 2;
// SKAdNetworkIdentifier entries in the publisher app's Info.plist.
repeated string skadnetids = 3;
// List of fidelity types supported, depending on the SKAdNetwork API
// version supported by the operating system and SDK as well as ad slot
// properties.
repeated SKAdNetworkFidelityType fidelities = 5 [packed = true];
}
// [AdX: BidRequest.Mobile.skadn]
optional SKAdNetworkRequest skadn = 14;
// Indicates the creative policy and publisher blocks that applies to this
// request.
message CreativeEnforcementSettings {
// Creative policy enforcement level that applies to this request.
// Creatives that don't adhere to the specified policy will be filtered
// before the auction. The status of the creatives with their respected
// policies can be retrieved via Creative API.
// https://developers.google.com/authorized-buyers/apis/guides/rtb-api/creatives
// Bids on deals may override the policy enforcement applicable to the
// request.
enum PolicyEnforcement {
POLICY_ENFORCEMENT_UNKNOWN = 0;
// Baseline policy for all ads serving through any of Google’s ads
// platform products. Learn more at:
// https://support.google.com/platformspolicy/answer/3013851.
POLICY_ENFORCEMENT_PLATFORM_POLICY = 1;
// Policy for ads serving through Google’s ad network. This includes the
// baseline policy for all ads serving through any of Google’s ads
// platform products. Learn more at:
// https://support.google.com/authorizedbuyers/answer/1325008.
POLICY_ENFORCEMENT_NETWORK_AND_PLATFORM_POLICY = 2;
}
optional PolicyEnforcement policy_enforcement = 1;
// Creative publisher blocks enforcement level that applies to this
// request. Publisher blocks allow publishers to control which creatives
// can be shown on their properties.
// Deals may also override publisher blocks. Please refer to Deals.adx_ext.
// publisher_blocks_overridden field.
enum PublisherBlocksEnforcement {
PUBLISHER_BLOCKS_ENFORCEMENT_UNKNOWN = 0;
// The publisher's blocking controls are enforced on creatives
// submitted. Publisher blocks enforcement settings are provided in the
// following fields:
// - Imp.adx_ext.publisher_settings_list_id
// - bcat
// - Imp.adx_ext.allowed_restricted_category
// - Imp.adx_ext.allowed_vendor_type
// - Audio.battr
// - Video.battr
// - Banner.battr
// - Native.battr
PUBLISHER_BLOCKS_ENFORCEMENT_APPLIES = 1;
// The publisher's blocking controls are not enforced on creatives
// submitted.
PUBLISHER_BLOCKS_ENFORCEMENT_OVERRIDDEN = 2;
}
optional PublisherBlocksEnforcement publisher_blocks_enforcement = 3;
// Indicates whether the policy, scan and publisher blocks level
// combination is the default combination for this bidder.
optional bool is_default = 4;
}
optional CreativeEnforcementSettings creative_enforcement_settings = 15;
// Describes the environment where the ad auction is run: either all
// on the server-side, server-side with sandboxed interest group bidding
// simulation, or with the contextual auction on the server-side and the
// interest group bidding and the final auction on the device.
enum AuctionEnvironment {
// The auction determining the winning ad is held server-side.
SERVER_SIDE_AUCTION = 0;
// This value is currently not in use and will be provided only when
// browsers start supporting on-device auctions.
// The contextual auction that determines a winning contextual bid is held
// server-side, and bidding functions are run on the device to determine
// interest group bids. Both the winning contextual bid and interest
// group bids are entered into a final auction held on the device to
// select the winning ad. For more information regarding the TURTLEDOVE
// on device bidding and auction, see:
// https://github.com/WICG/turtledove and
// https://github.com/WICG/turtledove/blob/main/FLEDGE.md
ON_DEVICE_INTEREST_GROUP_AUCTION = 1;
// An interest group auction is simulated in a sandboxed environment, and
// its results are entered into the conventional server-side auction to
// determine the winning ad. Experimental feature; may be subject to
// change. For more information regarding about the TURTLEDOVE simulation
// for RTB, see:
// https://github.com/google/ads-privacy/tree/master/experiments/turtledove-simulation,
// https://developers.google.com/authorized-buyers/rtb/turtledove,
// and https://developers.google.com/authorized-buyers/rtb/fledge
SERVER_SIDE_AUCTION_WITH_INTEREST_GROUP_SIMULATION = 2;
}
// Specifies where the ad auction runs.
optional AuctionEnvironment auction_environment = 18
[default = SERVER_SIDE_AUCTION];
}
extend com.google.openrtb.BidRequest.Imp {
// Extension key for AdX Imp.ext.
optional ImpExt imp = 1009;
}
message AppExt {
// Identification of and information about an SDK installed in the
// publisher's app that the bidder has access to, often because it's the
// bidder's SDK.
message InstalledSdk {
// Identifier for the installed SDK.
optional string id = 1;
// Semantic version of the installed SDK and the adapter that communicates
// between the installed SDK and Google's SDK.
message Version {
optional int32 major = 1 [default = -1];
optional int32 minor = 2 [default = -1];
optional int32 micro = 3 [default = -1];
}
// The version of the installed SDK.
optional Version sdk_version = 2;
// The version of the adapter that communicates with the installed SDK.
optional Version adapter_version = 3;
}
repeated InstalledSdk installed_sdk = 1;
}
extend com.google.openrtb.BidRequest.App {
// Extension key for AdX App.ext.
optional AppExt app = 1011;
}
// Ad Exchange extensions for the BidResponse object.
message BidResponseExt {
// [AdX: BidResponse.processing_time_ms]
optional int32 processing_time_ms = 1;
// Experimental feature; may be subject to change. See
// https://github.com/google/ads-privacy/tree/master/experiments/turtledove-simulation
// and https://developers.google.com/authorized-buyers/rtb/turtledove
// for more information about the TURTLEDOVE simulation for RTB.
//
// Contains contextual signals that will be passed to the bidding function
// for the TURTLEDOVE simulation.
optional .google.protobuf.Value contextual_signal = 2;
// Experimental feature; may be subject to change.
//
// Please reach out to your account manager to participate in the FLEDGE
// simulation.
//
// Represents a simulated FLEDGE interest group.
// https://github.com/WICG/turtledove/blob/main/FLEDGE.md#11-joining-interest-groups
message InterestGroup {
// References a bidding function that is provided ahead of time via
// Bidding functions API resource. See
// https://developers.google.com/authorized-buyers/apis/realtimebidding/reference/rest/v1alpha/bidders.biddingFunctions
optional string bidding_function_name = 1;
// Contains the interest group-related data that will be passed
// to the bidding function in FLEDGE simulation.
// Can be an arbitrary, structured JSON object.
optional .google.protobuf.Struct user_bidding_signals = 2;
// Contains the trusted bidding signals that will be passed to
// the bidding function. This field is intended to simulate the
// results from fetching real-time data from a trusted server in FLEDGE
// (https://github.com/WICG/turtledove/blob/main/FLEDGE.md#31-fetching-real-time-data-from-a-trusted-server).
// Can be an arbitrary, structured JSON object.
optional .google.protobuf.Struct trusted_bidding_signals = 3;
// Interest group owner's domain name used to associate the contextual
// per_buyer_signals from the bid response to their corresponding interest
// groups and invocations of the bidding functions. This value must match
// the buyer domain name configured for the interest group owner account.
// https://github.com/WICG/turtledove/blob/main/FLEDGE.md#11-joining-interest-groups
optional string buyer_domain_name = 4;
}
// Experimental feature; may be subject to change.
//
// A map from interest_group_name (string) to InterestGroup.
// Conceptually, this simulates a set of interest groups that are stored
// in the browser. During the simulation, bidders are responsible for
// storing the interest groups on their server.
map<string, InterestGroup> interest_group_map = 3;
// Experimental feature; may be subject to change.
//
// Contextual information required for running interest group auctions in a
// separate execution environment, such as the TURTLEDOVE in-browser or
// simulated server-side flow. In the TURTLEDOVE simulation, this should be
// populated in the contextual bid response.
message InterestGroupBidding {
// Information regarding an interest group buyer for the in-browser auction.
message InterestGroupBuyer {
// Optional buyer-specific signals to pass into the buyer's interest group
// bidding functions that will be transformed into a JSON object following
// Proto3 JSON representation
// (https://developers.google.com/protocol-buffers/docs/proto3#json).
// Can be left empty if no additional signals are
// required by the bidding function.
optional .google.protobuf.Value per_buyer_signals = 1;
}
// Map of one or more interest group owners that the bidder would enter
// into the interest group auction, keyed by the buyer's domain name.
// Interest groups that are owned by a buyer without a corresponding entry
// here will not participate in the auction.
map<string, InterestGroupBuyer> interest_group_buyers = 1;
}
optional InterestGroupBidding interest_group_bidding = 4;
}
extend com.google.openrtb.BidResponse {
// Extension key for AdX BidResponse.ext.
optional BidResponseExt bid_response = 1005;
}
// Ad Exchange extensions for the Bid object.
message BidExt {
// [AdX: BidResponse.Ad.impression_tracking_url]
repeated string impression_tracking_url = 1;
// [AdX: BidResponse.Ad.ad_choices_destination_url]
optional string ad_choices_destination_url = 2;
// This field is deprecated due to being unused.
// [AdX: BidResponse.Ad.bidder_name]
optional string DEPRECATED_bidder_name = 3 [deprecated = true];
// [AdX: BidResponse.Ad.AdSlot.exchange_deal_type]
enum ExchangeDealType {
OPEN_AUCTION = 0;
PRIVATE_AUCTION = 1;
PREFERRED_DEAL = 2;
EXCHANGE_AUCTION_PACKAGE = 3;
}
optional ExchangeDealType exchange_deal_type = 4 [default = OPEN_AUCTION];
// [AdX: BidResponse.Ad.attribute]
// See buyer-declarable-creative-attributes.txt in the technical documentation
// for a list of ids. Note that not all declarable attributes come through in
// the BidRequest in the various `battr` fields.
repeated int32 attribute = 5 [packed = true];
// The URL to fetch an AMPHTML ad. Only one of the following should be set:
// html_snippet, video_url, amp_ad_url, native_ad.
optional string amp_ad_url = 6;
// An ad that will be rendered by an SDK known to the buyer. This can only
// be used when the BidRequest included an AppExt.InstalledSdk submessage.
message SdkRenderedAd {
// The identifier for the SDK that will render the ad. Must match an
// AppExt.InstalledSdk.id sent in the corresponding bid request.
optional string id = 1;
// Data to pass to the SDK in order to render the ad. This data is opaque
// to the publisher and to Google.
optional string rendering_data = 2;
}
optional SdkRenderedAd sdk_rendered_ad = 7;
message EventNotificationToken {
// The contents of the token, which will be ignored if longer than 64
// bytes.
optional string payload = 1;
}
// A token set by bidders for troubleshooting which will be included in the
// real-time feedback for the Bid it is sent in. The contents of the token
// will not be logged.
optional EventNotificationToken event_notification_token = 8;
// All restricted categories for the ads that may be shown from this snippet.
// See ad-restricted-categories.txt in the technical documentation for a list
// of ids. If you are bidding with ads in restricted categories, you must
// always declare them here.
repeated int32 restricted_category = 9;
// The billing ID to attribute this impression to. The value must be in the
// repeated BidRequest.Imp.ImpExt.billing_id field sent for this impression.
// If the length of BidRequest.Imp.ImpExt.billing_id is exactly 1
// and the bidder does not have any active child seats, this field
// is not required and its contents will be ignored.
optional int64 billing_id = 10;
// Token used to identify end third party buyer information if an
// exchange as an open bidder is an intermediary. This is obtained from the
// third party buyer and must be passed to Google unaltered in the bid
// response.
optional string third_party_buyer_token = 14;
// Buyer declared ID which will be used to break down spend and invalid
// traffic metrics in IVT transparency reporting in Query Tool. Note that IDs
// with fewer than 1000 impressions will not be used to break down metrics.
// IDs longer than 64 bytes will be ignored.
optional string buyer_reporting_id = 17;
// Experimental feature; may be subject to change. See
// https://github.com/google/ads-privacy/tree/master/experiments/frequency-capping
// for more information about the experiment on exchange-enforced
// frequency capping.
//
// Specifies frequency capping to be applied to the bid. Impressions for each
// user are capped at the level specified by fcap_id. A bid will not
// participate in the auction if an additional impression for the user would
// violate any of the specified caps. Multiple frequency caps can be specified
// for the same fcap_id.
//
// A bid is filtered before the auction if the frequency cap is malformed.
// Instances where the cap is malformed include:
// - fcap_id is empty or is very long
// - max_mpressions or time_range are non-positive
// - there are a large number of frequency caps for a single bid
// - time_unit is not specified
//
// Note that if a subsequent bid with the same fcap_id uses a different
// duration (represented by time_unit and time_range) then impressions counted
// against the old frequency cap will not count against the new one and vice
// versa.
//
// To enable frequency capping for your account, please contact your account
// manager.
message FrequencyCap {
// An ID that can represent a bidder's use-case for frequency capping; for
// example, it could represent their campaign, ad, line item, etc. It should
// not contain any user-specific information or identifiers and should not
// be longer than 64 characters.
optional string fcap_id = 1;
// The time units for which frequency caps can be enforced.
enum TimeUnit {
UNKNOWN_TIME_UNIT = 0;
MINUTE = 1;
DAY = 2;
WEEK = 3;
MONTH = 4;
// When INDEFINITE is used, time_range will be ignored. INDEFINITE means
// the frequency cap will be applied for a long period of time, (longer
// than a month) but not necessarily forever.
INDEFINITE = 5;
}
// The unit of time used to specify the time window for which a frequency
// cap applies.
optional TimeUnit time_unit = 2;
// The length of the time window, in units specified by time_unit, for which
// the frequency cap applies. For instance, if time_unit=WEEK and
// time_range=3, then capping is applied for a three week period. If the
// time_unit=INDEFINITE, this will be ignored.
optional int32 time_range = 3 [default = 1];
// The maximum number of impressions allowed to be shown to a user for
// the provided frequency_cap_id within the time window described by
// time_unit and time_range.
optional int32 max_imp = 4;
}
repeated FrequencyCap fcap = 18;
// Advertiser's SKAdNetwork information to support app installation
// attribution for iOS 14 and later. Apple's SKAdNetwork API helps
// advertisers measure ad-driven app installation by sending a postback
// to the ad network after a successful install. Ad networks will need
// to send their network ID and signed advertiser information to allow
// an install to be attributed to the ad impression.
// For more info visit:
// https://developer.apple.com/documentation/storekit/skadnetwork
message SKAdNetworkResponse {
// Version of SKAdNetwork supported by the advertiser. Also used to
// specify how the signature was generated by the advertiser. This
// should match the version from BidRequest.imp.ext.skad.version.
optional string version = 1;
// Ad network identifier used in signature. This should match one of the
// items in BidRequest.imp.ext.skad.skadnetids.
optional string network = 2;
// Campaign ID compatible with Apple's spec.
optional string campaign = 3;
// ID of advertiser's app in Apple's app store.
optional string itunesitem = 4;
// SKAdNetwork API starting from version 2.2 supports multiple ad
// presentation options specified by the `fidelity-type` parameter of the
// SKAdNetwork signature. This holds parameters used to generate the
// signature that would be different for each fidelity type supported.
// For more info visit:
// https://developer.apple.com/documentation/storekit/skadnetwork/signing_and_providing_ads
// Next tag to use: 5
message Fidelity {
// The fidelity type of the attribution to track.
optional SKAdNetworkFidelityType fidelity = 1
[default = STOREKIT_RENDERED_ADS];
// A unique all-lowercase UUID generated by the advertiser to use for
// generating the signature.
optional string nonce = 2;
// Unix time in millis used at the time of signature generation.
optional string timestamp = 3;
// SKAdNetwork signature as specified by Apple.
optional string signature = 4;
}
repeated Fidelity fidelities = 9;
// A unique all-lowercase UUID generated by the advertiser to use for
// generating the signature.
// Note: This field will be deprecated in favor of the
// BidResponse.bid.ext.skadn.fidelities.nonce field to support multiple
// fidelity types.
optional string nonce = 5;
// ID of publisher's app in Apple's app store. This should match the ID
// from BidRequest.imp.ext.skad.sourceapp.
optional string sourceapp = 6;
// Unix time in millis used at the time of signature generation.
// Note: This field will be deprecated in favor of the
// BidResponse.bid.ext.skadn.fidelities.timestamp field to support multiple
// fidelity types.
optional string timestamp = 7;
// SKAdNetwork signature as specified by Apple.
// Note: This field will be deprecated in favor of the
// BidResponse.bid.ext.skadn.fidelities.signature field to support multiple
// fidelity types.
optional string signature = 8;
// Google Mobile Ads SDK options for SKAdNetwork handling.
// Next tag to use: 2
message SKAdNetworkOptions {
// By default, SKAdNetwork attribution will only be initiated if the
// click-through URL lands on the app store, either as a direct link to
// the app store or as the final destination of a server-side redirect
// chain. This flag enables GMA SDK to always initiate SKAdNetwork
// attribution on-click regardless of the detected click's final
// destination URL. Note that enabling this will launch the app store
// even for clicks that are not meant to open the app store, for example
// clicks on Ad Choices icon. For more info, see:
// https://developers.google.com/authorized-buyers/rtb/skadnetwork
optional bool always_open_appstore = 1 [default = false];
}
// [AdX: BidResponse.Ad.skadn_opts]
optional SKAdNetworkOptions skadn_opts = 10;
}
// [AdX: BidResponse.Ad.skadn]
optional SKAdNetworkResponse skadn = 19;
// Experimental feature; may be subject to change. See
// https://github.com/google/ads-privacy/tree/master/experiments/turtledove-simulation
// and https://developers.google.com/authorized-buyers/rtb/turtledove
// for more information about the TURTLEDOVE simulation for RTB.
//
// Bidding function name that the bidder selected for the TURTLEDOVE
// simulation. The name refers to the bidding function
// that is provided ahead of time via Bidding functions API resource.
// Bid value will be computed by the bidding function; value provided via
// max_cpm_micros will be ignored.
//
// This field was used in the original TURTLEDOVE simulation phase.
// Consider switching to FLEDGE simulation and
// using BidResponse.interest_group_map.bidding_function_name. The latter
// field associates bidding function with an interest group rather than
// with an ad. The current field is still supported for backward
// compatibility.
optional string bidding_function_name = 20;
// Experimental feature; may be subject to change. See
// https://github.com/google/ads-privacy/tree/master/experiments/turtledove-simulation
// and https://developers.google.com/authorized-buyers/rtb/turtledove
// for more information about the TURTLEDOVE simulation for RTB.
//
// Contains TURTLEDOVE interest group-related data that will be passed
// to the bidding function
//
// This field was used in the original TURTLEDOVE simulation phase.
// Consider switching to FLEDGE simulation and
// using BidResponse.interest_group_map.user_bidding_signals.
// user_bidding_signals associates bidding function with an interest group
// rather than with an ad. interest_group_data is still supported for
// backward compatibility.
optional .google.protobuf.Value interest_group_data = 21;
// Experimental feature; may be subject to change.
//
// Indicates the name of the interest group that this Ad belongs to.
// The name should be one of the map keys in
// BidResponse.interest_group_map.
optional string interest_group_name = 23;
// Experimental feature; may be subject to change.
//
// Contains bidder provided per-Ad data. This will be passed to
// the bidding function.
// Can be an arbitrary, structured JSON object.
// This field simulates 'ads' data in FLEDGE.
// https://github.com/WICG/turtledove/blob/main/FLEDGE.md#11-joining-interest-groups
optional .google.protobuf.Value ad_data = 24;
}
extend com.google.openrtb.BidResponse.SeatBid.Bid {
// Extension key for AdX Bid.ext.
optional BidExt bid = 1014;
}
message NativeRequestExt {
// [AdX: BidRequest.AdSlot.native_ad_template[0].style_id]
optional int32 style_id = 1;
// [AdX: BidRequest.AdSlot.native_ad_template[0].style_height]
optional int32 style_height = 2;
// [AdX: BidRequest.AdSlot.native_ad_template[0].style_width]
optional int32 style_width = 3;
// [AdX: BidRequest.AdSlot.native_ad_template[0].style_layout_type]
enum LayoutType {
PIXEL = 0;
FLUID = 1;
}
optional LayoutType style_layout_type = 4 [default = PIXEL];
// Note: This feature is currently in beta testing for publishers
// and is subject to change.
// This message is populated when the request is for an individual cell
// within a multi-ad grid. It provides cell level information as well as
// information about the grid this cell belongs to in the AdSlot.
// Only native ads are supported for cells in a multi-ad grid at this time.
message MultiAdsCellInfo {
// The row this cell belongs to.
optional int32 cell_row = 1;
// The column this cell belongs to.
optional int32 cell_column = 2;
// Total number of rows in the grid for this cell.
optional int32 grid_rows = 3;
// Total number of columns in the grid for this cell.
optional int32 grid_columns = 4;
// Unique ID for the grid. It identifies a single grid on a single
// instance of a page and is the same for all cells within that grid. If a
// page has multiple grids, the grid_id for other grids would be
// different. It would also be different for the same grid in two
// different pageviews.
// This is distinct from the google_query_id, which will differ for every
// request for a cell in the grid.
optional int64 grid_id = 5;
}
// [AdX: BidRequest.AdSlot.multi_ads_cell_info]
optional MultiAdsCellInfo multi_ads_cell_info = 5;
}
extend com.google.openrtb.NativeRequest {
// Extension key for the AdX Native.ext.
optional NativeRequestExt native_ext = 1001;
}
message EventTrackerExt {
// Additional context provided for rendering.
enum Context {
UNKNOWN = 0;
// Currently not supported.
OMID = 1;
}
repeated Context context = 1;
// Parameters associated with the resource that will be passed to the
// resource when it is loaded. The format of the parameters is dependent
// on the script vendor.
optional string verification_parameters = 2;
// Used to uniquely identify the verification script provider.
optional string vendor_key = 3;
}
extend com.google.openrtb.NativeResponse.EventTracker {
// Extension key for the AdX EventTracker.ext.
optional EventTrackerExt eventtrackers = 1000;
}
message PublisherExt {
// The billing address country code of the publisher. This may be different
// from the hosting country of the website. For a complete list of country
// codes, please refer to
// https://developers.google.com/adwords/api/docs/appendix/codes-formats#country-codes
optional string country = 1;
}
extend com.google.openrtb.BidRequest.Publisher {
// Extension key for the AdX Publisher.ext
optional PublisherExt publisher = 1002;
}
message SiteExt {
enum AmpPage {
// This is not an AMP page.
DIALECT_HTML = 0;
// This is an Amp page.
DIALECT_HTML_AMP = 1;
}
// Whether this is an AMP page or not. Omitted if unknown.
optional AmpPage amp = 1;
enum VisibilityState {
VISIBILITY_STATE_UNKNOWN = 0;
// The page is at least partially visible. For example, in the foreground
// tab of a non-minimized window.
VISIBILITY_STATE_VISIBLE = 1;
// The page is not visible to users. For example, when the page is in a
// background browser tab, or in a minimized window.
VISIBILITY_STATE_HIDDEN = 2;
}
// The visibility state of the web page containing the ad slot.
// See https://www.w3.org/TR/page-visibility/.
// [AdX: BidRequest.page_visibility]
optional VisibilityState page_visibility = 2
[default = VISIBILITY_STATE_UNKNOWN];
// Indicates that the request is using semi-transparent branding,
// which means only a truncated version of the request URL will
// be provided. This decision is made by the publisher, see
// https://support.google.com/admanager/answer/4584891#urls for context.
optional bool is_semi_transparent_request = 3;
}
extend com.google.openrtb.BidRequest.Site {
// Extension key for the Adx Site.ext
optional SiteExt site = 1010;
}
message BidRequestExt {
// Feedback on bids submitted in previous responses. This is only set if
// real-time feedback is enabled for your bidder. Please contact your
// account manager if you wish to enable real-time feedback.
//
message BidFeedback {
// The unique id from BidRequest.id.
optional string request_id = 1;
// The status code for the ad. See creative-status-codes.txt in the
// technical documentation for a list of ids.
optional int32 creative_status_code = 2;
// Experimental feature; may be subject to change. See
// https://github.com/google/ads-privacy/tree/master/experiments/turtledove-simulation
// and https://developers.google.com/authorized-buyers/rtb/turtledove
// for more information about the TURTLEDOVE simulation for RTB.
//
// This is the bid price CPM specified by the bidder in the bid response
// or computed by a bidding function in the TURTLEDOVE simulation
// (https://developers.google.com/authorized-buyers/rtb/turtledove)
// expressed in the bidding currency. The bidding currency is determined
// by:
// 1. The bidder-level currency, if configured.
// 2. Otherwise, the currency of the buyer account indicated by the
// billing ID in the billing_id field.
// 3. If billing_id is empty, the currency of the buyer account indicated
// by the sole billing ID in the bid request.
optional double bid_price = 9;
// Experimental feature; may be subject to change. See
// https://developers.google.com/authorized-buyers/rtb/fledge and
// https://developers.google.com/authorized-buyers/rtb/turtledove
// for more information about the FLEDGE and TURTLEDOVE simulations for RTB.
//
// An optional string for debugging a bidding function.
// This is the string that can be returned by the bidding function during
// invocation. This debug string is limited to a maximum size of 200 bytes
// of data.
optional string bidding_function_debug_string = 10;
// Experimental feature; may be subject to change. For more information
// about the TURTLEDOVE and FLEDGE simulations respectively, see:
// https://developers.google.com/authorized-buyers/rtb/turtledove,
// https://developers.google.com/authorized-buyers/rtb/fledge
//
// The estimated time it took for the bidding function specified by the
// bidder to run for on-device auctions simulated server-side.
optional .google.protobuf.Duration bidding_function_runtime = 11;
// If the bid won the auction, this is the price paid in your account
// currency. If the bid participated in the auction but was out-bid, this
// is the CPM that should have been exceeded in order to win. This is not
// set if the bid was filtered prior to the auction, if the publisher or
// winning bidder has opted out of price feedback or if your account has
// opted out of sharing winning prices with other bidders. For first-price
// auctions, minimum_bid_to_win is populated instead of this field.
optional double price = 3;
// The minimum bid value necessary to have the auction, in your account
// currency. If your bid won the auction, this is the second highest bid
// that was not filtered (including the floor price). If your bid did not
// win the auction, this is the winning candidate's bid. This field will
// only be populated if your bid participated in a first-price auction, and
// will not be populated if your bid was filtered prior to the auction.
optional double minimum_bid_to_win = 6;
// When a publisher uses an RTB auction and waterfall-based SDK mediation on
// the same query, the winner of the real-time auction must also compete in
// a mediation waterfall (which is ordered by price) to win the impression.
// If the bid participated in the auction and there was no waterfall, the
// value of this field is 0. If the bid participated in the auction and
// there was a waterfall, the value of this field is a price representing a
// sample bid from the eligible mediation networks that were higher than the
// auction winner, weighted by expected fill rate. This field can be used
// in conjunction with minimum_bid_to_win to train bidding models. The CPM
// is in your account currency.
optional double sampled_mediation_cpm_ahead_of_auction_winner = 8;
message EventNotificationToken {
// The contents of the token.
optional string payload = 1;
}
// The token included in the corresponding bid.
optional EventNotificationToken event_notification_token = 4;
// The creative ID included in the corresponding bid.
optional string buyer_creative_id = 5;
}
repeated BidFeedback bid_feedback = 1;
// This represents a unique ID for the overall query. In the event
// that there are multiple callouts for a query, all callout requests for that
// query will contain the same google_query_id.
optional string google_query_id = 2;
// Experimental feature. Subject to change. To receive this signal, please
// contact your account manager to enable frequency capping for your account.
//
// Describes the scope of frequency cap enforcement available for this
// request. Frequency caps to be enforced for a bid can be specified in the
// Bid.ext.fcap field.
enum FrequencyCappingScope {
// Default value which should not be used, or which can indicate that
// frequency cap scope could not be reliably determined.
FREQUENCY_CAPPING_SCOPE_UNKNOWN = 0;
// Frequency capping based on bid response specifications is not available
// for this request. A frequency-capped bid for a bid request with no
// frequency cap availability will be filtered prior to the auction.
FREQUENCY_CAPPING_SCOPE_NONE = 1;
// Frequency capping enforcement is available across multiple sites within
// the same browser.
FREQUENCY_CAPPING_SCOPE_BROWSER = 2;
// Frequency capping enforcement is available across multiple apps on the
// device, excluding browsers.
FREQUENCY_CAPPING_SCOPE_DEVICE = 3;
}
optional FrequencyCappingScope fcap_scope = 4;
}
extend com.google.openrtb.BidRequest {
// Extension key for the Adx BidRequest.ext
optional BidRequestExt bid_request = 1018;
}
message UserExt {
message ConsentedProvidersSettings {
// Set of IDs corresponding to ad tech providers (ATPs) for whom the
// publisher has specified to Google that its EEA users have given legally
// valid consent to: 1) the use of cookies or other local storage where
// legally required; and 2) the collection, sharing, and use of personal
// data for personalization of ads by an ATP in accordance with Google’s EU
// User Consent Policy.
//
// If a publisher is using the IAB Transparency and Consent Framework (TCF)
// v2 to manage user consent, this is the set of ATPs consented via the
// Additional Consent string (see
// https://support.google.com/admanager/answer/9681920 for details about
// Google's Additional Consent mode). ATPs consented via the TCF v2 consent
// string are represented in the UserExt.consent field.
//
// A mapping of ATP ID to ATP name is posted at providers.csv.
repeated int64 consented_providers = 2 [packed = true];
// The raw Additional Consent string, which contains a list of certain
// Google Ad Tech Providers (ATPs). These ATPs are not registered with IAB
// TCF v2, but publishers or their Consent Management Providers (CMPs) have
// ensured that certain disclosures are given to, and consents are obtained
// from, end users, as required by Google’s EU User Consent Policy. This
// field is only populated with the use of CMPs that are integrated with IAB
// TCF v2. Such CMPs use the raw Additional Consent string to indicate
// vendors that are not registered with IAB, and communicate end users’ CMP
// choices to those vendors. The consented_providers field contains the set
// of vendors that mirrors the one represented by the additional_consent
// field, which is in the raw form. Vendors or any other third-party service
// providers must not create AC strings themselves.
//
// See https://support.google.com/admanager/answer/9681920 for more details
// about this field.
optional string additional_consent = 3;
}
// Information about the ad tech providers for whom the publisher has
// specified to Google that its EEA user has consented to the use of their
// personal data for ads personalization in accordance with Google's EU User
// Consent Policy. This field will only be populated when RegsExt.gdpr is
// true.
optional ConsentedProvidersSettings consented_providers_settings = 1;
// 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 = 2;
message Floc {
// The value of a cohort ID – a string identifier that is common to a large
// cohort of users with similar browsing habits.
optional string id = 1;
// The type of the FLoC. See
// https://github.com/google/ads-privacy/blob/master/proposals/FLoC/FLOC-Whitepaper-Google.pdf.
enum FlocType {
// Default value that should not be used.
FLOC_TYPE_UNKNOWN = 0;
// FLoC simulated using affinity hierarchical clustering with centroids
// and feature extraction based on Topic categories as described in the
// whitepaper.
SIMULATED_AFFINITY_CLUSTERING_CENTROID_VERTICAL = 2;
// FLoC simulated using SortingLSH clustering algorithm and Domain One-hot
// encoding feature extraction as described in the whitepaper.
SIMULATED_SIMHASH_SORTING_LSH_DOMAIN_ONE_HOT = 3;
// FLoC simulated using a k Random Centers locality-sensitive hash
// function as described in
// https://github.com/google/ads-privacy/blob/master/proposals/FLoC/k-random-centers.md
// with Domain TF-IDF feature extraction as described in the whitepaper.
KCENTER_DOM_FILTERED_TFDIF = 4;
}
optional FlocType type = 2;
}
// Cohort ID that is common to a large cohort of users with similar
// browsing habits. Currently the cohort ID is simulated by the exchange