<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ShieldLabs</title>
    <description>The latest articles on DEV Community by ShieldLabs (shieldlabs).</description>
    <link>https://dev.to/shieldlabs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14794%2Fcc67d8ee-444c-4ec5-8370-63c3ecccc284.png</url>
      <title>DEV Community: ShieldLabs</title>
      <link>https://dev.to/shieldlabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shieldlabs"/>
    <language>en</language>
    <item>
      <title>10 browser fingerprinting techniques explained</title>
      <dc:creator>Yahor Papou</dc:creator>
      <pubDate>Wed, 16 Sep 2026 20:50:57 +0000</pubDate>
      <link>https://dev.to/shieldlabs/10-browser-fingerprinting-techniques-explained-22m2</link>
      <guid>https://dev.to/shieldlabs/10-browser-fingerprinting-techniques-explained-22m2</guid>
      <description>&lt;p&gt;Browser fingerprinting is the foundation of device intelligence: the way a site recognizes the same visitor without a cookie. Browser fingerprinting techniques are the individual methods a site uses to read attributes of a browser, each one probing a different surface, and combine them into an identifier that recognizes the same visitor again. No single attribute is unique; the power is in the combination. A &lt;a href="https://coveryourtracks.eff.org/static/browser-uniqueness.pdf" rel="noopener noreferrer"&gt;landmark study by the Electronic Frontier Foundation&lt;/a&gt;, published in the 2010 Privacy Enhancing Technologies Symposium proceedings, found that a browser fingerprint carried enough distinguishing detail to single out roughly 84 percent of browsers in its sample.&lt;/p&gt;

&lt;p&gt;The toolkit has grown from a handful of HTTP headers to a layered read across the graphics stack, the audio engine, and the network itself. The consistent pattern is that the attributes a browser can fake in JavaScript are the weak ones, and the techniques that reach down to the real hardware and the connection are the ones that hold up under a tool built to defeat them. This guide walks through the main techniques behind &lt;a href="https://shieldlabs.ai/blog/what-is-browser-fingerprinting" rel="noopener noreferrer"&gt;browser fingerprinting&lt;/a&gt;, what each one reads, and how stable each is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A browser fingerprint is built from many techniques at once. Each reads one attribute, and combined they carry enough distinguishing detail to recognize a returning visitor without a cookie.&lt;/li&gt;
&lt;li&gt;The strongest techniques read what the browser cannot easily hide: how the device renders graphics (canvas, WebGL), processes audio, and negotiates a connection (TLS, network).&lt;/li&gt;
&lt;li&gt;Declared attributes like the user agent are easy to spoof, so they add little on their own. The render-and-hardware techniques are what make a fingerprint stable.&lt;/li&gt;
&lt;li&gt;Anti-detect browsers fake these attributes per profile, but faking many layers consistently is hard, so the contradictions between them are their own detection signal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are browser fingerprinting techniques?
&lt;/h2&gt;

&lt;p&gt;Browser fingerprinting techniques are the individual methods a website uses to read attributes of a visitor's browser, with each method probing a different surface such as graphics rendering, audio processing, installed fonts, or the network connection. No single attribute is unique on its own, but together they carry enough distinguishing detail to recognize the same browser, and the device behind it, again without a cookie. These are the methods behind &lt;a href="https://shieldlabs.ai/blog/what-is-browser-fingerprinting" rel="noopener noreferrer"&gt;browser fingerprinting&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How browser fingerprinting works
&lt;/h2&gt;

&lt;p&gt;Browser fingerprinting works by collecting attributes that vary from one device to the next, then combining them into a single identifier. Each attribute on its own is shared by many people; together they narrow the field until the combination is, in most cases, unique. The detail that makes it work is that much of this data is exposed automatically through standard browser APIs, so a script can read it in milliseconds without any permission prompt.&lt;/p&gt;

