FunCaptcha Solver: Bypass Arkose Labs Captcha on Roblox & More
If you have ever tried to automate anything on Roblox, you know the pain. Every login attempt, every account creation, every sensitive action hits you with a FunCaptcha challenge from Arkose Labs. These are not your typical "click all the traffic lights" puzzles. They are 3D rotating objects, tile matching games, dice pair logic, shadow identification, and dozens of other creative ways to slow you down. This guide covers how a FunCaptcha solver based on image click recognition actually works, how to wire it into your scripts, and what mistakes to avoid along the way.
What Makes FunCaptcha So Annoying
FunCaptcha (the official name is Arkose Labs CAPTCHA, but nobody calls it that) is not just a visual challenge. Before you even see the puzzle, the system has already collected a full browser fingerprint. Arkose Labs calls this encrypted blob BDA, short for Browser Data Analytics. It tracks your mouse movement, interaction timing, screen resolution, installed fonts, WebGL renderer, and a whole list of other signals. Based on all that data, it decides how hard to make the challenge, or whether to show one at all.
The challenges themselves come in a few flavors. On Roblox, the most common ones are tile picking games, where you pick one image from a grid based on an instruction like "Pick the horse". Then there are 3D rotation puzzles, where you have to spin an object using arrow buttons until it faces the right direction. And finally, there are logic puzzles: matching dice that add up to a number, finding the odd shadow, connecting identical icons, or spotting the distorted object. Roblox uses all of these, and the difficulty ramps up if Arkose Labs thinks your traffic looks suspicious.
This is exactly why you need a dedicated FunCaptcha solver. Simple scripts and browser extensions do not cut it here. The variety of challenge types is too large, the fingerprinting layer is too deep, and Arkose Labs updates their system frequently.
How Image Click Solving Works
The idea behind a click based FunCaptcha solver is straightforward. Instead of trying to reverse engineer the Arkose Labs JavaScript or spoof the BDA fingerprint (which breaks every few weeks), you treat each challenge as an image recognition problem. Here is what happens under the hood:
Your automation script encounters a FunCaptcha challenge. It takes a screenshot of the challenge image and reads the instruction text (something like "Pick the ladybug" or "Pick the dice pair whose top sides add up to 7"). Both get sent to the solver API. The API analyzes the image, figures out which tile or position is correct, and sends back either pixel coordinates or cell numbers. Your script clicks in the right spot, and the challenge is solved.
This works for every FunCaptcha variant, tile picks, rotations, dice, shadows, everything, because the API handles the image classification on its end. You do not need separate code for each challenge type. Cap.Guru currently supports over 100 different FunCaptcha tasks, and they add new ones as Arkose Labs rolls them out.
TIP
The solver handles tile picking (animals, objects, vehicles), dice pair matching, shadow identification, card pairing, 3D object rotation, maze solving, and many other types. If Arkose Labs invents a new challenge next week, it gets added to the solver.
Solving Roblox Captcha Step by Step
Here is the actual workflow. Nothing fancy, just four steps that plug into any automation framework.
1. Capture the challenge image
When FunCaptcha loads inside the Roblox page, grab a screenshot of the full challenge area. Make sure you get the complete image, not a cropped version, and note the instruction text shown above the grid. You can send the image as a multipart file or encode it in base64.
2. Submit the task
Send a POST to http://api2.cap.guru/in.php with these parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
key | String | Yes | Your API key |
method | String | Yes | post for file upload, base64 for encoded image |
textinstructions | String | Yes | The instruction text, e.g. Pick the ladybug. Must be in English |
click | String | Yes | funcap returns pixel coordinates, funcap2 returns cell numbers |
file | File | Conditional | The image file (when method=post) |
body | String | Conditional | Base64 encoded image (when method=base64) |
json | Number | No | Set to 1 for JSON response instead of plain text |
You get back a task ID.
3. Get the result
Wait about 5 seconds, then GET http://api2.cap.guru/res.php with your key, action=get, and the task id.
The response looks like this depending on the mode you chose:
- funcap mode —
OK|coordinate:x=44,y=32(pixel position, origin at top left) - funcap2 mode —
OK|1,2,6,9(cell numbers in the grid) - Not done yet —
CAPCHA_NOT_READY(just wait 5 seconds and try again)
4. Click and move on
Use the coordinates or cell numbers to click inside the challenge. If Roblox serves you multiple waves (it often does when the risk score is high), take a new screenshot after each wave and repeat the process. Keep going until FunCaptcha accepts the answer.
Full code examples are in the documentation.
The Three Types of Roblox FunCaptcha
Not all Roblox captcha challenges are the same, and your solver needs to handle all of them. Here is a quick breakdown.
Tile picking is the most common. You see a grid of images and an instruction like "Pick the cat". One image matches, the rest do not. This is what shows up on most Roblox login and signup attempts. The FunCaptcha solver identifies the correct tile and returns its position.
3D rotation is trickier. You get an object that you rotate with arrow buttons until it faces the right direction. Each arrow press changes the image, so you need a fresh screenshot and a new API call after every interaction. These challenges can have multiple waves, meaning you solve one and immediately get another.
Logic puzzles are the hardest for humans but not necessarily for the solver. Dice pairs that add up to a specific number, shadows that match a silhouette, cards with matching symbols, animals walking in a particular direction. They show up during high risk actions or when Arkose Labs has flagged your session.
| Type | What it looks like | When you see it |
|---|---|---|
| Tile Pick | Grid of images, pick the matching one | Login, signup, password reset |
| 3D Rotation | Object with arrow controls, rotate to correct position | Login, signup on Roblox and Microsoft |
| Logic Puzzles | Dice, shadows, cards, mazes | High risk actions, flagged sessions |
Plugging It Into Your Automation Stack
The API itself is simple. The real question is how you wire it into Selenium, Puppeteer, Playwright, or whatever you are using.
With Selenium, locate the FunCaptcha iframe, switch into it, grab a screenshot of the challenge element, fire off the API call, and then use ActionChains to click the coordinates you get back.
With Puppeteer or Playwright, it is even cleaner. Use page.screenshot() on the challenge element, send the image to the API, and call page.mouse.click(x, y) with the pixel coordinates from the response.
The typical Roblox flow goes like this: open the login page, fill in credentials, trigger the captcha, screenshot the challenge, send it to the FunCaptcha solver, click the answer, and repeat if there are more waves. The whole thing takes a few seconds per wave. Since the clicks happen at real pixel positions inside a real browser, Arkose Labs behavioral analysis sees normal human like interaction patterns, which is the whole point of using a click based approach instead of token injection.
Mistakes That Will Waste Your Time
A few things trip people up when they first start using a Roblox captcha solver. Here is what to watch out for.
Bad screenshots are the number one problem. If you crop the image, include browser UI outside the challenge area, or capture it at a different resolution than what is displayed, the coordinates will not line up. The API needs the exact challenge image as the user sees it.
Wrong task text is the second biggest issue. The textinstructions value has to match what FunCaptcha actually shows. If the challenge says "Pick the cat" and you send "Pick the dog", you are going to get wrong answers. Also, instructions must be in English, even if the rest of the page is in another language.
Skipping waves is a subtle one. Some people solve the first challenge and assume they are done. Roblox often serves two or three waves in a row, especially for new accounts or suspicious IPs. After each successful click, check whether a new challenge appeared, and if it did, screenshot and solve again.
Coordinate misalignment happens when the element size on screen does not match the screenshot dimensions. If you are running a headless browser at a different viewport size than what you screenshot, the pixel positions will be off. Keep them consistent.
WARNING
If clicks keep missing: check the screenshot quality, verify the task text matches exactly, and make sure the screenshot dimensions equal the displayed element size.
Getting the Best Results
A few practical tips from people who run this at scale.
Use residential proxies. Datacenter IPs get flagged instantly by Arkose Labs. The harder your IP looks, the harder the challenges get, and the more waves you have to solve. Residential or mobile proxies make a real difference.
Keep your fingerprint consistent. Arkose Labs builds a risk profile from the BDA fingerprint. If your headless browser is leaking obvious automation signals (missing WebGL, weird user agent, no fonts), you are going to get maximum difficulty challenges every single time. Use a properly configured browser, not raw HTTP requests.
Add human like delays. Do not click the answer the instant you get the API response. Real humans take a second to look at the image and move the mouse. A small random delay between receiving coordinates and clicking makes your traffic look much more natural.
Handle waves properly. For high volume work, fire off the next screenshot and API call immediately after each wave completes. Cap.Guru supports concurrent requests, so you can pipeline multiple challenges at once if you are solving across several sessions.
Why Cap.Guru Works for This
There are several FunCaptcha solvers out there, but Cap.Guru is built specifically for the click based approach. It covers over 100 tile picking tasks, 3D rotation puzzles, dice challenges, shadow matching, card pairing, and every other Arkose Labs challenge type currently in rotation. Two response modes (pixel coordinates and cell numbers) give you flexibility depending on your framework. New challenge types get added as soon as Arkose Labs deploys them.
The API is a standard REST interface. If your code can make HTTP requests, it can use Cap.Guru. Works with Selenium, Puppeteer, Playwright, or plain curl if that is your thing. And because the solving is based on actual image recognition and real clicks rather than token spoofing, it holds up even as Arkose Labs updates their detection. That matters when you are building something that needs to keep running, not just pass a demo.