API Documentation V3.1

Pragma OCR предоставляет корпоративный уровень распознавания и валидации документов. Мы объединили лучшие мировые LLM (Gemini 3.0, Claude 4.5) с проверенными правилами валидации МВД (Mod-10, контрольные суммы, справочники).

Base URL: https://ocr-api.pragma.by/v1
Все запросы должны выполняться по HTTPS.

Мультимодельная архитектура

Наша система работает как шлюз (Gateway), автоматически направляя документ на наиболее подходящую нейросеть (Маршрутизация), либо следуя вашему прямому указанию через параметр ocr_provider.

💎 Gemini 3.0 Flash/Pro

Основной движок по умолчанию. Обеспечивает лучший баланс скорости (< 1.5с) и точности.

Default Google AI

🧠 Claude 4.5 Sonnet

Самая мощная модель в мире для распознавания сложного почерка и "шумных" документов. Используйте для критически важных задач.

High Precision Anthropic

👁️ Google Vision (Classic)

Классическое OCR от Google. Дает точные координаты слов. Идеально для старых форм, где важна геометрия, а не контекст.

Legacy Coordinates

🐉 Qwen3-VL Thinking

Модель с поддержкой режима рассуждений. Лучшая для сложных таблиц и документов на кириллице.

Tables Complex Layouts

Google Vision (Legacy)

Несмотря на доминирование Generative AI, мы сохранили полную поддержку классического Google Cloud Vision API.
В отличие от LLM (которые "читают" документ как человек), Google Vision детектирует символы попиксельно.

Когда использовать:

Для использования передайте: ocr_provider="google_vision".

Эндпоинт Распознавания

POST /documents/recognize Content-Type: multipart/form-data

Header Parameters

Заголовок Описание
X-API-Key (String, Required) Ваш секретный ключ доступа.

Body Parameters (Form-Data)

Параметр Тип Описание
file * Binary Файл изображения (JPG, PNG, WEBP, HEIC) или PDF. Макс 10MB (настраивается).
ocr_provider String Принудительный выбор движка. Если не указан, используется Intelligent Router.
Доступные значения:
gemini (3.0 Flash)
anthropic (Claude 4.5)
google_vision (Classic)
qwen (3-VL + Thinking)
deepseek (V3)
paddle (Local On-Premise)
document_type String Подсказка для парсера:
passport (Паспорт РБ)
id_card (ID карта РБ)
driver_license (Права РБ)
auto (Автоопределение - по умолчанию)
webhook_url URL URL для отправки результата (POST) при асинхронной обработке.

Справочник полей (РБ)

Ниже приведен полный список полей, возвращаемых в объекте fields для белорусских документов.

Паспорт (Passport)

JSON Key Описание Пример
surname Фамилия (Латиница) IVANOV
name Имя (Латиница) IVAN
surname_cyr Фамилия (Кириллица) ИВАНОВ
name_cyr Имя (Кириллица) ИВАН
patronymic Отчество (Кириллица) ИВАНОВИЧ
personal_number Личный номер ("Идентификационный") 1234567A012PB1
doc_number Номер паспорта MP1234567
birth_date Дата рождения 1990-05-20
expiry_date Срок действия 2030-05-20
issue_date Дата выдачи 2020-05-20
authority_code Код органа (напр. РУВД) 401
authority Орган выдавший документ Минским РУВД
mrz Машиночитаемая зона (строка) P

Validation Report

Объект validation_report содержит результаты проверок безопасности.

{
  "validity_status": "valid",  // valid, expired, fake, unknown
  "checks": {
     "id_checksum": true,      // Контрольная сумма личного номера (Mod-10) совпадает
     "mrz_valid": true,        // MRZ соответствует данным на странице
     "expiry_check": true,     // Документ не просрочен
     "age_check": true         // Владельцу есть 18 лет
  },
  "quality": {
     "is_good": true,
     "blur_score": 0.05,       // Уровень размытия (0.0 - нет, 1.0 - сильно)
     "glare_detected": false   // Блики
  }
}