&lt;p&gt;The techniques split into two families. Declared attributes are values the browser simply reports, like the user agent or the language, and they are trivial to change. Derived attributes are produced by asking the browser or device to do something, render an image, process an audio signal, negotiate a connection, and reading the result. Derived attributes are what give a fingerprint its staying power, because they reflect the real hardware and software underneath rather than a string the user can edit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fshieldlabs.ai%2Fassets%2Fblog%2Fbrowser-fingerprinting-techniques-declared-vs-derived-v5.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fshieldlabs.ai%2Fassets%2Fblog%2Fbrowser-fingerprinting-techniques-declared-vs-derived-v5.webp" width="800" height="446" alt="A diagram contrasting declared attributes like the user agent, which are easy to change, with derived attributes like canvas, GPU, and audio, which reflect the real hardware and are stable"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The main browser fingerprinting techniques
&lt;/h2&gt;

&lt;p&gt;The techniques below are listed roughly from the most stable to the most easily changed. A real fingerprint reads many of them at once. Most of them run inside the browser, canvas, WebGL, audio, fonts, and the declared attributes, while TLS and WebRTC read the layer underneath, the connection and the network, which is why they are harder to fake and pull double duty for anonymity detection. In practice a detection system reads across all of these together.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technique&lt;/th&gt;
&lt;th&gt;What it reads&lt;/th&gt;
&lt;th&gt;How stable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canvas fingerprinting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A hash of how the device renders text and graphics to a hidden canvas&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebGL fingerprinting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The GPU and graphics driver, read from a rendered 3D scene&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audio fingerprinting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tiny differences in how the device's audio stack processes a generated signal&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TLS fingerprinting (JA3/JA4)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The exact shape of the TLS handshake the browser sends&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WebRTC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A local or real IP address the browser can expose, even behind a VPN&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Font fingerprinting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Which fonts are installed and how they render&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hardware attributes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU cores, device memory, touch points, sensors&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Media device fingerprinting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How many media devices are connected and of what kind (full labels need camera or mic permission)&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Screen, timezone, language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Resolution, color depth, timezone offset, locale&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User agent and client hints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The declared browser, version, and operating system&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Canvas fingerprinting
&lt;/h3&gt;

&lt;p&gt;Canvas fingerprinting asks the browser to draw text and shapes to an off-screen &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" rel="noopener noreferrer"&gt;HTML canvas&lt;/a&gt;, then reads the pixel data back and hashes it. Because the result depends on the GPU, the graphics driver, the operating system's font rendering, and anti-aliasing, two devices almost never produce the same hash. It is one of the most reliable techniques because the user cannot easily change how their hardware renders, which is why &lt;a href="https://shieldlabs.ai/blog/what-is-canvas-fingerprinting" rel="noopener noreferrer"&gt;canvas fingerprinting&lt;/a&gt; carries so much weight in a combined read.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebGL fingerprinting
&lt;/h3&gt;

&lt;p&gt;WebGL fingerprinting is the 3D cousin of canvas. A script renders a scene through the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API" rel="noopener noreferrer"&gt;WebGL API&lt;/a&gt; and reads back both the rendered output and the reported GPU vendor and renderer strings. By exposing the graphics hardware directly, &lt;a href="https://shieldlabs.ai/blog/what-is-webgl-fingerprinting" rel="noopener noreferrer"&gt;WebGL fingerprinting&lt;/a&gt; stays stable per device and is hard to spoof convincingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audio fingerprinting
&lt;/h3&gt;

&lt;p&gt;Audio fingerprinting uses the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API" rel="noopener noreferrer"&gt;Web Audio API&lt;/a&gt; to generate a sound signal, process it through the device's audio stack, and measure the output. The tiny variations introduced by the hardware and the audio processing produce a stable value that differs between devices, even when nothing is actually played out loud. This kind of &lt;a href="https://shieldlabs.ai/blog/what-is-audio-fingerprinting" rel="noopener noreferrer"&gt;audio fingerprinting&lt;/a&gt; is a different thing from the music recognition that shares the name.&lt;/p&gt;

&lt;h3&gt;
  
  
  TLS fingerprinting (JA3/JA4)
&lt;/h3&gt;

