Публичный API

Документация API

Интегрируйте SotaOCR в ваши AI-агенты и LLM-пайплайны. API работает асинхронно: вы загружаете документ, опрашиваете статус, забираете готовый результат и, при необходимости, preview-изображение страницы в той же системе координат, что и OCR bbox.

Базовый URL

Все публичные OCR-эндпоинты доступны на этом хосте.

https://sotaocr.com

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

Все запросы к API требуют авторизации с помощью Bearer-токена. Вы можете создать API-ключ в своем дашборде.

Заголовок

Authorization: Bearer YOUR_API_KEY

Доступные маршруты

OCR-сервис отдает API-роуты: /v1/balance, /v1/extract, /v1/jobs/{job_id}, /v1/jobs/{job_id}/result, /v1/jobs/{job_id}/result.html, /v1/jobs/{job_id}/result.docx и /v1/jobs/{job_id}/pages/{page_number}/preview. Перед отправкой model_profile читайте model_profiles из GET /api/v1/info, чтобы клиент использовал только модели, включенные в текущей конфигурации сервиса. HTML и DOCX реконструкции доступны для FAST- и PRO-моделей.

Препроцессинг OCR

Перед основным OCR сервис автоматически определяет ориентацию страницы, поворачивает её и при необходимости применяет document unwarping. Угол возвращается в doc_preprocessor_res.angle, а preview endpoint отдает то самое изображение страницы, в координатах которого приходят bbox.

Поллинг и готовность результата

Опрашивайте API не чаще одного раза в секунду. Пока OCR не завершен, GET /v1/jobs/{job_id}/result возвращает 202 Accepted с кодом ошибки result_not_ready.

Pro OCR

Когда Pro-модель включена, model_profile=pro включает Pro OCR и списывает 2 scan pages за каждую обработанную страницу документа. Используйте его для OCR повышенного качества.

cURL · Pro-запрос
curl -X POST https://sotaocr.com/v1/extract \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@document.pdf" \
  -F 'page_ranges=[{"start":1,"end":5}]' \
  -F "model_profile=pro"
JSON · Ответ
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "pending",
  "page_count": 5,
  "pages_completed": 0,
  "model_profile": "pro",
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:00Z"
}
GET

Проверить баланс страниц

/v1/balance Возвращает текущий баланс scan pages для аккаунта по API-ключу. Используйте remaining_pages или total_affordable_pages, чтобы понять, сколько страниц еще можно обработать.

cURL · Запрос
curl -X GET https://sotaocr.com/v1/balance \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Ответ
{
  "entity_code": "scan_page",
  "remaining_pages": 63,
  "total_affordable_pages": 63,
  "monthly_pages": {"total": 40, "allocated": 5, "remaining": 35},
  "lifetime_pages": {"total": 20, "allocated": 2, "remaining": 18},
  "tokens": {"total": 120, "allocated": 20, "remaining": 100, "affordable_pages": 10},
  "token_price": 10
}
POST

1. Загрузка документа

/v1/extract Загружает PDF или изображение в OCR. При успехе возвращает 202 Accepted и метаданные джобы, включая account_id, upstream_job_id, created_at и updated_at.

  • file: Файл документа (PDF, PNG, JPG, JPEG, WEBP, BMP, TIF, TIFF).
  • page_ranges: (Опционально) JSON-строка с массивом диапазонов страниц. Пример: '[{"start":1,"end":3}]'
  • model_profile: Опциональный профиль OCR-модели. Не передавайте поле, чтобы использовать дефолт сервиса, или передайте одно из значений model_profiles из GET /api/v1/info.
cURL · Запрос
curl -X POST https://sotaocr.com/v1/extract \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@document.pdf" \
  -F 'page_ranges=[{"start":1,"end":5}]'
JSON · Ответ
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "pending",
  "page_count": 5,
  "pages_completed": 0,
  "model_profile": "fast",
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:00Z"
}
GET

2. Проверка статуса

/v1/jobs/{job_id} Возвращает 200 OK с текущим статусом обработки и полями account_id, upstream_job_id, page_count, pages_completed, created_at и updated_at.

