Recognize
rucaptcha
Install / Use
/learn @kdinisv/RecognizeREADME
Recognize

Captcha solving library for Node.js
English
Lightweight zero-dependency captcha solving client for RuCaptcha and Anti-Captcha services (API v2).
- 0 runtime dependencies — uses native
fetch(Node.js 18+) - TypeScript — full type safety, autocompletion, exported types
- Dual ESM/CJS — works with
importandrequire - 30+ captcha types — reCAPTCHA, hCaptcha, Turnstile, FunCaptcha, GeeTest, and more
- Auto-polling — waits for result with configurable interval & timeout
Install
npm install recognize
Quick Start
import { RuCaptcha } from "recognize";
const solver = new RuCaptcha({
apiKey: "YOUR_API_KEY",
pollingInterval: 5000, // optional, default 5000ms
timeout: 180000, // optional, default 180000ms
});
// Check balance
const balance = await solver.getBalance();
console.log("Balance:", balance);
// Solve reCAPTCHA v2
const { taskId, solution } = await solver.recaptchaV2(
"https://example.com",
"SITE_KEY",
);
console.log(solution.gRecaptchaResponse);
// Report result
await solver.reportCorrect(taskId);
Anti-Captcha
import { AntiCaptcha } from "recognize";
const solver = new AntiCaptcha({ apiKey: "YOUR_API_KEY" });
Dynamic service selection
import { createSolver } from "recognize";
const solver = createSolver("rucaptcha", { apiKey: "YOUR_API_KEY" });
// or
const solver2 = createSolver("anticaptcha", { apiKey: "YOUR_API_KEY" });
Constructor Options
| Option | Type | Default | Description |
| ----------------- | -------- | -------- | ---------------------------- |
| apiKey | string | — | Required. API key |
| pollingInterval | number | 5000 | Polling interval in ms |
| timeout | number | 180000 | Max wait time per task in ms |
API
All solving methods return Promise<TaskResult<T>> where TaskResult<T> = { taskId: number, solution: T }.
Account
| Method | Description |
| ------------------------- | ------------------------- |
| getBalance() | Get account balance |
| reportCorrect(taskId) | Report correct solution |
| reportIncorrect(taskId) | Report incorrect solution |
Image & Text
| Method | Params | Task Type |
| ------------------------------ | ------------------------------------------------- | ----------------- |
| imageCaptcha(body, options?) | body — Buffer or base64 string | ImageToTextTask |
| textCaptcha(text, options?) | text — question string | TextCaptchaTask |
| audioCaptcha(body, lang?) | body — Buffer or base64, lang — language code | AudioTask |
reCAPTCHA
| Method | Params |
| -------------------------------------------------------- | ---------------------------------- |
| recaptchaV2(url, siteKey, options?) | Supports proxy via options.proxy |
| recaptchaV3(url, siteKey, action, minScore?, options?) | minScore default 0.3 |
| recaptchaV2Enterprise(url, siteKey, options?) | Enterprise version |
hCaptcha
await solver.hcaptcha(url, siteKey, options?)
Cloudflare Turnstile
await solver.turnstile(url, siteKey, options?)
FunCaptcha (Arkose Labs)
await solver.funcaptcha(url, publicKey, options?)
GeeTest
await solver.geetest(url, gt, challenge, options?)
await solver.geetestV4(url, captchaId, options?)
Amazon WAF
await solver.amazonWaf(url, siteKey, options?)
Other Captcha Types
| Method | Task Type |
| -------------------------------------------------------- | --------------------------------- |
| keyCaptcha(url, options?) | KeyCaptchaTaskProxyless |
| lemin(url, captchaId, apiServer, options?) | LeminTaskProxyless |
| capyPuzzle(url, siteKey, options?) | CapyTaskProxyless |
| dataDome(url, captchaUrl, userAgent, proxyConfig) | DataDomeSliderTask |
| cyberSiara(url, slideMasterUrlId, userAgent, options?) | AntiCyberSiAraTaskProxyless |
| mtCaptcha(url, siteKey, options?) | MtCaptchaTaskProxyless |
| friendlyCaptcha(url, siteKey, options?) | FriendlyCaptchaTaskProxyless |
| cutcaptcha(url, miseryKey, apiKey, options?) | CutCaptchaTaskProxyless |
| tencent(url, appId, options?) | TencentTaskProxyless |
| atbCaptcha(url, appId, apiServer, options?) | AtbCaptchaTaskProxyless |
| yandexSmart(url, siteKey, options?) | YandexSmartCaptchaTaskProxyless |
| vkCaptcha(url, siteKey, options?) | VKCaptchaTaskProxyless |
| temuCaptcha(url, options?) | TemuCaptchaTaskProxyless |
Image-Based Tasks
| Method | Task Type |
| ------------------------------------ | ----------------- |
| rotateCaptcha(body, options?) | RotateTask |
| coordinatesCaptcha(body, options?) | CoordinatesTask |
| gridCaptcha(body, options?) | GridTask |
| boundingBoxCaptcha(body, options?) | BoundingBoxTask |
| drawAroundCaptcha(body, options?) | DrawAroundTask |
Generic / Custom
// Send any task type directly
await solver.solve<{ token: string }>({
type: "SomeNewTaskType",
websiteURL: "https://example.com",
});
Proxy Support
Methods that support proxy accept it via options:
await solver.recaptchaV2("https://example.com", "SITE_KEY", {
proxyType: "http",
proxyAddress: "1.2.3.4",
proxyPort: 8080,
proxyLogin: "user",
proxyPassword: "pass",
proxy: true,
});
Exported Types
import type {
SolverOptions,
TaskResult,
TokenSolution,
GRecaptchaSolution,
ImageSolution,
GeeTestSolution,
GeeTestV4Solution,
ProxyOptions,
RecaptchaV2Options,
HCaptchaOptions,
TurnstileOptions,
// ... and more
} from "recognize";
Migration from v2
| v2 (old) | v3 (current) |
| --------------------------------------- | ------------------------------- |
| new Recognize(SOURCE.RUCAPTCHA, {}) | new RuCaptcha({ apiKey }) |
| new Recognize(SOURCE.ANTICAPTCHA, {}) | new AntiCaptcha({ apiKey }) |
| { key: "..." } | { apiKey: "..." } |
| balanse() | getBalance() |
| solvingImage(buff) | imageCaptcha(buff) |
| solvingRecaptcha2() | recaptchaV2(url, key) |
| solvingRecaptcha3() | recaptchaV3(url, key, action) |
| reportGood(id) | reportCorrect(taskId) |
| reportBad(id) | reportIncorrect(taskId) |
| return { id, result } | return { taskId, solution } |
Comparison with Similar Libraries
| Feature | recognize | @2captcha/captcha-solver | 2captcha-ts | rucaptcha-2captcha | anticaptcha |
| -------------------- | :-----------: | :------------------------: | :-----------: | :------------------------------: | :-----------: |
| Runtime dependencies | 0 | node-fetch | node-fetch | axios + cheerio + ts-utils | apisauce |
| TypeScript (native) | ✅ | ❌ JS | ❌ JS | ✅ | ❌ JS |
| ESM + CJS | ✅ | ❌ | ❌ | ❌ | ❌ |
| RuCaptcha support | ✅ | ✅ | ✅ | ✅ | ❌ |
| Anti-Captcha support | ✅ | ❌ | ❌ | ❌ | ✅ |
| Actively maintained | ✅ 2025 | ✅ 2025 | ✅ 2025 | ❌ 2021 | ❌ 2022 |
recognize is the only library that supports both RuCaptcha and Anti-Captcha with zero runtime dependencies, written in native TypeScript with a dual ESM/CJS build.
License
See LICENSE file.
Русский
Лёгкий клиент для решения капч без сторонних зависимостей. Поддерживает сервисы RuCaptcha и Anti-Captcha (API v2).
- 0 зависимостей — использует встроенный
fetch(Node.js 18+) - TypeScript — полная типизация, автодополнение, экспортируемые типы
- Dual ESM/CJS — работает с
importиrequire - 30+ типов капч — reCAPTCHA, hCaptcha, Turnstile, FunCaptcha, GeeTest и другие
- Автополлинг — ожидает результат с настраиваемым интервалом и таймаутом
Установка
npm install recognize
Быстрый старт
import { RuCaptcha } from "recognize";
const solver = new RuCaptcha({
apiKey: "ВАШ_API_КЛЮЧ",
pollingInterval: 5000, // опционально, по умолчанию 5000 мс
timeout: 180000, // опционально, по умолчанию 1800
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
