We open it in a real browser, read the page, and tell you whether it is safe to shorten. It usually takes 15–30 seconds.
▾ More options
The check could not run
{{ scanError }}
Check the link is complete (including https://) and try again. If it keeps failing, tell an engineer what you pasted.
What you will get back
- One clear answer — safe to shorten, risky, do not shorten, or "a person needs to decide".
- A picture of the page as it really rendered, so you can see what the customer would see.
- The reasons, folded away underneath — open them only when you need them.
Past checks
Every link checked, newest first. Click a row to see the full answer again. Times follow your browser's clock ({{ hist.tz }}).
| Answer | Score | Link | Actions |
|---|---|---|---|
| {{ fx.words(r.verdict) }} | {{ r.abuse_score }} |
{{ r.final_url || r.url }}
{{ r.category }}
{{ fx.taughtWords(r.taught_label) }}
|
Delete this record? |
Links waiting for a person
The checks could not settle these on their own. Open one, look at the page and the reasons, then decide.
- Safe and Not safe both teach the system — the page is remembered as an example.
- I can't tell closes the item and deliberately teaches nothing. Use it when the page genuinely cannot be judged: a guess would be learned as if it were fact.
The second-opinion model, measured against people
{{ rev.agree.trust === 'authoritative' ? 'Counted in the answer' : 'Advisory — changes nothing' }}Measured over {{ rev.agree.comparable }} decisions. Before anyone promotes this model to counting in the answer, the number that matters is "said safe, people said unsafe" — that is the column that publishes a bad link.
| Answer so far | Score | Link | Status |
|---|---|---|---|
| {{ fx.words(r.verdict) }} | {{ r.abuse_score == null ? '—' : r.abuse_score }} |
{{ r.url }}
waiting since {{ fx.when(r.created_at) }}
{{ fx.taughtWords(r.taught_label) }}
|
waiting {{ fx.decisionWord(r.decision) }} |
Learning Memory
Nothing is learned automatically. A page is only remembered when a person confirms it here or in a review. There is one entry per link, so confirming again replaces the old entry rather than adding a second one.
| Taught as | Link | Actions |
|---|---|---|
|
{{ l.label === 'fraud' ? 'Fraud' : 'Safe' }}
{{ l.fraud_family }}
|
{{ l.url }}
|
Forget this example? |
Threat Services
Lists of known-bad links and known-popular domains. A feed that quietly stops updating makes every check worse, so its age is shown here.
| Feed | State | Entries | Last updated | Problem |
|---|---|---|---|---|
| {{ f.name }} | {{ f.status || 'never run' }} out of date | {{ (f.items || 0).toLocaleString() }} | {{ f.lastRunAt ? fx.when(f.lastRunAt) : 'never' }} | {{ f.error }} |
Outside checks, asked link by link
These are asked while a link is being checked. When one stops answering — a key that was revoked, a budget that ran out — the answer looks exactly like "nothing found", so no check fails and no warning appears. Every check just quietly gets weaker. This panel is the only place that shows.
{{ s.name }}
{{ s.state }}{{ s.what }}
{{ s.meter.left }}
- {{ r.k }}
- {{ r.v }} {{ r.v }}
{{ s.note }}
Always-safe and always-blocked domains
A decision pinned by hand, for when waiting on a code change is not an option. It applies to the whole domain, so use it sparingly.
Models
Which model does what, where it sits in the pipeline, and what the chosen window measured. Counts and latency below cover {{ mdlRangeWords }}. A model is retired here, never deleted — past checks name the model that judged them.
{{ mdl.error }}
Loading…
{{ g.title }}
{{ g.role }}{{ m.label || m.cf_model }}
{{ m.provider }} {{ m.active === 1 ? 'active' : 'retired' }} vision{{ m.cf_model }}
{{ m.explain }}
{{ m.stats.caveat }}
Agreement with the human decision on reviewed scans. This is NOT accuracy over all traffic — only the scans a person judged are counted here.
Changes waiting to be applied
Nothing is staged. Change a role or an Active box above and it is listed here first — nothing is written until you apply it.
- {{ c.label }} · role {{ c.fromRole }} → {{ c.toRole }} · {{ c.toActive ? 'activate' : 'retire' }}
- {{ w.message }} {{ w.code }}
{{ mdl.applyError }}
{{ mdl.applied }}
What has been changed here
The most recent entries, newest first. Every write above lands here with who made it and why.
| When | Who | What | Why |
|---|---|---|---|
| {{ fx.when(ch.changed_at) }} | {{ ch.actor || 'unknown' }} |
{{ ch.cf_model }}
{{ changeWords(ch) }}
|
{{ ch.reason }} |