1. Общие сведения
| Параметр | Значение |
|---|---|
| Наименование API | Doculus.Recognizer.App.Api |
| Версия | 1.0.0 |
| Базовый URL | https://api.doculus.pro/ |
| Префикс методов | /facades/correct/api/ |
2. Быстрый старт
Типовой сценарий работы с API включает следующие шаги:
- Создание пакета — получить идентификатор пакета для группы файлов.
- Добавление файлов в пакет.
- Запуск распознавания по пакету.
- Получение пакета (состояние и результат) — опрос состояния пакета и получение распознанных данных (структура ответа — раздел 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 — сервис недоступен или перегружен. | Повторить запрос через некоторое время; при устойчивой ошибке — обратиться в поддержку. |