cURL · Запрос
curl -X GET https://sotaocr.com/v1/jobs/job_123456789 \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Ответ
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "completed",
  "page_count": 5,
  "pages_completed": 5,
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:08Z"
}
GET

3. Получение результата

/v1/jobs/{job_id}/result?format=markdown Возвращает 200 OK с распознанным содержимым, когда джоба завершена. Для format=json страницы могут содержать doc_preprocessor_res с angle и page_preview с metadata coordinate space для bbox. format=html возвращает реконструированный HTML внутри JSON envelope для FAST и PRO; для самостоятельного HTML-файла со встроенными картинками используйте /result.html. До завершения эндпоинт отвечает 202 Accepted с кодом result_not_ready.

  • format: (Опционально) Формат ответа: json, markdown, text или html. По умолчанию json. html доступен для FAST- и PRO-моделей.
cURL · Запрос
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result?format=markdown" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Ответ
{
  "job_id": "job_123456789",
  "format": "json",
  "page_count": 1,
  "content": "{\"job_id\":\"job_123456789\",\"page_count\":1,\"pages\":[{\"page_number\":1,\"status\":\"completed\",\"text\":\"Иван Матвеев\",\"doc_preprocessor_res\":{\"angle\":0,\"model_settings\":{\"use_doc_orientation_classify\":true,\"use_doc_unwarping\":false}},\"page_preview\":{\"coordinate_space\":\"doc_preprocessed\",\"content_type\":\"image/png\",\"width\":1192,\"height\":1684},\"raw_result\":{}}]}"
}
GET

4. Получить standalone HTML

/v1/jobs/{job_id}/result.html Возвращает text/html реконструкцию со встроенными data-URI изображениями для FAST- и PRO-моделей.

cURL · Запрос
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result.html" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output result.html
JSON · Ответ
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: inline; filename="job_123456789.html"

(самостоятельный HTML со встроенными data-URI изображениями)
GET

5. Получить DOCX реконструкцию

/v1/jobs/{job_id}/result.docx Возвращает бинарный .docx с визуальной реконструкцией, встроенными изображениями страниц и searchable OCR-текстом для FAST- и PRO-моделей.

cURL · Запрос
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result.docx" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output result.docx
JSON · Ответ
HTTP/1.1 200 OK
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
Content-Disposition: attachment; filename="job_123456789.docx"

(бинарные DOCX bytes)
GET

6. Получить preview страницы для bbox overlays

/v1/jobs/{job_id}/pages/{page_number}/preview Возвращает PNG-изображение страницы после автоматического поворота и условного unwarp. Это тот же image object, поверх которого нужно рисовать OCR bbox.

cURL · Запрос
curl -X GET https://sotaocr.com/v1/jobs/job_123456789/pages/1/preview \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output page_0001_preview.png
JSON · Ответ
HTTP/1.1 200 OK
Content-Type: image/png
Content-Disposition: inline; filename="page_0001_preview.png"

(binary PNG bytes в той же системе координат, что и OCR bbox)

Ошибки API

Большинство ошибок используют формат {"error":{"code":"...","message":"..."}}. Для insufficient_balance дополнительно приходят entity_code, requested_units и available_units.

  • 400 Некорректный запрос: Неверный multipart, отсутствует file, некорректный page_ranges или битый документ. Код ошибки: bad_request.
  • 401 Не авторизован: Bearer-токен отсутствует или невалиден. Код ошибки: unauthorized.
  • 403 Доступ запрещен: Нет доступа к API или недостаточно баланса. Коды ошибок: api_access_required или insufficient_balance.
  • 404 Не найдено: Неизвестный job_id или попытка доступа к чужой джобе. Код ошибки: job_not_found.
  • 415 Неподдерживаемый тип: Неподдерживаемый тип загруженного файла. Код ошибки: unsupported_media.
  • 502 Ошибка upstream: Upstream OCR недоступен или синхронизация джобы завершилась ошибкой. Код ошибки: upstream_unavailable.

Готовы к интеграции?

Создайте API-ключ в личном кабинете и получите бесплатные страницы для тестирования.