Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
320 commits
Select commit Hold shift + click to select a range
e55d985
Preserve Prebid bidder parameter string types
ChristianPavilonis Jul 18, 2026
5eef5f1
Satisfy Clippy for override normalization
ChristianPavilonis Jul 18, 2026
966c856
Add /_ts/trace overlay to confirm creatives render on the page
prk-Jr Jul 18, 2026
e1a8b81
Trace client-side /auction renders and stop overclaiming GAM renders
prk-Jr Jul 18, 2026
76dd06b
Merge branch 'main' into feat/ssat-render-inline-creative
aram356 Jul 19, 2026
5d7f696
Fix ext.trusted_server.request_host to use the publisher domain
prk-Jr Jul 20, 2026
4f45974
Recover GPT slots orphaned by a client re-render
prk-Jr Jul 18, 2026
9e46233
Show the render trace as a timeline and badge every rendered slot
prk-Jr Jul 18, 2026
27a4727
Stop attributing GAM refreshes to the finished server-side auction
prk-Jr Jul 20, 2026
7b7c466
Number every render and keep GAM's fill signal on refresh rows
prk-Jr Jul 20, 2026
2c482d7
Show absent attribution as — instead of ? in trace tooltips
prk-Jr Jul 20, 2026
50ce368
Trace SSAT creatives the Universal Creative bridge renders inline
prk-Jr Jul 20, 2026
b0f31ef
Fall back to the OpenRTB bid id for hb_adid when cache_id and ad_id a…
prk-Jr Jul 20, 2026
0807060
Merge branch preserve-prebid-bid-param-string-types into rc/july
ChristianPavilonis Jul 20, 2026
f341a17
Merge branch 'main' into feature/optional-creative-rewriting
aram356 Jul 20, 2026
9f042f7
Resolve publisher test merge conflict
ChristianPavilonis Jul 20, 2026
d8961fa
Merge branch 'fix/auction-request-host' into rc/july
prk-Jr Jul 20, 2026
cd57004
Use configured publisher domain for navigation-path auction requests
aram356 Jul 20, 2026
65c34a6
Merge PR #937 (configured publisher domain for navigation-path auctio…
aram356 Jul 20, 2026
e7f7e17
Merge branch 'main' into fix/auction-request-publisher-host
prk-Jr Jul 21, 2026
bad87ae
Merge branch 'main' into feat/ssat-render-inline-creative
prk-Jr Jul 21, 2026
b2e736e
Resolve pbRender bid by requesting slot, not first hb_adid match
prk-Jr Jul 21, 2026
d97ac1d
Size inline creative render from the winning bid dimensions
prk-Jr Jul 21, 2026
f0f4a7f
Expand ${AUCTION_PRICE} before rewriting inline creatives
prk-Jr Jul 21, 2026
d0e00a6
Build inline creative URLs from the request origin
prk-Jr Jul 21, 2026
3a7e7e2
Preserve cached bid dimensions and price in the PBS Cache fallback
prk-Jr Jul 21, 2026
395abd6
Reconcile SSAT inline-creative design and plan with implementation
prk-Jr Jul 21, 2026
ebd23b2
Allow too_many_arguments on collect_stream_auction
prk-Jr Jul 21, 2026
161dafa
Add first-class APS OpenRTB integration
ChristianPavilonis Jul 16, 2026
d29a5d9
Resolve APS test scanning alerts
ChristianPavilonis Jul 16, 2026
fb5004b
Add APS inventory identity overrides
ChristianPavilonis Jul 16, 2026
66914a0
Render APS bids from the trustedServer Prebid adapter
ChristianPavilonis Jul 16, 2026
ca66dc2
Add APS auction debug metadata
ChristianPavilonis Jul 17, 2026
44c2bb8
Omit zero creative dimensions so the bridge falls back
prk-Jr Jul 21, 2026
f4e0a79
Scope the pbRender in-flight guard to the slot, not the bare adId
prk-Jr Jul 21, 2026
6a1db09
Fix React #418 hydration mismatch from ad-slot injection on Next.js A…
aram356 Jul 21, 2026
41345fc
Merge branch 'main' into rc/july
aram356 Jul 21, 2026
eaa8fed
Merge PR #945 (React #418 hydration mismatch fixes) into rc/july
aram356 Jul 21, 2026
d4131c5
Merge feat/ssat-render-inline-creative into rc/july
prk-Jr Jul 21, 2026
3ebcf8f
Defer initial adInit until after React hydration on Next.js App Router
aram356 Jul 21, 2026
ea2ab5e
Revert "Merge PR #945 (React #418 hydration mismatch fixes) into rc/j…
aram356 Jul 21, 2026
6fb5426
Merge remote-tracking branch 'origin/fix/react418-hydration-safety' i…
aram356 Jul 21, 2026
4847192
Address APS OpenRTB review findings
ChristianPavilonis Jul 21, 2026
10cd6d3
Update APS OpenRTB design records
ChristianPavilonis Jul 21, 2026
436a932
Detect GPT initial load configuration
ChristianPavilonis Jul 22, 2026
26fdfe8
Merge branch 'fix/gpt-set-config-initial-load-detection' into rc/july
ChristianPavilonis Jul 22, 2026
4a020e2
Attribute navigation auction telemetry to the configured publisher do…
aram356 Jul 22, 2026
66bc16f
Merge PR #937 follow-up (navigation telemetry publisher domain) into …
aram356 Jul 22, 2026
123393b
Merge main into rc/july after PR #937 landed
aram356 Jul 22, 2026
9456b95
Merge branch 'main' into feature/optional-creative-rewriting
aram356 Jul 22, 2026
3a6b7fd
Merge remote-tracking branch 'origin/main' into trace-auction-winners…
prk-Jr Jul 22, 2026
03aa5ec
Correct render tracing across auction paths
prk-Jr Jul 22, 2026
be02574
Document SSAT root document 304 prevention
prk-Jr Jul 22, 2026
19c3a25
Clarify unexpected origin 304 telemetry
prk-Jr Jul 22, 2026
1eb09cb
Plan SSAT root document 304 prevention
prk-Jr Jul 22, 2026
3360e6a
Handle oversized HEAD response metadata
ChristianPavilonis Jul 22, 2026
8bdbd61
Add platform HTTP cache bypass option
prk-Jr Jul 22, 2026
87f9319
Merge branch 'fix/head-content-length-limit' into rc/july
ChristianPavilonis Jul 22, 2026
15f4565
Bypass Fastly cache for marked HTTP requests
prk-Jr Jul 22, 2026
92f4169
Prevent SSAT publisher document revalidation
prk-Jr Jul 22, 2026
fc5611a
Reject unexpected SSAT origin 304 responses
prk-Jr Jul 22, 2026
79f6053
Format SSAT 304 implementation plan
prk-Jr Jul 22, 2026
4e79083
Merge branch 'main' into fix/react418-hydration-safety
aram356 Jul 22, 2026
28dd578
Merge branch 'fix/ssat-root-document-304' into rc/july
prk-Jr Jul 22, 2026
78bb93e
Make creative sanitization opt-in and restore creative iframe origin …
aram356 Jul 22, 2026
b4f5def
Make creative sanitization opt-in and restore creative iframe origin …
aram356 Jul 22, 2026
b5eff8b
Merge branch 'main' into fix/gpt-set-config-initial-load-detection
aram356 Jul 22, 2026
f59fd85
Add gam_unit_path template parser
prk-Jr Jul 23, 2026
9a71f55
Add request-path section derivation
prk-Jr Jul 23, 2026
7575873
Add section_root, unit-template compile/render, and startup validation
prk-Jr Jul 23, 2026
860ed0b
Render gam_unit_path template per request across initial and SPA paths
prk-Jr Jul 23, 2026
21a3523
Add spec and plan for per-section gam_unit_path
prk-Jr Jul 23, 2026
070fd94
Document per-section gam_unit_path templating
prk-Jr Jul 23, 2026
20f5f8e
Use fictional example values in tests and docs
prk-Jr Jul 23, 2026
dbdaea7
Merge branch 'main' into 954-per-section-gam-unit-path
prk-Jr Jul 23, 2026
ca131e0
Add privacy-safe auction-to-creative tracing
ChristianPavilonis Jul 23, 2026
3df591f
Revert "Merge pull request #922 from IABTechLab/trace-auction-winners…
ChristianPavilonis Jul 23, 2026
3b02916
Track effective GPT initial-load configuration
ChristianPavilonis Jul 23, 2026
b9ce68b
Document GPT initial-load getter fallback
ChristianPavilonis Jul 23, 2026
050ad9c
Add privacy-safe auction-to-creative tracing
ChristianPavilonis Jul 23, 2026
fd1cbd8
Clarify auction trace console evidence
ChristianPavilonis Jul 23, 2026
ea6aadf
Clarify auction trace console evidence
ChristianPavilonis Jul 23, 2026
5094f6f
Trace publisher-owned GPT slot lifecycles
ChristianPavilonis Jul 23, 2026
423e6c5
Trace publisher-owned GPT slot lifecycles
ChristianPavilonis Jul 23, 2026
49bbc12
Harden trace console lifecycle diagnostics
ChristianPavilonis Jul 24, 2026
653ae8a
Harden trace console lifecycle diagnostics
ChristianPavilonis Jul 24, 2026
2d0c4f7
Merge branch 'main' of github.com:IABTechLab/trusted-server into rc/july
ChristianPavilonis Jul 24, 2026
adffdf6
Merge branch 'main' into fix/react418-hydration-safety
aram356 Jul 24, 2026
df221c1
Merge branch 'main' into fix/gpt-set-config-initial-load-detection
aram356 Jul 24, 2026
dbb1d66
Merge branch 'main' into fix/ssat-root-document-304
aram356 Jul 24, 2026
7406ed7
Register APS renderer via requestId so it survives Prebid field strip…
aram356 Jul 24, 2026
d6caf2f
Merge origin/main into issue-764-aps-openrtb (resolve conflicts)
aram356 Jul 24, 2026
2fe03cf
Merge remote-tracking branch 'origin/issue-764-aps-openrtb' into fix/…
aram356 Jul 24, 2026
77ad775
Register APS renderer via requestId so it survives Prebid field strip…
aram356 Jul 24, 2026
2d2f657
Format docs/guide/configuration.md with Prettier
aram356 Jul 24, 2026
f0a275b
Address review feedback on gam_unit_path templating
prk-Jr Jul 24, 2026
bfc1cb9
Merge remote-tracking branch 'origin/954-per-section-gam-unit-path' i…
prk-Jr Jul 24, 2026
1199471
Merge remote-tracking branch 'origin/954-per-section-gam-unit-path' i…
prk-Jr Jul 24, 2026
da00536
Show container IDs in trace badges
ChristianPavilonis Jul 24, 2026
a07edd2
Exclude GAM paths from Prebid refresh auctions
ChristianPavilonis Jul 24, 2026
76c5626
Prevent duplicate GPT slot requests
ChristianPavilonis Jul 24, 2026
8932cb9
Merge branch 'fix/duplicate-gpt-slots' into rc/july
ChristianPavilonis Jul 24, 2026
b65e1ae
Gate publisher GPT requests until targeting is ready
ChristianPavilonis Jul 24, 2026
7de7aad
Merge branch 'fix/duplicate-gpt-slots' into rc/july
ChristianPavilonis Jul 24, 2026
f3c1e6b
Revert "Gate publisher GPT requests until targeting is ready"
ChristianPavilonis Jul 24, 2026
001ad38
Decouple the prebid tsjs shim from the bundled Prebid.js
aram356 Jul 24, 2026
86d114b
Merge branch 'main' into fix/duplicate-gpt-slots
aram356 Jul 25, 2026
f63f31a
Order the prebid.js type import before relative imports
aram356 Jul 25, 2026
2ddd193
Lint test files and replace explicit any casts with typed helpers
aram356 Jul 26, 2026
5a4ef23
Rename /__ts/page-bids to /_ts/page-bids
prk-Jr Jul 27, 2026
0a440fa
Merge branch 'main' into 942-page-bids-single-underscore
prk-Jr Jul 27, 2026
4ef2de6
Preserve Prebid ad units across GPT refreshes
ChristianPavilonis Jul 14, 2026
a945598
Handle deferred Prebid delivery refreshes
ChristianPavilonis Jul 14, 2026
90a8922
Merge branch 'main' into fix/react418-hydration-safety
aram356 Jul 27, 2026
461cff9
Address Prebid refresh review feedback
ChristianPavilonis Jul 17, 2026
e45b6b5
Resolve Prebid refresh review feedback
ChristianPavilonis Jul 24, 2026
d85a245
Merge branch 'main' into fix/gpt-set-config-initial-load-detection
aram356 Jul 27, 2026
1240e8a
Merge branch 'main' into fix/ssat-root-document-304
aram356 Jul 27, 2026
af46b98
Make auction creative rewriting optional
ChristianPavilonis Jul 15, 2026
29d3a0b
Address creative rewriting review feedback
ChristianPavilonis Jul 17, 2026
e6edc23
Address creative rewriting review feedback
ChristianPavilonis Jul 24, 2026
ece42a0
Add first-class APS OpenRTB integration
ChristianPavilonis Jul 16, 2026
5ad0478
Resolve APS test scanning alerts
ChristianPavilonis Jul 16, 2026
1b26199
Add APS inventory identity overrides
ChristianPavilonis Jul 16, 2026
004778b
Render APS bids from the trustedServer Prebid adapter
ChristianPavilonis Jul 16, 2026
3f7c202
Add APS auction debug metadata
ChristianPavilonis Jul 17, 2026
8a11546
Address APS OpenRTB review findings
ChristianPavilonis Jul 21, 2026
221b345
Update APS OpenRTB design records
ChristianPavilonis Jul 21, 2026
b00655e
Address APS review feedback
ChristianPavilonis Jul 27, 2026
0cb06ef
Fix rebased CI regressions
ChristianPavilonis Jul 27, 2026
a0f744e
Merge branch 'main' into rc/july
prk-Jr Jul 27, 2026
9b1985c
Harden GPT slot handoff
ChristianPavilonis Jul 27, 2026
724802d
Merge branch 'main' into fix/prebid-refresh-auctions
aram356 Jul 28, 2026
76a70b4
Merge branch 'main' into feature/optional-creative-rewriting
aram356 Jul 28, 2026
fb57a17
Merge branch 'main' into fix/react418-hydration-safety
aram356 Jul 28, 2026
642dd69
Merge branch 'main' into fix/gpt-set-config-initial-load-detection
prk-Jr Jul 28, 2026
6f9dbff
Guard deferred adInit with a navigation generation and make it testable
aram356 Jul 28, 2026
b323161
Merge remote-tracking branch 'origin/main' into fix/ssat-root-documen…
prk-Jr Jul 28, 2026
8677f62
Honor the cache-bypass contract in the Cloudflare HTTP client
prk-Jr Jul 28, 2026
8d74a1d
Merge branch 'fix/ssat-root-document-304' into rc/july
prk-Jr Jul 28, 2026
d977c09
Merge branch 'main' into 942-page-bids-single-underscore
prk-Jr Jul 28, 2026
6d0dbc7
Merge branch '942-page-bids-single-underscore' into rc/july
prk-Jr Jul 28, 2026
f3cdc6c
Cover the page-bids trace cache policy on both endpoint paths
prk-Jr Jul 28, 2026
41367bd
Preserve Prebid targeting during fallback refreshes
ChristianPavilonis Jul 28, 2026
32d85dd
Merge branch 'main' into fix/gpt-set-config-initial-load-detection
aram356 Jul 28, 2026
370403f
Add GPT initial-load API ordering regressions
ChristianPavilonis Jul 28, 2026
0f17312
Cover GPT initial-load getter fallback
ChristianPavilonis Jul 28, 2026
5e790e8
Merge remote-tracking branch 'origin/main' into rc/july
ChristianPavilonis Jul 28, 2026
d021f89
Merge branch 'main' into fix/ssat-root-document-304
aram356 Jul 28, 2026
58d0bc2
Merge latest PR #912 changes into July RC
ChristianPavilonis Jul 28, 2026
bb10c7b
Add GPT runtime diagnostics overlay
ChristianPavilonis Jul 28, 2026
6dca50f
Merge latest PR #916 changes into July RC
ChristianPavilonis Jul 28, 2026
fd138ae
Merge latest PR #956 changes into July RC
ChristianPavilonis Jul 28, 2026
710bf49
Complete creative rewriting review fixes
ChristianPavilonis Jul 28, 2026
62a8b58
Merge latest PR #918 changes into July RC
ChristianPavilonis Jul 28, 2026
6517fcf
Merge latest PR #963 head into July RC
ChristianPavilonis Jul 28, 2026
caa3784
Merge latest PR #916 changes into July RC
ChristianPavilonis Jul 28, 2026
5fa8a72
Merge latest PR #945 changes into July RC
ChristianPavilonis Jul 28, 2026
11756e1
Merge latest PR #948 changes into July RC
ChristianPavilonis Jul 28, 2026
982b0a8
Merge latest PR #952 head into July RC
ChristianPavilonis Jul 28, 2026
a886f7d
Merge latest PR #961 changes into July RC
ChristianPavilonis Jul 28, 2026
52504fb
Merge branch 'main' into feature/optional-creative-rewriting
aram356 Jul 29, 2026
59f968f
Merge branch 'feature/optional-creative-rewriting' into fix/creative-…
aram356 Jul 29, 2026
92faf6b
Merge branch 'main' into 954-per-section-gam-unit-path
prk-Jr Jul 29, 2026
4bedcd7
Address review feedback on per-section gam_unit_path
prk-Jr Jul 29, 2026
1658959
Merge branch 'main' into fix/ssat-root-document-304
prk-Jr Jul 29, 2026
367dc04
Fix doc lint
prk-Jr Jul 29, 2026
32e2120
Enable the Cloudflare cache bypass and strip CDN cache directives
prk-Jr Jul 29, 2026
0ff7bf9
Merge latest PR #971 changes into July RC
prk-Jr Jul 29, 2026
9556158
Merge latest fix/ssat-root-document-304 changes into July RC
prk-Jr Jul 29, 2026
7c9d4f4
Merge branch 'main' into 954-per-section-gam-unit-path
prk-Jr Jul 29, 2026
506ab76
Merge latest 954-per-section-gam-unit-path changes into July RC
prk-Jr Jul 29, 2026
79d0832
Disambiguate GPT fixture navigation
ChristianPavilonis Jul 29, 2026
82f56ab
Revert "Merge latest PR #961 changes into July RC"
ChristianPavilonis Jul 29, 2026
30720f9
Revert "Harden trace console lifecycle diagnostics"
ChristianPavilonis Jul 29, 2026
1214bbd
Revert "Trace publisher-owned GPT slot lifecycles"
ChristianPavilonis Jul 29, 2026
e64cb72
Revert "Clarify auction trace console evidence"
ChristianPavilonis Jul 29, 2026
8e89d37
Revert "Add privacy-safe auction-to-creative tracing"
ChristianPavilonis Jul 29, 2026
01e9b14
Merge latest PR #974 changes into July RC
ChristianPavilonis Jul 29, 2026
3b9920c
Merge branch 'rc/july' of github.com:IABTechLab/trusted-server into r…
ChristianPavilonis Jul 29, 2026
0ba566b
Merge branch 'main' into feature/optional-creative-rewriting
aram356 Jul 29, 2026
33c0663
Merge branch 'main' into decouple-prebid-shim
aram356 Jul 29, 2026
1929dc8
Fix opaque-origin click recovery and harden creative processing invar…
aram356 Jul 29, 2026
f916ddf
Add first-class APS OpenRTB integration
ChristianPavilonis Jul 16, 2026
daa9a60
Resolve APS test scanning alerts
ChristianPavilonis Jul 16, 2026
7fd3ea1
Add APS inventory identity overrides
ChristianPavilonis Jul 16, 2026
526c1a0
Render APS bids from the trustedServer Prebid adapter
ChristianPavilonis Jul 16, 2026
abe300b
Add APS auction debug metadata
ChristianPavilonis Jul 17, 2026
ebc0a80
Address APS OpenRTB review findings
ChristianPavilonis Jul 21, 2026
a27194b
Update APS OpenRTB design records
ChristianPavilonis Jul 21, 2026
ee84a58
Address APS review feedback
ChristianPavilonis Jul 27, 2026
89787c6
Fix rebased CI regressions
ChristianPavilonis Jul 27, 2026
488f7b1
Harden APS auction delivery and rendering
ChristianPavilonis Jul 29, 2026
3b2b689
Merge branch 'feature/optional-creative-rewriting' into fix/creative-…
aram356 Jul 29, 2026
340d1ef
Select active GPT responsive slots
ChristianPavilonis Jul 29, 2026
0fba6b8
Fix GPT display gating for responsive slots
ChristianPavilonis Jul 29, 2026
6cc9983
Register APS renderer via bid.meta so it survives Prebid field stripping
aram356 Jul 24, 2026
857c940
Merge branch 'main' into fix/duplicate-gpt-slots
aram356 Jul 30, 2026
637b21f
Merge remote-tracking branch 'origin/main' into decouple-prebid-shim
aram356 Jul 30, 2026
3c4135c
Merge remote-tracking branch 'origin/decouple-prebid-shim' into decou…
aram356 Jul 30, 2026
5d36b2d
Merge remote-tracking branch 'origin/main' into rc/july
ChristianPavilonis Jul 29, 2026
4bcef81
Merge remote-tracking branch 'origin/main' into rc/july
ChristianPavilonis Jul 30, 2026
7054a2a
Merge remote-tracking branch 'origin/main' into rc/july
ChristianPavilonis Jul 30, 2026
0fdd13e
Preserve native GPT slot behavior
ChristianPavilonis Jul 30, 2026
6b80f45
Merge main (PR #945 final) into rc/july
aram356 Jul 30, 2026
3ca2b9c
Merge main (PR #951 oversized bodiless metadata) into rc/july
aram356 Jul 30, 2026
54e0374
Merge branch 'main' into rc/july
aram356 Jul 30, 2026
fde8351
Close creative-processing bypass paths and fix opaque-origin click re…
aram356 Jul 30, 2026
d3c850d
Register APS renderer on bidAccepted and consolidate carrier rationale
aram356 Jul 31, 2026
ba6d4a2
Merge branch 'main' into decouple-prebid-shim
aram356 Jul 31, 2026
78632fe
Merge PR #967 (decouple prebid tsjs shim from bundled Prebid.js) into…
aram356 Jul 31, 2026
57f51b5
Merge PR #956 (opt-in creative sanitization and processing hardening)…
aram356 Jul 31, 2026
38ea8df
Type the fetch stub in the opaque-origin click test
aram356 Jul 31, 2026
744ce80
Drop redundant divId re-check in slot-element prefix scan
aram356 Jul 31, 2026
f78c98c
Restore auction regression safeguards
ChristianPavilonis Jul 31, 2026
eecb646
Merge PR #978 (fix/gpt-display-target-responsive-slot) into rc/july
aram356 Jul 31, 2026
ca678fe
Resolve visible responsive GPT slots
ChristianPavilonis Jul 31, 2026
b200be5
Fix GPT slot handoff matching
ChristianPavilonis Jul 31, 2026
417f5e0
Load the decoupled prebid shim in the APS renderer browser spec
aram356 Jul 31, 2026
d690438
Load the decoupled prebid shim in the APS renderer browser spec
aram356 Jul 31, 2026
5ff3bb7
Merge PR #988 (fix/aps-renderer-spec-decoupled-shim) into rc/july
aram356 Aug 1, 2026
7507f04
Merge remote-tracking branch 'origin/main' into decouple-prebid-shim
aram356 Aug 1, 2026
c5d6bea
Merge branch 'main' into fix/creative-sanitization-optional
aram356 Aug 1, 2026
d6d322b
Merge origin/main (PR #974 diagnostics, PR #984 CI lint scope) into r…
aram356 Aug 1, 2026
cdff897
Harden the decoupled prebid shim against partial artifact loads
aram356 Aug 1, 2026
9b21ba4
Refuse non-http(s) click navigation and fix test lint
aram356 Aug 1, 2026
2097710
Persist validated absolute URLs in the click guard
aram356 Aug 1, 2026
1db074d
Close creative-delivery gaps found in the third review round
aram356 Aug 2, 2026
3d9e2b6
Add a real-browser regression test for the sandboxed creative click path
aram356 Aug 2, 2026
f3dc6ba
Exclude GAM paths from Prebid refresh auctions
ChristianPavilonis Jul 24, 2026
a08bebf
Bound APS renderer tombstones and isolate lifecycle callbacks
ChristianPavilonis Aug 3, 2026
eb51d69
Merge PR #918 (issue-764-aps-openrtb) into rc/july
ChristianPavilonis Aug 3, 2026
ba6e2bf
Merge PR #956 (creative sanitization optional) into rc/july
ChristianPavilonis Aug 3, 2026
85d3054
Merge PR #965 (prebid refresh path opt out) into rc/july
ChristianPavilonis Aug 3, 2026
0bbfb4e
Merge PR #966 (duplicate GPT slots) into rc/july
ChristianPavilonis Aug 3, 2026
0a5a491
Merge PR #967 (decouple Prebid shim) into rc/july
ChristianPavilonis Aug 3, 2026
d94d781
Merge PR #978 (responsive GPT slots) into rc/july
ChristianPavilonis Aug 3, 2026
60a85e6
Preserve excluded slots during global Prebid refreshes
ChristianPavilonis Aug 3, 2026
2ddcf78
Merge origin/main into rc/july
prk-Jr Aug 3, 2026
7f8e54e
Align creative response tests with rewrite defaults
ChristianPavilonis Aug 3, 2026
d8062f5
Merge branch 'rc/july' of github.com:IABTechLab/trusted-server into r…
ChristianPavilonis Aug 3, 2026
945cec4
Add DataDome protection decision logs
ChristianPavilonis Aug 3, 2026
0dc9b19
Merge PR #922 (render tracing) into rc/july
ChristianPavilonis Aug 3, 2026
5226d8a
Merge PR #992 (DataDome decision logs) into rc/july
ChristianPavilonis Aug 3, 2026
8589431
Revert "Merge PR #992 (DataDome decision logs) into rc/july"
ChristianPavilonis Aug 3, 2026
de26f45
Log incoming DataDome client IP
ChristianPavilonis Aug 3, 2026
53fc326
Merge PR #992 (DataDome decision logs) into rc/july
ChristianPavilonis Aug 3, 2026
ca6398d
Reapply "Merge PR #992 (DataDome decision logs) into rc/july"
ChristianPavilonis Aug 3, 2026
c82c640
feat(datadome): suppress client tag for excluded IPs
ChristianPavilonis Aug 3, 2026
20b80ba
Merge latest PR #992 changes into rc/july
ChristianPavilonis Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,16 @@ jobs:
with:
node-version: ${{ steps.shared-setup.outputs.node-version }}
cache: npm
cache-dependency-path: crates/trusted-server-integration-tests/browser/package-lock.json
cache-dependency-path: |
crates/trusted-server-integration-tests/browser/package-lock.json
crates/trusted-server-js/lib/package-lock.json

- name: Build TSJS browser fixtures
working-directory: crates/trusted-server-js/lib
run: |
npm ci
npm run build
npm run build:prebid-external

- name: Install Playwright
working-directory: crates/trusted-server-integration-tests/browser
Expand Down
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- **Breaking** — Replaced the legacy APS contextual integration with APS OpenRTB at `/e/pb/bid`. APS configuration now uses canonical `account_id` (`pub_id` remains a compatibility alias), no longer requires APS-specific slot IDs, and defaults script creative eligibility off. Operators must update the endpoint, disable native APS demand for Trusted Server cohorts, and prepare GAM/Universal Creative targeting for `hb_bidder=aps` before rollout. APS renderer winners now preserve the upstream bid `id`, omit `crid` when APS omits it, and carry `ext.trusted_server.renderer` instead of `adm`; external `/auction` consumers must support this response shape.
- **Breaking** — `bid_param_zone_overrides` inner values must now be JSON objects; previously non-object or empty values (`"header" = "x"`, `"header" = {}`) were accepted and silently produced a dead rule at runtime. They now fail at startup with a configuration error. Operators upgrading should audit their `bid_param_zone_overrides` config for non-object zone entries.
- **Breaking** — Integration configuration strings are no longer globally reinterpreted as JSON scalars. Operators upgrading should audit `[integrations.*]` settings and use native TOML/typed-config booleans and numbers (for example, `enabled = true`, not `enabled = "true"`); quoted numeric and boolean scalars now fail validation instead of silently converting.
- **Breaking** — Sourcepoint browser module inclusion now requires explicit `[integrations.sourcepoint].enabled = true`; operators relying on the previous unconditional Sourcepoint module should enable the integration before upgrading.
- **Breaking** — Auction creative sanitization is now opt-in: the new `[auction].sanitize_creatives` defaults to `false` because unconditional sanitization blanked script-based creatives (the majority of programmatic display) while recording normal impressions. `[auction].rewrite_creatives` keeps its `true` default. The 1 MiB cap is now enforced on rewritten output as well as raw input and in every processing mode, rewriting fails closed on parser errors instead of emitting partial output, and `hb_cache_host`/`hb_cache_path` are emitted only for bids that supplied no creative — any bid carrying its own `adm` ships without them, so a processed or rejected creative can never be re-fetched raw from PBS Cache. Creative markup with no `<body>` token now receives the click-guard runtime, and bidder `<base>` elements are stripped whenever rewriting is enabled. The creative iframe sandbox no longer grants `allow-same-origin`, restoring origin isolation; rewritten-click recovery from the resulting opaque-origin iframe uses the GET `/first-party/proxy-rebuild` navigation fallback, now registered in every adapter, and dynamic resource signing inside those iframes is disabled pending [#982](https://github.com/IABTechLab/trusted-server/issues/982). Upgrading: binaries that predate `sanitize_creatives` reject a blob carrying it, so upgrade the binary first, then push the config. Rollback: non-default values (`sanitize_creatives = true`, `rewrite_creatives = false`) are serialized into the config blob and older binaries reject unknown fields — before rolling back to a binary that predates a field, restore its default, push the default-compatible blob, then roll back.
- Added optional APS `inventory_domain` and `inventory_page_origin` overrides for deployments whose edge hostname differs from the APS-authorized inventory identity.
- Preserved APS renderer capabilities through the client-side `trustedServer` Prebid adapter, allowing its generated `hb_adid` to render through GAM and Prebid Universal Creative instead of producing an empty creative.
- The SPA re-auction endpoint moved from `/__ts/page-bids` to `/_ts/page-bids`, joining every other internal route in the `/_ts/` namespace. The old path stays registered as a deprecated alias so already-loaded bundles keep serving ads, and responses on it carry a `Link: …; rel="deprecation"` header so remaining traffic is measurable from edge logs; removal is tracked in [#970](https://github.com/IABTechLab/trusted-server/issues/970). Two deployment notes: audit `[[handlers]]` for patterns broad enough to cover `/_ts` (for example `^/_ts`), which would put this browser-facing endpoint behind Basic Auth and return `401` to every visitor — scope them to `^/_ts/admin`; and prefer rolling forward over rolling back, since a server reverted past this release does not register the canonical path. In both cases the shipped client falls back to the deprecated alias, so the exposure is bounded until that alias is removed.
- Added optional APS `inventory_domain` and `inventory_page_origin` overrides for deployments whose edge hostname differs from the APS-authorized inventory identity.
- Preserved APS renderer capabilities through the client-side `trustedServer` Prebid adapter, allowing its generated `hb_adid` to render through GAM and Prebid Universal Creative instead of producing an empty creative.

### Security

Expand All @@ -24,7 +30,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Added the default-true `[auction].rewrite_creatives` option. Setting it to `false` preserves mandatory creative sanitization across `POST /auction` and publisher SSAT/page-bids delivery while skipping first-party resource/click URL rewriting; it also skips creative TSJS injection on `POST /auction`.
- Added opt-in APS HTTP debug metadata for controlled test sites, exposing the direct request and response under `/auction` provider metadata using the Prebid Server `debug.httpcalls` shape.
- Added typed APS renderer transport for direct auctions and GAM/Prebid Universal Creative, using a minimized one-bid envelope, a fragment-bound nonce, and an opaque sandboxed renderer endpoint.
- Added the `[auction].rewrite_creatives` (default `true`) and `[auction].sanitize_creatives` (default `false`) options. `rewrite_creatives` rewrites winning-bid adm to first-party endpoints across `POST /auction` and publisher SSAT/page-bids delivery (proxy/click URL conversion, bidder `<base>` removal; creative TSJS injection on `POST /auction` only). Enabling `sanitize_creatives` strips executable markup from winning-bid adm before delivery.
- `creative_opportunities.slot.gam_unit_path` is now a template supporting `{network_id}`, `{slot_id}`, and `{section}`, so a publisher whose ad unit varies by site section expresses it in one slot rule instead of one per (slot × section). `{section}` derives from the request path: `[creative_opportunities].section_segment` selects which path segment names the section (0-based, default `0`; set `1` for locale-prefixed URLs), and `section_root` supplies the value for paths with no such segment. `section_root` is required when a template uses `{section}`. Existing static and absent `gam_unit_path` configs are unchanged. Startup now also rejects a blank `gam_network_id` when slots are configured. Note that a config setting `section_root` or `section_segment` requires a binary that knows those keys — rolling the binary back below this release while the keys are present fails config load; configs that omit them roll back cleanly.
- Added Osano consent mirror integration docs and public enablement guidance.
- Implemented basic authentication for configurable endpoint paths (#73)
- Added integrations guide with example `testlight` integration
Expand Down
44 changes: 24 additions & 20 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ curl -X POST http://localhost:7676/auction \

**With Orchestrator Enabled** (`auction.enabled = true`):
- Logs showing: `"Using auction orchestrator"`
- Parallel execution of APS (mocked) and Prebid (real)
- GAM mediation (mocked) selecting winning bids
- Parallel execution of APS OpenRTB and Prebid Server
- Optional mock-adserver mediation selecting winning bids
- Final response with winning creatives

**With Orchestrator Disabled** (`auction.enabled = false`):
Expand All @@ -66,11 +66,13 @@ providers = ["prebid", "aps"]
mediator = "adserver_mock" # If set: mediation, if omitted: highest bid wins
timeout_ms = 2000

# Mock provider configs
# APS OpenRTB provider. The built-in production endpoint is used when
# endpoint is omitted; use only an account authorized for test traffic.
[integrations.aps]
enabled = true
mock = true
mock_price = 2.50
account_id = "example-account"
timeout_ms = 800
debug = false

[integrations.adserver_mock]
enabled = true
Expand All @@ -90,10 +92,10 @@ mediator = "adserver_mock" # Mediator configured = parallel mediation strategy
```

**Expected Flow:**
1. Prebid queries real SSPs
2. APS returns mock bids ($2.50 CPM)
3. AdServer Mock mediates between all bids
4. Winning creative returned
1. Prebid queries its configured bidders through Prebid Server
2. APS sends an OpenRTB request for eligible banner impressions
3. AdServer Mock mediates the provider responses
4. The winning creative or typed APS renderer is returned

### Scenario 2: Parallel Only (No Mediation)
**Config:**
Expand Down Expand Up @@ -131,8 +133,9 @@ INFO: Running 2 bidders in parallel
INFO: Requesting bids from: prebid
INFO: Prebid returned 2 bids (time: 120ms)
INFO: Requesting bids from: aps
INFO: APS (MOCK): returning 2 bids in 80ms
INFO: GAM mediation: slot 'header-banner' won by 'amazon-aps' at $2.50 CPM
INFO: APS requests bids for 2 impressions
INFO: APS returns 2 accepted bids in 80ms
INFO: GAM mediation: slot 'header-banner' won by 'aps' at $2.50 CPM
```

### Verify Provider Registration
Expand All @@ -156,18 +159,19 @@ INFO: Registering auction provider: adserver_mock

## Next Steps

1. **Test with real Prebid Server** - Verify Prebid bids work correctly
2. **Implement real APS** - Replace mock with actual Amazon TAM API calls
3. **Implement real GAM** - Add Google Ad Manager API integration
4. **Add metrics** - Track bid rates, win rates, latency per provider
1. **Verify Prebid Server demand** - Confirm configured bidders return expected test bids
2. **Verify APS eligibility** - Confirm the test account, inventory identity, and `/e/pb/bid` endpoint are authorized
3. **Exercise renderer security** - Run the APS browser integration suite for iframe and script creatives
4. **Add metrics** - Track bid rates, win rates, latency, and aggregate drop reasons per provider

## Mock Provider Behavior
## Provider Behavior

### APS (Amazon)
- Returns bids for all slots
- Default mock price: $2.50 CPM
- Always returns 2 bids
- Response time: ~80ms (simulated)
- Sends real OpenRTB requests for eligible banner slots
- Safely drops malformed, unsupported, or unrenderable bids and reports aggregate reasons
- Reduces multiple APS candidates to one winner per impression
- Returns typed renderer descriptors rather than exposing `adm` outside the sandbox
- Automated tests intercept upstream traffic and use fictional response fixtures

### AdServer Mock
- Acts as mediator by calling mocktioneer's mediation endpoint
Expand Down
18 changes: 16 additions & 2 deletions crates/trusted-server-adapter-axum/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use trusted_server_core::settings::Settings;
use trusted_server_core::settings_data::{
default_config_key, default_config_store_name, get_settings_from_config_store,
};
use trusted_server_core::trace_cookie::handle_trace_mode;

use trusted_server_core::platform::RuntimeServices;

Expand Down Expand Up @@ -262,6 +263,7 @@ enum NamedRouteHandler {
/// Legacy `/admin/keys/*` aliases — denied locally with 404 so they never
/// reach the publisher fallback (which would leak admin credentials).
LegacyAdminDenied,
TraceMode,
Auction,
PageBids,
FirstPartyProxy,
Expand All @@ -286,7 +288,7 @@ const LEGACY_ADMIN_DENY_METHODS: &[Method] = &[
Method::DELETE,
];

fn named_routes() -> [NamedRoute; 13] {
fn named_routes() -> [NamedRoute; 14] {
[
NamedRoute {
path: "/.well-known/trusted-server.json",
Expand Down Expand Up @@ -327,6 +329,11 @@ fn named_routes() -> [NamedRoute; 13] {
primary_methods: LEGACY_ADMIN_DENY_METHODS,
handler: NamedRouteHandler::LegacyAdminDenied,
},
NamedRoute {
path: "/_ts/trace",
primary_methods: &[Method::GET],
handler: NamedRouteHandler::TraceMode,
},
NamedRoute {
path: "/auction",
primary_methods: &[Method::POST],
Expand Down Expand Up @@ -364,7 +371,11 @@ fn named_routes() -> [NamedRoute; 13] {
},
NamedRoute {
path: "/first-party/proxy-rebuild",
primary_methods: &[Method::POST],
// GET serves the click guard's navigation fallback: the creative
// iframe is an opaque origin (sandbox without `allow-same-origin`),
// so its JSON POST is blocked by CORS and the guard navigates here
// for a 302 instead.
primary_methods: &[Method::GET, Method::POST],
handler: NamedRouteHandler::FirstPartyProxyRebuild,
},
]
Expand Down Expand Up @@ -404,6 +415,9 @@ fn named_route_handler(
Ok(resp)
}
NamedRouteHandler::LegacyAdminDenied => Ok(legacy_admin_alias_denied()),
NamedRouteHandler::TraceMode => {
handle_trace_mode(&state.settings, req.uri().query())
}
NamedRouteHandler::Auction => {
// Build the geo-aware EC context so the auction consent
// gate sees the caller's jurisdiction — `EcContext::default()`
Expand Down
1 change: 1 addition & 0 deletions crates/trusted-server-adapter-axum/tests/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ fn all_explicit_routes_are_registered() {
("GET", "/first-party/click"),
("GET", "/first-party/sign"),
("POST", "/first-party/sign"),
("GET", "/first-party/proxy-rebuild"),
("POST", "/first-party/proxy-rebuild"),
];

Expand Down
20 changes: 20 additions & 0 deletions crates/trusted-server-adapter-cloudflare/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use trusted_server_core::request_signing::{
handle_trusted_server_discovery, handle_verify_signature,
};
use trusted_server_core::settings::Settings;
use trusted_server_core::trace_cookie::handle_trace_mode;

use crate::middleware::{AuthMiddleware, FinalizeResponseMiddleware};
use crate::platform::build_runtime_services;
Expand Down Expand Up @@ -474,6 +475,15 @@ fn build_router(state: &Arc<AppState>) -> RouterService {
.post("/_ts/admin/keys/deactivate", |_ctx: RequestContext| async {
Ok::<Response, EdgeError>(admin_key_management_not_supported())
})
// Render-trace toggle: arms/disarms the ts-trace cookie and
// redirects to `/`. Gated by [debug] trace_route_enabled (404 when
// off).
.get(
"/_ts/trace",
make_handler(Arc::clone(&state), |s, _services, req| async move {
handle_trace_mode(&s.settings, req.uri().query())
}),
)
.post(
"/auction",
make_handler(Arc::clone(&state), |s, services, req| async move {
Expand Down Expand Up @@ -517,6 +527,16 @@ fn build_router(state: &Arc<AppState>) -> RouterService {
handle_first_party_proxy_sign(&s.settings, &services, req).await
}),
)
// GET serves the click guard's navigation fallback: the creative
// iframe is an opaque origin (sandbox without `allow-same-origin`),
// so its JSON POST is blocked by CORS and the guard navigates here
// for a 302 instead.
.get(
"/first-party/proxy-rebuild",
make_handler(Arc::clone(&state), |s, services, req| async move {
handle_first_party_proxy_rebuild(&s.settings, &services, req).await
}),
)
.post(
"/first-party/proxy-rebuild",
make_handler(Arc::clone(&state), |s, services, req| async move {
Expand Down
1 change: 1 addition & 0 deletions crates/trusted-server-adapter-cloudflare/tests/routes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ fn all_explicit_routes_are_registered() {
("GET", "/first-party/click"),
("GET", "/first-party/sign"),
("POST", "/first-party/sign"),
("GET", "/first-party/proxy-rebuild"),
("POST", "/first-party/proxy-rebuild"),
];

Expand Down
Loading
Loading