{"id":27786130,"url":"https://github.com/thecodetraveler/githubapistatus","last_synced_at":"2025-08-29T21:39:17.210Z","repository":{"id":37830266,"uuid":"262907570","full_name":"TheCodeTraveler/GitHubApiStatus","owner":"TheCodeTraveler","description":"A .NET library to easily parse GitHub's API Rate Limit","archived":false,"fork":false,"pushed_at":"2024-11-14T23:26:07.000Z","size":1696,"stargazers_count":16,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-19T19:09:47.565Z","etag":null,"topics":["github","github-api","github-api-ratelimit","github-api-v3","github-api-v4"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TheCodeTraveler.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["brminnick"]}},"created_at":"2020-05-11T01:15:05.000Z","updated_at":"2025-02-01T18:57:01.000Z","dependencies_parsed_at":"2023-10-03T10:10:14.345Z","dependency_job_id":"ca770604-e096-4212-b7c8-6be2ca1e3af8","html_url":"https://github.com/TheCodeTraveler/GitHubApiStatus","commit_stats":{"total_commits":312,"total_committers":2,"mean_commits":156.0,"dds":"0.40384615384615385","last_synced_commit":"24995a8a161f34f1e5efe84d2a082e03d85dd618"},"previous_names":["thecodetraveler/githubapistatus"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/TheCodeTraveler/GitHubApiStatus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeTraveler%2FGitHubApiStatus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeTraveler%2FGitHubApiStatus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeTraveler%2FGitHubApiStatus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeTraveler%2FGitHubApiStatus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TheCodeTraveler","download_url":"https://codeload.github.com/TheCodeTraveler/GitHubApiStatus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TheCodeTraveler%2FGitHubApiStatus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272766923,"owners_count":24989407,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-29T02:00:10.610Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["github","github-api","github-api-ratelimit","github-api-v3","github-api-v4"],"created_at":"2025-04-30T15:44:29.471Z","updated_at":"2025-08-29T21:39:17.202Z","avatar_url":"https://github.com/TheCodeTraveler.png","language":"C#","readme":"[![Build Projects](https://github.com/brminnick/GitHubApiStatus/actions/workflows/build.yml/badge.svg)](https://github.com/brminnick/GitHubApiStatus/actions/workflows/build.yml) [![Run Unit Tests](https://github.com/brminnick/GitHubApiStatus/actions/workflows/unittests.yml/badge.svg)](https://github.com/brminnick/GitHubApiStatus/actions/workflows/unittests.yml)\n\n\n# GitHubApiStatus\n\n| GitHubApiStatus | GitHubApiStatus.Extensions |\n| --------------- | -------------------------- |\n| [![NuGet Version](https://img.shields.io/nuget/vpre/GitHubApiStatus)](https://www.nuget.org/packages/GitHubApiStatus/) [![NuGet Downloads](https://img.shields.io/nuget/dt/GitHubApiStatus)](https://www.nuget.org/packages/GitHubApiStatus/) | [![NuGet](https://img.shields.io/nuget/vpre/GitHubApiStatus.Extensions)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/) [![NuGet](https://img.shields.io/nuget/dt/GitHubApiStatus.Extensions)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/) |\n\nGitHubApiStatus makes it easy to understand GitHub's API Rate Limit!\n\n- [Jump to the Setup](#Setup)\n- [Jump to the GitHubApiStatus API](#GitHubApiStatus-API)\n- [Jump to the GitHubApiStatus.Extensions API](#GitHubApiStatusExtensions-API)\n- [Jump to Examples](#Examples)\n\nFor more information, check out this blog post, [Introducing GitHubApiStatus](https://codetraveler.io/2021/01/12/introducing-githubapistatus/)\n\u003ca href=\"https://codetraveler.io/2021/01/12/introducing-githubapistatus\"\u003e\u003cimg width=\"490\" alt=\"Screen Shot 2021-01-22 at 12 07 53 PM\" src=\"https://user-images.githubusercontent.com/13558917/105540107-8aee4980-5caa-11eb-975c-2f44cf71e862.png\" \u003e\n\n## GitHub API Rate Limits\n\n### REST API\n\n(From the [GitHub REST API Docs](https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#rate-limiting))\n\n[![GitHub RST API Limits](https://user-images.githubusercontent.com/13558917/97235854-066e5680-17a1-11eb-98f9-01fae7c02ac0.png)](https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#rate-limiting)\n\n### GraphQL API\n\n(From the [GitHub GraphQL API Docs](https://docs.github.com/en/free-pro-team@latest/graphql/overview/resource-limitations#rate-limit))\n\n[![GitHub GraphQL API Limits](https://user-images.githubusercontent.com/13558917/97235806-ec347880-17a0-11eb-9637-fc1eb7f8dbc8.png)](https://docs.github.com/en/free-pro-team@latest/graphql/overview/resource-limitations#rate-limit)\n\n### Rate Limit Headers\n\n![Rate Limit Headers](https://user-images.githubusercontent.com/13558917/97235863-0e2dfb00-17a1-11eb-98f8-23c1065eb043.png)\n\n## Setup\n\n### GitHubApiStatus\n\n[![NuGet](https://buildstats.info/nuget/GitHubApiStatus?includePreReleases=true)](https://www.nuget.org/packages/GitHubApiStatus/)\n\n- Available on NuGet: https://www.nuget.org/packages/GitHubApiStatus/ \n- Add to any project supporting .NET Standard 1.3\n\n### GitHubApiStatus.Extensions\n\n[![NuGet](https://buildstats.info/nuget/GitHubApiStatus.Extensions?includePreReleases=true)](https://www.nuget.org/packages/GitHubApiStatus.Extensions/)\n\n- Available on NuGet: https://www.nuget.org/packages/GitHubApiStatus.Extensions/ \n- Add to any project supporting .NET Standard 2.0\n- Leverages [Microsoft.Extensions.Http](https://www.nuget.org/packages/Microsoft.Extensions.Http/)\n\n## GitHubApiStatus API\n\n#### GetApiRateLimits\n\n```csharp\npublic Task\u003cGitHubApiRateLimits\u003e GetApiRateLimits(AuthenticationHeaderValue authenticationHeaderValue)\n```\n- Get the current GitHub API Rate Limit status\n- Returns `RateLimitData` for the following GitHub APIs:\n  - REST API\n  - Search API\n  - GraphQL API\n  - Source Import API\n  - App Manifest Configuration API\n- Leverage's [GitHub Rate Limit API](https://docs.github.com/en/free-pro-team@latest/rest/reference/rate-limit) which does not count against your rate limit totals\n\n#### GetRateLimit\n\n```csharp\npublic int GetRateLimit(HttpResponseHeaders httpResponseHeaders)\n```\n- Get the total number of GitHub API Requests available\n- Parses the `X-RateLimit-Limit` header and return its `int` value\n  \n#### GetRemainingRequestCount\n  \n```csharp\npublic int GetRemainingRequestCount(HttpResponseHeaders httpResponseHeaders)\n```\n- Get the number of GitHub API Requests remaining\n- Parses the `X-RateLimit-Remaining` header and return its `int` value\n  \n#### HasReachedMaximumApiCallLimit\n  \n```csharp\npublic bool HasReachedMaximumApiCallLimit(HttpResponseHeaders httpResponseHeaders)\n```\n- Determines whether the maximum number of requests \n- Parses the `X-RateLimit-Remaining` header and returns wether or not it is greater than 0\n  \n#### GetRateLimitTimeRemaining\n  \n```csharp\npublic TimeSpan GetRateLimitTimeRemaining(HttpResponseHeaders httpResponseHeaders)\n```\n- Get the time remaining until GitHub API rate limit resets\n- Parses the `X-RateLimit-Reset` header and returns the `TimeSpan` value from the current time\n  \n#### IsResponseFromAuthenticatedRequest\n  \n```csharp\npublic bool IsResponseFromAuthenticatedRequest(HttpResponseHeaders httpResponseHeaders)\n```\n- Determine whether the request was made using an authenticated bearer token\n- Determines whether or not the `Authorization` key exists in the `Vary` header \n\n#### GetRateLimitResetDateTime\n\n```csharp\npublic DateTimeOffset GetRateLimitResetDateTime(HttpResponseHeaders httpResponseHeaders)\n```\n- Get the Date Time when the GitHub API rate limit resets\n- Parses the `X-RateLimit-Reset` header and returns its `DateTimeOffset` value\n  \n#### GetRateLimitResetDateTime_UnixEpochSeconds\n  \n```csharp\npublic long GetRateLimitResetDateTime_UnixEpochSeconds(HttpResponseHeaders httpResponseHeaders)\n```\n- Get the Date Time when the GitHub API rate limit resets\n- Parses the `X-RateLimit-Reset` header and returns its `long` value in [Unix Epoch Seconds](https://www.epochconverter.com)\n\n### DoesContainGitHubRateLimitHeader\n\n```csharp\npublic static bool DoesContainGitHubRateLimitHeader(this HttpResponseHeaders headers)\n```\n- Returns whether HttpResponseHeaders Contain X-RateLimit-Limit\n\n### DoesContainGitHubRateLimitResetHeader\n\n```csharp\npublic static bool DoesContainGitHubRateLimitResetHeader(this HttpResponseHeaders headers)\n```\n- Returns whether HttpResponseHeaders Contain X-RateLimit-Reset\n\n### DoesContainGitHubRateLimitRemainingHeader\n\n```csharp\npublic static bool DoesContainGitHubRateLimitRemainingHeader(this HttpResponseHeaders headers)\n```\n- Returns whether HttpResponseHeaders Contain X-RateLimit-Remaining\n\n## GitHubApiStatus.Extensions API\n\n#### AddGitHubApiStatusService\n\n```csharp\npublic static IHttpClientBuilder AddGitHubApiStatusService(this IServiceCollection services, AuthenticationHeaderValue authenticationHeaderValue, ProductHeaderValue productHeaderValue)\n```\n- Adds GitHubApiStatus.GitHubApiStatusService to `Microsoft.Extensions.DependencyInjection.IServiceCollection`\n\n#### AddGitHubApiStatusService\u0026lt;TGitHubApiStatusService\u0026gt;\n\n```csharp\npublic static IHttpClientBuilder AddGitHubApiStatusService\u003cTGitHubApiStatusService\u003e(this IServiceCollection services, AuthenticationHeaderValue authenticationHeaderValue, ProductHeaderValue productHeaderValue) where TGitHubApiStatusService : IGitHubApiStatusService\n```\n- Adds a custom implementation of IGitHubApiStatusService to `Microsoft.Extensions.DependencyInjection.IServiceCollection`\n  \n## Examples\n\n- [Jump to Get Current GitHub API Status](#Get-Current-GitHub-API-Status)\n- [Jump to Parse API Status from HttpResponseHeaders](#parse-api-status-from-httpresponseheaders)\n- [Jump to Dependency Injection](#Dependency-Injection)\n\n### Get Current GitHub API Status\n\n```csharp\nstatic async Task Main(string[] args)\n{\n    var gitHubApiStatusService = new GitHubApiStatusService(new AuthenticationHeaderValue(\"bearer\", \"Your GitHub Personal Access Token, e.g. 123456789012345\"));\n\n    //Generate Personal Access Token https://github.com/settings/tokens\n    var apiRateLimits = await gitHubApiStatusService.GetApiRateLimits();\n\n    // REST API Results\n    Console.WriteLine($\"What is the GitHub REST API Rate Limit? {apiRateLimits.RestApi.RateLimit}\"); // What is the GitHub REST API Rate Limit? 5000\n    Console.WriteLine($\"How many REST API requests do I have remaining? {apiRateLimits.RestApi.RemainingRequestCount}\"); // How many REST API requests do I have remaining? 4983\n    Console.WriteLine($\"How long until the GitHub REST API Rate Limit resets? {apiRateLimits.RestApi.RateLimitReset_TimeRemaining}\"); // How long until the GitHub REST API Rate Limit resets? 00:40:13.8035515\n    Console.WriteLine($\"When does the GitHub REST API Rate Limit reset? {apiRateLimits.RestApi.RateLimitReset_DateTime}\"); // When does the GitHub REST API Rate Limit reset? 10/29/2020 3:28:58 AM +00:00\n\n    Console.WriteLine();\n\n    // GraphQL API Results\n    Console.WriteLine($\"What is the GitHub GraphQL API Rate Limit? {apiRateLimits.GraphQLApi.RateLimit}\"); // What is the GitHub GraphQL API Rate Limit? 5000\n    Console.WriteLine($\"How many GraphQL API requests do I have remaining? {apiRateLimits.GraphQLApi.RemainingRequestCount}\"); // How many GraphQL API requests do I have remaining? 5000\n    Console.WriteLine($\"How long until the GitHub GraphQL API Rate Limit resets? {apiRateLimits.GraphQLApi.RateLimitReset_TimeRemaining}\"); // How long until the GitHub GraphQL API Rate Limit resets? 00:59:59.8034526\n    Console.WriteLine($\"When does the GitHub GraphQL API Rate Limit reset? {apiRateLimits.GraphQLApi.RateLimitReset_DateTime}\"); // When does the GitHub GraphQL API Rate Limit reset? 10/29/2020 3:48:44 AM +00:00\n\n    Console.WriteLine();\n\n    // Search API Results\n    Console.WriteLine($\"What is the GitHub Search API Rate Limit? {apiRateLimits.SearchApi.RateLimit}\"); // What is the GitHub Search API Rate Limit? 30\n    Console.WriteLine($\"How many Search API requests do I have remaining? {apiRateLimits.SearchApi.RemainingRequestCount}\"); // How many Search API requests do I have remaining? 30\n    Console.WriteLine($\"How long until the GitHub Search API Rate Limit resets? {apiRateLimits.SearchApi.RateLimitReset_TimeRemaining}\"); // How long until the GitHub Search API Rate Limit resets? 00:00:59.8034988\n    Console.WriteLine($\"When does the GitHub Search API Rate Limit reset? {apiRateLimits.SearchApi.RateLimitReset_DateTime}\"); // When does the GitHub Search API Rate Limit reset? 10/29/2020 2:49:44 AM +00:00\n    \n    Console.WriteLine();\n\n    // Source Import API Results\n    Console.WriteLine($\"What is the GitHub Source Import API Rate Limit? {apiRateLimits.SourceImport.RateLimit}\"); // What is the GitHub Source Import API Rate Limit? 100\n    Console.WriteLine($\"How many Source Import API requests do I have remaining? {apiRateLimits.SourceImport.RemainingRequestCount}\"); // How many Source Import API requests do I have remaining? 100\n    Console.WriteLine($\"How long until the GitHub Source Import API Rate Limit resets? {apiRateLimits.SourceImport.RateLimitReset_TimeRemaining}\"); // How long until the GitHub Source Import API Rate Limit resets? 00:00:59.8034154\n    Console.WriteLine($\"When does the GitHub Source Import API Rate Limit reset? {apiRateLimits.SourceImport.RateLimitReset_DateTime}\"); // When does the GitHub Source Import API Rate Limit reset? 10/29/2020 2:49:44 AM +00:00\n\n    Console.WriteLine();\n\n    // App Manifest Configuration API Results\n    Console.WriteLine($\"What is the GitHub App Manifest Configuration API Rate Limit? {apiRateLimits.AppManifestConfiguration.RateLimit}\"); // What is the GitHub App Manifest Configuration API Rate Limit? 5000\n    Console.WriteLine($\"How many App Manifest Configuration API requests do I have remaining? {apiRateLimits.AppManifestConfiguration.RemainingRequestCount}\"); // How many App Manifest Configuration API requests do I have remaining? 5000\n    Console.WriteLine($\"How long until the GitHub App Manifest Configuration API Rate Limit resets? {apiRateLimits.AppManifestConfiguration.RateLimitReset_TimeRemaining}\"); // How long until the GitHub App Manifest Configuration API Rate Limit resets? 00:59:59.8033802\n    Console.WriteLine($\"When does the GitHub App Manifest Configuration API Rate Limit reset? {apiRateLimits.AppManifestConfiguration.RateLimitReset_DateTime}\"); // When does the GitHub App Manifest Configuration API Rate Limit reset? 10/29/2020 3:48:44 AM +00:00\n\n    Console.WriteLine();\n\n    // Code Scanning Upload API Results\n    Console.WriteLine($\"What is the GitHub Code Scanning Upload API Rate Limit? {apiRateLimits.CodeScanningUpload.RateLimit}\"); // What is the GitHub Code Scanning Upload API Rate Limit? 500\n    Console.WriteLine($\"How many Code Scanning Upload API requests do I have remaining? {apiRateLimits.CodeScanningUpload.RemainingRequestCount}\"); // How many Code Scanning Upload API requests do I have remaining? 500\n    Console.WriteLine($\"How long until the GitHub Code Scanning Upload API Rate Limit resets? {apiRateLimits.CodeScanningUpload.RateLimitReset_TimeRemaining}\"); // How long until the GitHub Code Scanning Upload API Rate Limit resets? 00:59:59.8033455\n    Console.WriteLine($\"When does the GitHub Code Scanning Upload API Rate Limit reset? {apiRateLimits.CodeScanningUpload.RateLimitReset_DateTime}\"); // When does the GitHub Code Scanning Upload API Rate Limit reset? 10/29/2020 3:48:44 AM +00:00\n}\n```\n\n### Parse API status from `HttpResponseHeaders`\n\n```csharp\nconst string _gitHubRestApiUrl = \"https://api.github.com\";\n\nstatic readonly HttpClient _client = new HttpClient\n{\n    DefaultRequestHeaders =\n    {\n        { \"Authorization\", \"bearer [Your GitHub Personal Access Token, e.g. 123456789012345]\" }\n        { \"User-Agent\", \"GitHubApiStatus\" }\n    }\n};\n\nstatic async Task Main(string[] args)\n{\n    var gitHubApiStatusService = new GitHubApiStatusService(_client);\n\n    HttpResponseMessage restApiResponse = await _client.GetAsync($\"{ _gitHubRestApiUrl}/repos/brminnick/GitHubApiStatus\");\n    restApiResponse.EnsureSuccessStatusCode();\n\n    TimeSpan rateLimitTimeRemaining = gitHubApiStatusService.GetRateLimitTimeRemaining(restApiResponse.Headers);\n\n    int rateLimit = gitHubApiStatusService.GetRateLimit(restApiResponse.Headers);\n    int remainingRequestCount = gitHubApiStatusService.GetRemainingRequestCount(restApiResponse.Headers);\n\n    bool isAuthenticated = gitHubApiStatusService.IsResponseFromAuthenticatedRequest(restApiResponse.Headers);\n\n    bool hasReachedMaximumApiLimit = gitHubApiStatusService.HasReachedMaximumApiCallLimit(restApiResponse.Headers);\n\n    Console.WriteLine($\"What is the GitHub REST API Rate Limit? {rateLimit}\"); // What is the GitHub REST API Rate Limit? 60\n\n    Console.WriteLine($\"Have I reached the Maximum REST API Limit? {hasReachedMaximumApiLimit}\"); // Have I reached the Maximum REST API Limit? False\n    Console.WriteLine($\"How many REST API requests do I have remaining? {remainingRequestCount}\"); // How many REST API requests do I have remaining? 56\n\n    Console.WriteLine($\"How long until the GitHub REST API Rate Limit resets? {rateLimitTimeRemaining}\"); // How long until the GitHub REST API Rate Limit resets? 00:29:12.4134330\n\n    Console.WriteLine($\"Did the GitHub REST API Request include a Bearer Token? {isAuthenticated}\"); // Did GitHub REST API Request include a Bearer Token? False\n}\n```\n\n### Dependency Injection\n\n- [Jump to Blazor Example](#blazor-example)\n- [Jump to ASP.NET Core Example](#aspnet-core-example)\n- [Jump to Azure Functions Example](#azure-functions-example)\n\n#### Blazor Example\n\n```csharp\npublic class Program\n{\n    public static Task Main(string[] args)\n    {\n        var builder = WebAssemblyHostBuilder.CreateDefault(args);\n        builder.RootComponents.Add\u003cApp\u003e(\"#app\");\n        builder.Services.AddScoped(sp =\u003e new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });\n\n        // AddGitHubApiStatusService \n        builder.Services.AddGitHubApiStatusService(new AuthenticationHeaderValue(\"bearer\", \"[Your GitHub Personal Access Token, e.g. 123456789012345]\"), new ProductHeaderValue(\"MyApp\"))\n            .ConfigurePrimaryHttpMessageHandler(config =\u003e new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate });\n\n        return builder.Build().RunAsync();\n    }\n}\n```\n\n```csharp\n@page \"/graphql\"\n@using GitHubApiStatus\n@inject IGitHubApiStatusService GitHubApiStatusService\n\n\u003ch1\u003eGitHub REST Api Status\u003c/h1\u003e\n\n\u003cp\u003e@_graphQLApiStatus\u003c/p\u003e\n\n\u003cbutton class=\"btn btn-primary\" @onclick=\"GetGraphQLApiStatus\"\u003eGet Status\u003c/button\u003e\n\n@code {\n    string _graphQLApiStatus = string.Empty;\n\n    async Task GetGraphQLApiStatus()\n    {\n        var apiRateLimitStatuses = await GitHubApiStatusService.GetApiRateLimits(System.Threading.CancellationToken.None).ConfigureAwait(false);\n        _graphQLApiStatus = apiRateLimitStatuses.GraphQLApi.ToString();\n    }\n}\n```\n\n#### ASP.NET Core Example\n\n- Learn more about [Dependency Injection in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-5.0\u0026WT.mc_id=mobile-11370-bramin)\n\n```csharp\npublic class Startup\n{\n    // ...\n\n    public void ConfigureServices(IServiceCollection services)\n    {\n        services.AddGitHubApiStatusService(new AuthenticationHeaderValue(\"bearer\", \"[Your GitHub Personal Access Token, e.g. 123456789012345]\"), new ProductHeaderValue(\"MyApp\"))\n            .ConfigurePrimaryHttpMessageHandler(config =\u003e new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate });\n\n        services.AddRazorPages();\n    }\n\n    /// ...\n\n}\n```\n\n```csharp\nclass MyPageModel : PageModel\n{\n    readonly ILogger\u003cIndexModel\u003e _logger;\n    readonly IGitHubApiStatusService _gitHubApiStatusService;\n\n    public MyPageModel(IGitHubApiStatusService gitHubApiStatusService, ILogger\u003cMyPageModel\u003e logger)\n    {\n        _logger = logger;\n        _gitHubApiStatusService = gitHubApiStatusService;\n    }\n\n    // ...\n}\n```\n\n#### Azure Functions Example\n\n- Requires [Microsoft.Azure.Functions.Extensions NuGet Package](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions/)\n- Learn More about [Azure Functions Dependency Injection](https://docs.microsoft.com/azure/azure-functions/functions-dotnet-dependency-injection?WT.mc_id=mobile-11370-bramin)\n\n```csharp\n[assembly: FunctionsStartup(typeof(MyApp.Functions.Startup))]\nnamespace MyApp.Functions\n{\n    public class Startup : FunctionsStartup\n    {\n        public override void Configure(IFunctionsHostBuilder builder)\n        {\n            builder.Services.AddGitHubApiStatusService(new AuthenticationHeaderValue(\"bearer\", \"[Your GitHub Personal Access Token, e.g. 123456789012345]\"), new ProductHeaderValue(\"MyApp\"))\n                .ConfigurePrimaryHttpMessageHandler(config =\u003e new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate });\n        }\n    }\n}\n```\n\n```csharp\nclass GitHubApiStatusFunction\n{\n    readonly IGitHubApiStatusService _gitHubApiStatusService;\n\n    public MyHttpTriggerFunction(IGitHubApiStatusService gitHubApiStatusService) =\u003e _gitHubApiStatusService = gitHubApiStatusService\n\n    [FunctionName(\"GitHubApiStatus\")]\n    public async Task\u003cIActionResult\u003e Run([HttpTrigger(AuthorizationLevel.Function, \"get\", Route = null)] HttpRequest req, ILogger log)\n    {\n        log.LogInformation(\"C# HTTP trigger function processed a request.\");\n\n        var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(2));\n        var apiStatus = await _gitHubApiStatusService.GetApiRateLimits(cancellationTokenSource.Token).ConfigureAwait(false);\n\n        return new OkObjectResult(apiStatus);\n    }\n}\n```\n","funding_links":["https://github.com/sponsors/brminnick"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodetraveler%2Fgithubapistatus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthecodetraveler%2Fgithubapistatus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthecodetraveler%2Fgithubapistatus/lists"}