API Извлечения реквизитов из карточки компании и файлов документов

Опубликовано: 11.04.2026

API Извлечения реквизитов из карточки компании и файлов документов

В современном бизнесе часто возникает задача автоматического распознавания реквизитов: будь то из карточки контрагента (ИНН, КПП, ОГРН) или из текстовых документов (договоров, счетов, актов). Представляем вашему вниманию универсальный HTTP API для решения этой задачи.

Возможности API

API умеет извлекать реквизиты из двух типов источников:

  1. Карточка компании — структурированный вывод юридически значимых реквизитов.
  2. Файлы документов — извлечение реквизитов из текстовых форматов: 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 Человекочитаемое описание проблемы

Рекомендации

  1. Таймаут — всегда устанавливайте 120 секунд, особенно для PDF-файлов большого объема.
  2. Форматы — для PDF убедитесь, что документ содержит текстовый слой (не отсканированная картинка).
  3. Обработка ошибок — всегда проверяйте наличие поля success и его значение.
  4. Размер файла — рекомендуется не более 20 МБ.

Возможные ошибки

HTTP код error Описание
400 invalid_request Неверный формат файла, пустой запрос или отсутствует тело запроса
401 unauthorized Неверный или отсутствующий X-API-Key
413 payload_too_large Файл слишком большой
408 timeout Превышено время обработки (увеличьте timeout до 120 сек)
500 internal_error Внутренняя ошибка сервера

Используйте этот API для автоматизации ввода данных, интеграции с CRM или бухгалтерскими системами. Приятной разработки!