ORTB
中 / EN
Chapter navigation

Privacy · consent & privacy signals

GPP String v1.0 · TCF v2.2 baseline
On this page

Why the ad chain needs privacy signals

A programmatic bid travels from the publisher through a Supply-Side Platform (SSP) to several Demand-Side Platforms (DSP), with a Consent Management Platform (CMP) supplying consent state along the way, and it may change hands a few more times in between. These systems share no database and trust none of each other, yet each must confirm the same thing in machine-readable form inside a millisecond-scale auction window: whether this user and this page view may be processed, and to what degree — may it be used for personalised targeting, may it be recorded, may it be passed on to the next hop?

Solving this with bilateral contracts would mean one agreement per party on the path, and contract text cannot be read or validated by a machine inside a bid request. Privacy signals exist for exactly this multi-party coordination problem: they compress “may I, and how far” into a string every party can parse, travel with the bid request, and are read and checked at each downstream hop to decide whether to keep processing.

This is also why such a signal is natively an encoding format rather than contractual wording — its reader is not a person but the machines along the auction path.

In practice the question splits into three kinds, and this domain organises its signals along the same axis:

  • consentdid the user grant permission for a purpose / a vendor: the Transparency & Consent Framework (TCF) records it in the PurposesConsent / VendorConsents bitfields
  • opt-outdid the user opt out of sale / sharing: the Multi-State Privacy Agreement (MSPA) records it as Int(2) three-valued fields, USPrivacy as its third character
  • disclosurewhich transparency information travels with this ad: the EU Digital Services Act (DSA) carries it in regs.ext.dsa / bid.ext.dsa

Why there are so many standards

The number of standards in this domain was not designed; it accumulated as jurisdictions legislated year after year. Read it once in date order and the alphabet soup becomes a causal story in four acts.

  1. Each jurisdiction on its own (2018–2021)

    Two jurisdictions, two strings, no relation: the TCF expressed consent in Europe while USPrivacy expressed opt-out in the US.

    • The General Data Protection Regulation (GDPR) became applicable; the Interactive Advertising Bureau (IAB)'s European branch IAB Europe used the TCF to carry consent and transparency signals and became the mainstream framework on EU traffic.
    • The California Consumer Privacy Act (CCPA) took effect; IAB Tech Lab's USPrivacy String (of the form 1YNN) carried the opt-out signal.
  2. String sprawl, and GPP as the container (2022)

    GPP replaced no existing standard; it is only a container — the prior standards became section payloads, with the Header declaring which ones are present.

    • The Global Privacy Platform (GPP) string v1.0 was published: the Header ~ Section ~ Section container format was finalised.· last-verified 2026-08-31
    • OpenRTB 2.6 promoted gdpr / us_privacy / gpp / gpp_sid into the core Regs fields. In 2.5 Regs held only coppa and ext, so the industry had carried these in regs.ext privately.· last-verified 2026-08-12
    • MSPA US National Section v1.0 released.· last-verified 2026-08-31
  3. States plug in, legacy strings retire (2023–2024)

    Once the container stabilised, new jurisdictions joined by adding a section rather than inventing another string, while the legacy strings began to retire.

    • GPP CMP API v1.1: read in the browser via the __gpp() queue and the window.__gpp callback. Note this is the CMP API's own version number, unrelated to the GPP string format version (still v1.0).· last-verified 2026-08-31
    • TC strings with a policy version below 4 became invalid as of this date.· last-verified 2026-08-31
    • Support for the USPrivacy String ended.· last-verified 2026-08-31
    • Clarifying revision of GPP String v1.0 (the version number did not change; still v1.0).· last-verified 2026-08-31
    • The USPrivacy String was formally deprecated and superseded by GPP section 6 carrying its unencoded form; legacy traffic and some platform parameters still pass it directly.· last-verified 2026-08-31
    • The EU DSA became applicable; ad-transparency disclosure obligations are carried via regs.ext.dsa / bid.ext.dsa.
    • MSPA US National Section v2.0 released, adding support for 14 states (DE / IN / IA / KY / MD / MI / MT / NH / NE / NJ / OR / RI / TN / TX) under the Second Amended and Restated MSPA. MI (Michigan) has no corresponding section ID in the GPP Section registry.· last-verified 2026-08-31
  4. Now (2025 onward)

    The TCF side is still evolving; the GPP container itself has not changed since the November 2023 clarifying revision.

    • TCF 2.3: the DisclosedVendors segment became mandatory, resolving legitimate-interest ambiguity for special purposes.· last-verified 2026-08-31
    • TCF 2.4 is in rolling revision with no released version — it must not be cited as a published release.· last-verified 2026-08-31

