# Распознавание транспортной накладной (ТН, ТТН)

Грузоотправитель, грузополучатель и перевозчик, водитель и госномер, груз и масса, адреса погрузки и выгрузки — из скана транспортной накладной.

## Что извлекается

| Поле | Описание | Тип | Проверка |
| --- | --- | --- | --- |
| `number` | Номер накладной | string |  |
| `date` | Дата | string (date) |  |
| `shipper` | Грузоотправитель | object |  |
| `shipper.name` | Наименование | string |  |
| `shipper.inn` | ИНН | string | ИНН |
| `consignee` | Грузополучатель | object |  |
| `consignee.name` | Наименование | string |  |
| `consignee.inn` | ИНН | string | ИНН |
| `carrier` | Перевозчик | object |  |
| `carrier.name` | Наименование | string |  |
| `carrier.inn` | ИНН | string | ИНН |
| `driver` | Водитель (ФИО) | string |  |
| `vehicle` | Транспортное средство | object |  |
| `vehicle.model` | Марка | string |  |
| `vehicle.plate` | Государственный номер | string |  |
| `cargo` | Груз | object |  |
| `cargo.name` | Наименование груза | string |  |
| `cargo.places` | Количество мест | integer |  |
| `cargo.weight_kg` | Масса брутто, кг | number |  |
| `loading_address` | Адрес погрузки | string |  |
| `unloading_address` | Адрес выгрузки | string |  |

Если значения нет в документе, поле возвращается как null со статусом missing.

## JSON Schema

```json
{
  "type": "object",
  "properties": {
    "number": {
      "type": "string",
      "description": "Номер накладной"
    },
    "date": {
      "type": "string",
      "format": "date",
      "description": "Дата"
    },
    "shipper": {
      "type": "object",
      "description": "Грузоотправитель",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование"
        },
        "inn": {
          "type": "string",
          "description": "ИНН",
          "x-typizer-check": "inn"
        }
      },
      "required": [
        "name",
        "inn"
      ]
    },
    "consignee": {
      "type": "object",
      "description": "Грузополучатель",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование"
        },
        "inn": {
          "type": "string",
          "description": "ИНН",
          "x-typizer-check": "inn"
        }
      },
      "required": [
        "name",
        "inn"
      ]
    },
    "carrier": {
      "type": "object",
      "description": "Перевозчик",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование"
        },
        "inn": {
          "type": "string",
          "description": "ИНН",
          "x-typizer-check": "inn"
        }
      },
      "required": [
        "name",
        "inn"
      ]
    },
    "driver": {
      "type": "string",
      "description": "Водитель (ФИО)"
    },
    "vehicle": {
      "type": "object",
      "description": "Транспортное средство",
      "properties": {
        "model": {
          "type": "string",
          "description": "Марка"
        },
        "plate": {
          "type": "string",
          "description": "Государственный номер"
        }
      },
      "required": [
        "model",
        "plate"
      ]
    },
    "cargo": {
      "type": "object",
      "description": "Груз",
      "properties": {
        "name": {
          "type": "string",
          "description": "Наименование груза"
        },
        "places": {
          "type": "integer",
          "description": "Количество мест"
        },
        "weight_kg": {
          "type": "number",
          "description": "Масса брутто, кг"
        }
      },
      "required": [
        "name",
        "places",
        "weight_kg"
      ]
    },
    "loading_address": {
      "type": "string",
      "description": "Адрес погрузки"
    },
    "unloading_address": {
      "type": "string",
      "description": "Адрес выгрузки"
    }
  },
  "required": [
    "number",
    "date",
    "shipper",
    "consignee",
    "carrier",
    "driver",
    "vehicle",
    "cargo",
    "loading_address",
    "unloading_address"
  ]
}
```

## Пример результата (данные вымышлены)

