Руководство по интеграции

Документ для специалистов, интегрирующих сервис распознавания документов Doculus в свой продукт.

1. Общие сведения

Параметр Значение
Наименование API Doculus.Recognizer.App.Api
Версия 1.0.0
Базовый URL https://api.doculus.pro/
Префикс методов /facades/correct/api/

2. Быстрый старт

Типовой сценарий работы с API включает следующие шаги:

  1. Создание пакета — получить идентификатор пакета для группы файлов.
  2. Добавление файлов в пакет.
  3. Запуск распознавания по пакету.
  4. Получение пакета (состояние и результат) — опрос состояния пакета и получение распознанных данных (структура ответа — раздел 5.4, коды ошибок — раздел 8).

3. Аутентификация и заголовки

Все запросы к API должны содержать заголовок авторизации:

Authorization: Bearer <токен>

Где <токен> — выданный клиенту токен доступа. Для получения токена необходимо сформировать в личном кабинете API ключ и обменять его на токен.

Request:

POST https://api.doculus.pro/facades/correct/api/auth
Content-Type: application/json
Body:
{
  "apiKey": "API ключ"
}

Response:

{
  "bearer": "your_token"
}

Время жизни токена составляет один час. Вы можете настроить обновление токена на своей стороне по таймеру, либо обновлять токен при каждом запросе к API.

Дополнительно:

  • при отправке JSON — Content-Type: application/json;
  • при загрузке файлов — Content-Type: multipart/form-data.

4. Группы методов

API делится на три группы:

  • Packages — работа с пакетами (создание, запуск, получение).
  • Images — загрузка и получение изображений (старая версия, поддержка обратной совместимости).
  • Files — загрузка файлов в пакет (предпочтительное использование вместо Images).

5. Пакеты (Packages)

5.1. Создание пакета

Создаёт новый пакет для последующей загрузки изображений и файлов.

Параметр Значение
Метод POST
URL {baseUrl}/facades/correct/api/Packages
Тело запроса Отсутствует
Ответ 200 OK — JSON по схеме PackageCreatedResponse: объект с полем packageId (integer, int32) — идентификатор созданного пакета. 401 Unauthorized, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример запроса:

POST https://api.doculus.pro/facades/correct/api/Packages
Authorization: Bearer <токен>
Content-Type: application/json

Обязательный заголовок авторизации. Идентификатор созданного пакета далее используется в методах Images, Files при запуске распознавания и при получении результата распознавания.


5.2. Запуск распознавания

Запускает обработку файлов в уже созданном пакете.

Параметр Значение
Метод POST
URL {baseUrl}/facades/correct/api/Packages/{packageId}/start
Параметр пути packageId — идентификатор пакета (integer).
Ответ 204 No Content — успешный запуск, тело ответа пустое. 401 Unauthorized, 403 Forbidden, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример URL:

POST https://api.doculus.pro/facades/correct/api/Packages/13/start

После успешного вызова необходимо периодически опрашивать состояние пакета (см. п. 5.3) до перехода в финальное состояние (state: "Recognized"), затем получать результат распознавания (структура ответа — п. 5.4).


5.3. Получение пакета (состояние и результат)

Возвращает текущее состояние пакета и данные распознавания.

Параметр Значение
Метод GET
URL {baseUrl}/facades/correct/api/Packages/{packageId}
Параметр пути packageId — идентификатор пакета (integer).
Ответ 200 OK — JSON по схеме Package (структура — раздел 5.4): id, createdAt, state, documents, unrecognizedPages, unrecognizedFiles. 401 Unauthorized, 403 Forbidden, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример URL:

GET https://api.doculus.pro/facades/correct/api/Packages/13

Необходимо использовать этот метод для опроса состояния пакета после вызова «Запуск распознавания». Структура ответа при 200 OK описана в разделе 5.4.

5.4. Структура ответа GET пакета (результат распознавания)

Тело ответа метода GET .../Packages/{packageId} в формате JSON имеет следующую структуру.

Уровень пакета (корень объекта):

