capzy 0.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. capzy-0.0.1/.gitattributes +4 -0
  2. capzy-0.0.1/.github/workflows/publish.yml +74 -0
  3. capzy-0.0.1/.gitignore +32 -0
  4. capzy-0.0.1/CHANGELOG.md +34 -0
  5. capzy-0.0.1/LICENSE +21 -0
  6. capzy-0.0.1/MANIFEST.in +7 -0
  7. capzy-0.0.1/PKG-INFO +444 -0
  8. capzy-0.0.1/README.md +412 -0
  9. capzy-0.0.1/capzy/__init__.py +36 -0
  10. capzy-0.0.1/capzy/_version.py +1 -0
  11. capzy-0.0.1/capzy/client.py +224 -0
  12. capzy-0.0.1/capzy/exceptions.py +61 -0
  13. capzy-0.0.1/capzy-icon.png +0 -0
  14. capzy-0.0.1/capzy-logo.svg +73 -0
  15. capzy-0.0.1/docs/README.md +17 -0
  16. capzy-0.0.1/docs/authentication.md +77 -0
  17. capzy-0.0.1/docs/error-handling.md +136 -0
  18. capzy-0.0.1/docs/faq.md +89 -0
  19. capzy-0.0.1/docs/getting-started.md +95 -0
  20. capzy-0.0.1/docs/installation.md +105 -0
  21. capzy-0.0.1/docs/pricing.md +83 -0
  22. capzy-0.0.1/docs/proxies.md +85 -0
  23. capzy-0.0.1/docs/publishing.md +65 -0
  24. capzy-0.0.1/docs/task-types.md +434 -0
  25. capzy-0.0.1/examples/README.md +77 -0
  26. capzy-0.0.1/examples/akamai_bmp.py +41 -0
  27. capzy-0.0.1/examples/alibaba.py +37 -0
  28. capzy-0.0.1/examples/altcha.py +36 -0
  29. capzy-0.0.1/examples/aws_waf.py +38 -0
  30. capzy-0.0.1/examples/aws_waf_classification.py +29 -0
  31. capzy-0.0.1/examples/balance_check.py +12 -0
  32. capzy-0.0.1/examples/binance.py +19 -0
  33. capzy-0.0.1/examples/captchafox.py +40 -0
  34. capzy-0.0.1/examples/capy.py +39 -0
  35. capzy-0.0.1/examples/cloudflare_challenge.py +27 -0
  36. capzy-0.0.1/examples/cloudflare_turnstile.py +49 -0
  37. capzy-0.0.1/examples/coordinates.py +32 -0
  38. capzy-0.0.1/examples/datadome.py +31 -0
  39. capzy-0.0.1/examples/friendly_captcha.py +37 -0
  40. capzy-0.0.1/examples/funcaptcha.py +39 -0
  41. capzy-0.0.1/examples/geetest_v3.py +45 -0
  42. capzy-0.0.1/examples/geetest_v4.py +41 -0
  43. capzy-0.0.1/examples/image_to_text.py +34 -0
  44. capzy-0.0.1/examples/imperva.py +43 -0
  45. capzy-0.0.1/examples/kasada.py +38 -0
  46. capzy-0.0.1/examples/lemin.py +38 -0
  47. capzy-0.0.1/examples/math_captcha.py +26 -0
  48. capzy-0.0.1/examples/mtcaptcha.py +37 -0
  49. capzy-0.0.1/examples/perimeterx.py +36 -0
  50. capzy-0.0.1/examples/recaptcha_v2.py +42 -0
  51. capzy-0.0.1/examples/recaptcha_v2_enterprise.py +39 -0
  52. capzy-0.0.1/examples/recaptcha_v3.py +62 -0
  53. capzy-0.0.1/examples/recaptcha_v3_enterprise.py +42 -0
  54. capzy-0.0.1/examples/rotate.py +24 -0
  55. capzy-0.0.1/examples/shopee_curve.py +35 -0
  56. capzy-0.0.1/examples/shopee_slider.py +35 -0
  57. capzy-0.0.1/examples/temu.py +35 -0
  58. capzy-0.0.1/examples/tencent.py +38 -0
  59. capzy-0.0.1/examples/yandex.py +37 -0
  60. capzy-0.0.1/examples/yidun.py +37 -0
  61. capzy-0.0.1/pyproject.toml +52 -0
