Личный кабинет

Главная → Документация → Таможня ФТС

Таможня ФТС: API таможенного выпуска и утильсбора по VIN, кузову и шасси

Запрос в ФТС по автомобилю: дата и время таможенного выпуска, марка и модель, номера кузова и шасси, страна и сведения об утилизационном сборе: статус оплаты, таможенный орган, ввезён ли для личного пользования. Поиск по VIN, номеру кузова или шасси, поэтому подходит и для японских машин без VIN.

Метод GET /customs-ftsПоиск VIN · кузов · шассиИсточник ФТСОтвет обычно до минуты

Когда нужен этот метод

Рекомендуем сначала Данные о растаможке (/customs): нашлись сведения о ввозе - этот запрос не нужен. Таможня ФТС оплачивается за каждую выполненную проверку, в том числе когда сведений нет. В личном кабинете (полный отчёт и пакетная проверка) так и сделано: по VIN запрос в ФТС уходит, только если Данные о растаможке ничего не нашли.

Аутентификация

Токен передаётся заголовком Authorization: Bearer <токен> либо параметром ?token=. Токен один для всех API, он выдаётся в личном кабинете сразу после регистрации.

Эндпоинт

GET https://api.avtovincod.ru/customs-fts

Параметры

Передайте ровно один параметр поиска.

ПараметрЧто искатьФормат
vinпо VIN17 символов, латиница и цифры без 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по какому параметру искали и значение без пробелов (у кузова и шасси дефис сохраняется)
foundtrue - сведения о выпуске есть, false - проверка выполнена, сведений нет
checkedAtдата и время, на которые получены сведения (ISO 8601)
records[].vinVIN по данным ФТС; у машин без 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[].personalUsetrue - ввезён для личного пользования, 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_VINVIN не из 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слишком много запросов с одного IP429нет
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.

Без программиста: кабинет, отчёт, пакет

MCP-сервер для ИИ-ассистентов

Подключите проверки к ИИ-ассистенту: Claude, Cursor, VS Code и другим клиентам с поддержкой MCP (Model Context Protocol). Ассистент сам вызывает нужный метод по вашему токену, и проверку можно запросить обычными словами: "когда растаможен автомобиль с кузовом NCP51-0123456 и оплачен ли утильсбор".

Для генераторов клиентов и ИИ-агентов: OpenAPI-спецификация метода (YAML). Все методы сразу: /openapi.yaml.

Смежные методы

Частые вопросы

Чем этот метод отличается от Данных о растаможке (/customs)?

Данные о растаможке ищут по VIN в нескольких источниках, включая архив таможенных деклараций. Таможня ФТС - прямой вопрос к ФТС об автомобиле: ищет и по номеру кузова или шасси, отдаёт время выпуска и сведения об утилизационном сборе, но оплачивается каждая выполненная проверка. Рекомендуем сначала /customs: нашлись сведения - этот запрос не нужен.

Когда спишутся деньги?

За каждую выполненную проверку: сведения найдены, сведений нет (found: false), источник не выполнил проверку (SOURCE_ERROR) или ответ ещё готовится (PROCESSING). Ошибки в параметрах, PROVIDER_FAIL и SERVICE_UNAVAILABLE бесплатны.

Что делать с ответом PROCESSING?

ФТС ещё готовит ответ. Повторите тот же запрос с теми же параметрами через минуту-две: в течение 30 минут повтор берёт эту же проверку и не оплачивается. Обычно ответ приходит в первом же запросе.

Что такое дата выпуска?

Дата и время таможенного выпуска автомобиля (по Москве), то есть когда он прошёл таможенное оформление. Это не дата производства и не дата первой регистрации в ГИБДД.

Почему сведений нет?

Обычно так у машин, произведённых в России, и у ввезённых до появления электронных записей. Если машина ввезена недавно, сведения могут появиться позже.

Можно ли проверить японский автомобиль без VIN?

Да: передайте номер кузова (body) или шасси (chassis) так, как он записан в документах, можно с дефисом, например NCP51-0123456.

Что значат поля утильсбора?

paymentStatus - статус оплаты утилизационного сбора, как его передаёт ФТС; customsCode - код таможенного органа; personalUse - ввезён ли автомобиль для личного пользования; date - дата документа. Записей может быть несколько или не быть вовсе.

Проверить без программиста

В личном кабинете есть консоль проверки: введите номер и получите ответ в читаемом виде, без кода.

Открыть кабинет