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);
?>
1C
Процедура ОтправитьФайлНаСервере()
// 1. Проверка - выбран ли файл
Если ПустаяСтрока(ЭтотОбъект.ПутьКФайлу) Тогда
Сообщить("Ошибка: Не выбран файл для отправки", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
// 2. Проверка наличия API-ключа
Если ПустаяСтрока(ЭтотОбъект.APIКлюч) Тогда
Сообщить("Ошибка: Не указан API-ключ", СтатусСообщения.Важное);
Возврат;
КонецЕсли;
// 3. Проверка существования файла
ФайлДляПроверки = Новый Файл(ЭтотОбъект.ПутьКФайлу);
Если Не ФайлДляПроверки.Существует() Тогда
Сообщить("Ошибка: Файл не найден по пути " + ЭтотОбъект.ПутьКФайлу, СтатусСообщения.Важное);
Возврат;
КонецЕсли;
// 4. Чтение файла в двоичные данные
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ЭтотОбъект.ПутьКФайлу);
ИмяФайла = ФайлДляПроверки.Имя;
// 5. Формирование тела запроса (multipart/form-data) — ИСПРАВЛЕННЫЙ вариант
Граница = "----WebKitFormBoundary" + СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
Тело = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(Тело, , , Символы.ВК + Символы.ПС, ""); // Ключ: CRLF и пустой РазделительСтрок
ЗаписьДанных.ЗаписатьСтроку("--" + Граница);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; filename=""" + ИмяФайла + """");
ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/octet-stream");
ЗаписьДанных.ЗаписатьСтроку(""); // Пустая строка перед данными
ЗаписьДанных.Записать(ДвоичныеДанныеФайла); // Двоичные данные файла
ЗаписьДанных.ЗаписатьСтроку(""); // Пустая строка после данных
ЗаписьДанных.ЗаписатьСтроку("--" + Граница + "--"); // Закрывающий разделитель
ЗаписьДанных.Закрыть();
ДвоичныеДанныеТела = Тело.ЗакрытьИПолучитьДвоичныеДанные();
// 6. Формирование HTTP-запроса
ИмяСервера = "api-k.ru";
Порт = 443;
ЗащищенноеСоединение = Истина;
// Создаем HTTP-соединение
Попытка
HTTPСоединение = Новый HTTPСоединение(ИмяСервера, Порт, "", "", , ЗащищенноеСоединение);
Исключение
Сообщить("Ошибка при создании HTTP-соединения: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// Создаем HTTP-запрос
HTTPЗапрос = Новый HTTPЗапрос("/api/rekvizit_json");
HTTPЗапрос.Заголовки.Вставить("X-API-Key", ЭтотОбъект.APIКлюч);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "multipart/form-data; boundary=" + Граница);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеТела);
HTTPЗапрос.Заголовки.Вставить("Content-Length", XMLСтрока(ДвоичныеДанныеТела.Размер()));
// Отправляем запрос
Попытка
Ответ = HTTPСоединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
Если Ответ.КодСостояния = 200 Тогда
СтрокаОтвета = Ответ.ПолучитьТелоКакСтроку();
РазобратьИОтобразитьРезультат(СтрокаОтвета);
ЭтотОбъект.ОтветСервера = СтрокаОтвета;
Сообщить("Успешно! Файл обработан, реквизиты получены.", СтатусСообщения.Информация);
Иначе
СтрокаОшибки = Ответ.ПолучитьТелоКакСтроку();
ЭтотОбъект.ОтветСервера = СтрокаОшибки;
Сообщить("Ошибка HTTP " + Строка(Ответ.КодСостояния) + ": " + СтрокаОшибки, СтатусСообщения.Важное);
КонецЕсли;
Исключение
Сообщить("Ошибка запроса: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
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 со следующими полями:
{
"data": {
"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": "Иванова Н.В."
},
"file_size": 20480,
"filename": "2.doc",
"success": true
}
Описание полей:
| Поле | Описание |
|---|---|
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 или бухгалтерскими системами. Приятной разработки!