Testing your own forms
Keep CI pipelines and staging checks running for login, sign-up and contact forms protected by Turnstile.
Token task
Send the page URL and Turnstile site key, and get a token your script submits with the form, usually in a few seconds.
Pay only for solved tasks. Failed tasks are refunded automatically.
What you send, what you get
Turnstile is a mostly invisible check that runs when a page loads and produces a token without asking the visitor to solve anything. The page sends that token with its form or request, and the site verifies it. bypass.so returns the token for you.
Token tasks run asynchronously: createTask returns a taskId right away and you poll for the token. Typical time to a result is about eight seconds.
| Field | Description |
|---|---|
| clientKeystringrequired | Your API key. You can also send it as Authorization: Bearer <key> instead. |
| typestringrequired | Always TurnstileTask for this task. |
| websiteURLstringrequired | Full URL of the page that shows the widget. |
| websiteKeystringrequired | The Turnstile site key, from the widget's data-sitekey. It starts with 0x. |
| actionstringoptional | The widget's data-action value, if the page sets one. |
| Field | Meaning |
|---|---|
| errorId | 0 on success, 1 on error. Errors also carry errorCode and errorDescription. |
| status | processing while the task runs, then ready or failed. |
| taskId | Returned by createTask. Use it to poll and to report a wrong answer. |
| solution.token | The Turnstile token. Submit it in the cf-turnstile-response field. |
| solution.tokenField | Name of the form field the token belongs in, when it is known. |
| solution.tokenLifetime | Seconds the token stays usable after it is issued, when it is known. |
Integration
Plain HTTPS and JSON. No SDK to install.
TurnstileTask and its fields.processing.solution.token and continue your flow.POST /reportBad?task_id=<taskId> with your key as Bearer returns that task's price once.| errorCode | When it happens |
|---|---|
| ERROR_KEY_INVALID | The API key is missing or not recognised (HTTP 403). |
| ERROR_INSUFFICIENT_CREDITS | Your balance does not cover the task price. Top up and resend (HTTP 402). |
| ERROR_TASK_NOT_SUPPORTED | The type value is unknown or not live yet (coming soon). Nothing is charged. |
| ERROR_BAD_REQUEST | The body is not valid JSON or a field has the wrong type (HTTP 400). |
| ERROR_CAPTCHA_UNSOLVABLE | The task could not be completed. The held price is refunded automatically. |
| ERROR_RATE_LIMIT | Too many requests in a short time. Back off and retry (HTTP 429). |
| ERROR_NOT_FOUND | Unknown taskId, or the task belongs to another key (HTTP 404). |
Check your balance any time with GET /balance and Authorization: Bearer <key>. Full list in the error reference.
Using the result
What your own script does with the Turnstile token once the task is ready.
Find the Turnstile widget on the page you are testing and copy its data-sitekey (it starts with 0x) and the page URL.
Create a TurnstileTask and poll getTaskResult every 2 to 3 seconds until it is ready.
Set the token as the value of the hidden cf-turnstile-response input inside the form.
Turnstile tokens are valid for up to five minutes and work once. Submit the form promptly.
Use cases
Built for testing, accessibility and data work on sites you own or are allowed to automate.
Keep CI pipelines and staging checks running for login, sign-up and contact forms protected by Turnstile.
Run synthetic transactions on protected pages to confirm customers can still get through.
Keep approved scripts and partner tools working on pages that add the widget.
Use bypass.so only where you have permission. Respect each site's terms and rate limits, and never use results to access accounts or data that are not yours. See our acceptable use policy.
Pricing
That is — per task, or — tasks for $100.
| Tier | Top-up | Bonus | Effective / 1k | Tasks covered |
|---|
Related types
data-sitekey, or in the render call in the page script. Turnstile keys start with 0x.tokenLifetime, it tells you the number of seconds.GET /getTaskResult/{taskId} every two to three seconds.POST /reportBad and the taskId; the task's price is returned to your balance once. Then request a new token.Create an account, top up from a few dollars and get your key. You only pay for tasks that return a result.