RTB Architecture
GPP and TCF implementation for engineers: how consent travels from the CMP to the bid request
Published · Last updated
Next scheduled review:
A consent signal travels in four hops. The CMP writes a TC String or a GPP string, page code reads it through __tcfapi or __gpp, Prebid.js copies it into the request, and each exchange forwards it in regs.gpp, regs.gpp_sid and user.consent. Under TCF 2.3, strings created from 1 March 2026 need a Disclosed Vendors segment.
Contents
Key facts
- TCF 2.3 is in force. IAB Europe released TCF v2.3 on 19 June 2025 and closed the transition on 28 February 2026. From 1 March 2026, a TC String "created without the disclosedVendor segment will be deemed invalid" (IAB Europe, updated 15 December 2025).
- Google enforces the same rule with Limited Ads. Google describes 1 March 2026 as "the IAB's mandatory deadline" and says requests with non-compliant new strings may default to Limited Ads (Google Ad Manager Help). AdSense added TCF error code 1.4 for a missing or malformed Disclosed Vendors segment on 2 March 2026 (AdSense Help).
- TCF 2.4 changed the vendor list, not the string. The v2.4 specifications appeared on 23 July 2026. Web CMPs had until 23 October 2026 to comply; app and CTV CMPs have until 23 February 2027 (IAB Europe letter, 16 July 2026).
- The US National GPP section was rewritten. IAB Tech Lab merged version 3.0 of the section into its repository on 4 November 2026, cutting the core to four MSPA fields (GPP repository commit, 4 November 2026). Its GPP page still described the update as in public comment on 9 November 2026 (IAB Tech Lab, GPP page, updated 12 August 2026).
- Prebid.js still writes TCF to the old fields. Its TCF module sets
regs.ext.gdpranduser.ext.consent, while its GPP module sets the OpenRTB 2.6 fieldsregs.gppandregs.gpp_sid(consentManagementTcf.ts; consentManagementGpp.ts).
Definition
GPP string: a single encoded string, defined by IAB Tech Lab's Global Privacy Protocol, that holds a header listing section IDs and one payload per section. Each section carries one jurisdiction's signal, such as the IAB Europe TC String (section 2) or the MSPA US National section (section 7). OpenRTB 2.6 carries it in regs.gpp, with the applicable section IDs in regs.gpp_sid (GPP Consent String Specification). See the glossary entries for GPP, TCF and the consent string.
IAB Tech Lab renamed the standard from Global Privacy Platform to Global Privacy Protocol on 18 February 2025, because "platform" suggested licensed software (IAB Tech Lab blog). The repository and the OpenRTB field descriptions still use the old name.
What a signal permits under GDPR and ePrivacy is a legal question, covered in GDPR, ePrivacy and the bidstream. This page is about plumbing: where each signal is written, read and forwarded, and which dates decide whether it is valid.
The end-to-end path of a consent signal
The table follows one page view from the consent banner to the buyer. Field names are exact; check your logs against them.
6 of 6 rows
1 | Shows the notice, records choices, encodes strings | Web: CMP storage, exposed through | |
2 | Page scripts and tags | Ask the CMP for the current string and wait for a final status | In memory, per page view |
3 | Prebid.js consent modules | Fetch TCF and GPP data, hold the auction until ready or timed out |
|
4 | Prebid Server or the SSP | Normalises fields, may unwrap TCF from GPP, enforces rules | OpenRTB 2.6 core fields, or 2.5 |
5 | Exchange to DSP | Forwards the strings unchanged with the request |
|
6 | Pixels and syncs | No JavaScript, so values come from URL macros |
|
1
- Component
- What it does
Shows the notice, records choices, encodes strings
- Where the signal sits afterwards
Web: CMP storage, exposed through
__tcfapiand__gpp. Apps:IABTCF_TCString,IABGPP_HDR_GppString,IABGPP_GppSIDin NSUserDefaults or SharedPreferences
2
- Component
Page scripts and tags
- What it does
Ask the CMP for the current string and wait for a final status
- Where the signal sits afterwards
In memory, per page view
3
- Component
Prebid.js consent modules
- What it does
Fetch TCF and GPP data, hold the auction until ready or timed out
- Where the signal sits afterwards
ortb2.regs.ext.gdpr,ortb2.user.ext.consent,ortb2.regs.gpp,ortb2.regs.gpp_sid;bidderRequest.gdprConsent,bidderRequest.gppConsent
4
- Component
Prebid Server or the SSP
- What it does
Normalises fields, may unwrap TCF from GPP, enforces rules
- Where the signal sits afterwards
OpenRTB 2.6 core fields, or 2.5
extfields for bidders that need them
5
- Component
Exchange to DSP
- What it does
Forwards the strings unchanged with the request
- Where the signal sits afterwards
regs.gdpr,user.consent,regs.gpp,regs.gpp_sid
6
- Component
Pixels and syncs
- What it does
No JavaScript, so values come from URL macros
- Where the signal sits afterwards
gdpr=${GDPR},gdpr_consent=${GDPR_CONSENT_XXXXX},gpp=${GPP_STRING_XXXXX},gpp_sid=${GPP_SID}
Table by AdSovereign, CC BY 4.0.
Reading consent on the page: __tcfapi and __gpp
Both APIs are global JavaScript functions that a CMP stub must define before any vendor script runs. Neither returns a value; each answers through a callback. Wait for a final status before you read a string, or you will read an empty or stale one.
For the TCF, getTCData was deprecated in TCF v2.2. Register a listener instead and act on tcloaded (a stored string loaded with no banner) or useractioncomplete (the user just confirmed), as the CMP API v2 requires:
__tcfapi('addEventListener', 2, function (tcData, success) {
if (!success) return;
if (tcData.eventStatus === 'tcloaded' || tcData.eventStatus === 'useractioncomplete') {
var tcString = tcData.tcString; // goes to user.consent
var gdprApplies = tcData.gdprApplies; // true, false or undefined; goes to regs.gdpr
__tcfapi('removeEventListener', 2, function () {}, tcData.listenerId);
}
});For GPP, CMP API 1.1 (June 2023) removed return values and the getGPPData command. Listen for the signalStatus event and read only when it says ready. The CMP must set not ready before it changes any section and ready once it is done.
__gpp('addEventListener', function (evt, success) {
if (!success) return;
if (evt.eventName === 'signalStatus' && evt.data === 'ready') {
var gppString = evt.pingData.gppString; // goes to regs.gpp
var sids = evt.pingData.applicableSections; // goes to regs.gpp_sid, unless it is [-1]
}
});Two details cause most bugs here. A value of [-1] in applicableSections means no section applies, so do not forward it as gpp_sid. And gdprApplies can be undefined while the CMP is still deciding, which is not the same as false.
How Prebid.js passes the signals
Prebid.js ships two modules for this hop: consentManagementTcf and consentManagementGpp. Both call the CMP APIs above, wait up to a timeout, then write the result into the auction. The current release line is 11.x; version 11.47.0 was published on 4 November 2026 (Prebid.js releases).
pbjs.setConfig({
consentManagement: {
gdpr: { cmpApi: 'iab', timeout: 8000, defaultGdprScope: true },
gpp: { cmpApi: 'iab', timeout: 8000 }
}
});Build both into your package with gulp build --modules=consentManagementTcf,tcfControl,consentManagementGpp plus your bidder adapters. The optional tcfControl module enforces purposes inside Prebid.js, for example blocking storage without purpose 1 consent (Prebid TCF control module).
Where the values land matters for every adapter. The TCF module writes regs.ext.gdpr and user.ext.consent, the OpenRTB 2.5 locations. The GPP module writes regs.gpp and regs.gpp_sid, the 2.6 locations. Google's Additional Consent string goes to user.ext.ConsentedProvidersSettings.consented_providers, a non-standard path (consentManagementTcf.ts; consentManagementGpp.ts). Adapters can also read bidderRequest.gdprConsent and bidderRequest.gppConsent.
Since Prebid.js 11.14, a failed CMP lookup stops the User ID module from running; a timeout does not (Prebid GPP module). Header bidding setup in general is covered in header bidding explained.
Where consent sits in OpenRTB 2.6 and in the legacy fields
OpenRTB 2.6 promoted the GDPR flag and the TC String out of ext and added gpp and gpp_sid in release 2.6-202211 (OpenRTB 2.6, Object: Regs). Many systems still read the old paths, so most exchanges send both.
6 of 6 rows
GDPR applies |
|
|
| Google sends a boolean |
TC String |
|
|
|
|
GPP string |
| none |
| Vendors without a GPP ID may use |
Applicable sections |
| none |
| Usually one value; never 3 or 4 |
US Privacy String |
|
|
| Deprecated as GPP section 6 |
Additional Consent | none | Exchange-specific | none | Google ATP list; format |
GDPR applies
- OpenRTB 2.6 field
regs.gdpr(0, 1, omitted = unknown)- Legacy 2.5 location
regs.ext.gdpr- URL macro
${GDPR}- Notes
Google sends a boolean
regs.ext.gdpr
TC String
- OpenRTB 2.6 field
user.consent- Legacy 2.5 location
user.ext.consent- URL macro
${GDPR_CONSENT_XXXXX}- Notes
XXXXXis the receiving vendor's GVL ID
GPP string
- OpenRTB 2.6 field
regs.gpp- Legacy 2.5 location
none
- URL macro
${GPP_STRING_XXXXX}- Notes
Vendors without a GPP ID may use
${GPP_STRING}
Applicable sections
- OpenRTB 2.6 field
regs.gpp_sid- Legacy 2.5 location
none
- URL macro
${GPP_SID}- Notes
Usually one value; never 3 or 4
US Privacy String
- OpenRTB 2.6 field
regs.us_privacy- Legacy 2.5 location
regs.ext.us_privacy- URL macro
${US_PRIVACY}- Notes
Deprecated as GPP section 6
Additional Consent
- OpenRTB 2.6 field
none
- Legacy 2.5 location
Exchange-specific
user.ext- URL macro
none
- Notes
Google ATP list; format
2~consented~dv.disclosed
Table by AdSovereign, CC BY 4.0.
Sources: OpenRTB 2.6, Prebid Server convert_down.go, TCF string specification, URL macros, GPP string specification, URL macros, Google Authorized Buyers OpenRTB guide, Google Additional Consent spec, US Privacy String specification.
Prebid Server sits in the middle of this. It passes regs.gpp and regs.gpp_sid through, and it "parses the GPP container for TCF2 and USP strings, extracting them to the original ORTB location" (Prebid Server privacy features). For each bidder that does not declare OpenRTB 2.6, it moves regs.gdpr, user.consent and regs.us_privacy back into ext. In Prebid Server Go on 30 October 2026, 58 of 281 bidder adapters declared 2.6 (our count; method in OpenRTB versions compared). Running your own instance is covered in the Prebid Server self-hosting guide.
Annotated bid request: an EU user with GPP section 2
This OpenRTB 2.6 request comes from a German news site. The user consented on a TCF 2.3 banner, and the CMP also exposes GPP. Field meanings are in the table below the JSON; the full 2.6 field guide is OpenRTB 2.6 explained.
{
"id": "9c1f6e2a-3b7d-4c58-a1e0-5f2d8b6c4e91",
"imp": [
{ "id": "1", "banner": { "format": [{ "w": 300, "h": 250 }] }, "secure": 1 }
],
"site": {
"domain": "zeitung.example",
"page": "https://zeitung.example/politik/haushalt",
"publisher": { "id": "pub-3302" }
},
"device": {
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"ip": "192.0.2.0",
"geo": { "country": "DEU", "type": 2 }
},
"user": {
"buyeruid": "dsp-8f2c41d7",
"consent": "CQtaoIAQtaoIAAAABBENC4FgAPIAAELAAAYgF5wAgAaALzAvOACAvMAA.IF5wAwAFAA0AXm"
},
"regs": {
"gdpr": 1,
"gpp": "DBABM~CQtaoIAQtaoIAAAABBENC4FgAPIAAELAAAYgF5wAgAaALzAvOACAvMAA.IF5wAwAFAA0AXm",
"gpp_sid": [2]
},
"at": 1,
"tmax": 250,
"cur": ["EUR"]
}7 of 7 rows
| 1 | GDPR applies; read the TC String before using any identifier |
|
| A TCF 2.3 string: the part after the dot is the mandatory Disclosed Vendors segment |
Decoded core | Created 9 November 2026; GVL 184; policy version 5; purposes 1, 2, 3, 4 and 7 consented; legitimate interest transparency for 2, 7, 9 and 10 | Matches the live vendor list on 5 November 2026 (GVL v3) |
Decoded vendors | Consent for vendors 52 and 755; legitimate interest for 755; disclosed vendors 10, 52 and 755 | Vendor 10 was disclosed but carries neither a consent nor a legitimate interest signal |
|
| Header |
|
| The EU TCF section is the one in force |
| Last octet zeroed | A common minimisation step for EU traffic |
regs.gdpr
- Value
1
- What it tells the buyer
GDPR applies; read the TC String before using any identifier
user.consent
- Value
CQtaoIAQ…(core).IF5wAw…(Disclosed Vendors)- What it tells the buyer
A TCF 2.3 string: the part after the dot is the mandatory Disclosed Vendors segment
Decoded core
- Value
Created 9 November 2026; GVL 184; policy version 5; purposes 1, 2, 3, 4 and 7 consented; legitimate interest transparency for 2, 7, 9 and 10
- What it tells the buyer
Matches the live vendor list on 5 November 2026 (GVL v3)
Decoded vendors
- Value
Consent for vendors 52 and 755; legitimate interest for 755; disclosed vendors 10, 52 and 755
- What it tells the buyer
Vendor 10 was disclosed but carries neither a consent nor a legitimate interest signal
regs.gpp
- Value
DBABMheader, then the same TC String- What it tells the buyer
Header
DBABMdeclares exactly one section, ID 2
regs.gpp_sid
- Value
[2]- What it tells the buyer
The EU TCF section is the one in force
device.ip
- Value
Last octet zeroed
- What it tells the buyer
A common minimisation step for EU traffic
Table by AdSovereign, CC BY 4.0.
The TC String was generated for this page with CMP ID 0, the placeholder that IAB Tech Lab's own library tests use, so a strict decoder will flag it. Paste it into the TCF consent string decoder or the whole regs.gpp value into the GPP consent string decoder to see every field. Vendor ID 755 is Google Advertising Products on the vendor list (GVL v3).
The same request as a 2.5-only bidder receives it
When Prebid Server forwards this request to an adapter without an OpenRTB 2.6 flag, it moves the GDPR flag and the TC String into ext. It keeps gpp and gpp_sid, which have no 2.5 home (convert_down.go).
{
"id": "9c1f6e2a-3b7d-4c58-a1e0-5f2d8b6c4e91",
"imp": [
{ "id": "1", "banner": { "format": [{ "w": 300, "h": 250 }] }, "secure": 1 }
],
"site": {
"domain": "zeitung.example",
"page": "https://zeitung.example/politik/haushalt",
"publisher": { "id": "pub-3302" }
},
"user": {
"buyeruid": "dsp-8f2c41d7",
"ext": {
"consent": "CQtaoIAQtaoIAAAABBENC4FgAPIAAELAAAYgF5wAgAaALzAvOACAvMAA.IF5wAwAFAA0AXm"
}
},
"regs": {
"gpp": "DBABM~CQtaoIAQtaoIAAAABBENC4FgAPIAAELAAAYgF5wAgAaALzAvOACAvMAA.IF5wAwAFAA0AXm",
"gpp_sid": [2],
"ext": { "gdpr": 1 }
},
"at": 1,
"tmax": 250,
"cur": ["EUR"]
}A bidder that reads only regs.gdpr would see this request as "GDPR unknown". That is why the read rule in the common mistakes below says to check both places.
Annotated bid request: a US user with GPP section 7
This request comes from a weather app in California. The publisher uses the MSPA US National section, and the user opted out of sharing and targeted advertising. The string uses the version 2 layout, the one in force before the November 2026 revision.
{
"id": "2f7c9a1e-5d3b-4e86-9c20-7a1b4d6e8f35",
"imp": [
{ "id": "1", "banner": { "format": [{ "w": 320, "h": 50 }] }, "secure": 1 }
],
"app": {
"bundle": "com.example.weather",
"publisher": { "id": "pub-8810" }
},
"device": {
"ifa": "3f1d9b6e-0c2a-4e7f-9a51-7b8c2d4e6f10",
"lmt": 0,
"ip": "198.51.100.0",
"geo": { "country": "USA", "region": "CA", "type": 2 }
},
"regs": {
"coppa": 0,
"gpp": "DBABLA~CVQlAAAAAACA.YA",
"gpp_sid": [7]
},
"at": 1,
"tmax": 300,
"cur": ["USD"]
}7 of 7 rows
| Header with one section, ID 7 | The same header that IAB Tech Lab's reference library produces for US National |
Core, version | 2 | US National version 2 layout |
Notices | Sharing, sale opt-out, sharing opt-out and targeted advertising opt-out notices all 1 (provided) | The publisher gave the required notices |
Opt-outs | SaleOptOut 2 (did not opt out); SharingOptOut 1 and TargetedAdvertisingOptOut 1 (opted out) | No cross-context behavioural ads for this user |
Sensitive data and child consents | All 0 | Not applicable: the app does not process these |
MspaCoveredTransaction | 2 | Not declared a covered transaction under the MSPA |
GPC subsection | Gpc 1 | The device sent a Global Privacy Control signal |
DBABLA
- Decoded value
Header with one section, ID 7
- What it means for the buyer
The same header that IAB Tech Lab's reference library produces for US National
Core, version
- Decoded value
2
- What it means for the buyer
US National version 2 layout
Notices
- Decoded value
Sharing, sale opt-out, sharing opt-out and targeted advertising opt-out notices all 1 (provided)
- What it means for the buyer
The publisher gave the required notices
Opt-outs
- Decoded value
SaleOptOut 2 (did not opt out); SharingOptOut 1 and TargetedAdvertisingOptOut 1 (opted out)
- What it means for the buyer
No cross-context behavioural ads for this user
Sensitive data and child consents
- Decoded value
All 0
- What it means for the buyer
Not applicable: the app does not process these
MspaCoveredTransaction
- Decoded value
2
- What it means for the buyer
Not declared a covered transaction under the MSPA
GPC subsection YA
- Decoded value
Gpc 1
- What it means for the buyer
The device sent a Global Privacy Control signal
Table by AdSovereign, CC BY 4.0.
The field values follow the version 2 text (US National specification, June 2026). We encoded the string for this page and checked our encoder against the reference library's test string DBABLA~CAAAVVVVVVRA.QA (iabgpp-es GppModel tests). A buyer reading this string sees an opt-out of targeted advertising, so the usual practice is to bid on context and keep the advertising ID out of profiling.
TCF 2.3: what changed, and which deadline is right
TCF 2.3 changed one thing in the string: the Disclosed Vendors segment, once optional, became mandatory. Before 2.3, a vendor that relied only on special purposes could not tell "not shown to the user" from "user objected" when its legitimate interest bit was 0. The segment answers that with one bit per vendor (IAB Europe). The core segment layout did not change. The decoded fields are listed in our TCF consent string decoder, and the purposes and legal bases in GDPR, ePrivacy and the bidstream.
The "deadline conflict" is a difference of framing, not of rule. IAB Europe says the transition "concludes on 28th February, 2026" and that the rule applies "starting 1st March, 2026". Google calls 1 March 2026 the "mandatory deadline". Both mean the same check:
4 of 4 rows
IAB Europe, v2.3 transition page | Transition ends 28 February 2026 | Strings created up to and including 28 February 2026 may lack the segment |
IAB Europe, same page | From 1 March 2026 | A string created on or after 1 March 2026 without Disclosed Vendors is invalid; older strings stay valid until users renew choices |
Google Ad Manager Help | "Mandatory deadline" 1 March 2026 | New strings must be v2.3; v2.2 strings created before 1 March 2026 are still supported; failures may get Limited Ads |
Google AdSense Help, 2 March 2026 | After 1 March 2026 | Error code 1.4 when Disclosed Vendors is missing, malformed or "does not include Google" |
IAB Europe, v2.3 transition page
- Date it states
Transition ends 28 February 2026
- What it means in code
Strings created up to and including 28 February 2026 may lack the segment
IAB Europe, same page
- Date it states
From 1 March 2026
- What it means in code
A string created on or after 1 March 2026 without Disclosed Vendors is invalid; older strings stay valid until users renew choices
Google Ad Manager Help
- Date it states
"Mandatory deadline" 1 March 2026
- What it means in code
New strings must be v2.3; v2.2 strings created before 1 March 2026 are still supported; failures may get Limited Ads
Google AdSense Help, 2 March 2026
- Date it states
After 1 March 2026
- What it means in code
Error code 1.4 when Disclosed Vendors is missing, malformed or "does not include Google"
Table by AdSovereign, CC BY 4.0.
So the rule your validator should apply is: read the Created field; if it is 1 March 2026 or later and the Disclosed Vendors segment is missing, treat the string as invalid. The Created field holds a day-level timestamp, so the boundary is clean (TCF string specification). Third-party guides that quote 28 February are describing the end of the transition, not a different rule.
TCF 2.4 followed in 2026 without touching the string. It adds a standardTexts field and feature illustrations to the Global Vendor List, and renames special feature 2 (IAB Europe letter, 16 July 2026). Web CMPs had to comply by 23 October 2026; app and CTV CMPs have until 23 February 2027. A v2.4 string decodes exactly like a v2.3 string.
Google's TCF requirements in 2026
Google sets rules on top of the TCF for publishers using Ad Manager, AdSense and AdMob. Four matter for engineers.
- A Google-certified CMP. Personalised ads to users in the EEA and UK have needed a certified CMP integrated with the TCF since 16 January 2024, and in Switzerland since 31 July 2024 (Google Ad Manager Help). Google's list showed 145 certified CMPs when we checked on 9 November 2026.
- The TCF 2.3 rule above. New strings without Disclosed Vendors, or without Google disclosed, can fall back to Limited Ads (Ad Manager Help; AdSense Help).
- Google's own legal bases. Google says it is "not flexibly registered for purposes 1, 3, and 4" and "always requires consent" for them. It registered purposes 2, 7, 9 and 10 as flexible, defaulting to legitimate interest (Ad Manager Help). The vendor list matches: vendor 755 lists consent purposes 1, 3 and 4 and legitimate interest purposes 2, 7, 9 and 10 (GVL v3, version 184).
- Additional Consent for vendors outside the GVL. Google's AC string covers ad tech providers that are not on the vendor list. Version 2, the standard since December 2023, adds a disclosed list after
dv., for example2~1.10~dv.2.3.4(Google Additional Consent spec).
On the buy side, Google's OpenRTB implementation sends the TC String in both user.consent and user.ext.consent. It sets the boolean regs.ext.gdpr to true in two cases. Either the CMP sends a valid string and says GDPR applies, or no string arrives and Google's own data places the impression in the EEA (Google Authorized Buyers OpenRTB guide).
US state sections in GPP
For US traffic, GPP replaced the four-character US Privacy String, now marked deprecated as section 6 (GPP Section Information). The publisher chooses between one national section and per-state sections, and gpp_sid tells the buyer which one governs the transaction.
6 of 6 rows
2 |
| IAB Europe TCF v2 |
5 |
| IAB Canada TCF |
6 |
| US Privacy String (deprecated) |
7 |
| MSPA US National section |
8 to 23 |
| California to Minnesota |
24 to 27 |
| Maryland, Indiana, Kentucky, Rhode Island (final after public comment to 1 December 2025) |
2
- Client-side prefix
tcfeuv2- Covers
IAB Europe TCF v2
5
- Client-side prefix
tcfcav1- Covers
IAB Canada TCF
6
- Client-side prefix
uspv1- Covers
US Privacy String (deprecated)
7
- Client-side prefix
usnat- Covers
MSPA US National section
8 to 23
- Client-side prefix
usca,usva,usco,usut,usct,usfl,usmt,usor,ustx,usde,usia,usne,usnh,usnj,ustn,usmn- Covers
California to Minnesota
24 to 27
- Client-side prefix
usmd,usin,usky,usri- Covers
Maryland, Indiana, Kentucky, Rhode Island (final after public comment to 1 December 2025)
Table by AdSovereign, CC BY 4.0.
Sources: GPP Section Information; IAB Tech Lab GPP page.
That makes 20 state sections. The GPP decoder explains every field and value code. Which states treat which data as sensitive is tracked in our state health privacy laws tracker.
Support for state sections varies by tool. Prebid Server documents two modules for sections 7 to 12: one applies default interpretations, the other lets publishers write their own logic. Its privacy page does not mention sections 13 and higher (Prebid Server privacy features). Prebid.js adapters declare supported sections with the names tcfeu, tcfca, usnat, usstate_all and usp (Prebid GPP module). Check your stack against the full ID range before you rely on it.
The US National section version 3.0: what the November 2026 revision changes
IAB Tech Lab opened changes to the US sections for public comment on 11 August 2026, with comments due by 11 September. The changes support the Fifth Amended and Restated MSPA. They remove MSPA coverage for the state-by-state approach, end Service Provider and Opt-Out Option modes, and simplify notice and choice fields (IAB Tech Lab press release, 11 August 2026). Commits on 4 November 2026 merged them into the specification files (commit b997269).
7 of 7 rows
Section header | No | No | Yes: SectionId, Version, SubSections |
Notice fields | 6 notice fields | Same 6 | One field, MspaNotice |
Opt-out fields | Sale, sharing, targeted advertising | Same 3 | One field, MspaOptOut |
Sensitive data consents | 12 categories | 16 categories | Removed |
Known-child consents | 2 age bands | 3 age bands | Removed |
MSPA fields | Covered transaction, two modes | Same | MspaVersion and a 14-bit MspaId identifying the signatory |
GPC subsection | Not required | Not required | Must always be present |
Section header
- Version 1 (December 2022)
No
- Version 2 (October 2024)
No
- Version 3.0 (November 2026)
Yes: SectionId, Version, SubSections
Notice fields
- Version 1 (December 2022)
6 notice fields
- Version 2 (October 2024)
Same 6
- Version 3.0 (November 2026)
One field, MspaNotice
Opt-out fields
- Version 1 (December 2022)
Sale, sharing, targeted advertising
- Version 2 (October 2024)
Same 3
- Version 3.0 (November 2026)
One field, MspaOptOut
Sensitive data consents
- Version 1 (December 2022)
12 categories
- Version 2 (October 2024)
16 categories
- Version 3.0 (November 2026)
Removed
Known-child consents
- Version 1 (December 2022)
2 age bands
- Version 2 (October 2024)
3 age bands
- Version 3.0 (November 2026)
Removed
MSPA fields
- Version 1 (December 2022)
Covered transaction, two modes
- Version 2 (October 2024)
Same
- Version 3.0 (November 2026)
MspaVersion and a 14-bit MspaId identifying the signatory
GPC subsection
- Version 1 (December 2022)
Not required
- Version 2 (October 2024)
Not required
- Version 3.0 (November 2026)
Must always be present
Table by AdSovereign, CC BY 4.0.
Sources: US National specification, November 2026; version 2 text, June 2026. Version 1 lengths are from IAB Tech Lab's reference library, which reads 12 sensitive categories and 2 child bands for version 1 strings (iabgpp-es UsNatCoreSegment).
State sections keep their layout, but now say the MSPA fields "should not be used". The California section, for example, says MspaCoveredTransaction "must always be set to 2" and both mode fields to 0 (California section).
Treat version 3.0 as merged, not final. IAB Tech Lab's GPP page, last updated 12 August 2026, still described the update as in public comment on 9 November 2026, and we found no release announcement (IAB Tech Lab, GPP). The safe engineering move is to read the version field of every US National payload and branch on it. Version 1 and 2 strings will keep arriving from CMPs for months, and a parser that assumes one layout will misread the other two.
Common mistakes
- Reading the string before the CMP is ready. Act only on
tcloadedoruseractioncompletefor the TCF and onsignalStatusreadyfor GPP. An early read returns an empty or old string. - Treating
gdprApplies: undefinedas false. Undefined means the CMP has not decided. Prebid'sdefaultGdprScopesetting exists for exactly this case. - Sending
gppwithoutgpp_sid. The string alone does not say which section governs the transaction, and a buyer will guess. Send both, and never send-1. - Reading only
regs.gdpror onlyregs.ext.gdpr. Prebid.js writes theextform, Prebid Server may move it, and Google sends both. Read the core field first and fall back toext. - Rewriting the string on the way through. The GPP specification says strings "must always be propagated as is, and not modified". Re-encoding to strip a section breaks decoding downstream.
- Creating new TC Strings without Disclosed Vendors. Since 1 March 2026 they are invalid, and Google may serve Limited Ads. Check the CMP version, not only the banner.
- Forgetting Google in Disclosed Vendors. AdSense's error code 1.4 fires when the segment "does not include Google". If you work with Google, vendor 755 must be disclosed.
- Hard-coding one US National layout. Versions 1, 2 and 3.0 coexist in November 2026. Branch on the version field.
- Assuming every tool covers all 27 sections. Some modules interpret only sections 7 to 12. Test with a string for each state you serve.
- Dropping the URL macros on syncs. Pixels need
${GDPR_CONSENT_XXXXX}or${GPP_STRING_XXXXX}with your own vendor ID, or the receiving server cannot check consent.
Test strings for each case can be decoded in the TCF decoder and the GPP decoder. UK specifics after the Data (Use and Access) Act are covered in UK Data (Use and Access) Act and advertising. The identity and privacy hub and the RTB architecture hub collect the related pages.
FAQ
What is a GPP consent string?
regs.gpp, with the applicable IDs in regs.gpp_sid (GPP specification).What changed in TCF 2.3?
Was the TCF 2.3 deadline 28 February or 1 March 2026?
What does Google require for TCF 2.3?
GPP vs TCF: which one should I send?
user.consent and regs.gdpr, and add regs.gpp with gpp_sid 2 when your CMP supports GPP. For US traffic, send regs.gpp with a US National or state section; the old US Privacy String is deprecated.What changed in the GPP US National section in November 2026?
How this works on owned infrastructure
The hard part of consent in programmatic is not decoding a string. It is applying the same decision at every hop, under rules you can explain to a regulator months later. When consent is evaluated inside a vendor's exchange, you inherit its reading of gpp_sid, its handling of a missing Disclosed Vendors segment and its timetable for US National v3. AdSovereign is an enterprise RTB stack designed to run inside your own perimeter. Its exchange is built to parse user.consent, regs.gpp and regs.gpp_sid before any bidder sees an identifier, and to log each decision with the request ID. The architecture page shows where that consent gate sits, and the security page covers log retention.
Sources
- IAB Europe, "All You Need to Know About the Transition to TCF v2.3" (updated 15 December 2025). https://iabeurope.eu/all-you-need-to-know-about-the-transition-to-tcf-v2-3/
- IAB Europe, "TCF Policies v5.0.b and Specifications v2.4: confirmation of the timeline" (letter dated 16 July 2026). https://iabeurope.eu/wp-content/uploads/TCF_V-CMP_comms_TCFpoliciesV5.0.bAndSpecificationsV2.4ConfirmationOf-theTimeline_160726_IABEurope.pdf
- IAB Tech Lab and IAB Europe, "Consent string and vendor list formats v2" (version history to May 2026, v2.4). https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md
- IAB Tech Lab, "CMP API v2" for the TCF (version history to February 2026). https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md
- IAB Europe, Global Vendor List v3 (vendorListVersion 184, tcfPolicyVersion 5, last updated 5 November 2026). https://vendor-list.consensu.org/v3/vendor-list.json
- IAB Tech Lab, "Global Privacy Protocol String" specification (version 1, 28 September 2022; clarifications 3 November 2023). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/Consent%20String%20Specification.md
- IAB Tech Lab, GPP "Consent Management Platform API" (version 1.1, June 2023). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Core/CMP%20API%20Specification.md
- IAB Tech Lab, GPP Section Information (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/Section%20Information.md
- IAB Tech Lab and IAB Privacy, MSPA US National Technical Specification (version 3.0, November 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20%28MSPA%29%20US%20National%20Technical%20Specification.md
- Same specification, version 2 text (commit 00ffaef, 19 June 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/00ffaefe91513785e886c83877e9b56a4ec8e88c/Sections/US-National/IAB%20Privacy%E2%80%99s%20Multi-State%20Privacy%20Agreement%20%28MSPA%29%20US%20National%20Technical%20Specification.md
More sources (17)
- GitHub, Global-Privacy-Platform commit b997269, "Updates to US sections of the GPP" (4 November 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/commit/b997269909b0ec3c3096be4dbb4668864c6afed3
- IAB Tech Lab, California Privacy Technical Specification (November 2026 entry). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/US-States/CA/GPP%20Extension%3A%20California%20Privacy%20Technical%20Specification.md
- IAB Tech Lab, "Global Privacy Protocol" page (last updated 12 August 2026). https://iabtechlab.com/gpp/
- IAB Tech Lab, "IAB Tech Lab Announces Privacy Standards Portfolio Updates ... for Public Comment" (11 August 2026). https://iabtechlab.com/press-releases/privacy-standards-portfolio-updates-to-strengthen-privacy-compliance/
- IAB Tech Lab, "From Platform to Protocol: Renaming the GPP" (18 February 2025). https://iabtechlab.com/from-platform-to-protocol-renaming-the-gpp/
- IAB Tech Lab, iabgpp-es reference library, GppModel.test.ts (accessed 9 November 2026). https://github.com/IABTechLab/iabgpp-es/blob/master/modules/cmpapi/test/GppModel.test.ts
- IAB Tech Lab, "OpenRTB API Specification Version 2.6", Object: Regs (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md
- Google Ad Manager Help, "Publisher integration with the IAB Europe TCF" (TCF v2.3 timeline; accessed 9 November 2026). https://support.google.com/admanager/answer/9805023
- Google AdSense Help, "Recent transition to IAB TCF v2.3" (2 March 2026). https://support.google.com/adsense/answer/16942036
- Google Ad Manager Help, "Google consent management requirements for serving ads in the EEA, the UK, and Switzerland (for publishers)" (accessed 9 November 2026). https://support.google.com/admanager/answer/13554116
- Google Ad Manager Help, "Additional Consent Mode technical specification" (accessed 9 November 2026). https://support.google.com/admanager/answer/9681920
- Google, Authorized Buyers "OpenRTB Integration" guide (last updated 15 October 2026). https://developers.google.com/authorized-buyers/rtb/openrtb-guide
- Prebid.org, "TCF Consent Management Module" and "TCF Control Module" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/modules/consentManagementTcf.html
- Prebid.org, "GPP Consent Management Module" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/modules/consentManagementGpp.html
- Prebid, Prebid.js
modules/consentManagementTcf.tsandconsentManagementGpp.ts(master, accessed 9 November 2026); release 11.47.0 (4 November 2026). https://github.com/prebid/Prebid.js/blob/master/modules/consentManagementTcf.ts - Prebid.org, "Prebid Server Privacy Support" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/features/pbs-privacy.html
- Prebid, prebid-server
openrtb_ext/convert_down.go(accessed 9 November 2026). https://github.com/prebid/prebid-server/blob/master/openrtb_ext/convert_down.go
Changelog
- 9 November 2026. First edition. Covers TCF 2.3 (transition ended 28 February 2026) and 2.4 (web deadline 23 October 2026), GPP CMP API 1.1, OpenRTB 2.6 consent fields, Prebid.js 11.47.0, Google's certified CMP and TCF 2.3 rules, and the US National section 3.0 merged on 4 November 2026. Next review 9 February 2027.