How the standards relate

One signal can hold several relations at once, which a tree cannot express — TCF EU is both the payload of GPP section 2 (a carrying relation) and, as the standalone TC string, coexists with GPP (a coexistence relation). The four horizontal bands below are knowledge layers; the connecting lines are relation types. The third band is the GPP container itself: the whole string is GPP String = Header ~ Section ~ Section, with the Header declaring which sections travel in this bid; the full-width strip inside it is the Reusable Subsection, a horizontal extension mechanism rather than a fixed partition. Remaining abbreviations in the graph: Global Privacy Control (GPC); the legislative band also involves the California Privacy Rights Act (CPRA).

Legislative driversStandards & signalsGPP containerCarriage & accessEU General Data Protection RegulationGDPREU General Data Protection RegulationUS state privacy laws (CCPA / CPRA etc.)US state privacy laws (CCPA / CPRA etc.)EU Digital Services ActDSAEU Digital Services ActIAB Europe TCF v2TCF EUIAB Europe TCF v2Canadian TCFCanadian TCFCanadian TCFUSPrivacy StringUSPrivacyUSPrivacy StringMSPA technical specs (US National + states)MSPAMSPA technical specs (US National + states)Global Privacy ControlGPCGlobal Privacy ControlGoogle Additional ConsentGoogle ACGoogle Additional ConsentDSA transparency carriage conventionDSA 承载约定DSA transparency carriage conventionHeader (contents)HeaderHeader (contents)§2 EU TCF v2§2§2 EU TCF v2§5 Canadian TCF§5§5 Canadian TCF§6 USPrivacy§6§6 USPrivacy§7 US National§7§7 US National§8–27 US states§8–27§8–27 US statesReusable Subsection · attachable to any section via the . delimiter (SubsectionType Int(2): 0 Core / 1 GPC)Reusable SubsectionReusable Subsection · attachable to any section via the . delimiter (SubsectionType Int(2): 0 Core / 1 GPC)OpenRTB · regs.gpp · regs.gpp_sid · regs.gdpr · regs.us_privacy · user.consentOpenRTBregs.gppregs.gpp_sidregs.gdprregs.us_privacyuser.consentURL macros · ${GPP_STRING} · ${GPP_SID}URL macros${GPP_STRING}${GPP_SID}CMP JS API · __gpp() · __tcfapi()CMP JS API__gpp()__tcfapi()HTTP & JS surface · Sec-GPC · navigator.globalPrivacyControlHTTP & JS surfaceSec-GPCnavigator.globalPrivacyControlOpenRTB ext · regs.ext.dsa · bid.ext.dsaOpenRTB extregs.ext.dsabid.ext.dsa
Legendoriginatescarries (container → payload)travels (GPP container → carriage point)coexistscrosscutsbypasses (outside the container)

How the container as a whole travels——The whole GPP string travels through the carriage layer In OpenRTB 2.6 the Regs core fields are regs.gpp (the string) and regs.gpp_sid (integer array of applicable sections), alongside the pre-existing regs.gdpr and regs.us_privacy in the same object; The standalone TC string bypasses GPP and travels in user.consent, paired with regs.gdpr. On the URL side via the ${GPP_STRING} and ${GPP_SID} macros; In the browser via the CMP JS API's __gpp() queue and the window.__gpp callback. The graph above draws arrows only to the two carriage points directly beneath the container (OpenRTB and the URL macros); the CMP JS API route is this note's. Note that gpp_sid is an integer[] in OpenRTB but a string in the URL macros, and should not contain section 3 (Header) or 4 (Signal Integrity).