Примеры Интеграции

Python (Requests)

PYTHON
import requests

API_KEY = "sk-pragma-..."
URL = "https://ocr-api.pragma.by/v1/documents/recognize"

def recognize_doc(filepath):
    with open(filepath, 'rb') as f:
        response = requests.post(
            URL,
            headers={"X-API-Key": API_KEY},
            files={"file": f},
            data={
                "document_type": "passport",
                "ocr_provider": "gemini"  # Explicitly use Gemini 3.0
            }
        )
    return response.json()

result = recognize_doc("passport_scan.jpg")
print(f"Name: {result['data']['result']['fields']['file_name']}")

Node.js (Axios)

NODE.JS
const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');

async function scanDocument() {
  const form = new FormData();
  form.append('file', fs.createReadStream('passport.jpg'));
  form.append('ocr_provider', 'anthropic'); // Use Claude 4.5

  try {
    const res = await axios.post(
      'https://ocr-api.pragma.by/v1/documents/recognize', 
      form, 
      {
        headers: { 
          'X-API-Key': 'YOUR_KEY',
          ...form.getHeaders()
        }
      }
    );
    console.log(res.data);
  } catch (err) {
    console.error(err.response ? err.response.data : err.message);
  }
}

PHP (Guzzle)

PHP
$client = new \GuzzleHttp\Client();

$response = $client->post('https://ocr-api.pragma.by/v1/documents/recognize', [
    'headers' => [
        'X-API-Key' => 'YOUR_KEY'
    ],
    'multipart' => [
        [
            'name'     => 'file',
            'contents' => fopen('passport.jpg', 'r')
        ],
        [
            'name'     => 'ocr_provider',
            'contents' => 'gemini'
        ]
    ]
]);

$data = json_decode($response->getBody(), true);
print_r($data);

Java (OkHttp)

JAVA
OkHttpClient client = new OkHttpClient();

RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", "passport.jpg",
        RequestBody.create(new File("passport.jpg"), MediaType.parse("image/jpeg")))
    .addFormDataPart("ocr_provider", "google_vision") // Using Legacy Vision
    .build();

Request request = new Request.Builder()
    .url("https://ocr-api.pragma.by/v1/documents/recognize")
    .addHeader("X-API-Key", "YOUR_KEY")
    .post(requestBody)
    .build();

Response response = client.newCall(request).execute();
System.out.println(response.body().string());

C# (HttpClient)

C# / .NET
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-Key", "YOUR_KEY");

using var content = new MultipartFormDataContent();
using var fileStream = File.OpenRead("passport.jpg");
content.Add(new StreamContent(fileStream), "file", "passport.jpg");
content.Add(new StringContent("qwen"), "ocr_provider");

var response = await client.PostAsync("https://ocr-api.pragma.by/v1/documents/recognize", content);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

Коды Ошибок

Code Status Причина Решение
401 Unauthorized Неверный или отсутствующий API Key. Проверьте заголовок X-API-Key.
400 Bad Request Не передан файл или неверный формат. Убедитесь, что отправляете multipart/form-data.
413 Payload Too Large Файл > 10MB. Сожмите изображение перед отправкой.
422 Unprocessable Файл поврежден или не является изображением. Проверьте целостность файла.
429 Too Many Requests Превышен лимит запросов (RPM). Увеличьте интервал между запросами или повысьте тариф.
500 Internal Error Внутренняя ошибка сервера. Сообщите ID запроса в поддержку.
503 Service Unavailable Выбранный Provider (напр. OpenAI) недоступен. Попробуйте другой ocr_provider.

Webhooks Payload

При использовании webhook_url, мы отправим POST со следующей структурой:

{
  "event": "document.completed",
  "request_id": "550e8400-...",
  "timestamp": "2026-02-15T10:00:00Z",
  "payload": {
    "status": "completed",
    "result": { ... } // Полный объект результата
  },
  "signature": "hmac-sha256=..." // Для проверки подлинности
}