&lt;p&gt;TLS fingerprinting reads the connection itself rather than anything in the page. When a browser opens an encrypted connection, the order and contents of the TLS handshake it sends are characteristic of the client software. Methods like &lt;a href="https://github.com/FoxIO-LLC/ja4" rel="noopener noreferrer"&gt;JA3 and the newer JA4&lt;/a&gt; summarize that handshake into a value, which is powerful because it is sent over the network and a page script cannot rewrite it. It is the technique that most often catches a browser lying about what it is, and the &lt;a href="https://shieldlabs.ai/blog/ja4-fingerprinting" rel="noopener noreferrer"&gt;JA4 fingerprint&lt;/a&gt; is how that handshake becomes a value you can compare.&lt;/p&gt;

&lt;p&gt;To see how far that goes, run browsers configured to spoof their identity through a combined read, and the TLS handshake is the layer that gives them away most reliably. A profile can rewrite its user agent in seconds, but the handshake it actually negotiates still matches the client software underneath, so the declared browser and the connection stop agreeing. JA4, released in 2023, made that handshake easier to reduce to a single comparable value, which is why a contradiction between it and the declared user agent is such a dependable tell.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebRTC
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://shieldlabs.ai/blog/what-is-webrtc-fingerprinting" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; is a browser feature for real-time audio and video, and while setting up a connection it can reveal a local network address, and sometimes the real public one, even when the visitor sits behind a VPN or proxy. That makes it less a source of device distinguishing detail and more a way to notice a connection that is hiding its origin. It is why WebRTC matters more for anonymity detection, surfacing a real address that contradicts the declared one, than for telling two ordinary devices apart.&lt;/p&gt;

&lt;h3&gt;
  
  
  Font fingerprinting
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://shieldlabs.ai/blog/what-is-font-fingerprinting" rel="noopener noreferrer"&gt;Font fingerprinting&lt;/a&gt; detects which fonts are installed by measuring how sample text renders, since a missing font falls back to a default with different dimensions. The set of installed fonts reflects the operating system and the software a person has added, which makes it a useful medium-stability signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware and device attributes
&lt;/h3&gt;

&lt;p&gt;A browser also exposes hardware hints: the number of logical CPU cores, an approximate amount of device memory, the maximum number of simultaneous touch points, and, with permission, motion and orientation sensors. The set of supported browser features and APIs adds a few more bits the same way. Older techniques read the battery level and charging state too, though browsers have since restricted that one specifically because it was being used to track people. None is unique alone, but together they add distinguishing detail and tend to stay constant for a given device.&lt;/p&gt;

&lt;h3&gt;
  
  
  Media device fingerprinting
&lt;/h3&gt;

&lt;p&gt;Media device fingerprinting reads the list of media inputs and outputs the browser reports through the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices" rel="noopener noreferrer"&gt;media devices API&lt;/a&gt;: the microphones, cameras, and audio outputs attached to the machine. It captures nothing from them, only how many are connected and of what kind. The full list, with each device's label and ID, is only exposed once the visitor has granted camera or microphone access, so on its own this technique is a weak, supporting signal rather than a primary one. Where it does apply, the set of devices stays fairly consistent for a given machine and is awkward to fake convincingly across a fleet of fake profiles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screen, timezone, and language
&lt;/h3&gt;

&lt;p&gt;Screen resolution and color depth, the timezone offset, and the language and locale are all read directly. They are moderately stable and useful mostly as corroboration, and a mismatch between them, a timezone that disagrees with the declared locale, is itself a tell.&lt;/p&gt;

&lt;h3&gt;
  
  
  User agent and client hints
&lt;/h3&gt;

&lt;p&gt;The user agent string and the newer &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Client_hints" rel="noopener noreferrer"&gt;client hints&lt;/a&gt; report the browser, its version, and the operating system. They are the easiest attributes to spoof, so on their own they add almost no distinguishing detail, but when they disagree with what the render and TLS techniques reveal, that disagreement is a detection signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  How unique and stable is a fingerprint?
&lt;/h2&gt;