Relation list (equivalent to the graph above)
FromToNoteSource
GDPRoriginatesTCF EUOnce GDPR became applicable, IAB Europe used the TCF to carry consent and transparency signals.
US state privacy laws (CCPA / CPRA etc.)originatesUSPrivacyCalifornia's CCPA drove the USPrivacy String: four plaintext characters carrying the opt-out signal.
DSAoriginatesDSA 承载约定The EU DSA ad-transparency obligations are carried in OpenRTB per a convention defined by IAB Tech Lab.
TCF EUcarries (container → payload)§2The TCF EU v2 TC string is the payload of GPP section 2; its bit layout is defined by the TCF spec, not by GPP.Global-Privacy-Platform/Sections/Section Information.md — Section ID 2 → Sections/EEA
Canadian TCFcarries (container → payload)§5Canadian TCF is the payload of GPP section 5. The official repo also ships a TCF EU / TCF CA comparison document.Global-Privacy-Platform/Sections/Section Information.md — Section ID 5 → Sections/Canada
USPrivacycarries (container → payload)§6GPP section 6 carries the USPrivacy String in unencoded form (four plaintext characters, not base64).Global-Privacy-Platform/Sections/Section Information.md — Section ID 6 → USPrivacy String (Unencoded Format)
MSPAcarries (container → payload)§7MSPA US National is the payload of GPP section 7; its Notice / Opt-Out scalar fields use Int(2) three-valued semantics while SensitiveDataProcessing is an N-Bitfield(2,16).Global-Privacy-Platform/Sections/US-National/IAB Privacy's Multi-State Privacy Agreement (MSPA) US National Technical Specification.md
MSPAcarries (container → payload)§8–27Twenty states each occupy a section ID (§8–27); their field sets and N-Bitfield parameters differ per state — subsets of US National, not copies.Global-Privacy-Platform/Sections/Section Information.md(ID 8–27)+ Sections/US-States/<ST>/ 各州技术规范
travels (GPP container → carriage point)OpenRTB regs.gpp regs.gpp_sid regs.gdpr regs.us_privacy user.consentThe whole GPP string travels in OpenRTB 2.6 as regs.gpp (a string), with regs.gpp_sid declaring which sections apply to this transaction.本站 data/openrtb-spec/v26 Regs.gpp / Regs.gpp_sid(upstream commit 1debba80)
travels (GPP container → carriage point)URL macros ${GPP_STRING} ${GPP_SID}On the URL side the whole string travels in the ${GPP_STRING} macro and the applicable sections in ${GPP_SID}; the vendor-ID variant is ${GPP_STRING_XXXXX}.本站 data/privacy-spec/spec.json transport.urlParams(采集自 GPP 官方仓库)
TCF EUcoexistsOpenRTB regs.gpp regs.gpp_sid regs.gdpr regs.us_privacy user.consentThe standalone TC string has not been superseded by GPP: the EEA spec states that until IAB Europe officially deprecates it, the TC string must still be included in transaction headers, the TCF API must be implemented, and vendors must interpret it for all GDPR-applicable transactions. GPP section 2 and the standalone TC string therefore coexist; on this site the carriage point is user.consent alongside regs.gdpr.Global-Privacy-Platform/Sections/EEA/GPPExtension: IAB Europe TCF.md — Special note regarding TCF and GPP
GPCcrosscutsReusable SubsectionGPC is the first officially listed Reusable Subsection: identified by SubsectionType Int(2)=1, attached to any section with the . delimiter, payload a single Boolean. Availability is defined by each section's own document.Global-Privacy-Platform/Sections/Section Information.md — Reusable Subsections;US National 与 CA 规范均含 SubsectionType/Gpc 字段
GPCbypasses (outside the container)HTTP & JS surface Sec-GPC navigator.globalPrivacyControlGPC's native form bypasses the GPP container: it is exposed directly as the Sec-GPC request header (0/1) and navigator.globalPrivacyControl (true/false).Global-Privacy-Platform/Sections/Section Information.md — Reusable Subsections / Global Privacy Control (GPC)
Google ACbypasses (outside the container)CMP JS API __gpp() __tcfapi()Additional Consent is not a GPP section: addtl_consent travels in the TCData returned by __tcfapi, as a Google-side convention.
DSA 承载约定bypasses (outside the container)OpenRTB ext regs.ext.dsa bid.ext.dsaDSA transparency info travels in OpenRTB ext slots (regs.ext.dsa on the request side, bid.ext.dsa returned by the DSP); it is not part of the OpenRTB 2.6 core fields, and this site's OpenRTB data model does not model ext sub-fields either.

Current status at a glance

Confirm a signal is still alive before implementing it — this domain has an unusual number of deprecated and deprecating standards. An entry marked “pending evidence” has no official source on this site for whether it is still alive, so nothing is asserted about it.

