What counts as a link
Links are extracted whether or not the author wrote one properly:- Full URLs —
https://example.com/path www.prefixed —www.example.com- Markdown links — the destination is scored, not the label
- Bare domains —
example.comwritten mid-sentence, with no scheme and nowww.
report.pdf or clip.mov, missing spaces after a full stop (I'm tired.Today I...), bare IP addresses, and domains that only appear inside an email address are all left alone.
Fields
Signals
Observable properties of the URL. The shape is consistent on every request. Fields that aren’t applicable or weren’t checked come back asnull.
Not every URL is analyzed in full depth. URLs that are clearly clean or
clearly malicious from the string alone get a fast verdict, and the
network-level signals (
domain_age_days, has_email_setup, redirect_count,
final_url, bot_protection) come back null. Treat null as “not
checked,” not “not present.”How signals describe redirect chains
When a URL redirects across domains (e.g. a shortener resolving to a landing page), signals are assembled from both the submitted URL and the final URL:- Describe the destination (where the user ends up):
brand_impersonation,domain_age_days,has_email_setup,bot_protection - Describe the submitted URL (what was sent):
redirect_count,final_url,is_reported - Either URL exhibiting the trait:
is_link_shortener,has_suspicious_characters
http:// → https://, trailing-slash canonicalization) don’t trigger re-analysis.
Reason codes
reasons is an ordered list of stable codes explaining why the URL looks risky. Codes only appear when a signal or rule actually attributed risk to this URL. A field being present is not enough; it has to have driven the score. Benign URLs return reasons: [].
Reasons only describe what increased risk. You will not see
has_email_setup as a reason. It’s the absence of email setup that’s concerning, and that surfaces as missing_email_setup.
Allowed and blocked domains
You can override the risk model for domains you already have an opinion about. Both lists are applied before the model runs:- A blocklist hit returns
risk_score: 1andreasons: ["blocklisted"]. - An allowlist hit returns
risk_score: 0andreasons: ["allowlisted"]. - Everything else flows through the risk model.
signals are returned. The exception is a URL that was analyzed and then resolved, through a redirect, to a listed domain: the signals gathered on the way are still included.
If a domain is on both lists, the blocklist wins.
Maintaining the lists
Each list is a wordlist of domains, one domain per entry. Wordlists belong to your organization, so the same list can back several channels at once, and editing it takes effect everywhere it’s used without reconfiguring anything. To attach a list to the policy, open URL Risk on the channel and use the Allowed domains or Blocked domains tab. Every wordlist in your organization is listed there; toggle on the ones this channel should use. You can also create a new wordlist straight from that tab if you don’t have one yet. To add or edit domains, open the wordlist itself in Model Studio under Wordlists. Type entries in directly or upload a CSV or spreadsheet. The tab in the policy also links to each wordlist for quick edits.Domain matching is exact. The wordlist’s flagging threshold and semantic
matching don’t apply here, so a list used for URL Risk won’t match near-misses
or related words the way a wordlist does on text.
How entries match
Entries match on the full hostname, withwww. normalized away and case ignored. Subdomains are not matched automatically. To allow every subdomain of your service, add each one explicitly.
Given an allowlist entry of example.com:
Enter plain domains without wildcards. If you paste a full URL, the scheme and path are stripped for you.
Always flagging link shorteners
Shortened links hide their destination, and some platforms would rather not carry them at all. Always flag free link shorteners, on the URL Risk policy, turns that into a hard rule: any URL using a shortener comes back withrisk_score: 1 and is_link_shortener in reasons, whatever the model made of the destination. signals are still returned, so you can see what the destination looked like.
The setting covers the free, open shorteners anyone can create a link with (bit.ly, tinyurl.com, and others). Platform shorteners that can only ever point back at their own service, like youtu.be or lnkd.in, aren’t treated as shorteners here, so turning this on won’t flag every YouTube link your users post.
Allowlisted domains still pass. If you want to keep one shortener you rely on, add its domain to an allowlist and the setting won’t touch it.
FAQ
Why does the score for the same URL change over time?
Why does the score for the same URL change over time?
Risk is a moving target. Several inputs change between requests:
- Domains age. A freshly registered domain looks risky today and less risky in six months.
domain_age_daysgrows naturally. - Email infrastructure gets added. Legitimate businesses set up MX, SPF, and DMARC records as they grow up; throwaway domains rarely do.
has_email_setupcan flip fromfalsetotrueas a domain matures. - Threat-intelligence feeds update constantly. A URL not on any feed today may be reported tomorrow.
- Redirect destinations change. Shorteners and redirectors can be repointed at any time. The destination is re-resolved on every request.
- The model is updated as the threat landscape shifts.
What threshold should I use?
What threshold should I use?
risk_score >= 0.5 is the default cutoff for “treat as malicious,” and it’s tuned so the rate of false positives at that threshold is low across typical user-generated content. Tighten it (e.g. 0.7) if your audience is unusually tolerant of risky links, or loosen it (e.g. 0.3) if you’d rather over-block. The reasons array gives you the why in either direction.A legitimate URL of mine is being flagged. What do I do?
A legitimate URL of mine is being flagged. What do I do?
Add its domain to an allowlist. Allowlist entries override the risk model, which makes them the right tool for your own product domains, trusted partners, and URLs you’ve manually verified as safe.If you think the score is wrong in a way that would also affect other customers (for example, a brand-impersonation false positive on a legitimate brand variant), let us know and we’ll look at the model.