# C#

> YesCaptcha C# sample (.NET 6+, HttpClient and System.Text.Json). Check the balance, then create a reCAPTCHA v2 task and poll the result every 5 seconds.

Source: https://docs.yescaptcha.com/en/samples/csharp/ · Last verified: 2026-10-15

Requirements: .NET 6 or later, standard library only (`HttpClient`, `System.Text.Json`).

```bash
dotnet new console -o YesCaptchaDemo
cd YesCaptchaDemo
export YESCAPTCHA_CLIENT_KEY=your_client_key
dotnet run
```

Program.cs

```csharp
// YesCaptcha C# sample (.NET 6+): check the balance, then solve a reCAPTCHA v2.
// Run: dotnet new console -o YesCaptchaDemo, replace Program.cs with this file, set YESCAPTCHA_CLIENT_KEY, then dotnet run
using System;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Threading.Tasks;

class Program
{
    const string Api = "https://api.yescaptcha.com";
    static readonly HttpClient Http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
    static readonly string ClientKey = Environment.GetEnvironmentVariable("YESCAPTCHA_CLIENT_KEY") ?? "";

    static async Task<JsonNode> Call(string method, JsonObject payload)
    {
        payload["clientKey"] = ClientKey;
        var res = await Http.PostAsJsonAsync($"{Api}/{method}", payload);
        var data = JsonNode.Parse(await res.Content.ReadAsStringAsync())!;
        if ((int?)data["errorId"] != 0)
            throw new Exception($"{data["errorCode"]}: {data["errorDescription"]}");
        return data;
    }

    static async Task<JsonNode> Solve(JsonObject task)
    {
        var created = await Call("createTask", new JsonObject { ["task"] = task });
        if ((string?)created["status"] == "ready") return created["solution"]!; // synchronous types
        var taskId = (string)created["taskId"]!;
        for (var i = 0; i < 36; i++) // poll every 5 seconds, for up to about 3 minutes
        {
            await Task.Delay(5000);
            var result = await Call("getTaskResult", new JsonObject { ["taskId"] = taskId });
            if ((string?)result["status"] == "ready") return result["solution"]!;
        }
        throw new TimeoutException(taskId);
    }

    static async Task Main()
    {
        var balance = await Call("getBalance", new JsonObject());
        Console.WriteLine($"balance (points): {balance["balance"]}");

        var solution = await Solve(new JsonObject
        {
            ["type"] = "NoCaptchaTaskProxyless",
            ["websiteURL"] = "https://www.google.com/recaptcha/api2/demo",
            ["websiteKey"] = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        });
        Console.WriteLine(solution["gRecaptchaResponse"]);
    }
}
```

For other task types, change only the task object passed to `Solve`; the fields are on each [task type](https://docs.yescaptcha.com/en/tasks/) page. Synchronous types (image recognition, `ImageToTextTaskOcrBase`) return the result from `createTask`, which `Solve` already handles.
