API Извлечения реквизитов из карточки компании и файлов документов
В современном бизнесе часто возникает задача автоматического распознавания реквизитов: будь то из карточки контрагента (ИНН, КПП, ОГРН) или из текстовых документов (договоров, счетов, актов). Представляем вашему вниманию универсальный HTTP API для решения этой задачи.
Возможности API
API умеет извлекать реквизиты из двух типов источников:
- Карточка компании — структурированный вывод юридически значимых реквизитов.
- Файлы документов — извлечение реквизитов из текстовых форматов: PDF (текстовый слой), DOCX, DOC, TXT, RTF, HTML.
Эндпоинт
| Параметр | Значение |
|---|---|
| Метод | POST |
| URL | /api/rekvizit_json |
| Таймаут | Рекомендуется 120 секунд (для обработки больших файлов) |
Аутентификация и формат
Запрос должен содержать следующие заголовки:
| Заголовок | Значение | Обязательность |
|---|---|---|
X-API-Key |
Ваш уникальный ключ доступа | Да |
Content-Type |
multipart/form-data |
Да (устанавливается автоматически библиотеками) |
Тело запроса — multipart/form-data с одним полем:
- file — сам файл (PDF, DOCX, DOC, TXT, RTF, HTML) или изображение карточки.
Примеры кода
Python (requests)
import os
import requests
class RekvizitExtractor:
def __init__(self, api_key, api_url="/api/rekvizit_json"):
self.api_key = api_key
self.file_url = api_url # Полный URL эндпоинта
def extract(self, file_path):
headers = {
'X-API-Key': f'{self.api_key}'
}
try:
with open(file_path, 'rb') as f:
files = {'file': (os.path.basename(file_path), f, 'application/octet-stream')}
response = requests.post(
self.file_url,
headers=headers,
files=files,
timeout=120 # Рекомендуемый таймаут
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
return {"success": False, "error": str(e)}
# Использование
api = RekvizitExtractor(api_key="ваш_ключ", api_url="https://api-k.ru/api/rekvizit_json")
result = api.extract("contract.docx")
print(result)
cURL
curl -X POST https://api-k.ru/api/rekvizit_json \
-H "X-API-Key: ваш_ключ" \
-F "file=@/path/to/company_card.pdf" \
--max-time 120
JavaScript (Node.js с axios)
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
async function extractRequisites(apiKey, filePath) {
const formData = new FormData();
formData.append('file', fs.createReadStream(filePath));
try {
const response = await axios.post(
'https://api-k.ru/api/rekvizit_json',
formData,
{
headers: {
...formData.getHeaders(),
'X-API-Key': apiKey
},
timeout: 120000 // 120 секунд
}
);
return response.data;
} catch (error) {
return { success: false, error: error.message };
}
}
// Использование
extractRequisites('ваш_ключ', 'document.docx').then(console.log);
Java (OkHttp)
import okhttp3.*;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class RekvizitClient {
private final OkHttpClient client;
private final String apiKey;
public RekvizitClient(String apiKey) {
this.apiKey = apiKey;
this.client = new OkHttpClient.Builder()
.connectTimeout(120, TimeUnit.SECONDS)
.readTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.build();
}
public String extract(String filePath) throws IOException {
File file = new File(filePath);
RequestBody fileBody = RequestBody.create(file, MediaType.parse("application/octet-stream"));
MultipartBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), fileBody)
.build();
Request request = new Request.Builder()
.url("https://api-k.ru/api/rekvizit_json")
.addHeader("X-API-Key", apiKey)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
}
PHP (cURL)
<?php
function extractRequisites($apiKey, $filePath) {
$curl = curl_init();
$curlFile = new CURLFile($filePath);
$postFields = ['file' => $curlFile];
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api-k.ru/api/rekvizit_json',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postFields,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey
],
CURLOPT_TIMEOUT => 120
]);
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($curl);
if ($error) {
return ['success' => false, 'error' => $error];
}
return json_decode($response, true);
}
$result = extractRequisites('ваш_ключ', 'document.docx');
print_r($result);
?>
Go
package main
import (
"bytes"
"encoding/json"
"io"
"mime/multipart"
"net/http"
"os"
"path/filepath"
"time"
)
type Response struct {
Success bool `json:"success"`
Error string `json:"error,omitempty"`
// другие поля с реквизитами
}
func ExtractRequisites(apiKey, filePath string) (*Response, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("file", filepath.Base(filePath))
if err != nil {
return nil, err
}
_, err = io.Copy(part, file)
if err != nil {
return nil, err
}
writer.Close()
req, err := http.NewRequest("POST", "https://api-k.ru/api/rekvizit_json", body)
if err != nil {
return nil, err
}
req.Header.Set("X-API-Key", apiKey)
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{
Timeout: 120 * time.Second,
}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
var result Response
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return nil, err
}
return &result, nil
}
Структура ответа
Успешный ответ (HTTP 200)
При успешной обработке файла API возвращает JSON со следующими полями:
{
"organization_name": "ООО «Пример»",
"inn": "7701234567",
"kpp": "770101001",
"ogrn": "1027700123456",
"address": "109457, г. Москва, ул. Привольная, д. 61, кв. 1",
"phone": "+7(899) 456-23-33",
"bank_name": "ПАО Сбербанк",
"bik": "044525225",
"checking_account": "40702810123456789012",
"correspondent_account": "30101810400000000225",
"type_doc": "акт",
"nom_doc": "1",
"signatory": "Иванова Н.В."
}
Описание полей:
| Поле | Описание |
|---|---|
organization_name |
Наименование организации |
inn |
ИНН (10 или 12 цифр) |
kpp |
КПП (9 цифр) |
ogrn |
ОГРН (13 или 15 цифр) |
address |
Юридический адрес |
phone |
Контактный телефон |
bank_name |
Наименование банка |
bik |
БИК банка |
checking_account |
Расчетный счет |
correspondent_account |
Корреспондентский счет |
type_doc |
Тип документа (акт, счет, договор и т.д.) |
nom_doc |
Номер документа |
signatory |
Подписант (ФИО) |
Ответ с ошибкой
{
"success": false,
"error": "invalid_request",
"message": "Отсутствует тело запроса"
}
Поля ошибки:
| Поле | Описание |
|---|---|
success |
Всегда false при ошибке |
error |
Код ошибки (invalid_request, unauthorized, not_found, internal_error и т.д.) |
message |
Человекочитаемое описание проблемы |
Рекомендации
- Таймаут — всегда устанавливайте 120 секунд, особенно для PDF-файлов большого объема.
- Форматы — для PDF убедитесь, что документ содержит текстовый слой (не отсканированная картинка).
- Обработка ошибок — всегда проверяйте наличие поля
successи его значение. - Размер файла — рекомендуется не более 20 МБ.
Возможные ошибки
| HTTP код | error |
Описание |
|---|---|---|
| 400 | invalid_request |
Неверный формат файла, пустой запрос или отсутствует тело запроса |
| 401 | unauthorized |
Неверный или отсутствующий X-API-Key |
| 413 | payload_too_large |
Файл слишком большой |
| 408 | timeout |
Превышено время обработки (увеличьте timeout до 120 сек) |
| 500 | internal_error |
Внутренняя ошибка сервера |
Используйте этот API для автоматизации ввода данных, интеграции с CRM или бухгалтерскими системами. Приятной разработки!