Docs / Guides
Authentication
How clientKey authenticates every solver call, how API keys are created and rotated in the dashboard, and what each authentication failure code means.
The credential
Every solver call carries the raw API key in the JSON body:
{"clientKey": "ssk_live_…"}
There is no auth header on /createTask, /getTaskResult and /getBalance. The
key identifies the paying account: the charge lands on the balance of the key’s
owner, and the owner’s subscription packages are used before that balance.
API keys
Keys are created, rotated and revoked in the dashboard (API keys). An account holds one prepaid key at a time:
- Create a key when you have none; the value is shown when it is created. A second create is refused while a prepaid key is active.
- Rotate replaces the stored value; the previous value stops working at once. This is how you get a fresh credential.
- Revoke disables the key immediately and frees the slot for a new one.
Pay-as-you-go keys are the exception: support grants them, they are not created in the dashboard.
A key is a secret: keep it server-side and out of browsers, mobile bundles and public repositories. Keys must not be shared or resold, and the account owner is responsible for everything done with them.
What a rejected key looks like
Both cases answer HTTP 200 with errorId: 1:
errorCode | Cause |
|---|---|
ERROR_WRONG_CLIENT_KEY | clientKey is missing, empty or not a string. |
ERROR_KEY_DOES_NOT_EXIST | The key does not match an active key: wrong value, revoked, suspended or expired. |
The messages deliberately do not say whether a key ever existed. An unknown key and
another account’s taskId look identical for the same reason — see
Errors.
Other surfaces
- The dashboard and account pages authenticate with a session (
Authorization: Bearer …) from sign-in. That is a browser surface, not part of the solver API. GET /v1/servicesis the public rate sheet (price, status and average solve time per service) and needs no key at all.