&lt;p&gt;A fingerprint's strength comes from distinguishing detail: how much each attribute narrows the field of possible devices. &lt;a href="https://coveryourtracks.eff.org/static/browser-uniqueness.pdf" rel="noopener noreferrer"&gt;The EFF's early research&lt;/a&gt; found most browsers were unique within its sample. In 2018, &lt;a href="https://doi.org/10.1145/3178876.3186097" rel="noopener noreferrer"&gt;a study of around two million fingerprints&lt;/a&gt;, published in the Web Conference proceedings, found only about 33 percent were unique, because common phone models share very similar fingerprints. The practical reality sits in between: on desktop, a full fingerprint is usually distinctive; on mobile, it is weaker on its own and leans more on the network and behavioral layers.&lt;/p&gt;

&lt;p&gt;Stability is the other half. Fingerprints drift as browsers update, drivers change, and fonts are added, so a resilient system does not expect an exact match every time. It scores how much of the fingerprint agrees and tolerates small changes, which is also what separates a returning real user from an assembled profile that is too clean or internally contradictory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can browser fingerprinting be blocked?
&lt;/h2&gt;

&lt;p&gt;Browser fingerprinting can be resisted but not fully blocked, and the trade-offs are real. Privacy browsers and extensions add noise to canvas and audio readings, block known scripts, or make a device look like many others, and an anti-detect browser goes further by spoofing a full set of attributes per profile. Each of these changes some surfaces, but covering every technique consistently is hard, and the act of covering them, a too-uniform fingerprint, an injected-noise canvas that changes on every read, or a TLS handshake that disagrees with the declared browser, becomes its own signal. That cat-and-mouse plays out in full when a session runs an &lt;a href="https://shieldlabs.ai/blog/how-to-detect-anti-detect-browsers" rel="noopener noreferrer"&gt;anti-detect browser&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How browser fingerprinting works without a cookie
&lt;/h2&gt;

&lt;p&gt;Browser fingerprinting works without a cookie, and that is the point. A cookie is a value the site writes into the browser, so the visitor can clear it, switch to a private window, or move to a fresh browser and the link is gone. A browser fingerprint is not written anywhere; it is derived on the fly from the attributes the techniques above read, so the same browser produces the same identifier on the next visit even after cookies are cleared. That is why it survives the resets a fresh email and a private window are meant to provide.&lt;/p&gt;

&lt;p&gt;Fingerprinting does not replace cookies so much as complement them. A first-party cookie is a fast, reliable way to recognize a returning visitor who has not cleared anything, and the fingerprint is the layer underneath that still holds when the cookie is gone. Reading both together gives a steadier recognition than either one alone. That complement matters even though the third-party cookie did not disappear on the timeline many expected: in April 2025, &lt;a href="https://privacysandbox.google.com/blog/privacy-sandbox-next-steps" rel="noopener noreferrer"&gt;Google confirmed it would not phase out third-party cookies in Chrome&lt;/a&gt; after all, keeping its existing cookie-choice approach, so cookieless recognition is a resilient companion to cookies rather than a scramble to replace them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How browser fingerprinting helps detect fraud
&lt;/h2&gt;

&lt;p&gt;Browser fingerprinting helps detect fraud because most online abuse depends on one person looking like many different people. Multi-accounting, free-trial farming, fake signups, and account takeover all rely on creating a fresh-looking visitor for each attempt, usually by clearing cookies, switching browsers, or rotating IPs. A browser fingerprint cuts through that, because the same device keeps producing the same identifier no matter how many fresh emails and new IPs sit on top of it. Linking those attempts back to one device is what turns a wall of separate-looking accounts into a recognizable pattern.&lt;/p&gt;

