ProductsIntegrationsResourcesDocumentationPricing
Start Now

© 2026 CapSolver. All rights reserved.

CONTACT US

Slack: lola@capsolver.com

Products

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Browser Extension
  • Many more CAPTCHA types

Integrations

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Partners
  • View All Integrations

Resources

  • Referral System
  • Documentation
  • API Reference
  • Blog
  • FAQs
  • Glossary
  • Status

Legal

  • Terms & Conditions
  • Privacy Policy
  • Refund Policy
  • Don't Sell My Info
Blog/Cloudflare/How to Use C# to Solve Cloudflare Turnstile CAPTCHA Challenges
Sep18, 2024

How to Use C# to Solve Cloudflare Turnstile CAPTCHA Challenges

Lucas Mitchell

Lucas Mitchell

Automation Engineer

Navigating the complexities of CAPTCHA challenges can be a formidable task, especially when it comes to Cloudflare's Turnstile. As a seasoned developer, I’ve encountered numerous CAPTCHA systems over the years, but Cloudflare Turnstile presents a unique challenge due to its sophisticated algorithms designed to thwart automated systems. In this guide, I'll walk you through how to tackle Cloudflare Turnstile CAPTCHA challenges using C#, providing you with practical insights and techniques to enhance your automation efforts.

Table of Content

  1. Introduction to Cloudflare Turnstile
  2. Setting Up the C# Development Environment
  • Download and Install .NET
  • Configure VS Code for C# Development
  1. Obtain API Usage Prerequisites
  • Register for CapSolver
  • Retrieve SiteKey for Turnstile
  1. Using CapSolver API to Obtain a Turnstile Token
  2. Full Code Example
  3. Error Handling and Troubleshooting
  • Request Failed Errors
  1. Explanation of Code
  2. Conclusion

Understanding Cloudflare Turnstile

Cloudflare Turnstile is an advanced CAPTCHA system designed to protect websites from automated bots while ensuring minimal friction for legitimate users. Unlike traditional CAPTCHAs, which often involve solving puzzles or identifying objects, Turnstile operates through a more nuanced approach. It analyzes user behavior and various web interactions to determine whether the visitor is a human or a bot.
Turnstile employs a range of signals, including mouse movements, click patterns, and interaction times, to generate a challenge that is difficult for automated systems to solve. This makes it a powerful tool for website security but also a challenging obstacle for automation.

Bonus Code

Claim Your Bonus Code for top captcha solutions; CapSolver: WEBS. After redeeming it, you will get an extra 5% bonus after each recharge, Unlimited

Setting Up the C# Development Environment

1. Download and Install .NET

  • Visit this page to download .NET.
  • Follow the instructions provided for your operating system to install .NET.

2. Configure VS Code for C# Development

  • Install the C# extension for VS Code.
    • In VS Code, search for "C#" in the extensions marketplace and install the official plugin by Microsoft.
    • This extension provides features like IntelliSense and code formatting, making C# development easier.
  • Install the JSON parsing package Newtonsoft.Json for handling JSON data.
    • You can install this package using NuGet with the command:
      bash Copy
      dotnet add package Newtonsoft.Json

Obtain API Usage Prerequisites

1. Register for CapSolver

  • Create an account on CapSolver to access their API services.
  • After registration, you'll receive an API key necessary for accessing CapSolver's CAPTCHA solving services.

2. Retrieve SiteKey for Turnstile

  • For Cloudflare Turnstile CAPTCHA challenges, obtaining the siteKey for the target website is essential. The siteKey is required to use the decoding API and solve the CAPTCHA.
  • You can extract the siteKey using the CapSolver Extension, which simplifies the process.

Using CapSolver API to Obtain a Turnstile Token

Here's the code to interact with the CapSolver API, request CAPTCHA solving, and retrieve the Turnstile token.

