Free Xbox pad check
Xbox controller tester that names the button that is failing
An Xbox pad reaches the browser already rearranged onto the W3C standard layout, so index 0 is A, index 6 is the left trigger and index 16 is the Xbox button — which is what lets this page draw the controller and light the control you are holding under its own name. Walk all seventeen and the checklist tells you which square never turned, and the trigger panel shows where each trigger rests when your finger is off it. The id string also carries the USB product code, so the page can name the model and whether that code is the wired one or the Bluetooth one; the connection itself is something the browser never reports.
- 100% free
- No signup
- 17 controls checked
- Names the model
- Trigger rest values
How to test an Xbox controller
Identify the pad, prove every control, then look at the triggers properly.
Squeeze a trigger, then check the pad is the one the page thinks it is
A controller stays hidden from a web page until it sends something, so pull LT or press A to introduce it. The connection panel then reads the USB product code out of the id string and names the model — Series X|S, One S, Elite Series 2, 360 — along with whether that code is the wired one or the Bluetooth one. If the panel names a different controller than the one in your hands, a remapper or a third-party driver is sitting in between.
Walk all seventeen controls until nothing is gray
Every square starts gray, turns cyan once it has registered at least once, and flashes amber while you are holding it. Press the four face buttons, both bumpers, both triggers, View and Menu, the Xbox button, click both sticks in, and push the D-pad in all four directions on its own rather than diagonally. The counter tracks how many of the seventeen have proved themselves, and lists by name whatever is still gray when you stop.
Pull each trigger slowly and read where it rests
Triggers are the one control with somewhere to hide a fault. Let go of both and look at the two resting values in the panel: a healthy trigger sits at 0.000 and a worn one sits a little above it, and that number climbing over months is what precedes a trigger that fires by itself. Then pull each one slowly to the stop and watch the bar fill without steps or gaps.
Technical specifications
| Controls on the drawing | 17 — four face buttons, two bumpers, two triggers, View, Menu, Xbox, two stick clicks, four D-pad directions |
|---|---|
| Trigger scale | 0.00 to 1.00 here; XInput keeps the same trigger as a byte from 0 to 255 and ignores everything below 30 |
| Stick resolution | About 0.00003 per step — a 16-bit driver reading rescaled onto -1 to 1 |
| Buttons past the standard 17 | Listed by raw index: Share on a Series controller and unassigned Elite paddles land here with no name in the specification |
| Model detection | 12 Microsoft product codes recognized, covering the 360, One, One S, Series X|S, Elite Series 2 and Adaptive Controller |
| Connection guess | Read from the product code, not reported by the API — 0x0B12 is a Series pad wired or on the adapter, 0x0B13 the same pad over Bluetooth |
| Browsers publishing USB codes | Chrome and Firefox put vendor and product in the id string; Safari does not, so the model line is blank there |
| What leaves the tab | Nothing — the pad is read from a snapshot object and no connection of any kind is opened for it |
Frequently asked questions
Which Xbox controllers can a browser actually read?
Every model Microsoft has shipped since the 360, provided the operating system has a driver for it. Windows recognizes the 360 pad, the Xbox One family, the Series X|S controller, both Elite generations and the Adaptive Controller, and the browser inherits all of them as standard-mapping devices. macOS gained native support in Big Sur, and Linux handles them through xpad and xone. What matters to the page is not the model but whether the mapping came through as standard — that is what makes A actually A.
Does it matter whether I connect over Bluetooth or the Xbox Wireless Adapter?
It changes what the page can tell you, and it changes rumble. The API has no field for how a controller is attached, but the wired and wireless firmwares of the same pad carry different USB product codes: a Series controller on a cable or through the adapter identifies as 0x0B12, and the same controller over Bluetooth identifies as 0x0B13. That is what the connection panel is reading. Rumble is the practical difference — over USB it works in Chromium almost always, over Bluetooth on macOS the actuator is often present and silent.
The Share button on my Series controller does nothing here.
Share is outside the standard mapping, which stops at seventeen indices and was fixed before that button existed. Depending on the operating system, the driver and the pad's firmware it either arrives as an unnamed extra button past index 16 — the page lists any it finds, so check that row — or it is swallowed before the browser sees it by whatever handles screenshots on your system. Neither outcome says anything about the button itself.
Should the Xbox button in the middle light up?
It usually does, at index 16, but not always and not because of the controller. On Windows the Game Bar can claim the Guide button for itself, and on a machine with the Xbox app running it may never reach the browser at all. Steam's controller support does the same thing when Big Picture is configured to open on that button. If index 16 stays gray while every other control works, close those two and try again before concluding anything.
How do the names on this page line up with XInput?
One to one, which is why the table under the drawing prints both. The standard mapping the browser applies was modeled on XInput, so index 0 is XINPUT_GAMEPAD_A, index 4 is XINPUT_GAMEPAD_LEFT_SHOULDER, index 12 through 15 are the four D-pad flags, and the two triggers correspond to bLeftTrigger and bRightTrigger. The one difference worth knowing is scale: XInput keeps triggers as a byte from 0 to 255 and the browser hands you a fraction, so 0.5 here is 128 there.
My left trigger reads 0.09 with my finger off it. Is that a fault?
Not yet — XInput itself discards anything below 30 out of 255, which is 0.118 on this page's scale, so a resting value under that is inside what Windows was designed to ignore and no game will react to it. It matters as a trend rather than a reading: note the number, check again in a few weeks, and a trigger whose rest position keeps climbing is wearing out. A resting value over 0.2 is already past what most games tolerate and will feel like a trigger that is always slightly held.
Do the paddles on an Elite controller show up?
Only if they are not mapped to something else. By default the Xbox Accessories app assigns each paddle to copy a face button, so pressing P1 lights whichever button it was bound to and never appears as its own input. Clear the assignments in the app and the paddles arrive as extra buttons past index 16, in the extras row. An Elite with a profile loaded from the controller's own memory behaves the same way — the remapping happens inside the pad, before anything reaches the cable.
About the standard mapping and what Xbox pads do inside it
The layout every controller on the web is measured against is an Xbox pad in all but name. When the W3C wrote the standard mapping it picked the arrangement that had already won on Windows — XInput — and froze it at seventeen buttons and four axes. That is why an Xbox controller in a browser needs no translation layer and no vendor software: the driver hands over XInput, the browser relabels it, and index 0 comes out as A. It is also why a DualSense in the same browser reports Cross at index 0 and a Switch Pro controller reports B there, which surprises people who assume the numbering describes the pad in their hands rather than a pad from 2005.
The seventeen slots are the whole vocabulary, and they were fixed before two things Microsoft later added. The Share button on Series controllers has no index reserved for it, so it turns up past the end of the standard range or not at all, depending on which component of your operating system grabs screenshots. Elite paddles are worse: they are resolved inside the controller itself, so a paddle bound to A is genuinely indistinguishable from A by the time anything reaches the cable, and the only way to see them separately is to clear their assignments first. Neither limitation is the fault of the browser, and neither can be worked around by a web page. A pad that does not report mapping: "standard" at all — a clone, or a genuine pad behind a remapper — is better read as raw indices in the gamepad tester, which makes no assumptions about shape.
Two numbers on this page are worth watching over time rather than reading once. The first is where each trigger rests, because Xbox triggers are Hall-effect on recent models but sit on a return spring that does age, and a resting value that has climbed from 0.00 to 0.15 across a year is a trigger on its way out. The second is what happens to the sticks when you put the pad down, which this page shows as a dot that will not settle and the stick drift test turns into a measured figure over sixty seconds. One thing no controller page can measure is lag: the browser samples the pad once per screen redraw, so at 60 Hz your input is up to 16.7 ms old before the page has even looked at it — the Hz to ms converter does that arithmetic for whatever rate your display runs at. If your pad is not a pad at all but a stick with a throttle attached, the joystick test handles the axes this drawing has no room for.
Where the model detection happens
Every number on this page is worked out by JavaScript running in the tab you are reading it in. Nothing you type, paste or open is uploaded, logged or kept, which is also why the tools carry on working after you disconnect from the network.
The product-code lookup is a twelve-entry table compiled into this page. Your controller’s id string is matched against it in the tab and nothing is queried over the network, which is also why a model Microsoft released after this page was written comes back as unrecognized rather than as a fresh answer.