&lt;p&gt;The combination of techniques is also a fraud signal in its own right. A real browser produces attributes that agree with each other: the declared user agent matches what the render and TLS techniques reveal, the timezone fits the locale, the network looks like a residential connection. A tool built to fake a visitor has to keep all of those layers consistent at once, and the moment they can contradict each other, a TLS handshake that disagrees with the declared browser, a risk signal that surfaces a real address behind a VPN, that disagreement is the tell. So fingerprinting helps detect fraud two ways at once: it links repeat attempts to one device, and it flags the inconsistencies that mark an assembled identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recognizing returning visitors with ShieldLabs
&lt;/h2&gt;

&lt;p&gt;ShieldLabs turns device and browser signals into a stable &lt;a href="https://shieldlabs.ai/products/device-intelligence" rel="noopener noreferrer"&gt;device identifier&lt;/a&gt; through one JavaScript snippet that recognizes a returning visitor even after cleared cookies and a rotated IP. The identifier is derived from the combination of signals, which is what makes it survive the resets a fresh email and a new IP are meant to provide, so your team can link repeat fraud and abuse attempts back to one device.&lt;/p&gt;

&lt;p&gt;Around that identifier, each visit returns a &lt;a href="https://shieldlabs.ai/products/risk-scoring" rel="noopener noreferrer"&gt;risk score&lt;/a&gt; from 0 to 100 with the named signals behind it, including the &lt;a href="https://shieldlabs.ai/products/anonymity-signals" rel="noopener noreferrer"&gt;risk signals&lt;/a&gt;, a VPN, anonymous proxy, datacenter connection, or &lt;a href="https://shieldlabs.ai/solutions/anti-detect-browser-detection" rel="noopener noreferrer"&gt;anti-detect browser&lt;/a&gt;, that surface when what a visitor presents and the underlying signals contradict each other. The &lt;a href="https://docs.shieldlabs.ai/api/overview" rel="noopener noreferrer"&gt;API and webhooks&lt;/a&gt; deliver the risk score and named risk signals, while four High-Risk Events, multi-accounting, account sharing, impossible travel and account takeover, are detected directly in the analytics dashboard, API and webhooks. Because the read happens in the background from data the browser already exposes, it adds no friction for a real visitor, and ShieldLabs helps block fraudulent and abusive traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Eckersley, Peter (Electronic Frontier Foundation): &lt;a href="https://coveryourtracks.eff.org/static/browser-uniqueness.pdf" rel="noopener noreferrer"&gt;How Unique Is Your Web Browser?&lt;/a&gt; (PETS, 2010)&lt;/li&gt;
&lt;li&gt;Wikipedia: &lt;a href="https://en.wikipedia.org/wiki/Device_fingerprint" rel="noopener noreferrer"&gt;Device fingerprint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MDN Web Docs: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API" rel="noopener noreferrer"&gt;Canvas API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gómez-Boix, Laperdrix, Baudry: &lt;a href="https://doi.org/10.1145/3178876.3186097" rel="noopener noreferrer"&gt;Hiding in the Crowd: An Analysis of the Effectiveness of Browser Fingerprinting at Large Scale&lt;/a&gt; (WWW, 2018)&lt;/li&gt;
&lt;li&gt;Google: &lt;a href="https://privacysandbox.google.com/blog/privacy-sandbox-next-steps" rel="noopener noreferrer"&gt;The Privacy Sandbox: Next steps&lt;/a&gt; (2025)&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>privacy</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Free-trial abuse vs API-key abuse vs rate limiting: which layer stops what</title>
      <dc:creator>Yahor Papou</dc:creator>
      <pubDate>Wed, 16 Sep 2026 13:58:48 +0000</pubDate>
      <link>https://dev.to/shieldlabs/free-trial-abuse-vs-api-key-abuse-vs-rate-limiting-which-layer-stops-what-4g22</link>
      <guid>https://dev.to/shieldlabs/free-trial-abuse-vs-api-key-abuse-vs-rate-limiting-which-layer-stops-what-4g22</guid>
      <description>&lt;p&gt;A self-serve AI product gets a surprise five-figure compute bill, and the incident channel calls it "API abuse." Sometimes that is right. Often the real cause sits one layer upstream, at signup, where one person quietly farmed a hundred free-trial accounts and every one of them minted a valid key. In 2025, Stripe found that AI startups with self-serve sign-ups and direct API access saw &lt;a href="https://stripe.com/blog/analyzing-first-party-fraud-trends-account-free-trial-and-refund-abuse" rel="noopener noreferrer"&gt;10x more attempted abuse than enterprise AI solutions&lt;/a&gt;, and a lot of that pain comes from blaming the wrong layer. Free-trial abuse, API-key abuse, and rate limiting get treated as one thing. They are three problems, on three layers, with three owners, and the fix for one does almost nothing for the others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free-trial abuse is an identity problem at signup: one user opening many accounts to claim free credits. You stop it before a key is ever issued.&lt;/li&gt;
