Solve hCaptcha in Octo Browser profiles.
Octo Browser is an anti-detect browser that runs many browser profiles, each with its own fingerprint and proxy. Its profiles take Chrome Web Store extensions, and the NoneCap hCaptcha solver is on the Chrome Web Store: add it in a profile's Extensions section and it solves hCaptcha there as you browse. If you start profiles from code through Octo's Local API, request tokens from the NoneCap API instead; that route is further down. NoneCap is a captcha solver service that focuses on hCaptcha, and does not solve reCAPTCHA or Turnstile.
Add the extension to a profile
These steps follow Octo Browser's own installing extensions page. Extensions work in Windows and macOS profiles, not Android profiles. This is the NoneCap listing's URL:
https://chromewebstore.google.com/detail/nonecap-%E2%80%94-hcaptcha-auto-s/kahepbmokpbbkfognbmimpmnlfibcolf - Copy the URL above.
- In Octo Browser, open the profile's settings (or a template's) and check that Extensions is on under Cloud storage. Octo saves a profile's extensions only with that switch on.
- Go to Extensions and click Add a new extension.
- In the From the Web Store tab, paste the URL and click Add. Leave Enable auto-update ticked so the extension keeps updating.
- Save the profile, start it and open a page with hCaptcha. When the challenge opens, the extension solves it on the page.
Other ways to add it
- Many profiles at once. Once added, the extension is in your account's extension list for every team member and device. Tick the profiles in the client, click Extensions at the bottom and click + next to NoneCap. Octo applies bulk changes to up to 1,000 profiles at a time, and not to profiles that are running.
- Inside a running profile. Start a profile, open the NoneCap listing and click Add to Chrome, then close the profile so Octo syncs the extension to your account.
- From a file. Every NoneCap extension release is published on GitHub as a zip. In Add a new extension, the From file or folder tab takes the zip or the unzipped folder.
Things to know
- Windows and macOS profiles only. Octo's docs say extensions cannot be added to Android profiles.
- The extension needs Chrome 120 or newer.
- Extensions belong to your Octo account. If you transfer a profile to another Octo account, the extension does not go with it.
- While it solves, the browser shows a "started debugging this browser" banner. That is expected: the extension attaches only for the solve and detaches when the attempt ends. The extension privacy policy says what it sends.
- Settings and your API key are stored per profile.
Free solves or your API key
The extension includes 100 free solves a day without an account, which suits a few profiles. For more, create a NoneCap account, copy an API key from the dashboard and paste it into the extension's options in each profile. Solves then draw from your balance, from 1 credit per challenge round, and a failed solve is never charged. See pricing.
Profiles you start from code
Octo's
Local API
runs inside the desktop app on http://localhost:58888 while
the app is open and signed in. A POST to
/api/profiles/start with the profile's uuid and
debug_port: true starts it with an automation port and returns
ws_endpoint and debug_port. Playwright and
Puppeteer connect to ws_endpoint; Selenium attaches through
debuggerAddress at 127.0.0.1: plus
debug_port, as Octo's
API guide
shows. A POST to /api/profiles/stop with the same
uuid closes it. Octo's
pricing page
lists API access on Base and higher plans.
In a script, request the token yourself rather than waiting on the
extension: read the page's sitekey,
call NoneCap with the Node SDK (npm install nonecap playwright),
put the token in h-captcha-response and submit:
import { chromium } from "playwright";
import { NoneCap } from "nonecap";
const OCTO = "http://localhost:58888/api/profiles";
const uuid = process.env.OCTO_PROFILE_UUID;
const nc = new NoneCap({ apiKey: process.env.NONECAP_KEY });
// The Octo Browser app must be running and signed in.
const res = await fetch(`${OCTO}/start`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ uuid, headless: false, debug_port: true }),
});
const started = await res.json();
if (!res.ok) throw new Error(`Octo start failed: ${JSON.stringify(started)}`);
const browser = await chromium.connectOverCDP(started.ws_endpoint);
const page = await browser.contexts()[0].newPage();
await page.goto("https://target.example/login", { waitUntil: "networkidle" });
const sitekey = await page.getAttribute("[data-sitekey]", "data-sitekey");
const solve = await nc.solve({
type: "hcaptcha",
sitekey,
url: page.url(),
user_agent: await page.evaluate(() => navigator.userAgent),
// proxy: "http://user:pass@host:port", // the profile's own proxy, if it has one
});
await page.evaluate((token) => {
for (const name of ["h-captcha-response", "g-recaptcha-response"]) {
const el = document.querySelector(`textarea[name="${name}"]`);
if (el) el.value = token;
}
}, solve.token);
await Promise.all([page.waitForNavigation(), page.click("[type=submit]")]);
await browser.close();
await fetch(`${OCTO}/stop`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ uuid }),
});
Pass the profile's user agent as user_agent, as above: some
sites accept a token only from the browser version that solved it. If the
profile runs through a proxy, send that proxy as proxy so the
token is solved from the same address the profile submits it from. For an
invisible widget, call its data-callback with the token after
injecting it; the Playwright guide shows
how. If a profile's proxy is slow to connect, Octo's docs suggest raising
timeout (seconds) in the start request.
Use it where you're allowed to
NoneCap's terms rule out fraud, credential stuffing, spam and unauthorised access, and leave it to you to check the terms of the sites your profiles visit.
Last updated November 2026.
Frequently asked
Can I add a captcha solver extension to Octo Browser?
Why doesn't the extension show up or stay in my profile?
Which Octo Browser plan do I need?
Does it solve reCAPTCHA or Cloudflare Turnstile?
Can I use NoneCap with the Octo Browser API?
POST to localhost:58888/api/profiles/start and debug_port: true, connect Playwright or Puppeteer to the ws_endpoint it returns, and request the token from the NoneCap API. The Node example on this page does exactly that.