```json
{
  "number": "2026-0917-03",
  "date": "2026-09-17",
  "shipper": {
    "name": "ООО «Пример Агро»",
    "inn": "0036925810"
  },
  "consignee": {
    "name": "ООО «Сеть магазинов Условная»",
    "inn": "0014725832"
  },
  "carrier": {
    "name": "ИП Кузнецов Пётр Ильич",
    "inn": "001472583693"
  },
  "driver": "Кузнецов П. И.",
  "vehicle": {
    "model": "ГАЗель NEXT",
    "plate": "А000АА 00"
  },
  "cargo": {
    "name": "Овощи свежие в ящиках",
    "places": 64,
    "weight_kg": 1180
  },
  "loading_address": "Ленинградская обл., условный пос., ул. Полевая, 1",
  "unloading_address": "г. Санкт-Петербург, условный пр., 10"
}
```

## Особенности документа

- Форма транспортной накладной установлена Правилами перевозок грузов автомобильным транспортом (Постановление Правительства РФ от 21.12.2020 № 2200), но в обороте до сих пор встречаются и старые ТТН. Схема по смыслу работает с обеими.
- Госномер транспортного средства — частый источник ошибок ручного ввода из-за похожих букв кириллицы и латиницы. Извлечённое значение связано с местом на странице: проверить его можно одним взглядом.
- Масса груза указывается в разных единицах (кг, т) — добавьте в схему поле единицы или опишите в инструкции, в чём её вернуть.

## Что проверяет Typizer

- ИНН грузоотправителя, грузополучателя и перевозчика — контрольные цифры.
- Даты — правдоподобный год (1900–2100), иначе статус warn.

## Вызов API

Инструкция: Номер и дата накладной, грузоотправитель, грузополучатель и перевозчик с ИНН, водитель, марка и госномер ТС, груз, количество мест, масса, адреса погрузки и выгрузки

```bash
curl -X POST 'https://api.typizer.ru/v1/extract?wait=60' \
  -H 'Authorization: Bearer tz_live_YOUR_API_KEY' \
  -H "Idempotency-Key: $(uuidgen)" \
  -F 'file=@document.pdf' \
  --form-string 'schema={"type":"object","properties":{"number":{"type":"string","description":"Номер накладной"},"date":{"type":"string","format":"date","description":"Дата"},"shipper":{"type":"object","description":"Грузоотправитель","properties":{"name":{"type":"string","description":"Наименование"},"inn":{"type":"string","description":"ИНН","x-typizer-check":"inn"}},"required":["name","inn"]},"consignee":{"type":"object","description":"Грузополучатель","properties":{"name":{"type":"string","description":"Наименование"},"inn":{"type":"string","description":"ИНН","x-typizer-check":"inn"}},"required":["name","inn"]},"carrier":{"type":"object","description":"Перевозчик","properties":{"name":{"type":"string","description":"Наименование"},"inn":{"type":"string","description":"ИНН","x-typizer-check":"inn"}},"required":["name","inn"]},"driver":{"type":"string","description":"Водитель (ФИО)"},"vehicle":{"type":"object","description":"Транспортное средство","properties":{"model":{"type":"string","description":"Марка"},"plate":{"type":"string","description":"Государственный номер"}},"required":["model","plate"]},"cargo":{"type":"object","description":"Груз","properties":{"name":{"type":"string","description":"Наименование груза"},"places":{"type":"integer","description":"Количество мест"},"weight_kg":{"type":"number","description":"Масса брутто, кг"}},"required":["name","places","weight_kg"]},"loading_address":{"type":"string","description":"Адрес погрузки"},"unloading_address":{"type":"string","description":"Адрес выгрузки"}},"required":["number","date","shipper","consignee","carrier","driver","vehicle","cargo","loading_address","unloading_address"]}' \
  --form-string 'instructions=Номер и дата накладной, грузоотправитель, грузополучатель и перевозчик с ИНН, водитель, марка и госномер ТС, груз, количество мест, масса, адреса погрузки и выгрузки'
```

## Вопросы и ответы

### Подойдут ли накладные со смартфона водителя?

Да. Фото обрабатываются распознаванием текста; источник у каждого значения помогает быстро проверить сомнительные значения. Для плохих снимков — режим «Точный».

### Можно ли получать результаты автоматически?

Да: отправляйте накладные в API без ожидания и получайте результат вебхуком по спецификации Standard Webhooks — с подписью и повторами в течение суток.

### Распознаётся ли электронная транспортная накладная (ЭТрН)?

Если у вас её печатная форма в PDF — да. Сам формат ЭТрН уже структурирован и распознавания не требует.
