{"id":10308,"date":"2026-08-28T07:20:00","date_gmt":"2026-08-28T05:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10308"},"modified":"2026-10-24T03:57:10","modified_gmt":"2026-10-24T01:57:10","slug":"reading-a-tc-string-what-sits-in-the-213-header-bits","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/","title":{"rendered":"Reading a TC String: What Sits in the 213 Header Bits"},"content":{"rendered":"<p>A TC string stores transparency and consent signals in a compact format. Decoding reveals recorded values such as purpose flags, vendor choices and the referenced vendor-list version. It does not prove that the banner was correct, that a particular person gave valid consent or that a vendor respected the result.<\/p>\n<p>The format is encoded, not encrypted. Reading requires no secret key. The string is also not a signed audit trail. A useful inspection therefore combines decoded signals with the actual dialogue, the matching Global Vendor List (GVL) and observed requests.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-10308-review-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"TC string: 213 fixed bits, then variable vendor sections\"><figcaption>Encoded signals are not a signed record of consent<\/figcaption><\/figure>\n<h2>The fixed prefix: 213 bits, including purposes<\/h2>\n<p>Each segment uses the Base64url alphabet, with six bits represented by each character. Dots separate segments. The first six bits encode the format version: value 2 becomes <code>000010<\/code>, represented by <code>C<\/code>. A leading C identifies this version field; it does not validate the remaining string.<\/p>\n<p>The core starts with the following fields in order. Bit positions below are zero-based: position 0 is the first bit. The 213-bit prefix already contains the purpose flags. Vendor data starts at position 213, the 214th bit.<\/p>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th>Field<\/th>\n<th>Bit positions<\/th>\n<th>Length<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Version<\/code><\/td>\n<td>0\u20135<\/td>\n<td>6<\/td>\n<\/tr>\n<tr>\n<td><code>Created<\/code><\/td>\n<td>6\u201341<\/td>\n<td>36<\/td>\n<\/tr>\n<tr>\n<td><code>LastUpdated<\/code><\/td>\n<td>42\u201377<\/td>\n<td>36<\/td>\n<\/tr>\n<tr>\n<td><code>CmpId<\/code><\/td>\n<td>78\u201389<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td><code>CmpVersion<\/code><\/td>\n<td>90\u2013101<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td><code>ConsentScreen<\/code><\/td>\n<td>102\u2013107<\/td>\n<td>6<\/td>\n<\/tr>\n<tr>\n<td><code>ConsentLanguage<\/code><\/td>\n<td>108\u2013119<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td><code>VendorListVersion<\/code><\/td>\n<td>120\u2013131<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td><code>TcfPolicyVersion<\/code><\/td>\n<td>132\u2013137<\/td>\n<td>6<\/td>\n<\/tr>\n<tr>\n<td><code>IsServiceSpecific<\/code><\/td>\n<td>138\u2013138<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td><code>UseNonStandardTexts<\/code><\/td>\n<td>139\u2013139<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td><code>SpecialFeatureOptIns<\/code><\/td>\n<td>140\u2013151<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td><code>PurposesConsent<\/code><\/td>\n<td>152\u2013175<\/td>\n<td>24<\/td>\n<\/tr>\n<tr>\n<td><code>PurposesLITransparency<\/code><\/td>\n<td>176\u2013199<\/td>\n<td>24<\/td>\n<\/tr>\n<tr>\n<td><code>PurposeOneTreatment<\/code><\/td>\n<td>200\u2013200<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td><code>PublisherCC<\/code><\/td>\n<td>201\u2013212<\/td>\n<td>12<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The prefix ends after the first three bits of the 36th Base64url character. The remaining three bits belong to vendor data. Reading only 35 characters loses information; treating all 36 characters as the prefix consumes too much.<\/p>\n<h2>Dates and versions need separate interpretation<\/h2>\n<p>The timestamp fields retain 36-bit values expressed in tenths of a second since the Unix epoch. Under the current specification, however, <code>Created<\/code> and <code>LastUpdated<\/code> contain the same UTC day-level update timestamp. Multiplying by 100 converts the stored value to JavaScript milliseconds. The numeric unit does not establish tenth-of-a-second accuracy for the consent action.<\/p>\n<p>An old update date is a reason to inspect renewal and reminder handling. A recent date alone is not proof of fresh consent, and a thirteen-month comparison does not reconstruct consent history. The technical specification discusses reminders at least every thirteen months; the string is not a substitute for the underlying evidence.<\/p>\n<p>Format version 2, framework versions such as TCF 2.3 or 2.4, the policy version and the GVL version are different identifiers. A policy value of 4 was introduced with TCF 2.2; a value of 4 or higher is not proof that every current requirement has been implemented. VendorListVersion identifies the GVL snapshot used, not whether every vendor in that list appeared in the dialogue.<\/p>\n<h2>Vendor sections: length is not a consent score<\/h2>\n<p>A vendor section begins with a 16-bit maximum vendor ID and a one-bit encoding flag. Bitfield encoding then uses one bit per ID up to that maximum. Range encoding adds a 12-bit entry count. Each entry has a one-bit range flag and a 16-bit first or sole ID; a further 16-bit last ID appears only for a range.<\/p>\n<p>For a maximum ID of 800, a bitfield occupies 817 bits including the section header. Fifty isolated IDs need 879 bits as ranges: 17 + 12 + 50 \u00d7 17. One contiguous range needs only 62 bits: 17 + 12 + 33. An encoder choosing the smaller representation would use the bitfield in the first example and the range in the second. Accepting everything is therefore not a universal guarantee of a short string.<\/p>\n<p>Vendor consent and legitimate-interest signals occupy separate sections. Publisher restrictions and further segments also affect total length. A long string does not by itself mean broad consent, corruption or a large number of selected vendors.<\/p>\n<h2>Current rules beyond the bit layout<\/h2>\n<p>TCF 2.2 removed legitimate interest as an available basis for purposes 3\u20136. Purpose 1 already had consent as its permitted basis; its jurisdiction-specific <code>PurposeOneTreatment<\/code> flag is a separate matter. Special purposes have a separate numbering space and must not be read as ordinary purpose bits.<\/p>\n<p>For the currently defined purposes 1\u201311, reserved positions 12\u201324 are not additional choices. Unexpected set bits deserve validation against the applicable specification and GVL. Such a finding establishes an inconsistency, not who wrote the implementation. Purpose signals alone also do not authorize every vendor: vendor signals, disclosures, declared purposes and publisher restrictions belong in the assessment.<\/p>\n<p>TCF 2.3 made the <code>DisclosedVendors<\/code> segment mandatory for strings created from March 1, 2026. Earlier strings without that segment retain the transition exception; absence is therefore not automatically the same finding for every historical string. Segment type 1 records vendor disclosure, while optional type 3 describes publisher purposes. The former allowed-vendors segment, type 2, was removed in TCF 2.2.<\/p>\n<p>TCF 2.4 subsequently introduced updated feature disclosures. The official implementation deadline was October 23, 2026 for web environments and is February 23, 2027 for mobile apps and CTV. Those changes do not turn the six-bit encoding version into 2.4. A bit decoder cannot verify the required wording and presentation of the dialogue.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Is euconsent-v2 required?<\/h3>\n<p>No. The CMP chooses the storage mechanism; a different cookie name or non-cookie storage is possible. Absence of that cookie proves neither absence nor correctness of consent management.<\/p>\n<h3>Which browser API is appropriate?<\/h3>\n<p><code>getTCData<\/code> was deprecated in TCF 2.2. The supported approach uses <code>addEventListener<\/code>, checks callback success and the CMP\/event state, and reads <code>tcString<\/code> when available. The callback may initially contain incomplete data while the CMP loads. A one-time diagnostic reader should remove its listener with <code>removeEventListener<\/code> and the returned listener ID after obtaining the intended snapshot. An application following later choice changes must retain a suitable subscription.<\/p>\n<h3>How can incomplete data be detected?<\/h3>\n<p>A decoder checks the alphabet, field lengths, entry counts, ranges and segment types. Base64 decoding alone checks none of the policy rules. For byte-oriented decoders, Base64url alphabet conversion and any required padding apply separately to each segment. Direct conversion from each character to six bits avoids byte-boundary assumptions.<\/p>\n<p>Unexpectedly missing bits can result from copying, storage, encoding or transport errors. A length limit is one possible cause, not a diagnosis. RFC 6265 recommends that general-purpose browsers support at least 4096 bytes per cookie including name, value and attributes; the requirement is SHOULD, not MUST. Oversized cookies or request headers can be rejected rather than silently truncated. Comparison of the stored value, CMP API output and transmitted value helps locate the discrepancy.<\/p>\n<h3>What belongs in a practical review?<\/h3>\n<p>A repeatable review records the chosen test action, the corresponding UI state, decoded purpose and vendor signals, relevant restrictions and the matching GVL snapshot. Network observation then checks whether processing follows the expected decision. None of those individual checks establishes comprehensive legal compliance.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/InteractiveAdvertisingBureau\/GDPR-Transparency-and-Consent-Framework\/blob\/master\/TCFv2\/IAB%20Tech%20Lab%20-%20Consent%20string%20and%20vendor%20list%20formats%20v2.md\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Tech Lab: TC string format<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/InteractiveAdvertisingBureau\/GDPR-Transparency-and-Consent-Framework\/blob\/master\/TCFv2\/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Tech Lab: CMP API<\/a><\/li>\n<li><a href=\"https:\/\/iabeurope.eu\/all-you-need-to-know-about-the-transition-to-tcf-v2-3\/\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Europe: TCF 2.3 transition<\/a><\/li>\n<li><a href=\"https:\/\/iabeurope.eu\/wp-content\/uploads\/TCF_V-CMP_comms_TCFpoliciesV5.0.bAndSpecificationsV2.4ConfirmationOf-theTimeline_160726_IABEurope.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Europe: TCF 2.4 timeline<\/a><\/li>\n<li><a href=\"https:\/\/iabeurope.eu\/iab-europe-transparency-consent-framework-policies\/\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Europe: TCF policies<\/a><\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc6265.html\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 6265: HTTP State Management Mechanism<\/a><\/li>\n<li><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html\" target=\"_blank\" rel=\"noopener noreferrer\">RFC 9110: HTTP Semantics<\/a><\/li>\n<li><a href=\"https:\/\/iabeurope.eu\/transparency-consent-framework\/\" target=\"_blank\" rel=\"noopener noreferrer\">IAB Europe: Transparency and Consent Framework<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The euconsent-v2 cookie is not encrypted, only packed. What the first 213 bits contain, how purposes and vendors are stored, and which findings TCF 2.2 turned into errors.<\/p>\n","protected":false},"author":1,"featured_media":13854,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[91040,91279],"class_list":["post-10308","post","type-post","status-publish","format-standard","hentry","category-data-privacy","tag-consent-management","tag-prywatnosc-danych-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-28T05:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T01:57:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Reading a TC String: What Sits in the 213 Header Bits\",\"datePublished\":\"2026-08-28T05:20:00+00:00\",\"dateModified\":\"2026-10-24T01:57:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/\"},\"wordCount\":1069,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png\",\"keywords\":[\"Consent Management\",\"Data Privacy\"],\"articleSection\":[\"Data Privacy\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/\",\"name\":\"Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png\",\"datePublished\":\"2026-08-28T05:20:00+00:00\",\"dateModified\":\"2026-10-24T01:57:10+00:00\",\"description\":\"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Reading a TC String: What Sits in the 213 Header Bits\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/data-privacy\\\/reading-a-tc-string-what-sits-in-the-213-header-bits\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reading a TC String: What Sits in the 213 Header Bits\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik","description":"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/","og_locale":"en_US","og_type":"article","og_title":"Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik","og_description":"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-28T05:20:00+00:00","article_modified_time":"2026-10-24T01:57:10+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Reading a TC String: What Sits in the 213 Header Bits","datePublished":"2026-08-28T05:20:00+00:00","dateModified":"2026-10-24T01:57:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/"},"wordCount":1069,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png","keywords":["Consent Management","Data Privacy"],"articleSection":["Data Privacy"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/","name":"Reading a TC String: What Sits in the 213 Header Bits | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png","datePublished":"2026-08-28T05:20:00+00:00","dateModified":"2026-10-24T01:57:10+00:00","description":"How a TCF v2.2 consent string is built: 213 header bits, purposes as a bit field, vendors as ranges - and the checks that reveal a stale or wrong string.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10308-reading-a-tc-string-what-sits-in-the-g.png","width":1200,"height":630,"caption":"Reading a TC String: What Sits in the 213 Header Bits"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/data-privacy\/reading-a-tc-string-what-sits-in-the-213-header-bits\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Reading a TC String: What Sits in the 213 Header Bits"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10308"}],"version-history":[{"count":3,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10308\/revisions"}],"predecessor-version":[{"id":23454,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10308\/revisions\/23454"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13854"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}