Seatext library / BotRefund evidence
How WebGL Texture Constraint Analysis Fits Into Hardware Fingerprinting
WebGL texture constraints expose GPU driver behavior and hardware limits that stay consistent on a physical device but shift in virtualized or spoofed environments. BotRefund treats this as one of 106 independent evidence signals,...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
WebGL texture constraint analysis works by querying the browser's WebGL implementation for hard limits — maximum texture size, supported compression formats, renderbuffer precision, and similar caps. Those limits are determined by the physical GPU and its driver stack, so a real Chrome on a MacBook Pro reports one stable profile while a headless Chrome in a container often reports a different one. BotRefund captures this profile as a single independent signal, then cross-references it with 105 other checks before its prediction engine makes a final call.
What the WebGL texture constraint check actually measures
The check reads a handful of WebGL constants that the browser exposes through gl.getParameter(). The most telling values include MAX_TEXTURE_SIZE, MAX_CUBE_MAP_TEXTURE_SIZE, MAX_RENDERBUFFER_SIZE, and the list of supported compressed texture formats such as COMPRESSED_RGBA_S3TC_DXT5_EXT. On a genuine device these numbers match the GPU's documented specifications. In a virtualized or spoofed environment they often fall back to software renderer defaults or reveal a mismatch between the claimed device model and the actual graphics stack.
Step-by-step: how BotRefund extracts and uses the signal
- Initialize a WebGL context — the script creates a
canvaselement and requests awebglorwebgl2context. If the context fails, that failure itself becomes a data point. - Query the parameter set — the code calls
gl.getParameter()for each constant in the texture-constraint whitelist. The raw integers and enum lists are stored verbatim. - Normalize the payload — values are sorted, formatted, and hashed so the same hardware always produces the same fingerprint fragment regardless of browser version or OS patch level.
- Compare against the expected profile — BotRefund maintains a reference database of known-good profiles for common device/OS/browser combinations. A deviation flags the session for deeper review.
- Feed the signal into the correlation engine — the texture-constraint hash becomes one of 106 independent evidence items. It is not a verdict; it is a single fact that the AI model weighs alongside network reputation, behavioral biometrics, font enumeration, audio stack, and timing signals.
- Cross-check for corroboration — if the texture profile says "NVIDIA RTX 3080" but the user-agent claims an iPhone, and the pointer-movement signal shows linear robotic paths, the model sees three independent anomalies pointing the same way.
- Produce the final probability — the AI outputs a bot-likelihood score. Customers see the score and the contributing evidence in the audit dashboard, not a binary block/allow decision.
Why texture limits are harder to spoof than user-agent strings
Changing a user-agent header is trivial. Faking MAX_TEXTURE_SIZE requires either a real GPU with that capability or a software rasterizer that perfectly mimics the driver's edge cases — including how it handles out-of-memory errors, precision hints, and extension strings. Most headless automation frameworks (Puppeteer, Playwright, Selenium) run on top of a real browser, so they inherit the host machine's genuine WebGL caps. When the host is a headless Linux box with Mesa llvmpipe, the texture limits betray the container environment instantly.
Common mismatch patterns that raise the signal
- Desktop UA + mobile GPU caps — a Windows Chrome user-agent reporting a maximum texture size of 4096 (typical of integrated mobile GPUs) instead of 16384+ (common on discrete desktop cards).
- Missing compression formats — a device claiming to be a recent iPhone but lacking
COMPRESSED_RGBA_ASTC_4x4_KHRsupport. - Software renderer fingerprints — the
UNMASKED_RENDERER_WEBGLdebug extension (when available) reveals "llvmpipe" or "SwiftShader" instead of a vendor GPU string. - Inconsistent cubemap vs 2D limits — some virtualized stacks report identical values for
MAX_TEXTURE_SIZEandMAX_CUBE_MAP_TEXTURE_SIZE, which rarely happens on physical hardware.
How the signal fits into the 106-check evidence stack
BotRefund's architecture treats every check as independent evidence. The texture-constraint signal lives in the "Hardware & GPU Fingerprinting" category alongside canvas fingerprinting, WebGL parameter enumeration, audio context fingerprinting, and CPU benchmarking. Each category contributes orthogonal data: texture limits reveal the graphics stack, canvas reveals the rasterizer, audio reveals the DSP pipeline. When three categories disagree with the claimed device, the correlation engine has high confidence without relying on any single rule.
Verification step: confirm the signal in your own audit
Open the BotRefund dashboard for a flagged session. Locate the "WebGL Texture Constraint" row in the evidence table. Click the expand icon to see the raw parameter dump — MAX_TEXTURE_SIZE, supported extensions, renderer string. Compare those values against the device specification for the claimed user-agent. If they diverge, the signal is doing its job. If they match but the session is still flagged, look at the neighboring evidence rows (pointer behavior, tab speed, network reputation) to see which other signals triggered.
Key facts
| Fact | Detail |
|---|---|
| Signal category | Hardware & GPU Fingerprinting |
| Total independent checks in BotRefund | 106 |
| Primary WebGL constants measured | MAX_TEXTURE_SIZE, MAX_CUBE_MAP_TEXTURE_SIZE, MAX_RENDERBUFFER_SIZE, compressed format enums |
| Treatment of a single anomaly | Evidence only — not a verdict |
| Cross-check methodology | Correlated with browser, network, device, and behavioral signals |
| Final decision engine | AI prediction model weighing the complete pattern |
| Reported model accuracy | 99% (per BotRefund) |
Limitations and when the signal is less reliable
- Privacy-hardened browsers — Brave, Tor Browser, or Firefox with
privacy.resistFingerprintingenabled may clamp or randomize WebGL parameters, producing false positives for genuine users. - Corporate VDI environments — virtual desktop infrastructure often presents a generic GPU profile to all sessions, so legitimate employees share the same texture fingerprint.
- Driver updates — a GPU driver upgrade can change
MAX_TEXTURE_SIZEor expose new compression formats, shifting the baseline until the reference database is refreshed. - Software rasterizer fallback — on machines without hardware acceleration, the browser falls back to SwiftShader or llvmpipe, which have distinct but consistent limits that differ from the physical GPU.
Terminology quick reference
- WebGL context
- The JavaScript API object returned by
canvas.getContext('webgl')that exposes GPU capabilities. - Texture constraint
- A hard limit such as maximum dimensions or supported compression formats that the GPU driver enforces.
- Independent evidence
- A single measurable fact that does not depend on other checks; BotRefund collects 106 of these.
- Correlation engine
- The component that tests whether multiple independent signals support the same conclusion.
- AI prediction model
- The final classifier that weighs all evidence and outputs a bot-likelihood probability.
FAQ
Can a sophisticated bot spoof WebGL texture limits perfectly?
It would need to run on hardware that matches the target profile or implement a full software rasterizer that mimics every driver quirk. Most bot operators don't invest that effort; they accept the mismatch and rely on volume.
Does BotRefund block traffic based on this signal alone?
No. The documentation states explicitly: "A single anomaly is not a bot verdict." The signal is kept as evidence and cross-checked before the AI model decides.
What happens when a real user triggers a texture-constraint anomaly?
Privacy tools, corporate VDI, or unusual hardware can cause a mismatch. Because the signal is only one of 106, the model looks for corroboration. If the other 105 signals look human, the session scores low bot probability.
How often is the reference profile database updated?
BotRefund does not publish a fixed schedule, but the system ingests new device profiles continuously from live traffic across its customer base.
Can I see the raw WebGL parameters for a specific session?
Yes. In the audit dashboard, expand the "WebGL Texture Constraint" evidence row to view the full parameter dump.
Is this check available in the free bot audit?
The free audit runs the full 106-check suite, so texture-constraint analysis is included.
How does this differ from canvas fingerprinting?
Canvas fingerprinting renders an image and hashes the pixel output, capturing rasterizer behavior. Texture-constraint analysis reads static capability constants without drawing anything. They are orthogonal signals.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
How BotRefund can help
BotRefund runs the WebGL texture constraint check as part of its 106-signal audit on every paid visit. You get a session-level evidence table that shows the raw WebGL parameters, whether they match the claimed device, and how that signal combined with the other 105 checks to produce the final bot-likelihood score. The dashboard lets you drill into any flagged session, export the evidence dossier, and submit refund claims to Google and Meta with video proof. Setup takes about one minute — add the script, verify the first audit, and start recovering wasted ad spend.