Skip to content
voidcaptcha

Task type

Kasada solver API

Kasada protects sites like GoDaddy, Sephora, Twitch, Afterpay and Skechers by demanding two headers on every protected request: x-kpsdk-ct, a token the site has to trust, and x-kpsdk-cd, a proof-of-work that is valid once. KasadaTask runs the site’s live Kasada challenge for you and returns a trusted ct with a fresh cd and the other x-kpsdk headers, usually in a few seconds. After that you do not need a full solve for every request: KasadaCdTask takes the ct you already have and mints a new cd in milliseconds, at a tenth of the price. A full solve needs your proxy; a cd does not.

Tip

Send task.type as KasadaTask and the solution arrives in solution.headers, with solution.st beside it.

Before you integrate

  1. Send every header in solution.headers on your protected request, exactly as returned. The ct is not tied to the solving IP, but use your proxy for the site anyway.
  2. Each protected response carries a NEW x-kpsdk-ct. Use the newest one from then on: the old one stops working. A ct lives about 60 seconds from its solve.
  3. A cd is single-use. Before every protected request call KasadaCdTask with your current ct and st (and the same pageUrl) for a fresh one; it costs $0.20 per 1,000.
  4. Got a 429 from the site? The ct is no longer trusted. Run a new KasadaTask.

A site that will not solve is worth telling us about — coverage is per target as much as per type. The quickest route is Telegram (@VoidCaptchaSupport), where someone usually answers within minutes. You can also open a ticket from your dashboard or email [email protected]. Send the URL and the site key either way.

task.type
KasadaTask
Median
—
Success
—
Price / 1k
$0.20
$0.0002 each · up to $2.00 by variant
Proxy
Required

Variants and prices#

task.typeWhat you getPrice / 1k
KasadaTaskStandard$2.00
KasadaCdTaskStandard$0.20

Prices are per 1,000 successful solves; a failed solve is never charged. Send the variant you want as task.type. More on the Enterprise variants.

Solve request#

Solving Kasada is a single synchronous call. You post one task object and the response carries the finished solution — no task id to store, nothing to poll for.

POSThttps://api.voidcaptcha.com/v1/getResult

The connection is held open for the whole solve. Set a client timeout that covers it — the default socket timeout in most HTTP libraries is shorter than the work. If holding a connection that long does not suit your worker fleet, the same task goes to /v1/createTask and you collect it from /v1/checkTask instead.

When to use it#

  • Account login and signup on Kasada-protected sites (GoDaddy SSO, Twitch)
  • Checkout and pay-later flows behind Kasada (Afterpay, retail)
  • Product and inventory monitoring on Kasada-protected stores (Sephora, Skechers)

Task object structure#

These fields go inside task. The envelope around it — clientKey and the optional softId — is the same for every type and is described in the API reference.

PropertyTypeRequiredDescription
typestringRequiredLiteral "KasadaTask". Also accepts: KasadaCdTask. Matching is case-insensitive.
pageUrlstringRequiredAny URL on the protected site. KasadaCdTask also accepts domain instead.e.g. https://sso.godaddy.com/
proxystringRequiredKasadaTask only, and required there: the full solve runs on your proxy, never ours. Accepts host:port, host:port:user:pass, or a full http:// URL. KasadaCdTask needs no proxy.e.g. proxy.example.com:9090:user:pass
ctstringOptionalKasadaCdTask only, and required there: the current x-kpsdk-ct, i.e. the newest one the site returned.
stnumberOptionalKasadaCdTask only, and required there: the st from the KasadaTask that produced the ct.

Example payload#

The whole body, assembled from the table above — copy it formatted to read, or on one line to paste straight into a terminal or a REST client. The values are placeholders: swap the key for your own and the URL and site key for the page you are solving.

POSThttps://api.voidcaptcha.com/v1/getResult
{
  "clientKey": "void_a1b2c3d4e5f60718293a4b5c6d7e8f90",
  "task": {
    "type": "KasadaTask",
    "pageUrl": "https://sso.godaddy.com/",
    "proxy": "proxy.example.com:9090:user:pass"
  }
}

