# How to Get YouTube Transcripts in C# and .NET

Source: https://transcript-yt.com/blog/youtube-transcript-api-csharp-dotnet · Updated 2026-11-09 · TranscriptYT

> Fetch YouTube transcripts in C# with HttpClient and System.Net.Http.Json: records for the response, SRT and VTT downloads, translation, and error handling.

In .NET you need no NuGet package beyond the framework: HttpClient and System.Net.Http.Json read the TranscriptYT [YouTube Transcript API](https://transcript-yt.com/api) into C# records. It works in console apps, ASP.NET Core, Azure Functions, and anywhere else .NET runs.

## Fetch a transcript

Create a free key in the [dashboard](https://transcript-yt.com/dashboard/keys) (100 transcripts, no card) and set it as the TRANSCRIPTYT_KEY environment variable. This is a complete Program.cs.

```
using System.Net.Http.Headers;
using System.Net.Http.Json;

var http = new HttpClient { Timeout = TimeSpan.FromSeconds(120) };
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("TRANSCRIPTYT_KEY"));

var url = "https://transcript-yt.com/v1/transcript?url=" + Uri.EscapeDataString("https://youtu.be/5f3Pn-N6yLc");
using var res = await http.GetAsync(url);
if (!res.IsSuccessStatusCode)
{
    var err = await res.Content.ReadFromJsonAsync<ApiError>();
    throw new Exception($"{err?.Error.Code}: {err?.Error.Message}");
}

var t = (await res.Content.ReadFromJsonAsync<Transcript>())!;
Console.WriteLine($"{t.Title} {t.Language} {t.Source}");
foreach (var s in t.Segments.Take(3))
    Console.WriteLine($"{s.Start,7:F1}s  {s.Text}");

record Segment(double Start, double Duration, string Text);
record Transcript(string VideoId, string? Title, string Language, string Source, List<Segment> Segments);
record ApiErrorBody(string Code, string Message);
record ApiError(ApiErrorBody Error);
```

## Subtitle files and translation

Add format=srt (or vtt, text, csv, md) to get the file body directly, and translate_to to translate into one of 150+ languages with the timings kept.

```
var srt = await http.GetStringAsync(
    "https://transcript-yt.com/v1/transcript?url=5f3Pn-N6yLc&format=srt&translate_to=es");
await File.WriteAllTextAsync("captions.es.srt", srt);
```

## Errors and retries

Retry BLOCKED, RATE_LIMITED, and UPSTREAM_ERROR with backoff (Polly or Microsoft.Extensions.Http.Resilience work well). VIDEO_UNAVAILABLE, NO_CAPTIONS, and LANGUAGE_NOT_AVAILABLE are final, and a 402 means you're out of credits. Failed requests are never billed. Every code is in the [docs](https://transcript-yt.com/docs).

## FAQ

### How do I get a YouTube transcript in C#?

Call GET https://transcript-yt.com/v1/transcript with the video URL as the url parameter and your key as a Bearer token, then read the JSON with ReadFromJsonAsync.

### Which .NET version do I need?

.NET 6 or later. System.Net.Http.Json is part of the framework, and its web defaults map the API's camelCase fields to PascalCase properties.

### Should I create a new HttpClient per request?

No. Reuse one instance, or register it with IHttpClientFactory in ASP.NET Core, so connections are pooled.