&lt;li&gt;API-key abuse is a usage problem after a key exists: a key, often a leaked legitimate one, called at a volume or in a pattern it should not be.&lt;/li&gt;
&lt;li&gt;Rate limiting and spend caps are ceilings, not an identity check. They cap any single key, but they do not know that one person is behind a hundred of them.&lt;/li&gt;
&lt;li&gt;The layers complement each other. Identity scoring keeps farmed accounts from minting keys; gateway limits contain the damage of any key that slips through or leaks later.&lt;/li&gt;
&lt;li&gt;A CAPTCHA gates obvious bots at the form. It does not catch a human operator running many real-looking signups, and it is a different control from device-and-network identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The three problems people blame for one bill
&lt;/h2&gt;

&lt;p&gt;These three get conflated because they all end in the same place, a bigger-than-expected bill or a degraded service, but they start in different places. Naming where each one starts is the whole game, because the cheapest fix lives at the layer where the problem begins, not where the symptom shows up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free-trial abuse&lt;/strong&gt; starts at the &lt;strong&gt;signup&lt;/strong&gt; form, before any account or key exists. One user creates many accounts to claim the free credits each new account gets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API-key abuse&lt;/strong&gt; starts after a key is &lt;strong&gt;issued&lt;/strong&gt;: a valid key gets shared, leaked, or pointed at the API in a way it was never meant for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt; is not a problem at all; it is the &lt;strong&gt;gateway&lt;/strong&gt; control that caps how hard any one key or org can hit you. It contains damage, but it does not identify who is behind the traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conflating them is how a team ends up with a gap: they tighten rate limits and rotate keys after a bad week, feel safer, and never notice that the farmed accounts minting those keys are still arriving at the front door untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free-trial abuse vs API-key abuse vs rate limiting at a glance
&lt;/h2&gt;

&lt;p&gt;Here is the boundary in one view. Read down each column to see that these are genuinely different problems, not three names for one.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Free-trial (signup) abuse&lt;/th&gt;
&lt;th&gt;API-key abuse&lt;/th&gt;
&lt;th&gt;Rate limiting and spend caps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One user opens many accounts to claim free credits repeatedly&lt;/td&gt;
&lt;td&gt;A key, often a leaked or shared legitimate one, used at the wrong volume or pattern&lt;/td&gt;
&lt;td&gt;A ceiling on how many calls or how much spend any one key or org is allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When it happens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;At signup, before the account or key exists&lt;/td&gt;
&lt;td&gt;After a key is issued, during usage&lt;/td&gt;
&lt;td&gt;Continuously, as a guardrail on every key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What is behind it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A human (sometimes automated) farming identities; the device repeats while the email and IP rotate&lt;/td&gt;
&lt;td&gt;A leaked credential, a scraper, or a legitimate key pushed past its intent&lt;/td&gt;
&lt;td&gt;Nothing; it is your own enforcement, not an adversary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The layer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Signup identity&lt;/td&gt;
&lt;td&gt;Key usage&lt;/td&gt;
&lt;td&gt;Gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who owns the fix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identity scoring at registration&lt;/td&gt;
&lt;td&gt;Key rotation, scoping, per-key monitoring&lt;/td&gt;
&lt;td&gt;Your API gateway or proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it costs you if missed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compute burned across a hundred farmed accounts, plus polluted growth metrics&lt;/td&gt;
&lt;td&gt;A single key running away with your budget or exfiltrating data&lt;/td&gt;
&lt;td&gt;Without it, one key can drain the whole bill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What is free-trial abuse?
&lt;/h2&gt;