@@ -0,0 +1,4 @@
1
+ * text=auto eol=lf
2
+ *.png binary
3
+ *.jpg binary
4
+ *.ico binary
@@ -0,0 +1,74 @@
1
+ name: Publish to PyPI
2
+
3
+ # Triggered when you publish a GitHub Release.
4
+ # Tag the commit (e.g. `v0.0.1`), draft a release on GitHub, hit
5
+ # "Publish release" — this job builds the sdist + wheel and uploads
6
+ # them to PyPI using OIDC (no API token needed).
7
+ #
8
+ # Set up on the PyPI side (one-time):
9
+ # pypi.org → Account settings → Publishing → Add a new pending publisher
10
+ # PyPI Project Name: capzy
11
+ # Owner: capzy-ai
12
+ # Repository name: capzy-pip
13
+ # Workflow name: publish.yml
14
+ # Environment name: (leave blank — see note below)
15
+ #
16
+ # To add a manual-approval gate before each release, create a GitHub
17
+ # environment called `pypi` (Settings → Environments), require reviewers,
18
+ # uncomment the `environment:` line below, and add "pypi" to the
19
+ # Environment name field on the PyPI form.
20
+
21
+ on:
22
+ release:
23
+ types: [published]
24
+ workflow_dispatch: # also runnable from the Actions tab
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ jobs:
30
+ build:
31
+ name: Build distributions
32
+ runs-on: ubuntu-latest
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+
36
+ - uses: actions/setup-python@v5
37
+ with:
38
+ python-version: "3.x"
39
+
40
+ - name: Install build tooling
41
+ run: python -m pip install --upgrade build
42
+
43
+ - name: Build sdist + wheel
44
+ run: python -m build
45
+
46
+ - name: Validate metadata
47
+ run: |
48
+ python -m pip install --upgrade twine
49
+ python -m twine check dist/*
50
+
51
+ - name: Upload artifacts
52
+ uses: actions/upload-artifact@v4
53
+ with:
54
+ name: dist
55
+ path: dist/
56
+
57
+ publish:
58
+ name: Publish to PyPI
59
+ needs: build
60
+ runs-on: ubuntu-latest
61
+ # environment: pypi # uncomment to require manual approval per release
62
+ permissions:
63
+ id-token: write # required for trusted publishing (OIDC)
64
+ steps:
65
+ - name: Download built distributions
66
+ uses: actions/download-artifact@v4
67
+ with:
68
+ name: dist
69
+ path: dist/
70
+
71
+ - name: Publish to PyPI
72
+ uses: pypa/gh-action-pypi-publish@release/v1
73
+ # No `password:` field — auth is via OIDC against the trusted
74
+ # publisher configured on pypi.org.
capzy-0.0.1/.gitignore ADDED
@@ -0,0 +1,32 @@
1
+ # Build artefacts
2
+ build/
3
+ dist/
4
+ *.egg-info/
5
+ *.egg
6
+
7
+ # Bytecode
8
+ __pycache__/
9
+ *.py[cod]
10
+ *$py.class
11
+
12
+ # Virtual envs
13
+ .venv/
14
+ venv/
15
+ env/
16
+
17
+ # Tests / coverage
18
+ .pytest_cache/
19
+ .coverage
20
+ htmlcov/
21
+ .tox/
22
+
23
+ # Editors
24
+ .vscode/
25
+ .idea/
26
+ *.swp
27
+ .DS_Store
28
+
29
+ # Local secrets
30
+ .env
31
+ .env.*
32
+ !.env.example
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+
3
+ All notable changes to `capzy` are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project
5
+ follows [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [0.0.1] — Unreleased
8
+
9
+ Pre-PyPI publish snapshot. Pinned at `0.0.1` until the listing is
10
+ approved; the first published version on PyPI will bump to `0.1.0`.
11
+
12
+ ### Added
13
+
14
+ - `CapzyClient` — sync HTTP client with `solve`, `create_task`,
15
+ `get_task_result`, `report_score`, `get_balance`.
16
+ - `solve(type=..., **params)` — submits + polls. Single-call solve for
17
+ every supported captcha; takes the wire-level task `type` as a string
18
+ and the task params as kwargs.
19
+ - Auto camelCase conversion of snake_case task params
20
+ (`website_url` → `websiteURL`, `proxy_address` → `proxyAddress`, etc.)
21
+ so you can write Python-style names without thinking about the wire
22
+ format. CamelCase passes through untouched.
23
+ - `ApiError`, `TaskFailedError`, `TaskTimeoutError` for structured error
24
+ handling; refunded tasks raise rather than silently succeed.
25
+ - Per-call polling tunables (`poll_interval`, `max_wait`).
26
+ - Session injection for proxies / retries / custom TLS.
27
+ - Examples for every currently-supported captcha service
28
+ (Cloudflare Turnstile / Challenge, reCAPTCHA v2/v3 and Enterprise,
29
+ FunCaptcha, GeeTest v3 / v4, CaptchaFox, MTCaptcha, Friendly Captcha,
30
+ ALTCHA, Lemin, Capy, NetEase Yidun, Yandex SmartCaptcha, Binance
31
+ bCAPTCHA2, Tencent, Shopee Slider, Shopee Curve, Temu, Alibaba,
32
+ AWS WAF, DataDome, PerimeterX, Imperva, Akamai BMP, Kasada,
33
+ Image-to-Text, Math, Coordinates, Rotate).
34
+ - Documentation set under [docs/](./docs).
capzy-0.0.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Capzy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,7 @@
1
+ include README.md
2
+ include LICENSE
3
+ include CHANGELOG.md
4
+ include pyproject.toml
5
+ recursive-include capzy *.py
6
+ recursive-include docs *.md
7
+ recursive-include examples *.py
capzy-0.0.1/PKG-INFO ADDED
@@ -0,0 +1,444 @@
1
+ Metadata-Version: 2.4
2
+ Name: capzy
3
+ Version: 0.0.1
4
+ Summary: Official Python SDK for the Capzy captcha-solving API
5
+ Project-URL: Homepage, https://capzy.ai
6
+ Project-URL: Documentation, https://capzy.ai/docs
7
+ Project-URL: Source, https://github.com/capzy/capzy-pip
8
+ Project-URL: Issues, https://github.com/capzy/capzy-pip/issues
9
+ Author-email: Capzy <support@capzy.ai>
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: aws-waf,captcha,captcha-solver,capzy,cloudflare,datadome,funcaptcha,geetest,recaptcha,turnstile
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Internet :: WWW/HTTP
25
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
+ Requires-Python: >=3.9
27
+ Requires-Dist: requests>=2.28
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest>=7; extra == 'dev'
30
+ Requires-Dist: responses>=0.24; extra == 'dev'
31
+ Description-Content-Type: text/markdown
32
+
33
+ <div align="center">
34
+
35
+ <img src="https://capzy.ai/capzy-logo.svg" alt="Capzy" width="220" />
36
+
37
+ # `capzy` — official Python SDK
38
+
39
+ **Solve every major captcha with a single line of Python.**
40
+
41
+ [![PyPI version](https://img.shields.io/pypi/v/capzy.svg?color=%23ff5d2a)](https://pypi.org/project/capzy/)
42
+ [![Python](https://img.shields.io/pypi/pyversions/capzy.svg?color=%23ff5d2a)](https://pypi.org/project/capzy/)
43
+ [![License: MIT](https://img.shields.io/badge/license-MIT-%23ff5d2a.svg)](LICENSE)
44
+ [![Docs](https://img.shields.io/badge/docs-capzy.ai-%23ff5d2a)](https://capzy.ai/docs)
45
+ [![Status](https://img.shields.io/badge/uptime-99.9%25-%2322c55e)](https://capzy.ai)
46
+
47
+ [Website](https://capzy.ai) · [Dashboard](https://capzy.ai/dashboard) · [Docs](https://capzy.ai/docs) · [Pricing](https://capzy.ai/pricing) · [Get free credits](https://capzy.ai/auth/register)
48
+
49
+ </div>
50
+
51
+ ---
52
+
53
+ ## Why Capzy
54
+
55
+ > Built by people who were tired of paying half a cent to get back `errorCode: ERROR_NO_AVAILABLE_WORKERS`.
56
+
57
+ - ⚡️ **Fast.** Median solve <5s for Turnstile / reCAPTCHA v2 / hCaptcha.
58
+ - 💸 **Cheap.** Token-bound captchas start at **$0.40 per 1,000 solves**.
59
+ - 🧠 **Solves what others don't.** Native support for **Temu**, **Shopee** (slider + curve), **Binance bCAPTCHA2**, **CaptchaFox**, **MTCaptcha**, **Lemin**, **ALTCHA**, **Yidun**, **Capy** — not just the obvious ones. *(hCaptcha is in active development and not currently sold; status: see [roadmap](#roadmap).)*
60
+ - 🧩 **Drop-in compatible.** Uses the same `createTask` / `getTaskResult` shape your existing scripts already speak. Migration is a one-line `base_url` change.
61
+ - 🆓 **Free credits on sign-up.** Every new account gets **$0.10** in real credits to test in production. No card required.
62
+ - 🔓 **No retainer, no minimum.** Pay-as-you-go. Top up when you want.
63
+ - 📊 **Real dashboard.** Per-key analytics, score quality charts for v3, full payment audit log.
64
+
65
+ > [**Create a free account →**](https://capzy.ai/auth/register)
66
+ > Get **$0.10 in free credits** the moment you sign up — enough to verify integration end-to-end on roughly **80 reCAPTCHA v3** or **80 Turnstile** solves before you pay a cent.
67
+
68
+ ---
69
+
70
+ ## Install
71
+
72
+ ```bash
73
+ pip install capzy
74
+ ```
75
+
76
+ Requires Python ≥ 3.9 and `requests`. That's it.
77
+
78
+ > ⚠️ While we wait for our PyPI listing to be approved, you can install straight from the repo:
79
+ >
80
+ > ```bash
81
+ > pip install "git+https://github.com/capzy/capzy-pip.git"
82
+ > ```
83
+
84
+ ---
85
+
86
+ ## 60-second quickstart
87
+
88
+ ```python
89
+ from capzy import CapzyClient
90
+
91
+ capzy = CapzyClient("capzy_xxxxxxxxxxxxxxxxxxxxxxxx") # from capzy.ai/dashboard
92
+
93
+ solution = capzy.solve(
94
+ type="AntiTurnstileTaskProxyLess",
95
+ website_url="https://example.com/login",
96
+ website_key="0x4AAAAAAA...",
97
+ )
98
+ print(solution["token"]) # paste into the cf-turnstile-response field
99
+ ```
100
+
101
+ That's the whole pattern. `solve()` does `createTask` → polls `getTaskResult` → hands you the solution dict.
102
+
103
+ Need to route the solve through your own proxy? Switch to the `…Task` (non-`ProxyLess`) type and add the proxy params:
104
+
105
+ ```python
106
+ solution = capzy.solve(
107
+ type="AntiTurnstileTask",
108
+ website_url="https://example.com/login",
109
+ website_key="0x4AAAAAAA...",
110
+ proxy_type="http",
111
+ proxy_address="123.45.67.89",
112
+ proxy_port=8080,
113
+ proxy_login="user",
114
+ proxy_password="pass",
115
+ )
116
+ ```
117
+
118
+ Need lower-level control? Use the raw verbs:
119
+
120
+ ```python
121
+ created = capzy.create_task(
122
+ type="AntiTurnstileTaskProxyLess",
123
+ website_url="https://example.com/login",
124
+ website_key="0x4AAAAAAA...",
125
+ )
126
+ task_id = created["taskId"]
127
+
128
+ # Poll on your own schedule:
129
+ status = capzy.get_task_result(task_id)
130
+ ```
131
+
132
+ > **Param naming.** Pass either `website_url=` / `website_key=` (Python style) or
133
+ > `websiteURL=` / `websiteKey=` (wire style). They're equivalent — the SDK
134
+ > normalises snake_case to the camelCase the API expects.
135
+
136
+ ---
137
+
138
+ ## How it works
139
+
140
+ ```
141
+ ┌──────────────┐ createTask ┌──────────┐ enqueue ┌──────────┐
142
+ │ your script │ ────────────▶ │ Capzy │ ────────────▶ │ solver │
143
+ │ (capzy SDK) │ ◀──────────── │ API │ ◀──────────── │ cluster │
144
+ └──────────────┘ getTaskResult └──────────┘ solution └──────────┘
145
+ (polls until "ready")
146
+ ```
147
+
148
+ Submit → poll → done. No webhooks to set up, no SDK runtime required on the solver side, no captive browser to manage.
149
+
150
+ ---
151
+
152
+ ## Supported captchas
153
+
154
+ Every captcha below is supported as a **proxyless** task (we handle the upstream routing) and a **proxy** task (you supply the upstream IP). All prices are USD per solve.
155
+
156
+ ### Token-based — the workhorses
157
+
158
+ | Captcha | Task type | Price | Notes |
159
+ |---|---|---|---|
160
+ | Cloudflare Turnstile | `AntiTurnstileTaskProxyLess` | **$0.0012** | Including invisible variant |
161
+ | Cloudflare Challenge | `AntiCloudflareTask` | $0.005 | Full JS-challenge page |
162
+ | reCAPTCHA v2 | `ReCaptchaV2TaskProxyLess` | **$0.002** | Checkbox + invisible |
163
+ | reCAPTCHA v2 Enterprise | `ReCaptchaV2EnterpriseTaskProxyLess` | $0.004 | |
164
+ | reCAPTCHA v3 | `ReCaptchaV3TaskProxyLess` | **$0.0015** | Action + min-score |
165
+ | reCAPTCHA v3 Enterprise | `ReCaptchaV3EnterpriseTaskProxyLess` | $0.005 | |
166
+ | FunCaptcha (Arkose) | `FunCaptchaTaskProxyLess` | $0.004 | Including Roblox flow |
167
+ | GeeTest v4 | `GeeTestTaskProxyLess` | **$0.003** | captchaId-based |
168
+ | GeeTest v3 | `GeeTestV3TaskProxyLess` | $0.0035 | gt + challenge |
169
+ | CaptchaFox | `CaptchaFoxTaskProxyLess` | **$0.0012** | |
170
+ | MTCaptcha | `MtCaptchaTaskProxyLess` | $0.002 | |
171
+ | Friendly Captcha | `FriendlyCaptchaTaskProxyLess` | $0.002 | |
172
+ | ALTCHA | `AltchaTaskProxyLess` | $0.001 | Pure proof-of-work |
173
+ | Lemin | `LeminTaskProxyLess` | $0.0015 | |
174
+ | Capy Puzzle | `CapyTaskProxyLess` | $0.002 | |
175
+ | NetEase Yidun | `YidunSliderTaskProxyLess` | $0.003 | |
176
+ | Yandex SmartCaptcha | `YandexSmartCaptchaTaskProxyLess` | $0.025 | |
177
+ | Binance bCAPTCHA2 | `BinanceCaptchaTask` | $0.003 | |
178
+ | Tencent | `TencentTaskProxyLess` | $0.002 | |
179
+ | Shopee Slider | `ShopeeSliderTaskProxyLess` | $0.002 | |
180
+ | Shopee Curve Slider | `ShopeeCurveTaskProxyLess` | $0.003 | |
181
+ | Temu | `TemuCaptchaTaskProxyLess` | $0.002 | |
182
+ | Alibaba | `AntiAlibabaCaptchaTaskProxyLess` | $0.003 | |
183
+
184
+ ### Anti-bot platforms
185
+
186
+ | Platform | Task type | Price | Notes |
187
+ |---|---|---|---|
188
+ | AWS WAF (full challenge) | `AntiAwsWafTaskProxyLess` | $0.012 | |
189
+ | AWS WAF (image classify) | `AwsWafClassification` | **$0.0008** | Just the image piece |
190
+ | DataDome Slider | `DataDomeSliderTask` | $0.04 | Proxy required |
191
+ | PerimeterX | `AntiPerimeterXTaskProxyLess` | $0.04 | |
192
+ | Imperva Incapsula | `AntiImpervaTaskProxyLess` | $0.04 | |
193
+ | Akamai Bot Manager | `AntiAkamaiBMPTaskProxyLess` | $0.05 | Mobile (BMP) |
194
+ | Kasada | `KasadaCaptchaTaskProxyLess` | $0.005 | |
195
+
196
+ ### Image-based
197
+
198
+ | Type | Task type | Price | Use case |
199
+ |---|---|---|---|
200
+ | Image-to-Text | `ImageToTextTask` | **$0.001** | Generic OCR captchas |
201
+ | Math Captcha | `MathCaptchaTask` | $0.001 | "What is 7 + 3?" |
202
+ | Coordinates Click | `CoordinatesTask` | $0.001 | "Click the cat" |
203
+ | Rotate | `RotateTask` | $0.001 | Rotate-to-upright |
204
+
205
+ Full live pricing at **[capzy.ai/pricing](https://capzy.ai/pricing)** — these tables are scraped from the same source-of-truth.
206
+
207
+ ---
208
+
209
+ ## Examples per service
210
+
211
+ ### Cloudflare Turnstile
212
+
213
+ ```python
214
+ from capzy import CapzyClient
215
+
216
+ capzy = CapzyClient("capzy_xxx")
217
+ sol = capzy.solve(
218
+ type="AntiTurnstileTaskProxyLess",
219
+ website_url="https://example.com",
220
+ website_key="0x4AAAAAAA...",
221
+ action="login", # optional — must match data-action
222
+ cdata="user-123", # optional — server-issued cdata
223
+ )
224
+ print(sol["token"])
225
+ ```
226
+
227
+ ### reCAPTCHA v2
228
+
229
+ ```python
230
+ from capzy import CapzyClient
231
+
232
+ capzy = CapzyClient("capzy_xxx")
233
+ sol = capzy.solve(
234
+ type="ReCaptchaV2TaskProxyLess",
235
+ website_url="https://example.com",
236
+ website_key="6Lc_aCMTAAAAAB...",
237
+ is_invisible=False,
238
+ )
239
+ print(sol["gRecaptchaResponse"])
240
+ ```
241
+
242
+ ### reCAPTCHA v3 (score-based)
243
+
244
+ ```python
245
+ from capzy import CapzyClient
246
+
247
+ capzy = CapzyClient("capzy_xxx")
248
+ created = capzy.create_task(
249
+ type="ReCaptchaV3TaskProxyLess",
250
+ website_url="https://example.com",
251
+ website_key="6Lc_aCMTAAAAAB...",
252
+ page_action="checkout",
253
+ min_score=0.7,
254
+ )
255
+ task_id = created["taskId"]
256
+
257
+ # After you call Google siteverify with your secret, report the score back —
258
+ # it lights up your v3 quality dashboard and helps us auto-route your traffic.
259
+ capzy.report_score(task_id, score=0.9, action="checkout", hostname="example.com")
260
+ ```
261
+
262
+ ### GeeTest v4
263
+
264
+ ```python
265
+ from capzy import CapzyClient
266
+
267
+ capzy = CapzyClient("capzy_xxx")
268
+ sol = capzy.solve(
269
+ type="GeeTestV4TaskProxyLess",
270
+ website_url="https://example.com",
271
+ captcha_id="abc123...",
272
+ )
273
+ # sol contains captcha_id, lot_number, pass_token, gen_time, captcha_output
274
+ ```
275
+
276
+ ### Image-to-Text (sync solve — no polling)
277
+
278
+ ```python
279
+ import base64
280
+ from capzy import CapzyClient
281
+
282
+ capzy = CapzyClient("capzy_xxx")
283
+ with open("captcha.png", "rb") as f:
284
+ body = base64.b64encode(f.read()).decode()
285
+
286
+ sol = capzy.solve(type="ImageToTextTask", body=body, case="lower")
287
+ print(sol["text"])
288
+ ```
289
+
290
+ More copy-pasteable runners in [`examples/`](./examples).
291
+
292
+ ---
293
+
294
+ ## Free credits & getting an API key
295
+
296
+ 1. Create an account at **[capzy.ai/auth/register](https://capzy.ai/auth/register)**.
297
+ 2. We post a **$0.10 welcome bonus** as a real credit transaction on your dashboard. (Audit it like any other payment.)
298
+ 3. Generate an API key on **[capzy.ai/dashboard](https://capzy.ai/dashboard)** and drop it into `CapzyClient("capzy_…")`.
299
+
300
+ The $0.10 is plenty to verify end-to-end:
301
+
302
+ | Captcha | Solves you can run on $0.10 |
303
+ |---|---|
304
+ | reCAPTCHA v3 | ~66 |
305
+ | Turnstile | ~83 |
306
+ | reCAPTCHA v2 | ~50 |
307
+ | Image-to-Text | ~100 |
308
+ | GeeTest v4 | ~33 |
309
+
310
+ When you run out, top up with **Stripe** (card / Apple Pay / Google Pay) or **MixPay** (USDT / BTC / 30+ coins). No subscription, no minimum.
311
+
312
+ ---
313
+
314
+ ## Handling errors
315
+
316
+ ```python
317
+ from capzy import CapzyClient, ApiError, TaskFailedError, TaskTimeoutError
318
+
319
+ capzy = CapzyClient("capzy_xxx")
320
+ try:
321
+ sol = capzy.solve(
322
+ type="AntiTurnstileTaskProxyLess",
323
+ website_url="https://example.com",
324
+ website_key="0x4AAAAAAA...",
325
+ )
326
+ except ApiError as e:
327
+ # createTask was rejected — bad key, wrong task type, insufficient funds, etc.
328
+ print("API rejected the task:", e.error_code, e.error_description)
329
+ if e.recommended_task_type:
330
+ print("Hint — submit as:", e.recommended_task_type)
331
+ except TaskFailedError as e:
332
+ # Task ran but couldn't be solved. Refunded automatically.
333
+ print("Solver failed:", e.error_code, e.error_description)
334
+ except TaskTimeoutError as e:
335
+ # We didn't get an answer within max_wait. Refunded automatically.
336
+ print(f"No answer after {e.waited:.0f}s")
337
+ ```
338
+
339
+ **You are never charged for failed or timed-out tasks.** Refunds post as real credit transactions, visible in your dashboard.
340
+
341
+ ---
342
+
343
+ ## Configuration
344
+
345
+ ```python
346
+ capzy = CapzyClient(
347
+ api_key="capzy_xxx",
348
+ base_url="https://api.capzy.ai", # override for on-prem / staging
349
+ timeout=30.0, # per HTTP-request timeout
350
+ )
351
+
352
+ # Tune the polling behaviour per .solve() call:
353
+ capzy.solve(type="AntiTurnstileTaskProxyLess", website_url=..., website_key=...,
354
+ poll_interval=1.0, max_wait=90.0)
355
+ ```
356
+
357
+ Need a proxy on the SDK's own egress, retries, or custom TLS? Pass your own `requests.Session`:
358
+
359
+ ```python
360
+ import requests
361
+ from capzy import CapzyClient
362
+
363
+ session = requests.Session()
364
+ session.proxies = {"https": "http://user:pass@proxy.example:8080"}
365
+ capzy = CapzyClient("capzy_xxx", session=session)
366
+ ```
367
+
368
+ ---
369
+
370
+ ## API reference
371
+
372
+ `CapzyClient` is a thin wrapper around the Capzy HTTP API:
373
+
374
+ | Method | Endpoint | Returns |
375
+ |---|---|---|
376
+ | `capzy.solve(type=..., **params)` | `POST /createTask` + polls `POST /getTaskResult` | the `solution` dict |
377
+ | `capzy.create_task(type=..., **params)` | `POST /createTask` | `{taskId, status?, solution?, timeout?}` |
378
+ | `capzy.get_task_result(task_id)` | `POST /getTaskResult` | `{status, solution?, cost?, ip?, …}` |
379
+ | `capzy.report_score(task_id, score, action=None, hostname=None)` | `POST /reportScore` | `None` |
380
+ | `capzy.get_balance()` | `POST /getBalance` | `float` USD |
381
+
382
+ All task parameters travel as kwargs. Snake_case (`website_url`, `proxy_address`, `min_score`) and camelCase (`websiteURL`, `proxyAddress`, `minScore`) are equivalent — the SDK normalises to the wire format.
383
+
384
+ ---
385
+
386
+ ## FAQ
387
+
388
+ **Do you need to supply a proxy?**
389
+ No — every `*ProxyLess` task type runs against our own network. Bring your own only when the target binds the token to your egress IP (some anti-bot platforms do).
390
+
391
+ **Do you support async?**
392
+ Not in v0.0.1. The sync client is intentionally tiny — pair it with a thread pool, `anyio.to_thread`, or `asyncio.to_thread` if you need fan-out today. A native `AsyncCapzyClient` is on the roadmap.
393
+
394
+ **What happens if a task fails?**
395
+ The credit is automatically refunded as a `refund` transaction. The SDK raises `TaskFailedError` so you can retry with a different task type or proxy.
396
+
397
+ **Can I run this in a long-running service?**
398
+ Yes. Re-use one `CapzyClient` across threads — the underlying `requests.Session` is thread-safe for our usage pattern.
399
+
400
+ **Where do I find my API key?**
401
+ [capzy.ai/dashboard](https://capzy.ai/dashboard) → API keys → New key.
402
+
403
+ **Do you have rate limits?**
404
+ Per-key concurrency limits exist (visible on your dashboard). When you hit them, `createTask` returns `ERROR_RATE_LIMIT` and the SDK raises `ApiError(error_code="ERROR_RATE_LIMIT")` so you can back off.
405
+
406
+ **Where do solutions need to be submitted?**
407
+ - Turnstile → `cf-turnstile-response` form field
408
+ - reCAPTCHA v2 / Enterprise → `g-recaptcha-response`
409
+ - Others → service-specific; see the per-service guides at [capzy.ai/docs](https://capzy.ai/docs)
410
+
411
+ ---
412
+
413
+ ## Roadmap
414
+
415
+ Captchas not yet on the price list but actively being worked on:
416
+
417
+ - **hCaptcha** (incl. Enterprise) — local CV pipeline in late-stage testing; SDK task types (`HCaptchaTaskProxyLess`, etc.) already accepted so your code is forward-compatible.
418
+ - **Native `AsyncCapzyClient`** — `asyncio`-native client, same API surface.
419
+ - **Streaming `solveMany()`** — fan out N tasks, yield as they finish.
420
+
421
+ Want something prioritised? Open a [GitHub issue](https://github.com/capzy/capzy-pip/issues) or email **support@capzy.ai**.
422
+
423
+ ---
424
+
425
+ ## Links
426
+
427
+ - 🌐 **Website:** https://capzy.ai
428
+ - 📚 **Documentation:** https://capzy.ai/docs
429
+ - 💵 **Pricing:** https://capzy.ai/pricing
430
+ - 🔑 **Dashboard / API keys:** https://capzy.ai/dashboard
431
+ - 🆓 **Free credits on sign-up:** https://capzy.ai/auth/register
432
+ - 📜 **Changelog:** [CHANGELOG.md](CHANGELOG.md)
433
+ - 🐛 **Issues:** https://github.com/capzy/capzy-pip/issues
434
+ - 💬 **Support:** support@capzy.ai
435
+
436
+ ---
437
+
438
+ ## License
439
+
440
+ MIT — see [LICENSE](LICENSE). Use it in proprietary software, redistribute it, fork it. Just don't blame us if your bot finds love.
441
+
442
+ <div align="center">
443
+ <sub>Built with care by the Capzy team — <a href="https://capzy.ai">capzy.ai</a></sub>
444
+ </div>