core · formal standard
URL, HTTPS, macros, and IAB consent
Core runs on every URL-like artifact. Vendor packs add parameter contracts. This pack is the floor: the URL has to parse, the scheme has to be http or https, and a consent parameter has to be a consent string rather than a placeholder.
Base64 is a permissive alphabet. gdpr_consent=1 and gdpr_consent=true both pass a character check. Decoding the TC String version, the US Privacy version digit, and the GPP header type is what separates a string from a signal.
gdpr_consent=1 is not a TC String
The first six bits of a TCF v2 string are the version, and they have to read 2. A one-character placeholder decodes as something else, or as a truncated core segment. A TCF v1 string decodes as version 1 and is reported as sunset rather than as malformed.
A TC String in gpp is the wrong parameter
GPP header type is fixed to 3. A TC String pasted into gpp decodes to header type 2. That is the commonest way to get this wrong: the right string, the wrong field.
What this pack matches
Rules
Codes are stable. A finding in CI, MCP, or the playground lands on the same id.
| Field | Required | What it checks | Rule ids | Source |
|---|---|---|---|---|
URL parse and host |
required | The artifact parses as an absolute URL and carries a host. | core.url.invalidcore.url.host_missing |
docs |
http or https |
required | Network-delivered artifacts use http or https. | core.url.unsupported_scheme |
docs |
No userinfo, no fragment |
optional | Embedded credentials are deprecated. Fragments never reach the server. | core.url.userinfo_deprecatedcore.url.fragment_ignored |
docs |
HTTPS baseline |
recommended | Plain http endpoints are flagged for upgrade. | core.url.insecure_transport |
|
JSON parse |
required | A JSON body parses, and the finding names the byte where it stops. | core.json.parse_error |
docs |
Macros |
optional | A fired URL carries no unresolved macros. Macros never sit in scheme, authority, host, port, or userinfo. One artifact uses one syntax. | core.macro.unexpanded_in_fired_urlcore.macro.unsafe_positioncore.macro.mixed_syntax |
|
TC String |
optional | gdpr is 0 or 1. A TC String is decoded, not alphabet-checked. Version 2, core segment long enough, not a placeholder. | core.privacy.gdpr_invalidcore.privacy.gdpr_consent_missingcore.privacy.gdpr_consent_without_flagcore.privacy.gdpr_consent_ignoredcore.privacy.gdpr_consent_malformedcore.privacy.tc_string_versioncore.privacy.tc_string_truncated |
docs |
GPP and US Privacy |
optional | GPP header type is 3. A TC String in gpp is type 2. US Privacy is a version digit plus three Y/N/- characters, and is deprecated. | core.privacy.gpp_malformedcore.privacy.gpp_sid_missingcore.privacy.gpp_sid_malformedcore.privacy.gpp_header_typecore.privacy.gpp_header_versioncore.privacy.us_privacy_malformedcore.privacy.us_privacy_deprecatedcore.privacy.us_privacy_versioncore.privacy.duplicate_signal |
docs |
Validate a payload
pixellint validate url "$ARTIFACT" --rulepack core
Or paste it into the playground. Same engine, in the browser, nothing sent anywhere.
cargo install pixellint
·
npm install pixellint