&lt;p&gt;Free-trial abuse is one user creating many accounts to claim the same free offer more than once, scored and stopped at the registration before any credits or keys are provisioned. It hides because the user changes the surface details, a fresh email, a new IP, a cleared cookie, while the device and network behind the accounts repeat. An email check or an IP rule never sees that repetition; reading the device does.&lt;/p&gt;

&lt;p&gt;We measured this by rebuilding a signup the way a farmer does, rotating a new email, a fresh IP, and an emptied cookie on each pass, and the device underneath kept pointing at the same identifier every time. The surface details are meant to be disposable; the device is the part that repeats. That gap only widened in 2020, when Safari began blocking third-party cookies by default, leaving a cookie an even weaker anchor for a signup than the device beneath it.&lt;/p&gt;

&lt;p&gt;This is the only one of the three layers that is about &lt;em&gt;who&lt;/em&gt; is signing up rather than &lt;em&gt;what&lt;/em&gt; a key is doing. The advantage is timing: scoring the registration is far cheaper than chasing the compute after a hundred trials are already calling the model. The signals, the credit-gating, and the economics of &lt;a href="https://shieldlabs.ai/blog/how-to-prevent-free-trial-abuse-ai" rel="noopener noreferrer"&gt;how to prevent free-trial abuse at an AI company&lt;/a&gt; all turn on that timing; the point here is just where it sits: upstream of the key, at identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is API-key abuse?
&lt;/h2&gt;

&lt;p&gt;API-key abuse is a valid key being used at a volume, from a place, or in a pattern it was never meant for, and it lives entirely after the key is issued. The key might be a leaked secret committed to a public repo, a shared credential passed around a team, or a legitimate key repointed at scraping the model's output. Whatever the source, the control surface is the key itself, and the standard moves are the gateway's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope and rotate keys.&lt;/strong&gt; Short-lived, narrowly scoped keys limit the blast radius of any one that leaks. Broken authentication is one of the most common API risks for a reason, and it is squarely &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/" rel="noopener noreferrer"&gt;an API-security concern&lt;/a&gt;, not a signup one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-key spend caps.&lt;/strong&gt; A hard ceiling on spend per key and per org means no single credential, abused or not, can run away with your budget. The OWASP API Security Top 10 calls the missing version of this "unrestricted resource consumption."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anomaly monitoring on usage.&lt;/strong&gt; Watch for a key whose call volume, geography, or endpoint mix suddenly changes, the signature of a credential that has left its owner's hands.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this reads the human at the front door, and it does not need to. API-key abuse is downstream of identity. By the time a key exists, the farmed-account question was already answered, or missed, one layer up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is rate limiting (and spend caps)?
&lt;/h2&gt;

&lt;p&gt;Rate limiting caps how many requests a key or org can make in a window, and spend caps cap how much it can cost; both are essential guardrails, and neither knows who is behind the traffic. They are about volume, not identity. A &lt;a href="https://en.wikipedia.org/wiki/Rate_limiting" rel="noopener noreferrer"&gt;rate limiter&lt;/a&gt; will happily throttle one key at a thousand requests a minute, which is exactly what you want when a single credential goes rogue.&lt;/p&gt;

&lt;p&gt;The gap is structural: a rate limit applies &lt;em&gt;per key&lt;/em&gt;. The free-trial farmer's whole technique is to spread the load across a hundred keys, each one comfortably under the limit. A hundred accounts each making polite, well-behaved calls is invisible to a per-key ceiling, because no individual key ever misbehaves. Spend caps have the same blind spot. They stop one key from draining the budget; they do nothing about a hundred keys each spending a small, allowed amount that sums to the same loss. Rate limiting contains the runaway-key problem and leaves the farmed-account problem completely open. That is not a flaw in rate limiting; it is just a different layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where CAPTCHA and bot-gating fit
&lt;/h2&gt;