Поле Тип Описание
id number Идентификатор пакета (например, 5000465).
state string Текущее состояние пакета. Финальное состояние успешного распознавания: "Recognized". До завершения обработки пакет находится в статусе `"Recognizing".
createdAt string Дата и время создания пакета в формате ISO 8601 в UTC (например, 2026-02-26T09:07:02.681319+00:00).
documents array Массив распознанных документов (см. ниже).
unrecognizedFiles array Список файлов, которые не удалось распознать (при отсутствии — пустой массив []).
unrecognizedPages array Список страниц, которые не удалось распознать (при отсутствии — пустой массив []).
validationErrors array Список логических ошибок, выявленных при распознавании комплекта документов

Объект документа (элемент documents):

Поле Тип Описание
id string Уникальный идентификатор документа (UUID).
docType string Тип документа (например, "УПД" — универсальный передаточный документ).
pages array Массив страниц документа. Каждый элемент: {"id": number} — идентификатор страницы для запроса изображения через GET .../Images/{id}.
fields array Массив распознанных полей документа (реквизиты, табличные строки).
codes array Штрихкоды и QR-коды (при отсутствии — пустой массив).
signatures array Подписи (при отсутствии — пустой массив).
contractorStamp
object Печать контрагента (при отсутствии - null).
customerStamp object Печать организации (при отсутствии - null).

Объект поля (элемент fields):

Поле Тип Описание
fieldKey string Ключ поля (например, DocNum, DocDate, ContractNumber, ContractorName, ContractorINN, SumWithVat, Name, Qty, Price и т.д.). Полный перечень ключей по типам документов — в Справочнике полей.
fieldValue string Распознанное значение (текст, число, дата в виде строки).
confidence number Уверенность распознавания (например, 0.75 — от 0 до 1).
(В текущей реализации не используется)
documentPageIndex number Индекс страницы документа (0-based), на которой расположено поле.
location object Координаты области на странице: width, height, topOffset, leftOffset, rightOffset, bottomOffset (в пикселях).
tableRow number Индекс строки таблицы (0, 1, 2, …), если поле относится к таблице; иначе null.
tableIndex number Индекс таблицы в документе (0, 1, …), если поле из таблицы; иначе null.
unconfidentSymbols string Строка-маска символов с указателями на неуверенные символы 0 - уверенно распознанный символ, 1- неуверенно.
(В текущей реализации не используется)

Объект ошибки валидации (элемент validationErrors):

Поле Тип Описание
errorCode number Код типа ошибки. Справочник возможных кодов находится в процессе разработки
errorText string Текст ошибки
documentId string Идентификатор документа, к которому относится ошибка. Указывается не для всех типов ошибок – например, если ошибка относится к пакету целиком
imageId number Идентификатор страницы, к которой относится ошибка. Указывается не для всех типов ошибок
tableIndex number Индекс таблицы в документе (0-based), к которой относится ошибка. Указывается не для всех типов ошибок
tableRow number Индекс строки в таблице (0-based), к которой относится ошибка. Указывается не для всех типов ошибок

Пример фрагмента ответа (пакет и один документ с частью полей):

{
  "id": 5000465,
  "state": "Recognized",
  "createdAt": "2026-02-26T09:07:02.681319+00:00",
  "documents": [
    {
      "id": "1f2c5cf9-3fdf-4ca8-b4de-f500c52bf912",
      "docType": "УПД",
      "pages": [{"id": 10002090}],
      "fields": [
        {"fieldKey": "DocNum", "fieldValue": "6", "confidence": 0.75, "tableRow": null, "tableIndex": null, "documentPageIndex": 0},
        {"fieldKey": "DocDate", "fieldValue": "27.04.2024", "confidence": 0.75, "documentPageIndex": 0},
        {"fieldKey": "ContractorName", "fieldValue": "ООО \"ДОКУЛУС\"", "confidence": 0.75, "documentPageIndex": 0}
      ],
      "codes": [],
      "signatures": []
    }
  ],
  "unrecognizedFiles": [],
  "unrecognizedPages": [],
  "validationErrors": [
    {
      "errorCode": 100,
      "errorText": "Страница не распознана из-за низкого качества печати",
      "imageId": 10002091
    },
    {
      "errorCode": 200,
      "errorText": "На документе отсутствует ИНН поставщика",
      "documentId": "1f2c5cf9-3fdf-4ca8-b4de-f500c52bf912",
      "imageId": 10002090
    },
    {
      "errorCode": 201,
      "errorText": "Дата документа больше сегодняшнего дня",
      "documentId": "1f2c5cf9-3fdf-4ca8-b4de-f500c52bf912",
      "imageId": 10002090
    }
  ]
}

Полный пример ответа с табличными строками и координатами полей приведён в файле пример ответа пакета. Идентификаторы из documents[].pages[].id используются для запроса изображения страницы: GET .../Images/{id}.


6. Изображения (Images)

6.1. Добавление изображений в пакет

Загружает изображения (или страницы PDF) в существующий пакет. Порядок загрузки должен соответствовать порядку страниц в документе.

Устарело. Оставлено для обратной совместимости и будет удалено в будущих версиях API. Используйте Файлы (Files)

Параметр Значение
Метод POST
URL {baseUrl}/facades/correct/api/Images/package/{packageId}
Параметр пути packageId — идентификатор пакета (integer).
Ответ 200 OK — JSON по схеме UploadImageResponse: объект с полем imageIds (массив integer) — идентификаторы загруженных изображений. 400 Bad Request, 401 Unauthorized, 403 Forbidden, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример URL:

POST https://api.doculus.pro/facades/correct/api/Images/package/13

Типичные варианты тела запроса:

  • multipart/form-data
  • application/json — поле с содержимым в Base64.

Форматы: JPG, PNG, PDF, DOC, DOCX, RTF. Не рекомендуется загружать более 50 страниц в пакет.


6.2. Получение изображения

Возвращает данные изображения по идентификатору.

Параметр Значение
Метод GET
URL {baseUrl}/facades/correct/api/Images/{id}
Параметр пути id — идентификатор изображения (integer).
Ответ 200 OK — по схеме UploadImageResponse: объект с полем imageIds (массив идентификаторов изображений). 400 Bad Request, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример URL:

GET https://api.doculus.pro/facades/correct/api/Images/13

Идентификаторы изображений приходят в ответе на добавление изображений и в составе результата распознавания пакета — в массиве documents[].pages (поле id), см. п. 5.4.


7. Файлы (Files)

7.1. Добавление файлов в пакет

Добавляет в пакет файлы: изображения (JPG, PNG, PDF, DOC, DOCX, RTF).

Параметр Значение
Метод POST
URL {baseUrl}/facades/correct/api/Files/package/{packageId}
Параметр пути packageId — идентификатор пакета (integer).
Ответ 200 OK — JSON по схеме UploadFileResponse: объект с полем files — массив элементов UploadedFileResponseModel (каждый содержит id — идентификатор файла, int32, и images — массив идентификаторов изображений, int32). 400 Bad Request, 401 Unauthorized, 403 Forbidden, 500 Internal Server Error — при ошибках тело может содержать ProblemDetails (см. раздел 8).

Пример URL:

POST https://api.doculus.pro/facades/correct/api/Files/package/13

Формат тела запроса — multipart/form-data или JSON с Base64; в ответе при успехе возвращаются идентификаторы добавленных файлов и изображений.


8. Коды ошибок

При интеграции необходимо обрабатывать и ошибочные ответы. Типичные коды HTTP и рекомендуемые действия:

Код Описание Действия клиента
400 Bad Request — неверный запрос (тело, параметры, формат). Проверить URL, путь, тело запроса и заголовки; при наличии тела ошибки — разобрать описание и исправить запрос.
401 Unauthorized — не авторизован (токен отсутствует, неверный или просрочен). Проверить заголовок Authorization
403 Forbidden — доступ запрещён (прав недостаточно или ресурс недоступен). Проверить идентификатор ресурса (например, packageId).
404 Not Found — ресурс не найден (пакет, изображение и т.п.). Проверить идентификатор в пути; убедиться, что пакет создан и запрос идёт по правильному базовому URL.
409 Conflict — конфликт состояния (например, повторный запуск уже запущенного пакета). Проверить, что метод start вызывается только один раз и что вы не пытаетесь добавить файлы в уже запущенный пакет.
413 Payload Too Large — размер тела запроса превышает лимит. По возможности уменьшить размер загружаемых файлов или разбить на несколько пакетов.
500 Internal Server Error — внутренняя ошибка сервера. Повторить запрос через некоторое время; при устойчивой ошибке — обратиться в поддержку.
502, 503 Bad Gateway / Service Unavailable — сервис недоступен или перегружен. Повторить запрос через некоторое время; при устойчивой ошибке — обратиться в поддержку.