csharp Copy
public static async Task<string> CallCapsolver()
{
    // // Send GET request
    // var todoItem = await GetTodoItemAsync(API_URL);
    // Console.WriteLine("GET Request Result:");
    // Console.WriteLine(todoItem);

    var data = new
    {
        clientKey = CAPSOLVER_API_KEY,
        task = new
        {
            type = "AntiTurnstileTaskProxyLess",
            websiteURL = PAGE_URL,
            websiteKey = SITE_KEY,
            metadata = new { action = "login" }
        }
    };

    // Send POST request
    var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
    Console.WriteLine("POST Request Result:");
    var responseString = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseString);
    JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
    var taskId = taskResp["taskId"].ToString();
    if (string.IsNullOrEmpty(taskId))
    {
        Console.WriteLine("No task ID received.");
        return "";
    }
    Console.WriteLine($"Created task ID: {taskId}");

    while (true)
    {
        await Task.Delay(1000); // Sleep for 1 second
        var resultData = new
        {
            clientKey = CAPSOLVER_API_KEY,
            taskId = taskId
        };

        // content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
        // response = await httpClient.PostAsync(uri, content);

        response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
        responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
        if (!response.IsSuccessStatusCode)
        {
            Console.WriteLine($"Failed to get task result: {responseString}");
            return "";
        }

        taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
        Console.WriteLine(taskResp);
        var status = taskResp["status"].ToString();

        if (status == "ready")
        {
            Console.WriteLine("Successfully => " + responseString);
            return taskResp["solution"]["token"].ToString();
        }

        if (status == "failed")
        {
            Console.WriteLine("Failed! => " + responseString);
            return "";
        }
    }
}

Full code example

csharp Copy
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace HttpExample
{
    public class Program
    {
        private const string CAPSOLVER_API_KEY = "CAI-xxxxxxxxxxxxxxxxxxx";
        private const string PAGE_URL = "https://dash.cloudflare.com/login";
        private const string SITE_KEY = "0x4AAAAAAAJel0iaAR3mgkjp";

        public static async Task Main(string[] args)
        {
            var token = await CallCapsolver();
            Console.WriteLine($"token: {token}");
            await Login(token);
        }

        public static async Task<string> CallCapsolver()
        {
            // // Send GET request
            // var todoItem = await GetTodoItemAsync(API_URL);
            // Console.WriteLine("GET Request Result:");
            // Console.WriteLine(todoItem);

            var data = new
            {
                clientKey = CAPSOLVER_API_KEY,
                task = new
                {
                    type = "AntiTurnstileTaskProxyLess",
                    websiteURL = PAGE_URL,
                    websiteKey = SITE_KEY,
                    metadata = new { action = "login" }
                }
            };

            // Send POST request
            var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
            Console.WriteLine("POST Request Result:");
            var responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);
            JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
            var taskId = taskResp["taskId"].ToString();
            if (string.IsNullOrEmpty(taskId))
            {
                Console.WriteLine("No task ID received.");
                return "";
            }
            Console.WriteLine($"Created task ID: {taskId}");

            while (true)
            {
                await Task.Delay(1000); // Sleep for 1 second
                var resultData = new
                {
                    clientKey = CAPSOLVER_API_KEY,
                    taskId = taskId
                };

                // content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
                // response = await httpClient.PostAsync(uri, content);

                response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
                responseString = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseString);
                if (!response.IsSuccessStatusCode)
                {
                    Console.WriteLine($"Failed to get task result: {responseString}");
                    return "";
                }

                taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
                Console.WriteLine(taskResp);
                var status = taskResp["status"].ToString();

                if (status == "ready")
                {
                    Console.WriteLine("Successfully => " + responseString);
                    return taskResp["solution"]["token"].ToString();
                }

                if (status == "failed")
                {
                    Console.WriteLine("Failed! => " + responseString);
                    return "";
                }
            }
        }

        public static async Task Login(string token)
        {
            using var httpClient = new HttpClient();
            // Add request headers
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cookie", $"cf_clearance={token}");
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Host", "dash.cloudflare.com");
            var data = new {
                cf_challenge_response = token,
                email = "1111111@gmail.com",
                password = "123456",
            };
            var json = JsonConvert.SerializeObject(data);
            var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

            var response = await httpClient.PostAsync("https://dash.cloudflare.com/api/v4/login", content);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Request failed with status code {response.StatusCode}");
            }

            var responseString = await response.Content.ReadAsStringAsync();
            Console.WriteLine(responseString);
        }

        private static async Task<HttpResponseMessage> GetTodoItemAsync(string url)
        {
            using var httpClient = new HttpClient();
            var response = await httpClient.GetAsync(url);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Request failed with status code {response.StatusCode}");
            }

            // var responseString = await response.Content.ReadAsStringAsync();
            return response;
        }

        private static async Task<HttpResponseMessage> PostTodoItemAsync(string url, object item)
        {
            using var httpClient = new HttpClient();
            var json = JsonConvert.SerializeObject(item);
            var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

            var response = await httpClient.PostAsync(url, content);

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Request failed with status code {response.StatusCode}");
            }

            return response;
        }
    }
}

