-
Notifications
You must be signed in to change notification settings - Fork 25
/
index.bs
2859 lines (2371 loc) · 123 KB
/
index.bs
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
<pre class='metadata'>
Title: Secure Interactive Media Interface Definition (SIMID) <br><img alt="IAB Tech Lab" src="images/IABTechLabLogo.jpg" >
Shortname: SIMID
Level: 1
Status: LS
Group: IAB Tech Lab
!License: <p style="fontsize:small">The SIMID Specification from the IAB Tech Lab is licensed a Creative Commons Attribution, Non Commercial, No Derivatives License. To view a copy of this license, visit <a href="creativecommons.org/licenses/by-nc-nd/4.0/legalcode">creativecommons.org/licenses/by-nc-nd/4.0/legalcode</a> or write to Creative Commons, 171 Second Street, Suite 300, San Francisco, CA 94105, USA.</p>
!About the IAB Technology Lab: The IAB Technology Laboratory (Tech Lab) is a non-profit consortium that engages a member community globally to develop foundational technology and standards that enable growth and trust in the digital media ecosystem.. Comprised of digital publishers, ad technology firms, agencies, marketers, and other member companies, IAB Tech Lab focuses on improving the digital advertising supply chain, measurement, and consumer experiences, while promoting responsible use of data. Its work includes the OpenRTB real-time bidding protocol, ads.txt anti- fraud specification, Open Measurement SDK for viewability and verification, VAST video specification, and DigiTrust identity service. Board members include ExtremeReach, Facebook, Google, GroupM, Hearst Digital Media, Index Exchange, Integral Ad Science, LinkedIn, LiveRamp, MediaMath, Microsoft, Oracle Data Cloud, Pandora, PubMatic, Quantcast, Rakuten Marketing, Telaria, The Trade Desk, Verizon Media Group, Xandr, and Yahoo! Japan. Established in 2014, the IAB Tech Lab is headquartered in New York City with staff in San Francisco, Seattle, and London. Learn more at https://www.iabtechlab.com.
URL: https://interactiveadvertisingbureau.github.io/SIMID/
Repository: InteractiveAdvertisingBureau/SIMID
Editor: IAB Tech Lab's Digital Video Technical Working Group, [email protected]
Abstract: Establishes a common and secure communication protocol between media (video and audio) players and executable ad units, providing rich ad experiences for viewers.
Markup Shorthands: markdown yes, idl yes, dfn yes, markup yes
</pre>
# Version # {#version-number}
1.1.0
<style>
body {
counter-reset: diagram;
counter-reset: table-num;
}
table.alternatecolor {
border-collapse: collapse;
width: 100%;
}
table.alternatecolor th, td {
border: solid #CCCCCC;
padding: 5px;
vertical-align: top;
border-width: 0 1px 0 1px;
}
table.alternatecolor th{
border-color: #000;
background-color: #000;
color:#FFFFFF;
}
table.alternatecolor tr:nth-child(odd) td {
background-color: #EFEFEF;
}
table.alternatecolor tr:nth-child(even) td {
background-color: #FFF;
}
table.alternatecolor tr:last-child td, td.last-row {
border-bottom-width: 1px;
}
table.two-col-split td:nth-child(3n+0){
background: #FFF !important;
border: 0;
}
table.two-col-split th:nth-child(3n+0){
background: #FFF !important;
border: 0;
}
table.two-col-split td:nth-child(3n+2){
text-align: center;
}
table.two-col-split th:nth-child(3n+2){
text-align: center;
}
table.two-col-split td:nth-child(3n+2):before{
content: "\2716";
color: #008000;
}
table.alternatecolor td.empty {
display:none;
}
td[req]:before {
content: "\2714" !important;
color: #D20000 !important;
}
p[table-header]{
counter-increment: table-num;
font-weight: 700;
}
p[table-header]:before{
content: "Table " counter(table-num) ". ";
font-style: italic;
}
ul.footnote {
list-style-type: none;
font-size: 0.9em;
margin: 0;
}
ul.footnote li:before{
width: 1em !important;
margin-left: -1em;
display: inline-block;
}
ul.footnote li:nth-child(1):before {
content:'*';
}
ul.footnote li:nth-child(2):before {
content:'†';
}
ul.footnote li:nth-child(3):before {
content:'‡';
}
ul.footnote li:nth-child(4):before {
content:'§';
}
ul.footnote li:nth-child(5):before {
content:'◊';
}
ul.footnote li:nth-child(6):before {
content:'¶';
}
ul.values-list{
margin: 0;
list-style-type: none;
}
ul.values-list > li:nth-child(odd){
background: #FFF;
}
ul.values-list code{
margin: 0 1em 0 1em;
}
ul.values-list li{
margin: 0;
}
table.messages-summary td code:before{
content: "\2023" !important;
margin-right: 0.5em;
}
table.messages-summary td:nth-child(1) code:before{
content: "" !important;
margin-right: 0;
}
table.messages-summary td a{
font-family: Menlo, Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 0.9em;
}
pre.idl{
margin-bottom: 0 !important;
border-width: 8px !important;
}
dl.idl{
margin-top: 0 !important;
border-width: 8px !important;
}
ul[collapse], ol[collapse]{
margin: 0;
}
p[warning]{
border-color: rgb(243, 87, 87);
background-color: rgb(245, 230, 230);
}
ul[collapse] li {
margin-top: 0;
line-height: 1.5em;
}
ol[collapse] li {
margin-top: 0;
line-height: 1.5em;
}
ol[alpha]{
list-style-type: lower-alpha;
}
div[diagram]{
counter-increment: diagram;
position: relative;
border: 1px solid silver;
border-radius: 7px;
padding: 10px;
margin: 10px 0 10px 0;
overflow: hidden;
}
div[diagram] p:first-child::before{
content: "Diagram " counter(diagram) ". ";
margin-left: 10px;
}
div[diagram] > p:first-child{
font-weight: 600;
font-style:italic;
padding-left: 28px;
margin: 0 0 20px 0;
background-repeat: no-repeat;
background-size: 1.5em;
background-position-y: 2px;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzYgMjYiPg0KCTxwYXRoIGZpbGw9IiM1ODU5NWIiIGQ9Ik0yNCwxMGMwLDAuNTUyLTAuNDQ4LDEtMSwxSDEzYy0wLjU1MiwwLTEtMC40NDgtMS0xVjRjMC0wLjU1MiwwLjQ0OC0xLDEtMWgxMGMwLjU1MiwwLDEsMC40NDgsMSwxVjEweiIvPg0KCTxwYXRoIGZpbGw9IiM1ODU5NWIiIGQ9Ik0xMSwyMmMwLDAuNTUyLTAuNDQ4LDEtMSwxSDRjLTAuNTUyLDAtMS0wLjQ0OC0xLTF2LTRjMC0wLjU1MiwwLjQ0OC0xLDEtMWg2YzAuNTUyLDAsMSwwLjQ0OCwxLDFWMjJ6Ii8+DQoJPHBhdGggZmlsbD0iIzU4NTk1YiIgZD0iTTIyLDIyYzAsMC41NTItMC40NDgsMS0xLDFoLTZjLTAuNTUyLDAtMS0wLjQ0OC0xLTF2LTRjMC0wLjU1MiwwLjQ0OC0xLDEtMWg2YzAuNTUyLDAsMSwwLjQ0OCwxLDFWMjJ6Ii8+DQoJPHBhdGggZmlsbD0iIzU4NTk1YiIgZD0iTTMzLDIyYzAsMC41NTItMC40NDgsMS0xLDFoLTZjLTAuNTUyLDAtMS0wLjQ0OC0xLTF2LTRjMC0wLjU1MiwwLjQ0OC0xLDEtMWg2YzAuNTUyLDAsMSwwLjQ0OCwxLDFWMjJ6Ii8+DQoJPHBhdGggZmlsbD0iIzU4NTk1YiIgZD0iTTI5LDEzSDE5VjloLTJ2NEg3Yy0wLjU1MiwwLTEsMC40NDgtMSwxdjZoMnYtNWg5djRoMnYtNGg5djVoMnYtNkMzMCwxMy40NDgsMjkuNTUyLDEzLDI5LDEzeiIvPg0KCTxwYXRoIGZpbGw9IiM1ODU5NWIiIGQ9Ik0zNiwyYzAtMS4xMDQtMC44OTYtMi0yLTJIMkMwLjg5NiwwLDAsMC44OTYsMCwydjIyYzAsMS4xMDQsMC44OTYsMiwyLDJoMzJjMS4xMDQsMCwyLTAuODk2LDItMlYyeiBNMzUsMjQNCgkJYzAsMC41NTItMC40NDgsMS0xLDFIMmMtMC41NTIsMC0xLTAuNDQ4LTEtMVYyYzAtMC41NTIsMC40NDgtMSwxLTFoMzJjMC41NTIsMCwxLDAuNDQ4LDEsMVYyNHoiLz4NCjwvc3ZnPg0K');
}
ol[dgrm-details]{
counter-reset: dgrm-sequence;
list-style: none;
border: 0px dotted silver;
border-radius: 5px;
padding: 10px 10px 10px 10px;
background-size: 1.5em;
background-position: 10px 10px;
background-repeat: no-repeat;
background-image-x: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMzYgMzYiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iIzU4NTk1YiIgZD0iTTM2LDMzYzAsMS42NTctMS4zNDMsMy0zLDNIM2MtMS42NTcsMC0zLTEuMzQzLTMtM1YzYzAtMS42NTcsMS4zNDMtMywzLTNoMzBjMS42NTcsMCwzLDEuMzQzLDMsM1YzM3oiLz4NCjxjaXJjbGUgZmlsbD0iI0ZGRkZGRiIgY3g9IjE4IiBjeT0iMTgiIHI9IjE1Ii8+DQo8Y2lyY2xlIGZpbGw9IiM1ODU5NWIiIGN4PSIxOCIgY3k9IjE4IiByPSIxMSIvPg0KPHJlY3QgeD0iMTIiIHk9IjEyIiBmaWxsPSIjRkZGRkZGIiB3aWR0aD0iMyIgaGVpZ2h0PSIzIi8+DQo8cmVjdCB4PSIxNi41IiB5PSIxMiIgZmlsbD0iI0ZGRkZGRiIgd2lkdGg9IjMiIGhlaWdodD0iMyIvPg0KPHJlY3QgeD0iMjEiIHk9IjEyIiBmaWxsPSIjRkZGRkZGIiB3aWR0aD0iMyIgaGVpZ2h0PSIzIi8+DQo8cmVjdCB4PSIxMiIgeT0iMTYuNSIgZmlsbD0iI0ZGRkZGRiIgd2lkdGg9IjMiIGhlaWdodD0iMyIvPg0KPHJlY3QgeD0iMTYuNSIgeT0iMTYuNSIgZmlsbD0iI0ZGRkZGRiIgd2lkdGg9IjMiIGhlaWdodD0iMyIvPg0KPHJlY3QgeD0iMjEiIHk9IjE2LjUiIGZpbGw9IiNGRkZGRkYiIHdpZHRoPSIzIiBoZWlnaHQ9IjMiLz4NCjxyZWN0IHg9IjEyIiB5PSIyMSIgZmlsbD0iI0ZGRkZGRiIgd2lkdGg9IjMiIGhlaWdodD0iMyIvPg0KPHJlY3QgeD0iMTYuNSIgeT0iMjEiIGZpbGw9IiNGRkZGRkYiIHdpZHRoPSIzIiBoZWlnaHQ9IjMiLz4NCjxyZWN0IHg9IjIxIiB5PSIyMSIgZmlsbD0iI0ZGRkZGRiIgd2lkdGg9IjMiIGhlaWdodD0iMyIvPg0KPC9zdmc+DQo=')
}
ol[dgrm-details]{
counter-reset: dgrm-sequence;
list-style: none;
padding-left: 40px;
border: 0px dotted silver;
border-radius: 5px;
background-size: 1.5em;
background-position: 10px 10px;
background-repeat: no-repeat;
}
ol[dgrm-details] ol{
padding-left: 40px;
}
ol[dgrm-details] li{
position: relative;
}
ol[dgrm-details] li::before{
position: absolute;
--fontsize: 0.75em;
font-size: var(--fontsize);
background-color: #5b5b5b;
color: #FFF;
border-radius: 3px;
left: -26px;
--side: 1.6em;
width: var(--side);
height: var(--side);
text-align: center;
padding-top: 0.13em;
}
ol[dgrm-details-x] li::before{
position: absolute;
font-size: 0.75em;
background-color: #5b5b5b;
color: #FFF;
padding: 4px 6px;
border-radius: 3px;
left: -40px;
}
ol[dgrm-details] > li::before{
counter-increment: dgrm-sequence;
content: "" counter(dgrm-sequence) "";
}
ol[dgrm-details] > li > ol{
list-style: none;
counter-reset: dgrm-sequence-level-2;
}
ol[dgrm-details] > li > ol > li::before{
display: block;
width: calc(var(--side) * 1.5);
left:-40px;
counter-increment: dgrm-sequence-level-2;
content: "" counter(dgrm-sequence) "." counter(dgrm-sequence-level-2) "";
}
ol[dgrm-details] > li > ol > li > ol{
list-style: none;
counter-reset: dgrm-sequence-level-3;
}
ol[dgrm-details] > li > ol > li > ol > li::before{
display: block;
counter-increment: dgrm-sequence-level-3;
width: calc(var(--side) * 2);
left:-46px;
content: "" counter(dgrm-sequence) "." counter(dgrm-sequence-level-2) "." counter(dgrm-sequence-level-3) "";
}
span[steps]:before{
content:"steps ";
}
span[steps] b{
font-size: 0.75em;
margin-right: 0.5em;
background-color: #5b5b5b;
color: #FFF;
padding: 2px 6px;
border-radius: 3px;
}
span[step]:before{
content:"step ";
}
span[step] b{
font-size: 0.75em;
margin-right: 0.5em;
background-color: #5b5b5b;
color: #FFF;
padding: 2px 6px;
border-radius: 3px;
}
[skip-ad]{
background-color: #5b5b5b;
color: #FFFFFF;
border: 1px solid #5b5b5b;
border-radius: 2px;
outline: none;
padding: 4px 6px;
}
[skip-ad]::after{
content: "\25BA""|";
font-weight: 700;
letter-spacing: -3px;
margin-left: 4px;
}
#xml-highlight{
}
.xml-highlight .hnode{
color: #008000;
font-weight: bold;
}
.xml-highlight .hattr{
color: #7D9029;
}
.xml-highlight .hattrval{
color: #BA2121;
}
.xml-highlight .hcdata{
color: #BC7A00;
}
.js-highlight {
}
.js-highlight .hstr{
color: #BA2121;
}
.js-highlight .hnum{
color: #008c00;
}
.js-highlight .hbool{
color: #00ff00;
}
</style>
# Executive Summary # {#exec-summary}
Secure Interactive Media Interface Definition (SIMID) is a standard for providing rich interactivity in the context of
streaming audio and video (media) ads. While the Video Ad Serving Template (VAST) standard addresses how publishers
discover various metadata assets related to an ad campaign, SIMID addresses
how the publisher’s media player should communicate and interface with a rich
interactive layer and vice versa. As such, one can think of the SIMID creative
as one of the assets listed in a VAST document.
A main tenet of SIMID is the separation of the interactive layer from the media
asset. This clear separation allows publisher players to be in control of their
streams and enables use cases such as server-side ad insertion (SSAI), as well
as live streaming.
SIMID was built with strong security from the ground up, and is designed to be
sandboxed from the media player, providing peace of mind to publishers when
serving ads from third party services. SIMID aims to provide the tools and
controls to allow creatives to offer rich augmented user experiences while
degrading gracefully if certain features are not supported.
<div diagram id="diagram-simid-overlay">
<p>SIMID ads sandboxing from the publisher player environment</p>
<img src="images/simid_diagram_1_overlay.png" alt="Normal Creative Initialization Sequence"/>
</div>
A diagram showing SIMID ads sandboxed from the publisher player environment
SIMID is part of a broader effort to replace the older VPAID standard (more details in <a href="http://bit.ly/videoAdVision">this blog post</a> by the IAB Tech Lab). While
Open Measurement replaces the use case of verification and measurement, SIMID replaces
the use case of interactive streaming media ads, the original intended purpose
of the VPAID standard. SIMID provides a path for VPAID deprecation and allows
the industry to move to more secure and transparent standards. SIMID aims to
gain broad industry adoption by ensuring that the standard is focused on the
primary use case of interactivity.
## SIMID vs. VPAID Comparison ## {#simid-vs-vpaid}
<div diagram id="diagram-simid-api-models">
<p>VPAID vs. SIMID APIs</p>
<img src="images/simid_diagram_2_api_models.png" alt="Normal Creative Initialization Sequence" style="margin-left: -10px;"/>
</div>
<p table-header id="simid-vs-vapid">SIMID vs. VPAID Comparison.</p>
<table class="alternatecolor">
<tbody>
<tr>
<th width="20%">Feature</th>
<th width="40%">VPAID</th>
<th width="40%">SIMID</th>
</tr>
<tr>
<td>Security</td>
<td>Creative directly accesses player DOM and shared global JavaScript context.</td>
<td>Creative is sandboxed into a cross-origin iframe. No player DOM access or shared JavaScript context.</td>
</tr>
<tr class="c13">
<td>Ad media asset management</td>
<td>Creative manages ad video loading and playback.</td>
<td>Player manages ad media loading and playback (audio or video).</td>
</tr>
<tr>
<td>Pre-caching</td>
<td>Only the VPAID script can be reliably pre-cached. Video asset cannot be pre-cached.</td>
<td>Audio or video asset and SIMID creative can both be pre-cached.</td>
</tr>
<tr>
<td>Errors influence on performance or UX</td>
<td>Fatal script errors from ad creative can result in significant player or publisher site performance and user experience deterioration (due to shared security sandbox).</td>
<td>Fatal script errors from ad creative do not affect player or publisher site directly. Impact is limited to performance and user experience of the creative, only.</td>
</tr>
<tr>
<td>SSAI feasibility</td>
<td>SSAI is not possible.</td>
<td rowspan="1">Interactive creatives can be rendered in SSAI context.</td>
</tr>
<tr>
<td>Latencies</td>
<td>Publishers are at the mercy of VPAID creative implementation efficiency and uncontrollable internal processes (verification, trading, wrapping, etc.). Each of these behaviors can impose significant latencies.</td>
<td>Players can pre-load media and creative assets due to maintaining full control over decisioning, loading and displaying of the ad unit. Ad decisioning latency is removed, risks of internal processes are minimized due to separate security sandboxes.</td>
</tr>
<tr>
<td>API</td>
<td>Both the player and creative must support specific JavaScript functions. Each component calls functions directly on the other in a shared security sandbox (insecure).</td>
<td>No functions are directly called on either component by the other. All communication is achieved using standard postMessage API and SIMID messaging protocol across separate security sandboxes.</td>
</tr>
<tr>
<td>Ad blocking</td>
<td>VPAID can prevent an ad from rendering.</td>
<td>SIMID is built for interactivity and was not designed for ad blocking. The Open Measurement SDK (OMID) is expected to support this capability in the future.</td>
</tr>
<tr>
<td>Verification services</td>
<td>Verification features can be fully implemented and executed in shared DOM and global Javascript context.</td>
<td>SIMID creative cannot access any DOM, elements, or JS context outside of its own security sandbox so is unable to handle any verification use cases. OMID handles the use case for verification allowing SIMID to be focused on interactivity only.</td>
</tr>
<tr>
<td>Creative wrapping</td>
<td>VPAID ads can load other ads (including other VPAID ads).</td>
<td>Cannot be executed.</td>
</tr>
<tr>
<td>Audio advertising</td>
<td>Out of standard scope.</td>
<td>Enables interactive components serving with audio ads.</td>
</tr>
<tr>
<td>Environment constraints</td>
<td>Player must be an HTML video element.</td>
<td>Player can be native or web so long as the SIMID creative has sandboxed DOM access (such as a web view).</td>
</tr>
<tr>
<td>Resource MIME type</td>
<td>application/javascript</td>
<td>text/html</td>
</tr>
</tbody>
</table>
## Intended Audience ## {#intended-audience}
The SIMID standard is geared toward the digital media advertising community. Anyone who works with digital media advertising products or services can benefit from reading the Introduction sections of this document. The Messaging Protocol, API Reference, and later sections predominantly target software engineers.
## Changes In SIMID 1.1 ## {#simid-11-changes}
SIMID version 1.1 introduces the following enhancements:
1. Support for nonlinear ads.
* New messages [[#simid-creative-expandNonlinear]], [[#simid-creative-collapseNonlinear]], and [[#simid-player-collapseNonlinear]] and related data.
* Additional [[#error-codes]].
* Additional workflows for nonlinear playback.
* New sample code for nonlinear ads.
1. Player handling user navigation to external landing pages for the in-mobile apps servings. For this purpose, SIMID:
* New message [[#simid-creative-requestNavigation]] and related data.
* Additional related [[#error-codes]].
# Introduction # {#intro}
Throughout this document, the SIMID interactive component is referred to
as a “SIMID creative” or “creative”.
Compliance with SIMID requires support for all features and behaviors specificied in this document, unless a given feature or behavior is explicitly designated as optional.
Standard RFC language will be used. See <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a>
for RFC 2119 for enforcement terminology used in this standard.
## SIMID Interactive Creative Nature ## {#simid-interactive-creative-nature}
<div diagram id="diagram-simid-api-models">
<p>SIMID Assets loading</p>
<img src="images/simid_diagram_3_assets.png" alt="SIMID Interactive Creative Nature" style="margin-left: -10px;"/>
</div>
A SIMID creative can be included in a VAST document by way of an `<InteractiveCreativeFile>`
element. The text within this element must be a url which returns an HTML document.
When loaded into an iframe by a media player, this HTML document will define the SIMID creative's content, and will direct the web browser or host application to load any additional assets
required by that creative (images, CSS, scripts, etc.).
The `<InteractiveCreativeFile>` element is defined as a child of the `<MediaFiles>` element in VAST 4.0.
For more technical details, see the [[#api-vast]] section.
<!--- code syntax formatters:
https://pygments.org/demo/#try
https://tohtml.com/jScript/
--->
<div class="example">
<div class="xml-highlight"><pre style="line-height: 125%">
<span class="hnode"><MediaFiles></span>
<span class="hnode"><MediaFile></span>
<span class="hcdata"><![CDATA[https://example.com/mediafile.mp4]]></span>
<span class="hnode"></MediaFile></span>
<span class="hnode"><InteractiveCreativeFile</span> <span class="hattr">type=</span><span class="hattrval">"text/html"</span> <span class="hattr">apiFramework=</span><span class="hattrval">"SIMID"</span> <span class="hattr">variableDuration=</span><span class="hattrval">"true"</span><span class="hnode">></span>
<span class="hcdata"><![CDATA[https://adserver.com/ads/creative.html]]></span>
<span class="hnode"></InteractiveCreativeFile></span>
<span class="hnode"></MediaFiles></span>
</pre></div>
</div>
## SIMID Ad Serving Flow ## {#video-ad-flow}
The SIMID ad experience is delivered by a web browser or application concurrently rendering an ad's streaming audio or video file and its interactive creative file.
The media player obtains urls for both files from a VAST document, loads the files, assembles them into a single ad unit, and ensures a cohesive ad experience.
<div diagram id="diagram-simid-api-models">
<p>SIMID creative loading and presentation process.</p>
<img src="images/simid_diagram_4_loading.png" alt="SIMID creative loading and presentation process." style="margin-left: -10px;"/>
</div>
## Player and Creative Communication ## {#player-creative-communication}
A media player and a SIMID creative communicate by sending serialized messages back and forth to each other.
Because a SIMID creative is an HTML document that is served from an advertiser’s
web domain, and it is loaded by a media player into an iframe within a web page hosted on a different domain,
loading the creative requires the creation of a cross-origin iframe (also known as an "unfriendly iframe").
Due to browser sandbox security restrictions, JavaScript communication across this type of iframe can only be achieved via the standard postMessage API.
SIMID API requirements govern message construction conventions as well as the message data structure. See sections [[#msg-proto]], [[#api]] for more information.
## Scope and Limitations ## {#scope}
The use of HTML is only required for the SIMID creative, not the publisher
property hosting that creative. As long as the publisher can load HTML and
communicate with it over the standard postMessage API, it can support
SIMID. In practice, this means that SIMID can be hosted in web page iframes,
mobile app web views, and other platforms. In fact, SIMID can better support mobile use cases than VPAID because a native app or media player directly controls loading and playback of a SIMID ad unit's
media asset (whereas a VPAID ad unit offers no direct access or control of its internal media asset).
Note: Certain devices, including TV sets and OTT boxes, restrict loading of external assets, have limited HTML rendering capabilities, or are unable to display HTML along with audio or video. These devices are incapable of implementing SIMID. Devices that support HTML and JavaScript can support SIMID - on both client side as well as in server side ad insertion scenarios
SIMID cannot be used to decide which media to show on the client
pre-impression. This is because the media file must be present alongside
the SIMID creative and delivered via the VAST `MediaFile` node.
SIMID should not be set up to measure viewability.
Any use of the SIMID spec to support something other than interactive or
dynamic content within the ad unit is counter to the intentions of this spec.
## Introduction to Nonlinear Ads ## {#nonlinear-intro}
Nonlinear ads are served and displayed concurrently with the primary media content. In video players, nonlinear ads overlay a portion of the video.
Nonlinear ads implement two states: collapsed and expanded. The player renders the nonlinear ad in the original state, collapsed, while media content progresses uninterrupted. The expanded ad state typically occupies the entire player viewport and requires the media content to be paused. The expanded state of the nonlinear ad usually occurs via user interaction with the creative.
<div diagram id="diagram-nonlinear-states">
<p>Nonlinear Ad States</p>
<img src="images/nonlinear-intro.png" alt="Nonlinear states."/>
</div>
Unlike the linear ads, there is no media asset that the player needs to render with a nonlinear ad.
SIMID supports nonlinear ads by providing a nonlinear specific API. Both linear and nonlinear ads share the same communication protocol and data providers. As with linear ads, the interactive creative is a single resource that the player loads into a cross-origin iframe.
<div diagram id="diagram-nonlinear-user-experience">
<p>Nonlinear Ad User Experience</p>
<img src="images/nonlinear-user-experience.png" alt="Nonlinear state."/>
<ol dgrm-details>
<li>User clicks on expand button. The player pauses content and expands the creative.
<ol>
<li>User clicks collapse button.
<ol>
<li>Player resizes the creatigve to its default state and resumes content playback.</li>
</ol>
</li>
<li>User clicks close button.
<ol>
<li>Player unloads the creative and resumes media content.</li>
</ol>
</li>
</ol>
</li>
<li>User clicks close button provided by the default state. Player unloads the creative.</li>
</ol>
</div>
### Nonlinear Ads VAST Response ### {#nonlinear-vast-response}
VAST supports nonlinear ads since version 2.0 including interactive ads that implement API frameworks.
VAST response describes nonlinear ads in the `<NonLinear>` node children. The `<NonLinear>` node attribute’s `apiFrmawork` value is `SIMID`. The node <IFrameResource> delivers a URI to the SIMID interactive component. The node `<AdParameters>` contains custom ad data for the creative’s consumption.
<div class="example">
<div class="xml-highlight"><pre style="line-height: 125%">
<span class="hnode"><Creative></span>
<span class="hnode"><NonLinear></span>
<span class="hnode"><IFrameResource</span> <span class="hattr">type=</span><span class="hattrval">"text/html"</span> <span class="hattr">apiFramework=</span><span class="hattrval">"SIMID"</span><span class="hnode">></span>
<span class="hcdata"><![CDATA[https://adserver.com/videoads/simidshell.html]></span>
<span class="hnode"></IFrameResource></span>
<span class="hnode"><AdParameters></span>
<span class="hcdata"><![CDATA[{adid:345893,cturi:"https://mycar.com/modelS.html"}]></span>
<span class="hnode"></AdParameters></span>
<span class="hnode"></NonLinear></span>
<span class="hnode"></Creative></span>
</pre></div>
</div>
# API Reference # {#api}
SIMID API is a set of messages and data structures that ad-rendering parties exchange via [[#msg-proto]].
## Reference Table ## {#reference-table}
<table class="alternatecolor">
<tbody>
<tr>
<th width="40%">API</th>
<th width="30%">resolve</th>
<th width="30%">reject</th>
</tr>
<tr>
<td>[[#simid-media-durationchange]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-ended]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-error]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-pause]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-play]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-playing]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-seeked]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-seeking]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-stalled]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-timeupdate]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-media-volumechange]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-adSkipped]]</td>
<td>[[#simid-player-adSkipped-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-adStopped]]</td>
<td>[[#simid-player-adStopped-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-app-backgrounded]]</td>
<td>[[#simid-player-app-backgrounded-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-app-foregrounded]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-collapseNonlinear]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-fatalError]]</td>
<td>[[#simid-player-fatalError-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-init]]</td>
<td>[[#simid-player-init-resolve]]</td>
<td>[[#simid-player-init-reject]]</td>
</tr>
<tr>
<td>[[#simid-player-log]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-resize]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-player-startCreative]]</td>
<td>[[#simid-player-startCreative-resolve]]</td>
<td>[[#simid-player-startCreative-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-clickThru]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-creative-collapseNonlinear]]</td>
<td>[[#simid-creative-collapseNonlinear-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-creative-expandNonlinear]]</td>
<td>[[#simid-creative-expandNonlinear-resolve]]</td>
<td>[[#simid-creative-expandNonlinear-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-fatalError]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-creative-getMediaState]]</td>
<td>[[#simid-creative-getMediaState-resolve]]</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-creative-log]]</td>
<td>n/a</td>
<td>n/a</td>
</tr>
<tr>
<td>[[#simid-creative-reportTracking]]</td>
<td>[[#simid-creative-reportTracking-resolve]]</td>
<td>[[#simid-creative-reportTracking-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestChangeAdDuration]]</td>
<td>[[#simid-creative-requestChangeAdDuration-resolve]]</td>
<td>[[#simid-creative-requestChangeAdDuration-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestChangeVolume]]</td>
<td>[[#simid-creative-requestChangeVolume-resolve]]</td>
<td>[[#simid-creative-requestChangeVolume-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestFullscreen]]</td>
<td>[[#simid-creative-requestFullscreen-resolve]]</td>
<td>[[#simid-creative-requestFullscreen-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestExitFullscreen]]</td>
<td>[[#simid-creative-requestExitFullscreen-resolve]]</td>
<td>[[#simid-creative-requestExitFullscreen-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestPause]]</td>
<td>[[#simid-creative-requestPause-resolve]]</td>
<td>[[#simid-creative-requestPause-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestPlay]]</td>
<td>[[#simid-creative-requestPlay-resolve]]</td>
<td>[[#simid-creative-requestPlay-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestResize]]</td>
<td>[[#simid-creative-requestResize-resolve]]</td>
<td>[[#simid-creative-requestResize-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestSkip]]</td>
<td>[[#simid-creative-requestSkip-resolve]]</td>
<td>[[#simid-creative-requestSkip-reject]]</td>
</tr>
<tr>
<td>[[#simid-creative-requestStop]]</td>
<td>[[#simid-creative-requestStop-resolve]]</td>
<td>[[#simid-creative-requestStop-reject]]</td>
</tr>
</tbody>
</table>
## Messages Triggered by Media Element Events ## {#media-messages}
SIMID specifies a group of messages that describe ad media states. The player prepends such messages with the `SIMID:Media namespace`.
SIMID borrows media-related semantics and naming conventions from the standard `HTMLMediaElement` behavior. In player implementations where an `HTMLMediaElement` is not used, the player must translate events and property values into the associated `SIMID:Media` message.
In HTML environments, `SIMID:Media` messages contain the original media event type.
<div class="example">
1. `HTMLMediaElement` dispatches event `play`.
1. Player sets `Message.type = SIMID:Media:play`.
</div>
The player must report `SIMID:Media` messages immediately after the associated event occurs.
The player must not queue messages in cases where the creative iframe initialization happens in the middle of the ad media playback. The player posts only messages that communicate events that occur after the iframe initialization.
`SIMID:Media` messages are information-only; they do not trigger `resolve/reject` responses from the creative.
The player may elect to report all standard HTML media events to the creative. However, the creative should not expect to receive messages with optional types. (See <a href="#table-media-events">table</a> below.)
Some `SIMID:Media` messages - `durationchange`, `error`, `timeupdate`, and `volumechange` - require additional data provided with `Message.args` parameters.
<p table-header id="table-media-events">Required and optional media event types.</p>
<table class="alternatecolor two-col-split">
<tbody>
<tr>
<th>Event Name</th>
<th>Required</th>
<th width="2%" style="background:#FF0000"></th>
<th>Event Name</th>
<th>Required</th>
<th width="2%" style="background:#FF0000"></th>
<th>Event Name</th>
<th>Required</th>
</tr>
<tr><td>`abort`</td><td></td><td></td><td>`interruptend`</td><td></td><td></td><td>`seeked`</td><td req></td></tr>
<tr><td>`canplay`</td><td></td><td></td><td>`loadeddata`</td><td></td><td></td><td>`seeking`</td><td req></td></tr>
<tr><td>`canplaythrough`</td><td></td><td></td><td>`loadedmetadata`</td><td></td><td></td><td>`stalled`</td><td req></td></tr>
<tr><td>`durationchange`</td><td req></td><td></td><td>`loadstart`</td><td></td><td></td><td>`suspend`</td><td></td></tr>
<tr><td>`emptied`</td><td></td><td></td><td>`pause`</td><td req></td><td></td><td>`timeupdate`</td><td req></td></tr>
<tr><td>`encrypted`</td><td></td><td></td><td>`play`</td><td req></td><td></td><td>`volumechange`</td><td req></td></tr>
<tr><td>`ended`</td><td req></td><td></td><td>`playing`</td><td req></td><td></td><td class="last-row">`waiting`</td><td class="last-row"></td></tr>
<tr><td>`error`</td><td req></td><td></td><td>`progress`</td><td></td><td></td><td class="empty"></td><td class="empty"></td></tr>
<tr><td>`interruptbegin`</td><td></td><td></td><td>`ratechange`</td><td></td><td></td><td class="empty"></td><td class="empty"></td></tr>
</tbody>
</table>
### SIMID:Media:durationchange ### {#simid-media-durationchange}
When the duration of the media changes due to the player receiving the media resource metadata (in HTML, `HTMLMediaElement` dispatches the `durationchange` event), the player posts a `SIMID:Media:durationchange` message.
<xmp class="idl">
dictionary MessageArgs {
required float duration;
};
</xmp>
<dl dfn-type=attribute dfn-for=FooInterface class="idl highlight def">
<dt><dfn>duration</dfn>
<dd>The duration of the media in seconds. In HTML, HTMLMediaElement.duration value.*
</dl>
<ul class="footnote">
<li>In SSAI, `HTMLMediaElement.duration` value does not express the actual ad media duration. In such cases, the player must compute the ad’s actual media length.</li>
</ul>
### SIMID:Media:ended ### {#simid-media-ended}
When the media playback completes (in HTML, `HTMLMediaElement` dispatches an `ended` event), the player posts a `SIMID:Media:ended` message.
### SIMID:Media:error ### {#simid-media-error}
When playback throws an exception (in HTML, `HTMLMediaElement` dispatches an `error` event), the player posts a `SIMID:Media:error` message.
<xmp class="idl">
dictionary MessageArgs {
required unsigned short error;
required DOMString message;
};
</xmp>
<dl dfn-type=attribute dfn-for=FooInterface class="idl highlight def">
<dt><dfn>error</dfn>
<dd>In HTML, the value of `HTMLMediaElement.error.code`. Codes:
<ul class="values-list">
<li>`1` The media download was canceled</li>
<li>`2` Network error</li>
<li>`3` The player failed to decode the media</li>
<li>`4` Environment does not support media resource</li>
</ul>
<dt><dfn>message</dfn>
<dd>In HTML, the value of `HTMLMediaElement.error.message`.
</dl>
### SIMID:Media:pause ### {#simid-media-pause}
When the media pauses (in HTML, `HTMLMediaElement` dispatches a `pause` event), the player posts a `SIMID:Media:pause` message.
### SIMID:Media:play ### {#simid-media-play}
When media playback starts as a result of autoplay or its state is no longer paused (in HTML, `HTMLMediaElement` dispatches a `play` event), the player posts a `SIMID:Media:play` message.
### SIMID:Media:playing ### {#simid-media-playing}
The player posts a `SIMID:Media:playing` message in one of the following cases:
* the media has enough data to start playback;
* the media recovered from `stalled` state;
* playback restarts;
* after seek operation completion.
In HTML, the player posts a `Media:playing` message when `HTMLMediaElement` dispatches a `playing` event.
### SIMID:Media:seeked ### {#simid-media-seeked}
When the user finished moving playhead into a new position (in HTML, `HTMLMediaElement` dispatches a `seeked` event), the player posts a `SIMID:Media:seeked` message.
### SIMID:Media:seeking ### {#simid-media-seeking}
When the user initiates seek operation (in HTML, `HTMLMediaElement` dispatches a `seeking` event), the player posts a `SIMID:Media:seeking` message.
### SIMID:Media:stalled ### {#simid-media-stalled}
When media data is not available for rendering (in HTML, `HTMLMediaElement` dispatches a `stalled` event), the player posts a `SIMID:Media:stalled` message.
### SIMID:Media:timeupdate ### {#simid-media-timeupdate}
The player communicates media playhead position by posting a `SIMID:Media:timeupdate` message. The message `Media:timeupdate` frequency should be not less than every 250ms.
In HTML, the player sends a `Media:timeupdate` message when` HTMLMediaElement` dispatches a `timeupdate` event.
<xmp class="idl">
dictionary MessageArgs {
required float currentTime;
};
</xmp>
<dl dfn-type=attribute dfn-for=MessageArgs class="idl highlight def">
<dt><dfn>currentTime</dfn>
<dd>The value in seconds. In HTML, `HTMLMediaElement.currentTime` property value.
</dl>