Skip to content

Instantly share code, notes, and snippets.

@nalgeon
Last active April 5, 2024 16:13
Show Gist options
  • Star 27 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save nalgeon/547e95d4f6b7a8b06bcdc9de3c87856a to your computer and use it in GitHub Desktop.
Save nalgeon/547e95d4f6b7a8b06bcdc9de3c87856a to your computer and use it in GitHub Desktop.
Определить ИНН по паспортным данным человека

Определить ИНН по паспортным данным человека

В поддержку «Дадаты» часто обращаются с вопросом «как получить ИНН по паспортным данным». Налоговая служба предоставляет такой сервис, но без API.

В интернете есть несколько сайтов, которые предоставляют сервис «узнать ИНН» через API. Насколько нам известно, все они используют «неофициальный» интерфейс взаимодействия с налоговой, потому что ни официального API, ни открытых данных по ИНН не существует.

Мы в «Дадате» не хотим подключать неофициальное API налоговой: оно не отличается стабильностью работы и имеет непонятные перспективы. Если вы очень хотите получать ИНН через API — вызывайте API налоговой напрямую. Мы подготовили примеры, как это сделать на самых популярных языках — Python, PHP и JavaScript.

API налоговой бесплатное, но используете его вы на свой страх и риск. Никто не гарантирует, что оно будет работать корректно и стабильно.

Пример ответа API налоговой, если ИНН найден:

{'inn': 'xxxxxxxxxxxx', 'captchaRequired': False, 'code': 1}

Ответ API, если ИНН не найден:

{'captchaRequired': False, 'code': 0}

Примеры вызова на JS, PHP и Python — ниже.

const fetch = require("node-fetch");
function suggestInn(
surname,
name,
patronymic,
birthdate,
doctype,
docnumber,
docdate
) {
const url = "https://service.nalog.ru/inn-proc.do";
const data = {
fam: surname,
nam: name,
otch: patronymic,
bdate: birthdate,
bplace: "",
doctype: doctype,
docno: docnumber,
docdt: docdate,
c: "innMy",
captcha: "",
captchaToken: ""
};
const encoded = encode(data);
resp = fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: encoded
});
return resp;
}
function encode(data) {
encoded = Object.keys(data)
.map(
key => encodeURIComponent(key) + "=" + encodeURIComponent(data[key])
)
.join("&");
return encoded;
}
suggestInn(
"Иванов",
"Сергей",
"Владимирович",
"16.03.1982",
"21",
"45 12 229333",
"03.09.2012"
)
.then(response => {
return response.json();
})
.then(response => {
console.log(response);
});
<?php
function suggestInn($surname, $name, $patronymic, $birthdate, $doctype, $docnumber, $docdate)
{
$url = "https://service.nalog.ru/inn-proc.do";
$data = array(
"fam" => $surname,
"nam" => $name,
"otch" => $patronymic,
"bdate" => $birthdate,
"bplace" => "",
"doctype" => $doctype,
"docno" => $docnumber,
"docdt" => $docdate,
"c" => "innMy",
"captcha" => "",
"captchaToken" => ""
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => array(
'Content-type: application/x-www-form-urlencoded',
),
'content' => http_build_query($data)
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return $result;
}
$resp = suggestInn("Иванов", "Сергей", "Владимирович", "16.03.1982", "21", "45 12 229333", "03.09.2012");
print_r($resp);
import requests
from enum import Enum
class DocumentType(Enum):
# Паспорт гражданина СССР
passport_ussr = "01"
# Свидетельство о рождении
birth_certificate = "03"
# Паспорт иностранного гражданина
passport_foreign = "10"
# Вид на жительство в России
residence_permit = "12"
# Разрешение на временное проживание в России
residence_permit_temp = "15"
# Свидетельство о предоставлении временного убежища на территории России
asylum_certificate_temp = "19"
# Паспорт гражданина России
passport_russia = "21"
# Свидетельство о рождении, выданное уполномоченным органом иностранного государства
birth_certificate_foreign = "23"
# Вид на жительство иностранного гражданина
residence_permit_foreign = "62"
def suggest_inn(surname, name, patronymic, birthdate, doctype, docnumber, docdate):
url = "https://service.nalog.ru/inn-proc.do"
data = {
"fam": surname,
"nam": name,
"otch": patronymic,
"bdate": birthdate,
"bplace": "",
"doctype": doctype,
"docno": docnumber,
"docdt": docdate,
"c": "innMy",
"captcha": "",
"captchaToken": "",
}
resp = requests.post(url=url, data=data)
resp.raise_for_status()
return resp.json()
if __name__ == "__main__":
response = suggest_inn(
surname="Иванов",
name="Сергей",
patronymic="Владимирович",
birthdate="16.03.1982",
doctype=DocumentType.passport_russia.value,
docnumber="45 12 229333",
docdate="03.09.2012",
)
print(response)
@Ichinya
Copy link

Ichinya commented Feb 19, 2024

Такой сервис есть у Тинькофф https://www.tinkoff.ru/inn/ Интересно, они его всё-таки реализовали через API от ФНС или "накостылили"?

Спасибо за подсказку. Сделал у себя дополнительно через Тинькофф.

@aav1984
Copy link

aav1984 commented Feb 20, 2024

@Avryanta Спасибо за наводку и пример. Если что - до сих пор работает.
зы.: только лучше бы вы в тело упаковали перс.данные, от греха.

`Для каждого эл из СтруктураПараметров Цикл

	СтрокаЗапроса = эл.Ключ+"="+эл.Значение+"&"+СтрокаЗапроса; 

КонецЦикла;

СтрокаЗапроса = КодироватьСтроку(СтрокаЗапроса,СпособКодированияСтроки.URLВКодировкеURL);

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса);`

Где в структуре ключ-значение параметров запроса (аналогично топик стартеру).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment