Skip to content
CaptchAPI
Guides

Migrating from CapSolver or Anti-Captcha

What changes, what does not, and what to check before you cut over.

CaptchAPI implements the anti-captcha contract that CapSolver, CapMonster and Anti-Captcha all descend from. In most codebases the migration is two constants. This page is the honest list of what else you should look at.

From CapSolver

Change the base URL and the key. Task type names, the request shape, the polling contract and the error codes are the same. Your existing retry logic keeps working because HTTP stays 200 and errorId still carries the outcome.

- const API = 'https://api.capsolver.com';
+ const API = 'https://api.captchapi.com';

- clientKey: process.env.CAPSOLVER_KEY,
+ clientKey: process.env.CAPTCHAPI_KEY,

From Anti-Captcha

Same three endpoints, same field names. Anti-Captcha's numeric errorId values map to our string errorCode values, which you may already be reading — if you branch on the numeric code, switch to errorCode before cutting over.

- POST https://api.anti-captcha.com/createTask
+ POST https://api.captchapi.com/createTask

- POST https://api.anti-captcha.com/getTaskResult
+ POST https://api.captchapi.com/getTaskResult

- POST https://api.anti-captcha.com/getBalance
+ POST https://api.captchapi.com/getBalance

What is actually different

  • Cloudflare full-page challenges return a cookies object plus a userAgent instead of a token. If your client assumes solution.token always exists, that assumption breaks here.
  • cost is returned as a string in USD after your volume discount, so it will not match a competitor's list price.
  • Results are retained for 5 minutes, which is shorter than some providers. Read the solution promptly.
  • We do not sell proxies. Proxy fields are honoured but you bring your own egress.
  • There is no soft-ID or affiliate parameter, and no per-task priority flag. Every task is treated the same.

Cut-over checklist

  • Top up a small balance and run one task of each type you actually use, against a real target rather than a test sitekey.
  • Confirm your code reads solution.cookies for Cloudflare tasks if you use them.
  • Point a canary at CaptchAPI for a few percent of traffic and compare your own p50 and p95 before moving the rest.
  • Keep the old provider's key configured for a week. Switching back should be a config change, and we would rather you were able to.
  • Set a balance alert. It is the one failure mode that looks like an outage but is not.

Migrating a large integration and something does not line up? Send us the request you are sending and the response you expected. Compatibility gaps are bugs on our side and we treat them that way.