The Cited tag

A measurement script that answers one question: which visits to your site came from an AI answer engine, and which of those became an enquiry.

Served from tag.getcited.in · integrity.json · security contact salman@getcited.in

You are probably here because you found this hostname in a script tag and want to know what it does. Good. This page is the whole answer, and the script itself is unminified and readable — about 200 lines, most of them comments. There is no build step between our repository and the file your visitors run, so what you audit is byte-for-byte what executes.

What it collects, and what it never collects

CollectedNever collected
Page path — no query string, no fragmentNames, emails, phone numbers or message text in readable form
document.referrer hostname onlyThe full referring URL, which can carry a search query or a private path
utm_* parameters your own links setCookies. There are none.
A random session id in sessionStorage, gone when the tab closesCross-site identifiers, fingerprints, canvas or font probing
Coarse device class: mobile / tablet / desktopKeystrokes, clipboard, page content, form field values
Enquiry type: form · call tap · WhatsApp tap · email clickAnything that could follow a person off your domain

The one hash we do send

If a submitted form contains an email or phone field, we compute a SHA-256 digest inside your visitor's browser and send only that. It is not reversible, it is not joined to anything, and it exists for exactly one purpose: so a double-tapped submit button is not counted as two enquiries.

It is inert until consent

Nothing is collected or transmitted until one of these is true:

<script ... data-consent="granted">      <!-- attribute on the tag -->
cited('consent', true);                   // or your own consent code

cited('consent', false) stops collection and clears the session id. This is the posture the India DPDP Act 2023 expects: consent informed, specific, granular and affirmative, with third-party scripts blocked until it is recorded.

Content Security Policy

script-src  https://tag.getcited.in
connect-src https://api.getcited.in

Install, pinned

Every published version has a Subresource Integrity hash you can pin. Current hashes are always at /integrity.json.

<script async
  src="https://tag.getcited.in/t/v1.0.1/c.js"
  integrity="sha384-UGw39E4DTAkSoRIkjb1VVkWTjx85mRn1376EOcuiduw++orB1xd7gLtSApQSRKjK"
  crossorigin="anonymous"
  data-brand="YOUR_BRAND_KEY"></script>

A published version is never rewritten. Not for a typo, not for a hotfix. Changes ship as a new version directory, so a hash you pin today keeps working.

That promise would be worth nothing resting on discipline, so it is enforced in CI: a lock file records each version's hash at first publication and the build fails if any published version's bytes ever differ. A published SRI hash that can silently change is worse than no hash at all — it invites you to depend on a promise we are not keeping.

If you have no IT function and would rather the tag update itself, use https://tag.getcited.in/stable/c.js and omit the integrity attribute. You trade verifiability for convenience. That is a documented choice, not an accident — but the pinned version is what we recommend.

For your PCI DSS 4.0.1 §6.4.3 script inventory

Requirements 6.4.3 and 11.6.1 have been mandatory since 31 March 2025 and cover every third-party script on a payment page. Paste this:

Script:       Cited tag (tag.getcited.in)
Justification: First-party measurement of which AI-answer-engine referrals
               produce enquiries. Collects page path, referrer hostname and
               enquiry type. Transmits no cardholder data and no readable
               personal data.
Integrity:     Subresource Integrity hash pinned to an immutable versioned
               URL; hash published at https://tag.getcited.in/integrity.json

Versions

VersionNotes
v1.0.1 — currentSends the beacon as text/plain rather than application/json. Only the three CORS-safelisted content types avoid a preflight, and a beacon that needs a preflight is dropped silently. The body is still JSON.
v1.0.0Initial release. Still served, still pinnable, never rewritten — but v1.0.1 is what you want.

Both remain available at their original URLs with their original hashes. That is the point: a version you pinned keeps working.

It will not break your site

Loadingasync; never participates in page load, never blocks window.onload
Failure modeEvery entry point wrapped in try/catch — fails silently rather than throwing on your page
GlobalsExactly one: window.cited. No prototypes patched, nothing else touched
Networknavigator.sendBeacon on visibilitychange. No synchronous XHR, no unload handlers
Private modeDegrades rather than breaks when sessionStorage is unavailable
MisconfigurationDoes nothing at all without a data-brand key
Size4.3 KB gzipped, comments and all