Example request#

The smallest thing that gets a token back, in your language. Python and Node.js use the official client (pip install voidcaptcha, npm install voidcaptcha); every other language makes the HTTP call its standard library already has. The complete version, with the key read from the environment and the error envelope checked, is in Sample code at the bottom of this page.

Language choice is remembered across the whole site, so switching here carries to every other sample in the docs.

# pip install voidcaptcha
from voidcaptcha import VoidCaptcha

client = VoidCaptcha("void_a1b2c3d4e5f60718293a4b5c6d7e8f90")

result = client.solve({
    "type": "KasadaTask",
    "pageUrl": "https://sso.godaddy.com/",
    "proxy": "proxy.example.com:9090:user:pass",
})

print(result["headers"])

Example response#

A successful solve returns errorId: 0 and a solution object. The result is in solution.headers. This type never opens a browser, so there is no userAgent.

solution carries those and nothing else — the gateway copies the result field, anything extra this type returns across, and drops the rest of whatever the solver sent. Timing arrives at the top level as elapsedMs, present only when the duration is known, beside cost and your remaining balance. The figures below are illustrative: nothing here is a published median.

This type also returns solution.st. The server time Kasada issued with the ct. Keep it: KasadaCdTask needs it, with the ct, to mint the next cd.

JSON
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "headers": { "x-kpsdk-ct": "0Ia2kXr7…", "x-kpsdk-cd": "{\"workTime\":…}", "x-kpsdk-v": "j-1.2.937", "x-kpsdk-h": "01" },
    "st": 1761561310656
  },
  "cost": "$0.0002",
  "balance": "$411.24",
  "elapsedMs": 4820
}

Errors for this type#

The codes Kasada can return, on top of the shared authentication and billing set. Branch on errorCode, not on the HTTP status.

CodeHTTPMeaningRetry
ERROR_KEY_MISSING401No clientKey was supplied.Do not retry
ERROR_KEY_INVALID401The key does not exist or has been revoked.Do not retry
ERROR_KEY_SUSPENDED403The account attached to this key is suspended.Do not retry
ERROR_TYPE_NOT_ENABLED403This account is not enabled for the requested task type.Do not retry
ERROR_BAD_REQUEST400The body was not valid JSON, or task was missing.Do not retry
ERROR_REQUIRED_FIELD400A field this task type requires was absent.Do not retry
ERROR_PROXY_CONNECT200Your proxy refused the connection or timed out.Retry
ERROR_CAPTCHA_UNSOLVABLE200The challenge was served but could not be completed.Retry
ERROR_INSUFFICIENT_BALANCE402Your balance will not cover this solve.Do not retry
ERROR_THREAD_LIMIT429You have more solves in flight than your key permits.Retry with backoff
ERROR_RATE_LIMITED429Too many requests in a short window.Retry with backoff

Every code, with the fix for each, is on the error reference. A failed solve is never charged.

Sample code#

A complete file: key from the environment, task built, errors handled, result used. Python and Node.js use the official SDK (pip install voidcaptcha, npm install voidcaptcha); the other languages call the endpoint directly.

# pip install voidcaptcha
import sys

import voidcaptcha

# The key comes from the VOIDCAPTCHA_KEY environment variable. A key in a
# committed script is a key someone else is already spending.
client = voidcaptcha.VoidCaptcha()

try:
    result = client.solve({
        "type": "KasadaTask",
        "pageUrl": "https://sso.godaddy.com/",
        "proxy": "proxy.example.com:9090:user:pass",
    })
except voidcaptcha.SolveError as e:
    # The solve failed. It was not charged, and it is safe to retry.
    sys.exit(f"{e.code}: {e.description}")
except voidcaptcha.VoidCaptchaError as e:
    # Key, balance, limits or a bad request; e.retryable says if a retry helps.
    sys.exit(f"{e.code}: {e.description}")

print(result["headers"])
print(result.cost)

Last updated on 2 August 2026