TRACIO:s botdetektering identifierar automatiserade webbläsare, headless-verktyg och skriptbaserade attacker med hjälp av en tvålagersarkitektur: klientsidig insamling i webbläsaragenten och serversidig analys. Den täcker gängse automatiseringsramverk, headless-webbläsare, AI-webbläsaragenter och antidetect-webbläsare med nära noll falska positiva, samtidigt som legitima sökmotor-crawlers automatiskt sätts på allowlistan.
Webbläsaragenten kör en bred uppsättning kontroller och rapporterar deras utfall. På
servern vägs utfallen samman till en botpoäng, och poängen mappas till ett verdikt.
Ett litet antal entydiga indikatorer är avgörande på egen hand och tvingar fram ett
bot-verdikt oavsett övrigt.
Vilka kontroller som körs, hur de viktas och var trösklarna ligger publiceras inte — i ingen prisplan. Att dokumentera det skulle tala om exakt för botoperatörer vad de behöver ändra för att ta sig förbi skyddet. Det du får i stället är verdiktet, en bottypsetikett och — från Business och uppåt — orsakskoder som namnger klassen av iakttagelse bakom beslutet.
Varje identifiering bär ett botverdikt. Det når dig som bot.result i
webhook-payloaden och som result.bot i klient-SDK:n.
| Resultat | Beskrivning |
|---|---|
human | Inga automatiseringsindikatorer hittades. Verifierade crawlers ger också human. |
bot | Automatisering eller skriptbaserad åtkomst upptäckt. En bot.type-etikett följer med. |
uncertain | Blandade eller svaga signaler — varken tydligt mänskligt eller tydligt automatiserat. |
Detta mappas till det affärsmässiga fältet decision.action (real, fake eller
suspicious) som används genom hela dashboarden och i webhook-payloaden.
bot.score följer med verdiktet. I webhook-payload version 2 är det ett decimaltal
0..100 — samma tal som dashboarden visar för det besöket. (I det frysta schemat i
version 1 är det en andel 0..1; se Webhooks.)
bot.type finns med när resultatet är bot. Det är antingen namnet på en känd bot
eller runtime, eller en familj, när ett utpekande av den specifika kontrollen
skulle avslöja detektorns interna funktion:
bot.type | Innebörd |
|---|---|
playwright, jsdom, electron | Den namngivna automatiseringsruntimen identifierades |
browser_use, claude_computer_use, skyvern, genspark, fellou | Den namngivna AI-webbläsaragenten identifierades |
automation | Automatiseringsverktyg, utan att den specifika kontrollen namnges |
headless | En webbläsare som körs utan användargränssnitt |
antidetect | Ett antidetect-bygge eller ett bygge som förfalskar fingeravtrycket |
extension | Ett webbläsartillägg som driver automatisering, proxy eller VPN |
privacy_browser | Ett integritetshärdat webbläsarbygge (till exempel Mullvad Browser) |
other | Upptäckt, men utanför det publicerade vokabuläret |
Listan är sluten med avsikt: en kontroll som läggs till i detektorn i morgon dyker upp
som other i stället för att läcka sitt interna namn. Behandla bot.type som en
etikett att förgrena på, inte som en uttömmande enum att validera mot — nya namngivna
runtimes tillkommer med tiden.
I prisplanerna Business och Enterprise bär webhook-payloaden en reasons-array —
högst åtta poster, sorterade efter betydelse. En kod namnger klassen av iakttagelse,
aldrig kontrollen bakom den:
| Kod | Vad den betyder |
|---|---|
automation_signature | Spår av automatiseringsverktyg |
headless_browser | En webbläsare utan användargränssnitt |
anonymous_browser | Ett integritetshärdat eller antidetect-bygge som gjorts för att se vanligt ut |
privacy_hardening | Aggressiva integritetsinställningar |
behavior_anomaly | Icke-mänskliga interaktionsmönster |
fingerprint_tampering | Värden som borde stämma överens med varandra gör det inte |
environment_anomaly | Körmiljön är internt motsägelsefull |
identity_mismatch | Den uppgivna identiteten stämmer inte med det som observeras |
virtual_environment | En emulator i stället för fysisk hårdvara |
strong_automation_evidence | Entydiga botindikatorer — avgörande på egen hand |
detection_signal | Övriga kontroller som utlöste |
severity är high, medium eller low, och den anger hur stor andel av
verdiktet den här klassen står för vid det här besöket — inte en fast egenskap hos
koden. Samma kod kan komma som high vid ett besök och low vid ett annat, så
cachea den inte som en konstant.
privacy_hardening förtjänar särskild försiktighet: den utlöser lika gärna för
vanliga integritetsmedvetna besökare som för undanflykter. Väg in den tillsammans med
övrigt i stället för att agera enbart på den.
virtual_environment kommer från emulatordetekteringen. På webben finns inget separat
verdikt för ”kör under en hypervisor”: de ledtrådar en webbläsare kan se — en generisk
mjukvarurenderare, ett ovanligt lågt antal kärnor — förekommer lika ofta på vanliga
maskiner utan GPU-drivrutin och i fjärrskrivbordssessioner, så vi gör dem inte till ett
verdikt som du skulle behöva ifrågasätta.
| Funktion | Tillgänglighet |
|---|---|
| Detektering av automatisering, headless och AI-agenter | Alla prisplaner |
| Allowlisting av verifierade crawlers | Alla prisplaner |
| Emulatordetektering | Alla prisplaner |
Antidetect-indikatorer (bot.antidetectScore, 0..100) | Från Pro och uppåt |
| Orsakskoder, beteendeblock | Från Business och uppåt |
| DevTools-detektering | Från Business och uppåt |
Antidetect-poängen kalibreras fortfarande.
bot.antidetectScorerapporteras för att du ska kunna observera den och justera din egen policy — behandla den som ett indata till ditt riskbeslut snarare än som ett fristående skäl att blockera.
Kontroller som bara gäller mobilen är inte effektiva på webben. Detektering av root, jailbreak, klonade/dubblerade appar och Frida bygger på nativa mobilsignaler som en webbläsare inte kan samla in. TRACIO levererar enbart webbläsar-SDK:er, så förlita dig på verdikten för automatisering, headless, AI-agenter, antidetect, emulator och beteende, som är fullt aktiva på webben.
Kända bra bottar känns igen på sin user-agent och verifieras därefter mot den anslutande IP-adressen — en omvänd DNS-uppslagning på IP-adressen, en kontroll av att det resulterande värdnamnet hör till operatörens domän, och en framåtriktad uppslagning som bekräftar att det pekar tillbaka till samma IP-adress. Det är den verifieringsprocedur som crawler-operatörerna själva publicerar.
| Crawler | Verifierade domäner |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
En verifierad crawler ger human. En begäran som utger sig för att vara Googlebot
medan dess IP-adress bevisligen tillhör någon annan klassas som bot — en uppslagning
som bara saknas eller går i timeout behandlas inte som bevis för förfalskning.
Interaktionsdynamik — pekarrörelser, tangentbordsrytm, scrollning — matar verdiktet
som bevis för om en människa är närvarande, inte för vilken människa det är.
Från Business och uppåt levereras aggregatet i webhookens behavior-block:
{ "behavior": { "score": 87, "verdict": "human", "confidence": 0.92 }}score löper 0..100 (högre = mer mänskligt), verdict är human, uncertain
eller bot, och confidence (0..1) anger hur mycket underlag verdiktet vilar på —
ett kort besök med två pekarrörelser får låg poäng här även när verdiktet ser
avgörande ut.
Blocket finns med endast när beteendepoängsättningen faktiskt kördes för det besöket. Ett saknat block betyder ”inga data”, aldrig ”inget misstänkt” — läs inte dess frånvaro som en ren signal.
Klient-SDK:n exponerar en bekväm boolean, result.bot.detected, plus en confidence
på skalan 0..100:
const result = await tracio.getResult()
if (result.bot.detected) { console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
await login(credentials)Agera på din server utifrån leveransen av webhooken. Botverdiktet
finns i objektet bot — bot.result och bot.type:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot?.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitorId, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})Noll- och tomvärden utelämnas ur payloaden, så läs bot.type defensivt i stället för
att kräva det i ditt schema.
TRACIO:s botdetektering är konstruerad för nära noll falska positiva, men gränsfall förekommer:
| Scenario | Risk | Motåtgärd |
|---|---|---|
Webbläsartillägg som ändrar navigator | Låg | Korsvalidering över många kontroller hindrar att en enskild kontroll utlöser |
| Företagens säkerhetsprogramvara | Mycket låg | Klassning som headless kräver stödjande bevis |
| Hjälpmedelsverktyg | Ingen | Accessibility-API:er matar inte botdetekteringen |
| VPN-/proxyanvändare | Ingen | Nätverksflaggor följs separat från botverdiktet |
Om du ser falska positiva, granska bot.type (och reasons från Business och uppåt)
för att förstå vilken klass av iakttagelse som utlöste, och justera sedan din policy.
Se Felsökning för de vanliga orsakerna.