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.gdpr and user.ext.consent, while its GPP module sets the OpenRTB 2.6 fields regs.gpp and regs.gpp_sid (consentManagementTcf.ts; consentManagementGpp.ts).
    Jump to the table

    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 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

    Columns (4)

    1

    Shows the notice, records choices, encodes strings

    Web: CMP storage, exposed through __tcfapi and __gpp. Apps: IABTCF_TCString, IABGPP_HDR_GppString, IABGPP_GppSID in NSUserDefaults or SharedPreferences

    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

    ortb2.regs.ext.gdpr, ortb2.user.ext.consent, ortb2.regs.gpp, ortb2.regs.gpp_sid; bidderRequest.gdprConsent, bidderRequest.gppConsent

    4

    Prebid Server or the SSP

    Normalises fields, may unwrap TCF from GPP, enforces rules

    OpenRTB 2.6 core fields, or 2.5 ext fields for bidders that need them

    5

    Exchange to DSP

    Forwards the strings unchanged with the request

    regs.gdpr, user.consent, regs.gpp, regs.gpp_sid

    6

    Pixels and syncs

    No JavaScript, so values come from URL macros

    gdpr=${GDPR}, gdpr_consent=${GDPR_CONSENT_XXXXX}, gpp=${GPP_STRING_XXXXX}, gpp_sid=${GPP_SID}

    1

    What it does

    Shows the notice, records choices, encodes strings

    Where the signal sits afterwards

    Web: CMP storage, exposed through __tcfapi and __gpp. Apps: IABTCF_TCString, IABGPP_HDR_GppString, IABGPP_GppSID in 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 ext fields 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}

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    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.

    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

    Columns (5)

    GDPR applies

    regs.gdpr (0, 1, omitted = unknown)

    regs.ext.gdpr

    ${GDPR}

    Google sends a boolean regs.ext.gdpr

    TC String

    user.consent

    user.ext.consent

    ${GDPR_CONSENT_XXXXX}

    XXXXX is the receiving vendor's GVL ID

    GPP string

    regs.gpp

    none

    ${GPP_STRING_XXXXX}

    Vendors without a GPP ID may use ${GPP_STRING}

    Applicable sections

    regs.gpp_sid

    none

    ${GPP_SID}

    Usually one value; never 3 or 4

    US Privacy String

    regs.us_privacy

    regs.ext.us_privacy

    ${US_PRIVACY}

    Deprecated as GPP section 6

    Additional Consent

    none

    Exchange-specific user.ext

    none

    Google ATP list; format 2~consented~dv.disclosed

    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

    XXXXX is 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

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    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

    Columns (3)

    regs.gdpr

    1

    GDPR applies; read the TC String before using any identifier

    user.consent

    CQtaoIAQ… (core) .IF5wAw… (Disclosed Vendors)

    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

    regs.gpp

    DBABM header, then the same TC String

    Header DBABM declares exactly one section, ID 2

    regs.gpp_sid

    [2]

    The EU TCF section is the one in force

    device.ip

    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

    DBABM header, then the same TC String

    What it tells the buyer

    Header DBABM declares 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

    Download JSON

    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

    Columns (3)

    DBABLA

    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 YA

    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

    Download JSON

    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

    Columns (3)

    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"

    Download JSON

    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.

    1. 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.
    2. 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).
    3. 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).
    4. 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 example 2~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

    Columns (3)

    2

    tcfeuv2

    IAB Europe TCF v2

    5

    tcfcav1

    IAB Canada TCF

    6

    uspv1

    US Privacy String (deprecated)

    7

    usnat

    MSPA US National section

    8 to 23

    usca, usva, usco, usut, usct, usfl, usmt, usor, ustx, usde, usia, usne, usnh, usnj, ustn, usmn

    California to Minnesota

    24 to 27

    usmd, usin, usky, usri

    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)

    Download JSON

    Table by AdSovereign, CC BY 4.0.

    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

    Columns (4)

    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

    Download JSON

    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

    1. Reading the string before the CMP is ready. Act only on tcloaded or useractioncomplete for the TCF and on signalStatus ready for GPP. An early read returns an empty or old string.
    2. Treating gdprApplies: undefined as false. Undefined means the CMP has not decided. Prebid's defaultGdprScope setting exists for exactly this case.
    3. Sending gpp without gpp_sid. The string alone does not say which section governs the transaction, and a buyer will guess. Send both, and never send -1.
    4. Reading only regs.gdpr or only regs.ext.gdpr. Prebid.js writes the ext form, Prebid Server may move it, and Google sends both. Read the core field first and fall back to ext.
    5. 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.
    6. 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.
    7. 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.
    8. Hard-coding one US National layout. Versions 1, 2 and 3.0 coexist in November 2026. Branch on the version field.
    9. Assuming every tool covers all 27 sections. Some modules interpret only sections 7 to 12. Test with a string for each state you serve.
    10. 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?
    It is one encoded string that carries privacy signals for several jurisdictions. A header lists the section IDs present, and each section follows its own specification, such as the IAB Europe TCF (ID 2) or the MSPA US National section (ID 7). In OpenRTB 2.6 it travels in regs.gpp, with the applicable IDs in regs.gpp_sid (GPP specification).
    What changed in TCF 2.3?
    The Disclosed Vendors segment became mandatory in every new TC String, so a vendor can tell whether the CMP showed it to the user. Vendors that rely only on special purposes must check their bit in that segment instead of their legitimate interest bit. The core segment did not change (IAB Europe).
    Was the TCF 2.3 deadline 28 February or 1 March 2026?
    Both dates describe one rule. IAB Europe's transition ended on 28 February 2026, and from 1 March 2026 a newly created string without Disclosed Vendors is invalid. Google names 1 March 2026 as the deadline (IAB Europe; Google). Strings created earlier stay valid until users renew their choices.
    What does Google require for TCF 2.3?
    TC Strings created on or after 1 March 2026 must be v2.3 strings, and Google must be among the disclosed vendors; otherwise requests may default to Limited Ads. Publishers also need a Google-certified CMP for personalised ads in the EEA, UK and Switzerland (Google Ad Manager Help). AdSense reports failures as error code 1.4.
    GPP vs TCF: which one should I send?
    In the EEA and UK, the TC String is the signal vendors are built to read, and GPP section 2 carries the same string. 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?
    Version 3.0 replaces the separate notice, opt-out and sensitive-data fields with four MSPA fields: version, notice, opt-out and the signatory's MSPA ID. A GPC subsection becomes mandatory. It was merged into the specification on 4 November 2026 after public comment, but IAB Tech Lab had not announced a final release by 9 November 2026 (IAB Tech Lab).

    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

    1. 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/
    2. 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
    3. 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
    4. 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
    5. IAB Europe, Global Vendor List v3 (vendorListVersion 184, tcfPolicyVersion 5, last updated 5 November 2026). https://vendor-list.consensu.org/v3/vendor-list.json
    6. 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
    7. 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
    8. IAB Tech Lab, GPP Section Information (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/Section%20Information.md
    9. 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
    10. 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)
    1. 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
    2. 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
    3. IAB Tech Lab, "Global Privacy Protocol" page (last updated 12 August 2026). https://iabtechlab.com/gpp/
    4. 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/
    5. IAB Tech Lab, "From Platform to Protocol: Renaming the GPP" (18 February 2025). https://iabtechlab.com/from-platform-to-protocol-renaming-the-gpp/
    6. 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
    7. 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
    8. 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
    9. Google AdSense Help, "Recent transition to IAB TCF v2.3" (2 March 2026). https://support.google.com/adsense/answer/16942036
    10. 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
    11. Google Ad Manager Help, "Additional Consent Mode technical specification" (accessed 9 November 2026). https://support.google.com/admanager/answer/9681920
    12. Google, Authorized Buyers "OpenRTB Integration" guide (last updated 15 October 2026). https://developers.google.com/authorized-buyers/rtb/openrtb-guide
    13. Prebid.org, "TCF Consent Management Module" and "TCF Control Module" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/modules/consentManagementTcf.html
    14. Prebid.org, "GPP Consent Management Module" (accessed 9 November 2026). https://docs.prebid.org/dev-docs/modules/consentManagementGpp.html
    15. Prebid, Prebid.js modules/consentManagementTcf.ts and consentManagementGpp.ts (master, accessed 9 November 2026); release 11.47.0 (4 November 2026). https://github.com/prebid/Prebid.js/blob/master/modules/consentManagementTcf.ts
    16. Prebid.org, "Prebid Server Privacy Support" (accessed 9 November 2026). https://docs.prebid.org/prebid-server/features/pbs-privacy.html
    17. 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.