FnsNet.NpdStatus 1.1.0

dotnet add package FnsNet.NpdStatus --version 1.1.0
                    
NuGet\Install-Package FnsNet.NpdStatus -Version 1.1.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FnsNet.NpdStatus" Version="1.1.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FnsNet.NpdStatus" Version="1.1.0" />
                    
Directory.Packages.props
<PackageReference Include="FnsNet.NpdStatus" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FnsNet.NpdStatus --version 1.1.0
                    
#r "nuget: FnsNet.NpdStatus, 1.1.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FnsNet.NpdStatus@1.1.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FnsNet.NpdStatus&version=1.1.0
                    
Install as a Cake Addin
#tool nuget:?package=FnsNet.NpdStatus&version=1.1.0
                    
Install as a Cake Tool

<table> <tr> <td width="170" align="center" valign="middle"> <img src="https://raw.githubusercontent.com/ai-iskuzhin/FnsNet.NpdStatus/main/assets/FnsSignNet.png" width="140" alt="Логотип FnsNet.NpdStatus" /> </td> <td valign="middle"> <h1>FnsNet.NpdStatus</h1> <p>.NET SDK для публичного сервиса ФНС России <a href="https://npd.nalog.ru/check-status/">«Проверка статуса налогоплательщика налога на профессиональный доход»</a>: по ИНН и дате отвечает, был ли человек самозанятым на эту дату.</p> <p> <a href="https://github.com/ai-iskuzhin/FnsNet.NpdStatus/actions/workflows/ci.yml"><img src="https://github.com/ai-iskuzhin/FnsNet.NpdStatus/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI" /></a> <a href="https://www.nuget.org/packages/FnsNet.NpdStatus"><img src="https://img.shields.io/nuget/v/FnsNet.NpdStatus?logo=nuget" alt="NuGet" /></a> <a href="https://www.nuget.org/packages/FnsNet.NpdStatus"><img src="https://img.shields.io/nuget/dt/FnsNet.NpdStatus" alt="Downloads" /></a> <a href="https://github.com/ai-iskuzhin/FnsNet.NpdStatus/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ai-iskuzhin/FnsNet.NpdStatus" alt="License: MIT" /></a> <img src="https://img.shields.io/badge/targets-net8.0%20%7C%20net10.0-512BD4?logo=dotnet" alt="Targets" /> </p> </td> </tr> </table>

Сервис открытый: ни ключа, ни регистрации, ни договора. Ограничения — два запроса в минуту с одного IP-адреса, и доступ только из российских сетей.

Установка

dotnet add package FnsNet.NpdStatus

Быстрый старт

using FnsNet.NpdStatus;
using Microsoft.Extensions.DependencyInjection;

services.AddNpdStatusClient();
public sealed class SelfEmployedCheck(INpdStatusClient fns)
{
    public async Task<bool?> IsSelfEmployedTodayAsync(string inn, CancellationToken ct)
    {
        try
        {
            var status = await fns.GetStatusAsync(inn, DateOnly.FromDateTime(DateTime.UtcNow), ct);

            return status.IsRegistered;
        }
        catch (NpdStatusException exception) when (exception.IsTransient)
        {
            // Сервис занят или недоступен — статус неизвестен. Это не «не самозанятый».
            return null;
        }
    }
}

AddNpdStatusClient возвращает IHttpClientBuilder — повторы, ограничение частоты и логирование добавляются как обычно:

services.AddNpdStatusClient()
    .AddPolicyHandler(retryPolicy)
    .AddHttpMessageHandler<MyRateLimitingHandler>();

Без контейнера зависимостей

using var client = NpdStatusClient.Create();

var status = await client.GetStatusAsync("525741209968", new DateOnly(2026, 10, 1));

Что умеет

Метод Эндпоинт Назначение
GetStatusAsync(inn, date, ct) POST /api/v1/tracker/taxpayer_status Был ли ИНН плательщиком НПД на указанную дату

Ответ — NpdTaxpayerStatus(Inn, Date, IsRegistered, Message). Message — фраза самого сервиса по-русски, её можно показывать пользователю.

requestDate принимается не раньше 01.01.2019, когда режим начал действовать, и не позже сегодняшнего дня. Регистрацию можно прекратить в любой момент, поэтому ответ верен только для того дня, о котором спросили: храните дату рядом с результатом.

Ошибки

Неуспешный ответ приходит как NpdStatusException с кодом и сообщением сервиса.

Code HTTP Что значит IsTransient
validation.failed 422 Некорректный ИНН или дата вне допустимого окна. Подробности — в сообщении. false
taxpayer.status.service.unavailable.error 422 Сервис временно недоступен. true
taxpayer.status.service.limited.error 422 Превышены два запроса в минуту. true
(нет) 400 Тело не разобралось, поэтому кода сервис не прислал. false
(нет) 500 Внутренняя ошибка сервиса. true

Ошибка не значит «не самозанятый»: неудачная проверка оставляет статус неизвестным.

Отладка

Трассировка и логирование запросов работают средствами платформы — SDK для этого ничего не делает.

// Запрос попадает в трассировку как обычный HTTP-вызов.
services.AddOpenTelemetry().WithTracing(t => t.AddHttpClientInstrumentation());
// Логи именно этого клиента: заголовки и тайминги. Тела запросов и ответов сюда не попадают.
"Logging": {
  "LogLevel": {
    "System.Net.Http.HttpClient.FnsNet.NpdStatus.LogicalHandler": "Trace",
    "System.Net.Http.HttpClient.FnsNet.NpdStatus.ClientHandler": "Trace"
  }
}

Имя клиента — ServiceCollectionExtensions.HttpClientName.

Сырое тело ответа

Тело ответа с ошибкой есть всегда:

catch (NpdStatusException exception)
{
    logger.LogWarning(
        "ФНС ответила {Status} {Code}: {Body}",
        (int)exception.StatusCode, exception.Code, exception.ResponseBody);
}

Тело успешного ответа — по флагу, по умолчанию выключено: в нём ИНН, то есть персональные данные.

services.AddNpdStatusClient(o => o.CaptureRawResponseBody = true);

var status = await fns.GetStatusAsync(inn, date, ct);
// status.RawResponseBody

Источник

Описание API публичного сервиса ФНС России «Проверка статуса налогоплательщика налога на профессиональный доход (самозанятого)», версия 1.0.0 от 21.02.2019. Краткий конспект — в docs/api.md.

Лицензия

MIT.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.0 83 10/1/2026
1.0.0 74 10/1/2026

Сырое тело ответа: всегда на исключении, по флагу — на успешном ответе.