Concepts
Four ideas to internalize before you wire Tellr in: the 18 digit ID, composite IDs, verdicts plus thresholds. They are the entire mental model.
tellr_id
Every tracked end user gets one stable 18 digit decimal identifier. The same person across multiple check calls reuses the same tellr_id even when they swap email, IP, browser or card.
Store it alongside your internal user record. From then on the dashboard, the API plus your support tools can all pivot on it.
ALTER TABLE users ADD COLUMN tellr_id CHAR(18); CREATE INDEX ON users (tellr_id);
Composite IDs
Tellr derives four SHA256 hashes per check, in increasing order of identity strength:
| Hash | Inputs | Match weight |
|---|---|---|
hardware_id | canvas, WebGL, audio, CPU, RAM, screen, platform | +45 |
browser_id | UA, fonts, voices, locale, permissions | +30 |
network_id | ASN, subnet, JA4, HTTP/2 fingerprint | +25 |
identity_id | canonical email, E.164 phone plus card fingerprint | +50 |
A new check is a repeat if any composite ID matches an existing end_user in your project. Multiple matches are stronger than one.
Verdicts and scores
Each check returns a 0 to 100 score along with one of three verdicts. The score is the sum of every signal contribution, capped at 100. Thresholds are configurable per project.
| Verdict | Default range | Suggested action |
|---|---|---|
allow | 0 to 49 | Let through silently. |
flag | 50 to 79 | Send to manual review or extra friction such as CAPTCHA or email confirmation. |
block | 80 to 100 | Refuse the signup at the API. |
Custom thresholds
Both thresholds are per project so they are editable in Settings or via the API on every check. Lower thresholds catch more abuse but raise false positives.
{
"session_token": "tk_sess_xxx",
"end_user": { "email": "alice@example.com" },
"options": { "block_threshold": 70, "flag_threshold": 40 }
}Explanation array
Every check response includes an explanation array of signal contributions, sorted by weight descending. It is designed to be displayed verbatim to your support staff.
"explanation": [
{ "signal": "hardware_id_match", "weight": 45, "description": "Same device hardware as user 194827361092847362" },
{ "signal": "ip_vpn", "weight": 25, "description": "VPN: NordVPN" },
{ "signal": "email_disposable", "weight": 30, "description": "Disposable email: mailinator.com" }
]