
Ethan Collins
Pattern Recognition Specialist

A price per thousand requests is easy to copy into a budget. It is less useful when the business needs a thousand accepted form submissions or validated image answers. Extra attempts, application rejection and operational work change the relationship between the invoice and the finished job. A useful comparison makes those inputs visible.
CapSolver publishes pricing for image CAPTCHA recognition. This article uses that published rate as one input to a transparent cost model, then compares two hypothetical operating scenarios. You can replace the example's counts with your own billing export and acceptance logs. The resulting calculation helps a team decide whether extra attempts are worth their cost without implying that every API response produces a completed task.
Use the current price for the exact task type and the billable quantity defined by your account's terms.
The official CapSolver pricing documentation listed image-to-text at $0.40 per 1,000 when checked on September 7, 2026. The ImageToTextTask documentation identifies the image recognition task. Do not apply that price to token-based tasks or other challenge types.
The examples below treat $0.40 as the price per 1,000 billable attempts. That is a modeling input. This article does not establish how an individual failed, cancelled or retried task is billed. Reconcile the billable count with the current provider documentation, account export or support response before estimating a real invoice.
Define an accepted result at the application's boundary. For example, an owned test application might confirm that the submitted recognized text matches its expected answer. Count a result once per business task, even if it took several attempts. If your workflow only needs recognized text, use that narrower output as the acceptance boundary and name it explicitly.
The CAPTCHA solving FAQ provides product context. Neither a generic success label nor a headline price supplies the application-specific denominator.
Compare total cost and accepted output together, including the incremental cost of additional attempts.
Both scenarios below are hypothetical. The operating cost is an illustrative allocation of $20 for the same measurement window; no latency, accuracy or acceptance rate was measured against a provider.
| Input or result | Baseline | Extra-attempt scenario |
|---|---|---|
| Billable attempts | 100,000 | 120,000 |
| Accepted results | 90,000 | 92,000 |
| Price per 1,000 billable attempts | $0.40 | $0.40 |
| API cost | $40.00 | $48.00 |
| Allocated operating cost | $20.00 | $20.00 |
| Total cost | $60.00 | $68.00 |
| Cost per 1,000 accepted results | $0.6667 | $0.7391 |
The second scenario spends $8 more and produces 2,000 additional accepted results. Its incremental cost is $4 per 1,000 additional accepted results. That is a different question from the average cost of all accepted results. A business might accept that tradeoff for a valuable workflow; the table alone cannot decide.
This approach follows the purpose of FinOps unit economics: relate spending to a meaningful unit of business output. Record how the output is defined so two teams do not compare “recognized text” with “completed transaction” as if they were identical.
Redeem Your CapSolver Bonus Code
Boost your automation budget instantly!
Use bonus code CAP26 when topping up your CapSolver account to get an extra 5% bonus on every recharge — with no limits.
Redeem it now in your CapSolver Dashboard
Use decimal arithmetic and return an undefined unit cost when there are no accepted results.
Python's Decimal module supports decimal arithmetic suitable for this example. Save the following as cost.py and run it with Python 3.11 or later. It has no third-party dependencies and sends no network requests. Pass prices as decimal strings and counts as integers, as shown.
from decimal import Decimal
import json
def cost_per_accepted(billable_attempts, accepted_results,
price_per_thousand, operating_cost):
if type(billable_attempts) is not int or type(accepted_results) is not int:
raise ValueError("counts must be integers")
if billable_attempts < 0 or accepted_results < 0:
raise ValueError("counts cannot be negative")
price, operations = map(Decimal, (price_per_thousand, operating_cost))
if not price.is_finite() or not operations.is_finite():
raise ValueError("costs must be finite")
if price < 0 or operations < 0:
raise ValueError("costs cannot be negative")
api_cost = Decimal(billable_attempts) * price / Decimal(1000)
total = api_cost + operations
unit = total / accepted_results if accepted_results else None
return {"api_cost_usd": str(api_cost), "total_cost_usd": str(total),
"usd_per_1000_accepted": str((unit * 1000).quantize(
Decimal("0.0001"))) if unit is not None else None}
"""Workload and operating costs are hypothetical, not provider measurements."""
baseline = cost_per_accepted(100000, 90000, "0.40", "20.00")
retries = cost_per_accepted(120000, 92000, "0.40", "20.00")
assert baseline['api_cost_usd'] == '40.00'
assert baseline['usd_per_1000_accepted'] == '0.6667'
assert retries['usd_per_1000_accepted'] == '0.7391'
assert cost_per_accepted(10,0,"0.40","0")['usd_per_1000_accepted'] is None
try:
cost_per_accepted(-1,1,"0.40","0")
raise AssertionError("negative counts accepted")
except ValueError:
pass
print(json.dumps({"baseline":baseline,"extra_attempts":retries},sort_keys=True))
The verified run produced the table's $40 and $48 API costs and the rounded $0.6667 and $0.7391 unit costs. It also checked that a zero accepted-result count returns None and that a negative attempt count raises an error. Production ingestion should additionally validate the input schema and currency before calling the calculator.
Join invoice quantities and accepted outcomes by a documented window and cohort. If tasks cross a billing boundary, choose whether to attribute the cost to the attempt date or the completed task cohort. Preserve that choice in the report. Otherwise, late completions can make one day appear unusually expensive and the next unusually cheap.
Deduplicate completed tasks with an application identifier. Keep retry attempts separately and reconcile their billable status against provider records. Record discounts, credits and currency conversions as explicit adjustments instead of silently changing the list-price input.
Retry limits should be based on incremental completion value, operational limits and failure classification.
Give each task a maximum attempt count and a wall-clock deadline. Avoid immediately repeating a request with unchanged invalid inputs. For transient conditions, use an application-approved delay policy and a shared budget across workers. Google's SRE chapter on handling overload explains why uncontrolled retries can worsen an overloaded service.
Track the accepted results gained by each additional attempt number. Pair that with the extra billable quantity, compute time and queue delay. This makes it possible to retire an expensive retry branch without hiding the work it used to complete.
An operating-cost allocation can include browser infrastructure, worker time and incident support. The example's fixed $20 keeps the arithmetic readable; an actual deployment should use its own measured allocation. Do not present fixed operating cost as a guarantee that additional volume is free to run.
Use CapSolver pricing alongside your own acceptance logs, billing quantities and workload definition.
Start with a small authorized evaluation and reconcile the counts before projecting monthly volume. The LangChain integration guide gives one example of a workflow where a tool result and the final task outcome need separate tracking. Keep those boundaries in your budget as well as your application.
Q: Is $0.40 per 1,000 the cost of 1,000 completed tasks?
No. It is the published image-to-text price used as a billable-attempt input here. Cost per completed task depends on your billing terms, attempts and application acceptance definition.
Q: Does the example measure CapSolver's acceptance rate?
No. Both workloads and the operating-cost allocation are hypothetical. The Python arithmetic was executed, but no provider performance test was performed.
Q: Why can extra attempts raise average cost even when more tasks finish?
The additional accepted results may cost more per unit than the earlier results. Compare the marginal cost and business value before changing the retry limit.
Q: What should a dashboard show when accepted results equal zero?
Show the spend and an undefined unit cost, with the zero-output condition visible. Reporting a zero cost per result would imply an outcome that never occurred.
Learn how to protect keys, sessions, logs, and test environments in Selenium CAPTCHA integrations, with practical review checks for authorized automation.

Compare Node.js CAPTCHA API options by separating generators, open-source clients and managed solving, then evaluate workload fit, ownership and real cost.
