Identity and Privacy
TCF 2.3 decoder: read any TC String, including the Disclosed Vendors segment
Published · Last updated
Next scheduled review:
This TCF consent string decoder reads any IAB Europe TC String and shows every field in plain English: the core segment, the Disclosed Vendors segment that TCF 2.3 made mandatory, and the Publisher TC segment. It flags strings that break the 28 February 2026 rule. Decoding runs in your browser and nothing is stored.
Decode a TCF string
Your string is decoded in your browser. We do not receive or store it.
Paste a string from the user.consent field of a bid request, from a gdpr_consent URL parameter, or from your consent management platform's API output. The decoder names each purpose and vendor from the current Global Vendor List and tells you which checks the string fails.
Contents
Key facts
- TCF 2.3 made Disclosed Vendors mandatory. IAB Europe released v2.3 on 19 June 2025 and ended the transition on 28 February 2026. Strings created after that date without the segment "will be considered invalid", while older strings stay valid until users renew their choices (IAB Europe, updated 15 December 2025).
- TCF 2.4 changed the vendor list, not the string. IAB Europe published the v2.4 specifications on 23 July 2026, with CMP deadlines of 23 October 2026 for web and 23 February 2027 for app and CTV (IAB Europe letter, 16 July 2026). The specification's version history lists v2.4 as a change to the GVL format (IAB Tech Lab, TC String specification, May 2026 entry).
- Old policy versions are invalid. TCF v2.2 raised the policy version to 4, and strings with a lower version are "deemed invalid" after 30 September 2023 (IAB Tech Lab, TC String specification).
- The vendor list keeps moving. On 9 November 2026 the Global Vendor List was at version 184, with policy version 5 and 1,037 active vendors, last updated on 5 November 2026 (IAB Europe, GVL v3, fetched 9 November 2026).
- The string is personal data in many cases. The Court of Justice of the EU held on 7 March 2024 that a TC String is personal data when it can be linked to an identifier such as an IP address (CJEU, C-604/22). That is why this decoder keeps nothing.
How to use the decoder
- Paste the string. Any TC String works, with or without its optional segments. If you paste a Global Privacy Protocol string (it starts with
Dand contains~), the decoder offers to open section 2 here or send you to the GPP consent string decoder. - Read the summary card. It shows the version, the CMP, the dates, the policy version and a pass, warning or error badge for each check.
- Open the segments. Each segment lists its fields in order, with the raw bits on hover and a plain-English label for every purpose and special feature.
- Look up a vendor. Type a vendor ID or name to see its consent bit, its legitimate interest bit, whether the CMP disclosed it, and any publisher restriction that names it.
- Copy or share. Copy the decoded JSON, or copy a link. The link keeps the string in the URL fragment, which browsers do not send to our server.
What a TC String contains
A TC String is a compact record that a consent management platform (CMP) writes after a user makes choices in a banner. It follows the IAB Europe Transparency and Consent Framework (TCF). Vendors decode it to learn what the user agreed to, and the string travels with the ad request as a consent string.
The string is URL-safe base64. Each character carries six bits, and the fields are read left to right in a fixed order (TC String specification). Segments are joined with a dot. The core segment always comes first; the other segments carry a three-bit type so that they can appear in any order.
4 of 4 rows
Core | none (first position) | Yes | Metadata, purpose consent and legitimate interest, special features, vendor consent and legitimate interest, publisher restrictions |
Disclosed Vendors | 1 | Yes since TCF 2.3 | Every vendor the CMP showed the user |
Allowed Vendors | 2 | No (deprecated) | A legacy global-scope list; the current specification no longer defines it |
Publisher TC | 3 | No | The publisher's own purposes and any custom purposes |
Core
- Type code
none (first position)
- Required
Yes
- What it records
Metadata, purpose consent and legitimate interest, special features, vendor consent and legitimate interest, publisher restrictions
Disclosed Vendors
- Type code
1
- Required
Yes since TCF 2.3
- What it records
Every vendor the CMP showed the user
Allowed Vendors
- Type code
2
- Required
No (deprecated)
- What it records
A legacy global-scope list; the current specification no longer defines it
Publisher TC
- Type code
3
- Required
No
- What it records
The publisher's own purposes and any custom purposes
Table by AdSovereign, CC BY 4.0.
The core segment holds 16 fixed fields before the vendor sections. The table below lists them in decoding order, which is the order the decoder shows.
11 of 11 rows
Version | 6 | Format version; must be 2 |
Created, LastUpdated | 36 each | Deciseconds since 1970, shown as a UTC date; current strings round both to the day |
CmpId, CmpVersion, ConsentScreen | 12, 12, 6 | Which CMP build wrote the string, matched to the CMP list |
ConsentLanguage | 12 | Two letters, for example EN |
VendorListVersion, TcfPolicyVersion | 12, 6 | Which GVL and policy the CMP used |
IsServiceSpecific, UseNonStandardTexts | 1, 1 | Service-specific must be 1 |
SpecialFeatureOptIns | 12 | Opt-ins for precise geolocation and active device identification |
PurposesConsent, PurposesLITransparency | 24, 24 | One bit per purpose; purposes 3 to 6 can no longer use legitimate interest |
PurposeOneTreatment, PublisherCC | 1, 12 | Jurisdiction handling for purpose 1 and the publisher's country |
Vendor consent and vendor legitimate interest | variable | MaxVendorId, then a bitfield or a list of ranges |
Publisher restrictions | variable | Purpose, restriction type and the vendors it covers |
Version
- Bits
6
- What the decoder displays
Format version; must be 2
Created, LastUpdated
- Bits
36 each
- What the decoder displays
Deciseconds since 1970, shown as a UTC date; current strings round both to the day
CmpId, CmpVersion, ConsentScreen
- Bits
12, 12, 6
- What the decoder displays
Which CMP build wrote the string, matched to the CMP list
ConsentLanguage
- Bits
12
- What the decoder displays
Two letters, for example EN
VendorListVersion, TcfPolicyVersion
- Bits
12, 6
- What the decoder displays
Which GVL and policy the CMP used
IsServiceSpecific, UseNonStandardTexts
- Bits
1, 1
- What the decoder displays
Service-specific must be 1
SpecialFeatureOptIns
- Bits
12
- What the decoder displays
Opt-ins for precise geolocation and active device identification
PurposesConsent, PurposesLITransparency
- Bits
24, 24
- What the decoder displays
One bit per purpose; purposes 3 to 6 can no longer use legitimate interest
PurposeOneTreatment, PublisherCC
- Bits
1, 12
- What the decoder displays
Jurisdiction handling for purpose 1 and the publisher's country
Vendor consent and vendor legitimate interest
- Bits
variable
- What the decoder displays
MaxVendorId, then a bitfield or a list of ranges
Publisher restrictions
- Bits
variable
- What the decoder displays
Purpose, restriction type and the vendors it covers
Table by AdSovereign, CC BY 4.0.
TCF 2.3 changes and the 28 February 2026 deadline
Before version 2.3, a vendor that relied only on special purposes could not tell two cases apart. A zero in its legitimate interest bit might mean the CMP never showed it, or it might mean the user objected. IAB Europe fixed the ambiguity by making the Disclosed Vendors segment mandatory (IAB Europe, updated 15 December 2025).
The rule now has three parts. Strings created after 28 February 2026 without the segment are invalid. Strings created before 1 March 2026 without it remain valid until users renew or change their choices. Vendors must check their own bit in the segment before processing for special purposes. The specification adds that the old workaround, setting the legitimate interest bit for special-purpose-only vendors, was removed in April 2026 (IAB Tech Lab, TC String specification).
3 of 3 rows
TCF 2.2 | May 2023 | Policy version 4; older versions invalid after 30 September 2023 | Legitimate interest bits for purposes 3 to 6 must be 0 | |
TCF 2.3 | 19 June 2025 | 28 February 2026 | Disclosed Vendors segment mandatory | |
TCF 2.4 | Specifications 23 July 2026 | 23 October 2026 (web); 23 February 2027 (app, CTV) | No change to the bit layout; new |
TCF 2.2
- Released
May 2023
- Deadline
Policy version 4; older versions invalid after 30 September 2023
- What changed for the string
Legitimate interest bits for purposes 3 to 6 must be 0
- Source
TCF 2.3
- Released
19 June 2025
- Deadline
28 February 2026
- What changed for the string
Disclosed Vendors segment mandatory
TCF 2.4
- Released
Specifications 23 July 2026
- Deadline
23 October 2026 (web); 23 February 2027 (app, CTV)
- What changed for the string
No change to the bit layout; new
standardTextsfield and feature illustrations in the GVL
Table by AdSovereign, CC BY 4.0.
The decoder applies the date rule automatically. It reads the Created field, compares it with 1 March 2026, and reports the result in the summary card. A string without the segment and created on 13 January 2026 gets a note. The same string created on 13 March 2026 gets an error.
Worked example: the specification's own string
The IAB Tech Lab specification shows this three-segment example (TC String specification, "TC String Format"):
CQSbk4AQSbk4ANwAAAENAwCgAAAAAAAAAAYgACPAAAAA.IDKQA4AAgAKAGQAygAAA.YAAAAAAAAAAA13 of 13 rows
Version | 2 |
Created and LastUpdated | 3 June 2025, 00:00 UTC |
CmpId, CmpVersion, ConsentScreen | 880, 0, 0 |
ConsentLanguage | EN |
VendorListVersion, TcfPolicyVersion | 48, 2 |
IsServiceSpecific | 1 |
Purposes with consent | none |
PublisherCC | DE |
Vendor consent | vendors 1, 2, 3 and 4 (bitfield, MaxVendorId 4) |
Vendor legitimate interest | none |
Publisher restrictions | none |
Disclosed Vendors | vendors 1 to 5, 100 and 404 (three range entries, MaxVendorId 404) |
Publisher TC | no publisher purposes, no custom purposes |
Version
- Decoded value
2
Created and LastUpdated
- Decoded value
3 June 2025, 00:00 UTC
CmpId, CmpVersion, ConsentScreen
- Decoded value
880, 0, 0
ConsentLanguage
- Decoded value
EN
VendorListVersion, TcfPolicyVersion
- Decoded value
48, 2
IsServiceSpecific
- Decoded value
1
Purposes with consent
- Decoded value
none
PublisherCC
- Decoded value
DE
Vendor consent
- Decoded value
vendors 1, 2, 3 and 4 (bitfield, MaxVendorId 4)
Vendor legitimate interest
- Decoded value
none
Publisher restrictions
- Decoded value
none
Disclosed Vendors
- Decoded value
vendors 1 to 5, 100 and 404 (three range entries, MaxVendorId 404)
Publisher TC
- Decoded value
no publisher purposes, no custom purposes
Table by AdSovereign, CC BY 4.0.
Two things stand out. The structure is a clean TCF 2.3 string, with the Disclosed Vendors segment present and every consented vendor disclosed. But the policy version is 2, so the decoder marks the string invalid under the 30 September 2023 rule. The specification uses it to show the format, not as a live consent record. That is a useful habit to copy: decode first, then read the warnings.
Official test strings you can try
Every string below comes from the IAB Tech Lab specification or from IAB test code on GitHub. Paste any of them to see the full decode.
6 of 6 rows
| All three segments; policy version warning | |
| A 2019 string with IsServiceSpecific 0 | |
| 20 publisher restrictions, one vendor listed twice | |
| Consent for vendor 28; vendors 10, 11 and 28 disclosed | |
| A January 2026 string whose Disclosed Vendors segment is empty | |
| A TCF v1 string, rejected |
CQSbk4AQSbk4…
- Source
- What it shows
All three segments; policy version warning
COrVd1pOrVd1p…
- Source
- What it shows
A 2019 string with IsServiceSpecific 0
CO4VGswO4VGsw…
- Source
- What it shows
20 publisher restrictions, one vendor listed twice
CPSG_8APSG_8…IAOABgAB…
- Source
- What it shows
Consent for vendor 28; vendors 10, 11 and 28 disclosed
CQd924AQd924…
- Source
- What it shows
A January 2026 string whose Disclosed Vendors segment is empty
BOhwdphOxFC7…
- Source
- What it shows
A TCF v1 string, rejected
Table by AdSovereign, CC BY 4.0.
The fifth string is the most instructive. Four vendors have consent, yet the CMP disclosed none of them. A vendor that reads only its consent bit would process; a vendor that also reads the Disclosed Vendors bit would stop. The decoder reports the mismatch for each vendor.
What the checks mean
The decoder separates errors, warnings and notes. An error means the string cannot be read or the specification calls it invalid. A warning means a vendor that follows the specification should not rely on the string as it stands. A note is information.
10 of 10 rows
Not base64url, or a field runs past the end | Error | The bit layout in the specification |
Version other than 2 | Error | TCF v1 strings have been invalid since 30 September 2020 |
IsServiceSpecific is 0 | Error | The specification calls such strings invalid |
Policy version below 4 | Error | Invalid after 30 September 2023 |
Disclosed Vendors missing, created after 28 February 2026 | Error | TCF 2.3 transition rule |
Disclosed Vendors missing, created before 1 March 2026 | Note | Valid until the user renews choices |
Vendor has consent or legitimate interest but is not disclosed | Warning | TCF 2.3: vendors check their disclosed bit |
Legitimate interest set for purposes 3 to 6 | Warning | TCF 2.2 requires those bits to be 0 |
Policy version differs from the current GVL | Warning | The GVL notes say consent must then be re-established |
Allowed Vendors segment present | Note | Legacy global scope, deprecated in 2021 |
Not base64url, or a field runs past the end
- Severity
Error
- Rule it applies
The bit layout in the specification
Version other than 2
- Severity
Error
- Rule it applies
TCF v1 strings have been invalid since 30 September 2020
IsServiceSpecific is 0
- Severity
Error
- Rule it applies
The specification calls such strings invalid
Policy version below 4
- Severity
Error
- Rule it applies
Invalid after 30 September 2023
Disclosed Vendors missing, created after 28 February 2026
- Severity
Error
- Rule it applies
TCF 2.3 transition rule
Disclosed Vendors missing, created before 1 March 2026
- Severity
Note
- Rule it applies
Valid until the user renews choices
Vendor has consent or legitimate interest but is not disclosed
- Severity
Warning
- Rule it applies
TCF 2.3: vendors check their disclosed bit
Legitimate interest set for purposes 3 to 6
- Severity
Warning
- Rule it applies
TCF 2.2 requires those bits to be 0
Policy version differs from the current GVL
- Severity
Warning
- Rule it applies
The GVL notes say consent must then be re-established
Allowed Vendors segment present
- Severity
Note
- Rule it applies
Legacy global scope, deprecated in 2021
Table by AdSovereign, CC BY 4.0.
The decoder does not decide whether you have a legal basis to process data. It reports signals. What those signals allow under the GDPR and the ePrivacy Directive is covered in GDPR, ePrivacy and the bidstream. How to wire the string through OpenRTB, Prebid and GPP is covered in GPP and TCF implementation for engineers and in OpenRTB 2.6 explained.
Methodology and limits
The decoder follows the IAB Tech Lab TC String specification as published on GitHub on 9 November 2026. Purpose, feature and vendor names come from the GVL version the string names when that file is still published, and from the current GVL otherwise. The decoder tells you which one it used.
It checks only what the specification defines. It cannot tell whether the CMP showed a fair banner, whether the user saw the vendors it lists, or whether a country's rules on cookie banners differ. For those questions, see cookie banner rules by country and the EU Digital Omnibus tracker, which follows proposed changes to the consent rules themselves.
The hub for consent, identity and legitimate interest topics is identity and privacy.
FAQ
What is a TC String?
What changed in TCF 2.3?
What happens to strings without Disclosed Vendors after 28 February 2026?
Does TCF 2.4 change the TC String?
Is it safe to paste a real user's TC String here?
Can I decode a GPP string here?
How this works on owned infrastructure
The question this decoder answers, what a single TC String allows, is asked millions of times a day inside bidders and exchanges. Where that check runs matters. If consent evaluation happens in a third-party service, the string and the IP address that makes it personal data leave your environment before any decision is made. AdSovereign is an on-premise RTB stack whose exchange and bidder are designed to read the TC String, the Disclosed Vendors bit and publisher restrictions inside infrastructure you control, and to keep the decision log under your own retention policy. The security page lists the controls it supports; the architecture page shows where consent is evaluated in the request path.
Sources
- IAB Tech Lab, "Transparency and Consent String with Global Vendor & CMP List Formats" (TCF specification, version history through May 2026; accessed 9 November 2026). 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 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, 16 July 2026). https://iabeurope.eu/wp-content/uploads/TCF_V-CMP_comms_TCFpoliciesV5.0.bAndSpecificationsV2.4ConfirmationOf-theTimeline_160726_IABEurope.pdf
- IAB Europe, Global Vendor List v3 (vendorListVersion 184, lastUpdated 5 November 2026; fetched 9 November 2026). https://vendor-list.consensu.org/v3/vendor-list.json
- IAB Tech Lab, TCF Implementation Guidelines ("What changed in v2.3?"; accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/TCF-Implementation-Guidelines.md
- IAB Tech Lab, iabtcf-es reference library, core test file ReportedIssues.test.ts (repository state of 1 September 2026). https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/core/test/ReportedIssues.test.ts
- IAB Tech Lab, iabtcf-es CLI README (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/cli/README.md
- IAB Tech Lab, iabtcf-es CMP API test file ReportedIssues.test.ts (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/iabtcf-es/blob/master/modules/cmpapi/test/ReportedIssues.test.ts
- IAB Tech Lab, iabgpp-es reference library, GppModel.test.ts (repository state of 3 August 2026). https://github.com/IABTechLab/iabgpp-es/blob/master/modules/cmpapi/test/GppModel.test.ts
- Court of Justice of the European Union, Case C-604/22, IAB Europe (judgment of 7 March 2024). https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:62022CJ0604
Changelog
- 9 November 2026. First edition: decoder specification for TCF 2.2, 2.3 and 2.4 strings, 12 test vectors, TCF 2.3 date rule. Next review 9 February 2027.