SignalGPP sectionTypeStatusKey datePublisher
TCF EU v2The current baseline is Final v.2.2 with the rolling 2.3 and 2.4 revisions; 2.4 has no released version and must not be cited as one.§2consentcurrent2025-04(TCF 2.3:DisclosedVendors 段强制)IAB Europe
Canadian TCFThe official repo also ships a TCF EU / TCF CA comparison document, usable as the diff material for section 7 of its chapter. This site's decoder only reads the leading Version field for this section.§5consentcurrentIAB Canada
USPrivacy StringFour plaintext characters (version · explicitNotice · optOutSale · lspaCoveredTransaction), not base64-encoded — a ready-made counter-example to the assumption that section payloads must be bit-encoded. Legacy traffic and some platform parameters still pass it directly, so it is honestly kept for debugging.§6opt-outdeprecated2023-09-30 停止支持 · 2024-01 由 GPP §6 承接IAB Tech Lab
MSPA US National (§7)The consumer-facing Notice / Opt-Out scalar fields use Int(2) three-valued semantics (0 not applicable / 1 yes / 2 no), not booleans, while SensitiveDataProcessing is an N-Bitfield(2,16) rather than an Int(2). Notice and Opt-Out fields are bound by cross-field validity constraints (e.g. SaleOptOut=0 requires that SaleOptOutNotice was not provided). Three further Int(2) mode fields — MspaCoveredTransaction, MspaOptOutOptionMode and MspaServiceProviderMode — describe a party's contracting status and belong to a different dimension from the consumer-facing ones.upstream inconsistencyUS National v2.0 (2024-10) declares support for MI (Michigan), but the GPP Section registry has no section ID for MI — that state can only be expressed via US National §7, with no discrete section.§7opt-outcurrent2022-12 v1.0 · 2024-10 v2.0IAB Tech LabContracting entity · IAB Privacy, Inc.
US state sections (§8–27, 20 in total)Each state has its own technical specification; the field set is a subset of US National and the N-Bitfield parameters differ per state (California, for instance, uses N-Bitfield(2,9) rather than (2,16)), so no single bit layout can be shared. The registry's 20 state sections do not coincide with the 14-state list behind v2.0: MI in that list has no section of its own (it is expressed only via §7), while seven states outside the list — CA, CO, CT, UT, VA, FL and MN — each have one. The official Section Information.md lists only state names for IDs 8–27; this site resolves the spec links by the Sections/US-States/<ST>/ convention.upstream inconsistencyTexas's document is named differently from the other states (IAB Privacy's Texas Privacy Technical Specification.md rather than GPP Extension: Texas …), so batch extraction cannot rely on a single filename pattern.§8–27opt-outcurrentIAB Tech LabContracting entity · IAB Privacy, Inc.
Standalone TC string (outside the GPP container)Two carriage forms of the same payload as §2, not two signals: a leading C means no GPP container. The EEA spec states that until IAB Europe officially deprecates it, the standalone TC string must still be included in transaction headers, the TCF API must be implemented, and vendors must interpret it for all GDPR-applicable transactions — so it coexists with GPP §2 rather than being superseded. This site's decoder supports it (the tcf-eu branch of classifyPrivacyString).consentcurrentIAB Europe
Google Additional Consentaddtl_consent travels in the TCData returned by __tcfapi and is not a GPP section. A Google-side convention whose licensing chain differs from the IAB specs already collected here, so it needs its own sourcing effort; whether it is sunsetting must likewise come from Google's own documentation. This site asserts nothing here, so the status is recorded as pending evidence rather than sunset.consentpending evidenceGoogle
Global Privacy ControlDual identity: natively the Sec-GPC request header (value 1, or the header omitted entirely; the official spec defines no 0) and navigator.globalPrivacyControl (true/false), bypassing the GPP container; within GPP it is the first officially listed Reusable Subsection (SubsectionType Int(2)=1, payload a single Boolean), attachable to any section. This site's decoder does not currently parse the GPC subsection.opt-outcurrentW3C Web Privacy Community Group & browser vendors
DSA transparency (regs.ext.dsa / bid.ext.dsa)A disclosure signal — neither consent nor opt-out — so its validation rules and invalid forms differ entirely from the consent family. The legislation is the EU DSA; the carriage convention is defined by IAB Tech Lab. Not part of the OpenRTB 2.6 core fields, and this site's OpenRTB field model cannot nest ext sub-fields, so the data must be built on the Privacy side and linked to the existing #regs-ext / #bid-ext anchors.disclosurecurrentIAB Tech Lab

Who owns what

Privacy is a domain where several standards bodies overlap: before reading any document, work out which body to trust for which question. Most publishers below are IAB regional branches; GPC's native form is advanced by the World Wide Web Consortium (W3C) Web Privacy Community Group together with browser vendors. Note that the MSPA contracting entity and the publisher of its technical specifications are not the same organisation.

PublisherOwnsLicense
IAB Tech Lab
  • GPP string format & Section registry
  • USPrivacy String (deprecated)
  • MSPA US National & per-state section technical specifications
  • GPP CMP API specification
  • Carriage convention for DSA transparency info in OpenRTB
CC-BY 3.0 (IAB Tech Lab)
IAB Europe
  • TCF (Transparency & Consent Framework)
  • GVL (Global Vendor List)
CC-BY 3.0 (IAB Tech Lab) / IAB Europe
IAB Canada
  • Canadian TCF (payload of GPP section 5)
IAB Privacy, Inc.The MSPA contracting entity is IAB Privacy, Inc., while the section technical specifications are published by IAB Tech Lab — two distinct entities that must not be conflated when citing.
  • Contracting entity behind the MSPA (Multi-State Privacy Agreement)
Google
  • Additional Consent (addtl_consent)
  • Consent Mode
W3C Web Privacy Community Group & browser vendors
  • GPC (Global Privacy Control): the Sec-GPC header and navigator.globalPrivacyControl

Core terms

No privacy specification can be read without these dozen-odd words. Several of them do not mean the same thing across standards, and the definitions say so where that is the case.

  • Purpose

    The TCF's division of processing activities, numbered 1–24: 1–11 carry official names (11 added in TCF 2.2), 12–24 are reserved. Both consent and legitimate interest are recorded per Purpose.

  • Special Feature

    Two TCF features requiring a separate opt-in: 1 use precise geolocation data, 2 actively scan device characteristics for identification. Carried in the TC String core segment as the SpecialFeatureOptIns bitfield (12 bits wide, only the first 2 meaningful).

  • Vendor

    A processor registered in the GVL and participating in the ad chain. The TCF records its legal basis per vendor ID in two variable-length sections, VendorConsents and VendorLI; the IDs come from the GVL.

  • CMPConsent Management Platform

    Consent Management Platform. It produces and exposes privacy strings in the browser (via the __gpp() / __tcfapi() queues); its ID and version are written into the TC String's CmpId / CmpVersion fields.

  • Section

    An independent payload within a GPP string carrying one signal, delimited by ~ and declared by ID in the Header. The official registry currently spans IDs 1–27; each section's bit layout is defined by its own specification, not by GPP.

  • SIDgpp_sid

    The section IDs applicable to this transaction. An integer[] as regs.gpp_sid in OpenRTB, but a string as the ${GPP_SID} URL macro — one semantics, two types. Usually a single value; section 3 (Header) and 4 (Signal Integrity) should not appear in it.

  • MSPAMulti-State Privacy Agreement

    The Multi-State Privacy Agreement. Its contracting entity is IAB Privacy, Inc. while the technical specifications are published by IAB Tech Lab — two distinct entities that must not be conflated. Technically it materialises as GPP sections 7 (US National) and 8–27 (the states).

  • LSPALimited Service Provider Agreement

    The IAB Limited Service Provider Agreement. The fourth character of the USPrivacy String, lspaCoveredTransaction, marks whether the transaction is covered by it (Y/N).

  • GVLGlobal Vendor List

    The Global Vendor List maintained by IAB Europe. The TC String's VendorListVersion field records the version used; Vendor and CMP IDs come from it. This site has not yet collected the GVL schema or vendor data.

  • GPCGlobal Privacy Control

    Two forms: natively the Sec-GPC request header (0/1) and navigator.globalPrivacyControl (true/false), advanced by the W3C Web Privacy CG and browser vendors; within GPP it is the first officially listed Reusable Subsection, attachable to any section.

  • Reusable Subsection

    GPP's horizontal extension mechanism: a new signal starts as a subsection attached to any section with the . delimiter and may be promoted to its own section ID as adoption grows; self-identified by SubsectionType Int(2) (0 Core / 1 GPC). Availability is defined by each section's own document. Note that TCF EU (§2) does not use this mechanism — it uses the TCF-native Segment (SegmentType Int(3)): the same . delimiter carries two different self-identification schemes.

Suggested reading path

To understand the domain systematically, read in this order: container → encoding primitives → one concrete signal → carriage → decode something real. Steps marked “not built yet” are not live and will follow.

  1. 1The GPP container: string composition and the Header
  2. 2Encoding primitives: how to read Int / Fibonacci / Bitfield / N-Bitfield
  3. 3One concrete signal: the bit layout of TCF EU's TC String
  4. 4Opt-out signals: MSPA US National's three-valued field model
  5. 5Carriage: OpenRTB fields, URL macros and the CMP API
  6. 6Hands on: decode a real string
Content faithfully follows the official specifications of IAB Tech Lab / IAB Europe and others (CC-BY 3.0).