Главная → Документация → Таможня ФТС
Таможня ФТС: API таможенного выпуска и утильсбора по VIN, кузову и шасси
Запрос в ФТС по автомобилю: дата и время таможенного выпуска, марка и модель, номера кузова и шасси, страна и сведения об утилизационном сборе: статус оплаты, таможенный орган, ввезён ли для личного пользования. Поиск по VIN, номеру кузова или шасси, поэтому подходит и для японских машин без VIN.
Когда нужен этот метод
- Машина без VIN. Японские и праворульные автомобили ищутся по номеру кузова или шасси.
- Нужен утильсбор. Статус оплаты утилизационного сбора, таможенный орган и признак ввоза для личного пользования.
- Нужна точная дата выпуска. Дата и время таможенного оформления по данным ФТС.
Рекомендуем сначала Данные о растаможке (/customs): нашлись сведения о ввозе - этот запрос не нужен. Таможня ФТС оплачивается за каждую выполненную проверку, в том числе когда сведений нет. В личном кабинете (полный отчёт и пакетная проверка) так и сделано: по VIN запрос в ФТС уходит, только если Данные о растаможке ничего не нашли.
Аутентификация
Токен передаётся заголовком Authorization: Bearer <токен> либо параметром ?token=. Токен один для всех API, он выдаётся в личном кабинете сразу после регистрации.
Эндпоинт
GET https://api.avtovincod.ru/customs-fts
Параметры
Передайте ровно один параметр поиска.
| Параметр | Что искать | Формат |
|---|---|---|
vin | по VIN | 17 символов, латиница и цифры без I, O, Q. Русские буквы-двойники переводятся в латиницу сами |
body | по номеру кузова | от 5 символов: латинские буквы, цифры и дефис, например NCP51-0123456. Пробелы убираются |
chassis | по номеру шасси | так же, как номер кузова, например HZJ105-0012345 |
Пример запроса
curl --max-time 90 -H "Authorization: Bearer $TOKEN" \
"https://api.avtovincod.ru/customs-fts?vin=JTDBT923771234567"
Ставьте таймаут на своей стороне не меньше 90 секунд: ФТС обычно отвечает за минуту, ответ готовится на стороне источника.
Пример ответа: сведения найдены
{
"success": 1,
"query": {
"vin": "JTDBT923771234567"
},
"found": true,
"checkedAt": "2026-11-04T12:00:00+03:00",
"records": [
{
"source": "provider",
"vin": "JTDBT923771234567",
"model": "TOYOTA COROLLA FIELDER",
"chassis": null,
"body": "JTDBT923771234567",
"country": "392",
"releaseDate": "2021-05-20",
"releaseTime": "14:32:10",
"recyclingFee": [
{
"paymentStatus": "Оплачен",
"customsCode": "10702070",
"personalUse": true,
"date": "2021-05-18"
}
]
}
],
"billing": {
"charged": 10,
"currency": "RUB",
"billed": true,
"balance": 990,
"requestId": 1234567
}
}
VIN и сведения в примере условные; billing - списание за этот запрос (цифры условные).
По номеру кузова
GET https://api.avtovincod.ru/customs-fts?body=NCP51-0123456
{
"success": 1,
"query": {
"body": "NCP51-0123456"
},
"found": true,
"checkedAt": "2026-11-04T12:00:00+03:00",
"records": [
{
"source": "provider",
"vin": null,
"model": "TOYOTA PROBOX",
"chassis": null,
"body": "NCP51-0123456",
"country": "392",
"releaseDate": "2019-08-14",
"releaseTime": "11:05:42",
"recyclingFee": [
{
"paymentStatus": "Оплачен",
"customsCode": "10702030",
"personalUse": false,
"date": "2019-08-12"
}
]
}
]
}
Поля ответа
| Поле | Значение |
|---|---|
query | по какому параметру искали и значение без пробелов (у кузова и шасси дефис сохраняется) |
found | true - сведения о выпуске есть, false - проверка выполнена, сведений нет |
checkedAt | дата и время, на которые получены сведения (ISO 8601) |
records[].vin | VIN по данным ФТС; у машин без VIN null |
records[].model | марка и модель |
records[].body | номер кузова |
records[].chassis | номер шасси |
records[].country | код страны из сведений ФТС, если указан (например, 392 - Япония) |
records[].releaseDate | дата таможенного выпуска, YYYY-MM-DD. Не дата производства |
records[].releaseTime | время выпуска по Москве, HH:MM:SS |
records[].recyclingFee[] | сведения об утилизационном сборе; нет записей - пустой список |
recyclingFee[].paymentStatus | статус оплаты сбора, как его передаёт ФТС |
recyclingFee[].customsCode | код таможенного органа |
recyclingFee[].personalUse | true - ввезён для личного пользования, false - нет, null - не указано |
recyclingFee[].date | дата документа, YYYY-MM-DD |
records[].source | вид записи: всегда provider, как у сведений о ТС в Данных о растаможке |
billing | списание за запрос: charged, billed, balance, requestId |
Поля, которых нет в сведениях ФТС, приходят null, ключи остаются на месте. Структура записи совпадает со сведениями о ТС в Данных о растаможке и дополнена полями releaseTime и recyclingFee.
Пример ответа: сведений нет
HTTP 200, success: 1, found: false. Проверка выполнена и оплачивается.
{
"success": 1,
"query": {
"vin": "XTA219000N0123456"
},
"found": false,
"checkedAt": "2026-11-04T12:00:00+03:00",
"records": [],
"billing": {
"charged": 10,
"currency": "RUB",
"billed": true,
"balance": 980,
"requestId": 1234568
}
}
Ответ ещё готовится
Проверку выполняет ФТС. Если ответ не успел за время запроса, приходит PROCESSING: проверка уже идёт и оплачена. Повторите тот же запрос с теми же параметрами через 1-2 минуты (retryAfterSec): в течение 30 минут повтор берёт эту же проверку и не оплачивается.
{
"success": 0,
"code": "PROCESSING",
"query": {
"vin": "JTDBT923771234567"
},
"retryAfterSec": 60,
"error": "Проверка ещё выполняется в ФТС. Повторите запрос с теми же параметрами через 1-2 минуты: результат этой проверки придёт без повторной оплаты (в течение 30 минут)."
}
Коды ошибок
| Код | Значение | HTTP | Оплата |
|---|---|---|---|
INPUT_REQUIRED | не передан ни один параметр поиска | 400 | нет |
INPUT_CONFLICT | передано больше одного параметра | 400 | нет |
BAD_VIN | VIN не из 17 символов или с недопустимыми буквами | 400 | нет |
BAD_BODY / BAD_CHASSIS | номер кузова или шасси короче 5 символов или с недопустимыми знаками | 400 | нет |
NO_TOKEN | токен не передан | 401 | нет |
TOKEN_INVALID | токен недействителен или деактивирован | 401 | нет |
INSUFFICIENT_BALANCE | недостаточно средств на балансе | 402 | нет |
NOT_ALLOWED | метод не подключён вашему токену | 403 | нет |
API_DISABLED | метод временно отключён | 403 | нет |
IP_NOT_ALLOWED | запрос с IP вне вашего белого списка | 403 | нет |
RATE_LIMIT | превышен лимит запросов в минуту | 429 | нет |
RATE_LIMIT_IP | слишком много запросов с одного IP | 429 | нет |
PROCESSING | ФТС ещё готовит ответ: повторите тот же запрос через 1-2 минуты, повтор бесплатный | 200 | да, один раз |
SOURCE_ERROR | источник принял проверку, но не выполнил её | 200 | да |
PROVIDER_FAIL | проверка не началась: источник не ответил или отказал | 200 | нет |
SERVICE_UNAVAILABLE | сервис временно недоступен, повторите позже | 503 | нет |
Ошибка приходит в виде {"success": 0, "error": "...", "code": "..."}. PROCESSING, SOURCE_ERROR и PROVIDER_FAIL приходят с HTTP 200: проверяйте поле success. Оплачиваются только PROCESSING и SOURCE_ERROR: проверка в ФТС уже началась.
Примеры кода: PHP, Python, JavaScript, Go, Java, C#, Ruby, 1С
Примеры готовы к запуску: токен берётся из переменной окружения AVC_TOKEN, а в запросе стоит тестовое значение (vin=X7TEST00000000001). По тестовым значениям приходит ответ-образец по схеме метода: бесплатно, без списания и даже при нулевом балансе, с полем "testMode": true. Так интеграцию можно собрать и проверить до первого платного запроса. Все тестовые значения.
curl -s --max-time 90 -G "https://api.avtovincod.ru/customs-fts" \
--data-urlencode "vin=X7TEST00000000001" \
-H "Authorization: Bearer $AVC_TOKEN"<?php
$url = 'https://api.avtovincod.ru/customs-fts?' . http_build_query(['vin' => 'X7TEST00000000001']);
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 90,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AVC_TOKEN')]]);
$d = json_decode(curl_exec($ch), true);
echo $d['success'] ? json_encode($d, JSON_UNESCAPED_UNICODE) : $d['code'] . ': ' . $d['error'];import os, requests
r = requests.get("https://api.avtovincod.ru/customs-fts", params={"vin": "X7TEST00000000001"},
headers={"Authorization": "Bearer " + os.environ["AVC_TOKEN"]}, timeout=90)
d = r.json()
print(d if d.get("success") else f'{d["code"]}: {d["error"]}')// Node.js 18+, файл .mjs (await на верхнем уровне)
const url = "https://api.avtovincod.ru/customs-fts?" + new URLSearchParams({ vin: "X7TEST00000000001" });
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AVC_TOKEN}` },
signal: AbortSignal.timeout(90000) });
const d = await res.json();
console.log(d.success ? d : `${d.code}: ${d.error}`);package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"time"
)
func main() {
q := url.Values{}
q.Set("vin", "X7TEST00000000001")
req, _ := http.NewRequest("GET", "https://api.avtovincod.ru/customs-fts?"+q.Encode(), nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AVC_TOKEN"))
resp, err := (&http.Client{Timeout: 90 * time.Second}).Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(resp.StatusCode, string(body))
}// Java 11+
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class AvtoVinCod {
public static void main(String[] args) throws Exception {
String q = "vin=" + URLEncoder.encode("X7TEST00000000001", StandardCharsets.UTF_8);
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.avtovincod.ru/customs-fts?" + q))
.header("Authorization", "Bearer " + System.getenv("AVC_TOKEN"))
.timeout(Duration.ofSeconds(90)).GET().build();
HttpResponse<String> resp = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.statusCode() + " " + resp.body());
}
}// .NET 6+
using System.Net.Http.Headers;
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(90) };
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("AVC_TOKEN"));
var url = "https://api.avtovincod.ru/customs-fts?" + "vin=" + Uri.EscapeDataString("X7TEST00000000001");
var resp = await http.GetAsync(url);
Console.WriteLine((int)resp.StatusCode + " " + await resp.Content.ReadAsStringAsync());require "net/http"
require "json"
uri = URI("https://api.avtovincod.ru/customs-fts")
uri.query = URI.encode_www_form(vin: "X7TEST00000000001")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV["AVC_TOKEN"]}"
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 90) { |h| h.request(req) }
d = JSON.parse(res.body)
puts d["success"] == 1 ? d : "#{d["code"]}: #{d["error"]}"Токен = "ВАШ_ТОКЕН";
Соединение = Новый HTTPСоединение("api.avtovincod.ru", 443, , , , 90, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/customs-fts?" + "vin=" + КодироватьСтроку("X7TEST00000000001", СпособКодированияСтроки.КодировкаURL));
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
Ответ = Соединение.Получить(Запрос);
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку("UTF-8"));
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Если Данные.success = 1 Тогда
Сообщить("Проверка выполнена");
Иначе
Сообщить(Данные.code + ": " + Данные.error);
КонецЕсли;Бесплатных тестовых периодов и долгих согласований нет: пополните баланс в личном кабинете и сразу проверяйте реальные машины. Токен выдаётся при регистрации, деньги списываются только по правилам метода (раздел "Тарификация"). Нужен доступ из ИИ-ассистента: MCP-сервер.
Примеры ответов: успешный, ошибка, источник недоступен
Успешный запрос
GET https://api.avtovincod.ru/customs-fts?vin=JTDBT923771234567
Authorization: Bearer ВАШ_ТОКЕН
HTTP 200, success: 1. Списание по тарифу метода, сумма и остаток в блоке billing (цифры в примере условные).
{
"success": 1,
"query": { "vin": "JTDBT923771234567" },
"found": true,
"records": [ ... ],
"billing": {
"charged": 10,
"currency": "RUB",
"billed": true,
"balance": 990,
"requestId": 1234567
}
}
Бесплатная проба без списания: https://api.avtovincod.ru/customs-fts?vin=X7TEST00000000001 вернёт ответ-образец по этой же схеме с полем testMode: true и charged: 0. Тестовые значения есть и для body=TEST-0000001, chassis=TEST-0000001.
Неуспешный запрос
GET https://api.avtovincod.ru/customs-fts?vin=JTDBT92377123456
Authorization: Bearer ВАШ_ТОКЕН
Ошибка в параметрах: HTTP 400, код BAD_VIN, текст ошибки можно показать пользователю. Бесплатно.
{
"success": 0,
"error": "VIN должен содержать 17 символов, у вас 16. Проверьте ввод.",
"code": "BAD_VIN"
}
Источник не выполнил проверку
ФТС приняла проверку, но не выполнила её: HTTP 200, SOURCE_ERROR. Проверка оплачивается, повторите позже.
{
"success": 0,
"code": "SOURCE_ERROR",
"query": {
"vin": "JTDBT923771234567"
},
"error": "Источник ФТС не выполнил проверку. Проверка оплачивается, как и у источника: повторите позже."
}
Проверка не началась
Источник не ответил или отказал до начала проверки: HTTP 200, PROVIDER_FAIL. Бесплатно, повторите через несколько минут.
{
"success": 0,
"error": "Проверка не выполнена, повторите позже",
"code": "PROVIDER_FAIL"
}
Сервис недоступен
HTTP 503, SERVICE_UNAVAILABLE. Бесплатно, повторите запрос позже.
{
"success": 0,
"error": "Сервис временно недоступен",
"code": "SERVICE_UNAVAILABLE"
}
Тарификация
Списание один раз за каждую выполненную проверку: и когда сведения найдены, и когда их нет (found: false), а также при SOURCE_ERROR и PROCESSING, потому что проверка в ФТС уже началась. Повтор после PROCESSING с теми же параметрами в течение 30 минут не оплачивается. Ошибки в параметрах, PROVIDER_FAIL, SERVICE_UNAVAILABLE и остальные ошибки бесплатны. Цена и подключение метода в личном кабинете.
В ответ добавляется блок billing: сколько списано за этот запрос (charged, в рублях), платный ли он (billed), остаток баланса после запроса (balance) и номер в истории запросов (requestId). Те же данные в заголовках X-Charged, X-Balance, X-Request-Id. Нет блока - запрос не списан. Подробнее о блоке billing.
Без программиста: кабинет, отчёт, пакет
- Проверка в кабинете. Раздел «Проверка»: введите VIN, номер кузова или шасси и получите сведения в читаемом виде.
- Полный отчёт по машине. По госномеру, VIN или кузову. По VIN запрос в ФТС идёт, только если Данные о растаможке ничего не нашли, по кузову - сразу.
- Пакетная проверка. Загрузите файл со списком машин, результат придёт таблицей и в Excel. Правило то же, что в полном отчёте.
MCP-сервер для ИИ-ассистентов
Подключите проверки к ИИ-ассистенту: Claude, Cursor, VS Code и другим клиентам с поддержкой MCP (Model Context Protocol). Ассистент сам вызывает нужный метод по вашему токену, и проверку можно запросить обычными словами: "когда растаможен автомобиль с кузовом NCP51-0123456 и оплачен ли утильсбор".
- Адрес сервера:
https://api.avtovincod.ru/mcp, авторизация тем же токеном (Authorization: Bearer ВАШ_ТОКЕН). - Этот метод в MCP - инструмент
customs_fts_check; всего инструментов 45. - Цены и списания как у API, в результате тоже есть блок
billing. Тестовые значения работают бесплатно. - Инструкция по подключению: avtovincod.ru/docs/mcp/
Для генераторов клиентов и ИИ-агентов: OpenAPI-спецификация метода (YAML). Все методы сразу: /openapi.yaml.
Смежные методы
- Данные о растаможке: сведения о ввозе по VIN, включая таможенные декларации; рекомендуем проверять первыми.
- Проверка ЭПТС: электронный паспорт, в том числе сведения об утилизационном сборе.
- VIN по госномеру: VIN или номер кузова по госномеру, чтобы затем проверить растаможку.
- История регистрации: владельцы и характеристики по VIN или номеру кузова.
Частые вопросы
Чем этот метод отличается от Данных о растаможке (/customs)?
Данные о растаможке ищут по VIN в нескольких источниках, включая архив таможенных деклараций. Таможня ФТС - прямой вопрос к ФТС об автомобиле: ищет и по номеру кузова или шасси, отдаёт время выпуска и сведения об утилизационном сборе, но оплачивается каждая выполненная проверка. Рекомендуем сначала /customs: нашлись сведения - этот запрос не нужен.
Когда спишутся деньги?
За каждую выполненную проверку: сведения найдены, сведений нет (found: false), источник не выполнил проверку (SOURCE_ERROR) или ответ ещё готовится (PROCESSING). Ошибки в параметрах, PROVIDER_FAIL и SERVICE_UNAVAILABLE бесплатны.
Что делать с ответом PROCESSING?
ФТС ещё готовит ответ. Повторите тот же запрос с теми же параметрами через минуту-две: в течение 30 минут повтор берёт эту же проверку и не оплачивается. Обычно ответ приходит в первом же запросе.
Что такое дата выпуска?
Дата и время таможенного выпуска автомобиля (по Москве), то есть когда он прошёл таможенное оформление. Это не дата производства и не дата первой регистрации в ГИБДД.
Почему сведений нет?
Обычно так у машин, произведённых в России, и у ввезённых до появления электронных записей. Если машина ввезена недавно, сведения могут появиться позже.
Можно ли проверить японский автомобиль без VIN?
Да: передайте номер кузова (body) или шасси (chassis) так, как он записан в документах, можно с дефисом, например NCP51-0123456.
Что значат поля утильсбора?
paymentStatus - статус оплаты утилизационного сбора, как его передаёт ФТС; customsCode - код таможенного органа; personalUse - ввезён ли автомобиль для личного пользования; date - дата документа. Записей может быть несколько или не быть вовсе.
Проверить без программиста
В личном кабинете есть консоль проверки: введите номер и получите ответ в читаемом виде, без кода.