FnsNet.NpdStatus
1.1.0
dotnet add package FnsNet.NpdStatus --version 1.1.0
NuGet\Install-Package FnsNet.NpdStatus -Version 1.1.0
<PackageReference Include="FnsNet.NpdStatus" Version="1.1.0" />
<PackageVersion Include="FnsNet.NpdStatus" Version="1.1.0" />
<PackageReference Include="FnsNet.NpdStatus" />
paket add FnsNet.NpdStatus --version 1.1.0
#r "nuget: FnsNet.NpdStatus, 1.1.0"
#:package FnsNet.NpdStatus@1.1.0
#addin nuget:?package=FnsNet.NpdStatus&version=1.1.0
#tool nuget:?package=FnsNet.NpdStatus&version=1.1.0
<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 | Versions 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. |
-
net10.0
- Microsoft.Extensions.Http (>= 10.0.0)
- Microsoft.Extensions.Options (>= 10.0.0)
-
net8.0
- Microsoft.Extensions.Http (>= 8.0.1)
- Microsoft.Extensions.Options (>= 8.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Сырое тело ответа: всегда на исключении, по флагу — на успешном ответе.