API Documentation V3.1
Pragma OCR предоставляет корпоративный уровень распознавания и валидации документов. Мы объединили лучшие мировые LLM (Gemini 3.0, Claude 4.5) с проверенными правилами валидации МВД (Mod-10, контрольные суммы, справочники).
https://ocr-api.pragma.by/v1Все запросы должны выполняться по HTTPS.
Мультимодельная архитектура
Наша система работает как шлюз (Gateway), автоматически направляя документ на наиболее подходящую
нейросеть (Маршрутизация), либо следуя вашему прямому указанию через параметр ocr_provider.
💎 Gemini 3.0 Flash/Pro
Основной движок по умолчанию. Обеспечивает лучший баланс скорости (< 1.5с) и точности.
🧠 Claude 4.5 Sonnet
Самая мощная модель в мире для распознавания сложного почерка и "шумных" документов. Используйте для критически важных задач.
👁️ Google Vision (Classic)
Классическое OCR от Google. Дает точные координаты слов. Идеально для старых форм, где важна геометрия, а не контекст.
🐉 Qwen3-VL Thinking
Модель с поддержкой режима рассуждений. Лучшая для сложных таблиц и документов на кириллице.
Google Vision (Legacy)
Несмотря на доминирование Generative AI, мы сохранили полную поддержку классического Google
Cloud Vision API.
В отличие от LLM (которые "читают" документ как человек), Google Vision детектирует символы
попиксельно.
Когда использовать:
- Требуется экстремальная точность распознавания номеров (цифр), где LLM может "додумать" (галлюцинировать).
- Документы с очень низким разрешением, где LLM отказываются работать.
- Для обратной совместимости со старыми системами.
Для использования передайте: ocr_provider="google_vision".
Эндпоинт Распознавания
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)
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)
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)
$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)
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)
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=..." // Для проверки подлинности
}