Error Handling and Troubleshooting

  • Request Failed: If you encounter a "Request failed" error, verify that the API key and site key are correct.
    • Ensure you have an active API key from your CapSolver account.
    • Double-check that the siteKey matches the one from the target website.

Explanation

  1. Setting up the Task: In the CallCapsolver method, you define the task type AntiTurnstileTaskProxyLess, the websiteURL, and websiteKey. These parameters are sent to CapSolver to create the CAPTCHA-solving task.
  2. Polling for Task Status: Once the task is created, the code polls the getTaskResult endpoint to check the task's status. If the task is ready, it retrieves the solution (the Turnstile token); if it fails, it returns an error.
  3. Using the Token: The Login method uses the token received from CapSolver to authenticate the login request on the Cloudflare-protected website.

Conclusion

By following this guide, you’ll be able to navigate the complexities of solving Cloudflare Turnstile CAPTCHA challenges using C#. CapSolver’s API provides a reliable and efficient way to automate the process, improving your automation capabilities. For more information and updates, visit CapSolver.

Note on Compliance

Important: When engaging in web scraping, it's crucial to adhere to legal and ethical guidelines. Always ensure that you have permission to scrape the target website, and respect the site's robots.txt file and terms of service. CapSolver firmly opposes the misuse of our services for any non-compliant activities. Misuse of automated tools to bypass CAPTCHAs without proper authorization can lead to legal consequences. Make sure your scraping activities are compliant with all applicable lcaptcha and regulations to avoid potential issues.

More

CloudflareApr 21, 2026

Cloudflare Turnstile Verification Failed? Causes, Fixes & Troubleshooting Guide

Learn how to fix the "failed to verify cloudflare turnstile token" error. This guide covers causes, troubleshooting steps, and how to defeat cloudflare turnstile with CapSolver.

Emma Foster
Emma Foster
CloudflareApr 20, 2026

Best Cloudflare Challenge Solver Tools: Comparison & Use Cases

Discover the best cloudflare challenge solver tools, compare API vs. manual automation, and find optimal solutions for your web scraping and automation needs. Learn why CapSolver is a top choice.

Contents

Ethan Collins
Ethan Collins
CloudflareApr 16, 2026

How to Solve Cloudflare Turnstile in Vehicle Data Automation

Learn how to handle Cloudflare Turnstile in vehicle data and public records automation. Use CapSolver and n8n to automate record scraping efficiently.

Lucas Mitchell
Lucas Mitchell
CloudflareApr 14, 2026

CAPTCHA Error 600010: What It Means and How to Fix It Fast

Facing CAPTCHA Error 600010? Learn what this Cloudflare Turnstile error means and get step-by-step solutions for users and developers, including CapSolver integration for automation.

Anh Tuan
Anh Tuan