&lt;p&gt;A CAPTCHA sits at the signup form and tries to separate humans from scripts, which makes it a bot control, not an identity one. It raises the cost of fully automated, headless signup floods, and for that narrow job it helps. Two things it does not do: it does not stop a human operator, or a lightly automated one driving a real browser, from completing many real-looking signups, and it does not tell you that two solved-CAPTCHA signups trace back to one machine. CAPTCHA asks "is this a bot?"; the identity layer asks "have we seen this device before?". They answer different questions, and a serious farming operation passes the first while failing the second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which layer stops what: the honest map
&lt;/h2&gt;

&lt;p&gt;Put together, the picture is simple and the layers do not substitute for each other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signup identity&lt;/strong&gt; catches the farmed account &lt;em&gt;before&lt;/em&gt; a key is minted. It is the cheapest place to act, because nothing has been provisioned yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key scoping, rotation, and monitoring&lt;/strong&gt; contain a key &lt;em&gt;after&lt;/em&gt; it exists, whether it was farmed past the identity layer or leaked later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits and spend caps&lt;/strong&gt; are the backstop that keeps any single key, abused or not, from running away with the bill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CAPTCHA&lt;/strong&gt; thins out crude automation at the form, and leaves the human-operated farm for the identity layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A team that only hardens the gateway, more rate limits, tighter key scopes, is defending the second and third layers while the first stays open. A team that only scores signups stops the farm but still needs ceilings for the key that leaks next week. The two halves are complementary by design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where ShieldLabs fits, and where it does not
&lt;/h2&gt;

&lt;p&gt;ShieldLabs reads exactly one of these layers: the signup-identity one. You add a JavaScript snippet to your signup or trial-activation page, and on the first visit it returns a &lt;a href="https://shieldlabs.ai/products/risk-scoring" rel="noopener noreferrer"&gt;risk score&lt;/a&gt; from 0 to 100 with the &lt;a href="https://shieldlabs.ai/products/anonymity-signals" rel="noopener noreferrer"&gt;risk signals&lt;/a&gt; and &lt;a href="https://shieldlabs.ai/products/device-intelligence" rel="noopener noreferrer"&gt;persistent identification&lt;/a&gt; behind it, before a single credit or key is provisioned. When a "new" signup traces back to a device you have already seen, that linkage is the farmed-account tell a fresh email is meant to hide.&lt;/p&gt;

&lt;p&gt;To be plain about scope: ShieldLabs scores the signup on a 0 to 100 risk score, names the risk signals that fired, and directly detects multi-accounting, so your team can keep farmed accounts from minting keys in the first place and the layer downstream has less to contain. Key usage monitoring, secret rotation, and spend-cap enforcement are your gateway's job, and they should stay there. You read the risk score and named risk signals through the &lt;a href="https://docs.shieldlabs.ai/api/overview" rel="noopener noreferrer"&gt;API and webhooks&lt;/a&gt; and decide, by your own rules, whether to gate credits, ask for a verification step, or let a clean signup through. It complements the gateway. The same identity layer carries into &lt;a href="https://shieldlabs.ai/solutions/new-account-fraud-prevention" rel="noopener noreferrer"&gt;new-account fraud prevention&lt;/a&gt; and &lt;a href="https://shieldlabs.ai/solutions/free-trial-abuse-prevention" rel="noopener noreferrer"&gt;free-trial abuse prevention&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to close the signup-identity gap?
&lt;/h2&gt;

&lt;p&gt;Install the ShieldLabs JavaScript snippet and risk-score every trial signup for linked accounts and risk signals in about five minutes, free for the first 5,000 identifications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shieldlabs.ai/pricing" rel="noopener noreferrer"&gt;Start Free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://shieldlabs.ai/blog/free-trial-vs-api-key-abuse-vs-rate-limiting" rel="noopener noreferrer"&gt;ShieldLabs blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>api</category>
      <category>saas</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
