API

Что нужно знать 1С-разработчику:
  • id — ваш уникальный идентификатор товара (обычно GUID из 1С). Без него сервис не сможет добавить или обновить товар. Повторная загрузка с тем же id полностью перезаписывает запись
  • name — наименование товара. Обязательно только для нечеткого поиска
  • Сервис ищет по полям: name, code, barcode, art, а также динамическим полям в PRO-режиме (см. Расширенный поиск)
  • Ответ приходит за 2-10 мс — ваша 1С не зависнет
  • Если сервис недоступен — ставьте таймаут 1-2 секунды и создавайте новый товар без проверки
В примерах ниже используется порт `8080` как условный локальный порт. В production-контурах по умолчанию Free работает на `8081`, PRO — на `8082` (см. `deployment/docker-compose.yml`).
Аутентификация и rate limit. Если в конфиге задан security.api_key, все запросы должны содержать заголовок X-API-Key: <ключ>. Без него сервис вернет 401 Unauthorized. При превышении лимита запросов сервис вернет 429 Too Many Requests.
Режим "только для сайта" (site.enabled = true). Все мутации (/add, /delete, /admin/*, /feedback, /synonyms POST/DELETE и др.) возвращают 403 Forbidden. Доступны только чтение: /find, /export, /health, /api/search-config, /api/config и статика.

Поля в запросах и ответах

ПолеГде используетсяЧто значитТипОбязательность
nameв запросе /find, /addНаименование товараstringдля нечеткого поиска, для точного (можно пустым)
idв запросе /add, /delete, /findВаш GUID из 1Сstringобязательно для /add
id_outв ответе /findGUID найденного товараstring—
name_outв ответе /findНаименование найденного товараstring—
scoreв ответе /findУверенность (0-1). 1.0 = идеальное совпадениеfloat—
matched_byв ответе /findСпособ поиска (см. таблицу ниже)string—
search_time_msв ответе /findОбщее время выполнения поиска в миллисекундахinteger—
codeв запросе/ответеКод товара / производителяstringопционально
barcodeв запросе/ответеШтрихкод (строка или массив строк)string или arrayопционально
artв запросе/ответеДополнительный артикулstringопционально
fieldsв запросе /findКакие дополнительные поля вернуть в ответеobjectопционально
(динамические поля)в запросе/ответеЛюбые дополнительные реквизиты передаются плоско, на одном уровне с name, id, code (например: material, color, supplier, brand). Все значения хранятся и сравниваются как строки — числа и даты тоже становятся строками.stringопционально (PRO only)
strategyв запросе /findСтратегия поиска: "fs_only", "embedding_only", "hybrid", "parallel"stringопционально; принимается в обеих редакциях, эффект только в PRO
parent_idв запросе /addID родительского элемента (для иерархии)stringопционально (PRO only)
group_idв запросе /addID группы аналогов (кросс-коды)stringопционально (PRO only)
is_originalв запросе /addЯвляется ли товар оригиналом в группеbooleanопционально (PRO only)
limitв запросе /findМаксимальное количество результатов (не более 1000)integerопционально (по умолчанию из конфига, максимум 1000)
type/find, /add, ответТип номенклатуры (1С)stringопционально
desc/find, /add, ответОписание/реквизиты (1С)stringопционально
ref/find, /add, ответСсылка/UUID 1С (точный поиск)stringопционально
fs_only/add (body)Пропустить эмбеддинги (экономия CPU)boolпо умолчанию false
successв ответе /add, /deleteУспешно ли выполнена операцияboolean—
error / reasonв ответе /add, /deleteПричина ошибкиstring—

Значения поля matched_by

ЗначениеЧто значит
exact_idТочное совпадение по id
exact_id_from_nameUUID из поля name распознан как id
exact_id_fallbackТочное совпадение по id после fallback-поиска
exact_barcode / exact_barcode_from_nameТочное совпадение по штрихкоду (в том числе из name)
exact_code / exact_code_from_nameТочное совпадение по коду товара (в том числе из name)
exact_art / exact_art_from_nameТочное совпадение по артикулу (в том числе из name)
exact_typeТочное совпадение по типу 1С
exact_refТочное совпадение по ссылке/UUID 1С
exact_name / exact_name_rawТочное совпадение по наименованию (стеммированное / исходное)
exact_fieldsСовпадение по комбинации полей запроса (code, art, type, ref, barcode)
exact_dynamicТочное совпадение по динамическим полям (PRO only)
exact_identifierТочное совпадение по идентификатору 1С или внешнему коду
exact_parent_idНайден по parent_id (иерархия)
exact_1c_full_matchПолное совпадение по 1С-идентификаторам
ngramНайдено через Edge N-gram (по части слова)
phrase / phrase_fallbackНайдено по точной фразе
fuzzy_textНайдено через нечеткий поиск (с опечатками)
fuzzy_booleanНайдено через булевый нечеткий поиск
dynamic_onlyНайдено только по динамическим полям (без name, PRO only)
embeddingНайдено через семантический поиск (PRO only)
fs_onlyНайдено через полнотекстовый поиск
fs+embeddingГибридный поиск (PRO only)
hierarchy_childНайден как потомок в иерархии (PRO only)
hierarchy_defaultЗначение по умолчанию при иерархическом поиске (PRO only)

POST /find — поиск

POST/find

Поиск по названию (основной сценарий):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "Болт М16 цинк"
      }
    ],
    "limit": 3
  }'
# Тот же запрос через CLI
sku-cli search "Болт М16 цинк" --limit 3

Точный поиск по ID (name можно передать пустым):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "",
        "id": "1C-GUID-0001"
      }
    ]
  }'
# Тот же запрос через CLI
sku-cli search --id "1C-GUID-0001"

Поиск по артикулу (name можно передать пустым):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "",
        "code": "BOLT-M16-60-ZN"
      }
    ]
  }'
# Тот же запрос через CLI
sku-cli search --code "BOLT-M16-60-ZN"
Про регистр: Если поле добавлено в `case_sensitive_fields`, то прямой поиск по нему (например, `code="BOLT-M16-60-ZN"`) учитывает регистр. При этом поиск через общее поле `name="bolt-m16-60-zn"` остается регистронезависимым — система найдет товар в любом регистре.

Поиск по динамическим полям (PRO only):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "",
        "supplier": "ООО Ромашка",
        "brand": "Bosch"
      }
    ],
    "limit": 20
  }'
# Тот же запрос через CLI
sku-cli search "" --field supplier="ООО Ромашка" --field brand="Bosch" --dynamic-only --limit 20
PRO only. Для работы этого режима необходим PRO-режим и в конфиге должны быть включены extended_search_enabled = true и require_name_for_fuzzy = false.

Смешанный поиск (название + артикул + динамические поля):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "Болт М16",
        "art": "78454",
        "color": "оцинкованный"
      }
    ],
    "limit": 5
  }'
# Тот же запрос через CLI
sku-cli search "Болт М16" --art "78454" --field color="оцинкованный" --limit 5

С указанием стратегии поиска:

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "шуруповерт аккумуляторный"
      }
    ],
    "strategy": "hybrid",
    "limit": 5
  }'
# Тот же запрос через CLI
sku-cli search "шуруповерт аккумуляторный" --limit 5 --strategy hybrid

Поиск по type (фильтр по типу объекта 1С):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "болт",
        "type": "Справочник.Номенклатура"
      }
    ]
  }'
# Тот же запрос через CLI
sku-cli search "болт" --type "Справочник.Номенклатура"

Поиск по ref (прямая ссылка на объект 1С):

curl -X POST http://localhost:8080/find \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "name": "",
        "ref": "e1cib/data/Справочник.Номенклатура?ref=a1b2c3d4e5f6..."
      }
    ]
  }'
# Тот же запрос через CLI
sku-cli search --ref "e1cib/data/Справочник.Номенклатура?ref=a1b2c3d4e5f6..."

Транслитерация и неправильная раскладка:

# Русская фраза, набранная латиницей на русской раскладке
    curl -X POST http://localhost:8080/find \
      -H "Content-Type: application/json" \
      -d '{"items":[{"name":"ljvbr d lthtdyt"}]}'

# Латинская транслитерация
    curl -X POST http://localhost:8080/find \
      -H "Content-Type: application/json" \
      -d '{"items":[{"name":"domik v derevne"}]}'
# Тот же запрос через CLI
sku-cli search "ljvbr d lthtdyt"
sku-cli search "domik v derevne"
Транслитерация работает, если в config.toml включен параметр search.transliteration_enabled = true.

Ответ (когда товар найден):

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "search_time_ms": 12,
  "results": [
    {
      "query": {
        "name": "Болт М16 цинк",
        "id": null,
        "code": null,
        "art": null,
        "barcode": [],
        "fields": {},
        "parent_id": null,
        "group_id": null,
        "is_original": false,
        "type": null,
        "desc": null,
        "ref": null
      },
      "matches": [
        {
          "original": {
            "name_out": "Болт М16х60 оцинкованный ГОСТ 7798-70",
            "id_out": "1C-GUID-0001",
            "code": "BOLT-M16-60-ZN",
            "barcode": ["4607000010015"],
            "art": "78454",
            "score": 0.94,
            "matched_by": "fuzzy_text",
            "is_original": false,
            "matched_tokens": ["болт", "м16", "оцинкованный"]
          }
        }
      ]
    }
  ]
}
Поле cross_codes возвращается только при непустом списке кросс-кодов; если аналогов нет, ключ в JSON отсутствует.

Ответ с кросс-кодами (PRO only):

Параметр include_cross_codes по умолчанию true. Кросс-коды возвращаются только если в конфигурации включены pro.enabled и pro.cross_codes.enabled.

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "search_time_ms": 8,
  "results": [
    {
      "query": { ... },
      "matches": [
        {
          "original": {
            "name_out": "Болт М16х60 оцинкованный",
            "id_out": "DETAL-BOSCH-001",
            "group_id": "GROUP-BOSCH-001",
            "is_original": true,
            "score": 0.94
          },
          "cross_codes": [
            {
              "name_out": "Болт М16х60 оцинкованный аналог",
              "id_out": "DETAL-BOSCH-002",
              "score": 0.89,
              "is_original": false
            }
          ]
        }
      ]
    }
  ]
}

Ответ (когда ничего не найдено):

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "search_time_ms": 3,
  "results": [
    {
      "query": { "name": "несуществующий товар", ... },
      "matches": []
    }
  ]
}
Как возвращаются динамические поля: Значения произвольных полей приходят плоско внутри объекта `original`, наравне с `name_out`, `id_out` и т.д. (не во вложенном `extra`).
  • Обычные extra-поля (не описанные в <code>[[search.extended_fields]]</code>) сохраняются в f_attrs и возвращаются автоматически, если они проиндексированы.
  • Расширенные поля (<code>[[search.extended_fields]]</code>, PRO) сохраняются в отдельные поля схемы поискового индекса. Они возвращаются в ответе, только когда поиск выполняется именно по этому полю (обычно с пустым name). Если товар найден по названию или эмбеддингам, расширенное поле может отсутствовать.
  • «Технические» 1С-значения (GUID, строки только из цифр/дефисов/точек/слешей) не попадают в f_attrs и не возвращаются как extra-атрибуты.
Важно: Для нечеткого поиска (fuzzy) поле `name` обязательно и не должно быть пустым, если `require_name_for_fuzzy = true`. Для точного поиска по `id`, `barcode`, `code` или `art` поле `name` можно передать пустой строкой.

POST /add — добавить или обновить

POST/add

Запрос:

curl -X POST http://localhost:8080/add \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{
      "name": "Гайка М16 нержавеющая",
      "id": "1C-GUID-0002",
      "code": "NUT-M16-A2",
      "barcode": ["4607000010022"],
      "art": "GN-16",
      "supplier": "ООО Ромашка",
      "brand": "Nord"
    }]
  }'
# Тот же запрос через CLI
# Создайте файл item.json:
    [
      {
        "name": "Гайка М16 нержавеющая",
        "id": "1C-GUID-0002",
        "code": "NUT-M16-A2",
        "barcode": [
          "4607000010022"
        ],
        "art": "GN-16",
        "supplier": "ООО Ромашка",
        "brand": "Nord"
      }
    ]

sku-cli add item.json
Важно: Поле `id` обязательно для индексации. Без него сервис не сможет обновить товар. Динамические поля (`supplier`, `brand` и др.) добавляются прямо в корень объекта.
Перезапись по id: Если в индексе уже есть товар с таким id, сервис удалит старую запись и запишет новую. Это позволяет обновлять товары, но требует, чтобы id был уникальным и не менялся между загрузками.

Ответ (успех):

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "success": true,
  "error": null,
  "results": [
    {
      "id": "1C-GUID-0002",
      "success": true,
      "error": null
    }
  ]
}

Запрос с ошибкой (пустой id):

curl -X POST http://localhost:8080/add \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{
      "name": "Товар без GUID",
      "id": ""
    }]
  }'
# Тот же запрос через CLI
# Создайте файл item.json:
    [
      {
        "name": "Товар без GUID",
        "id": ""
      }
    ]

sku-cli add item.json

Ответ (ошибка):

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "success": false,
  "error": "Batch validation failed",
  "results": [
    {
      "id": "",
      "success": false,
      "error": "id missing or empty"
    }
  ]
}

POST /add?dry_run=true — проверить без записи

POST/add?dry_run=true
curl -X POST "http://localhost:8080/add?dry_run=true" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"name":"Новый товар","id":"NEW-001"}]}'
# Тот же запрос через CLI
# Создайте файл item.json:
    [
      {
        "name": "Новый товар",
        "id": "NEW-001"
      }
    ]

sku-cli add item.json --dry-run

Ответ:

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "success": true,
  "error": null,
  "results": [
    {
      "id": "NEW-001",
      "success": true,
      "error": "would_insert"
    }
  ]
}
`error` содержит `"would_insert"` — новый товар, `"would_update"` — обновит существующий.

POST /delete — удалить

POST/delete
curl -X POST http://localhost:8080/delete \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"1C-GUID-OLD-001"}]}'
# Тот же запрос через CLI
sku-cli delete "1C-GUID-OLD-001"

Ответ:

{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "success": true,
  "error": null,
  "results": [
    {
      "id": "1C-GUID-OLD-001",
      "success": true,
      "error": null
    }
  ]
}

POST /synonyms — управление синонимами

POST/synonyms
curl -X POST http://localhost:8080/synonyms \
  -H "Content-Type: application/json" \
  -d '{"items":[{"word":"цинк","expansions":["оцинкованный","zn","zinc"]}]}'
# Тот же запрос через CLI
sku-cli synonyms add --word "цинк" --expansions "оцинкованный,zn,zinc"

Ответ:

{
  "results": [
    {
      "word": "цинк",
      "success": true,
      "reason": null
    }
  ]
}

GET /synonyms — получить все синонимы

GET/synonyms
curl http://localhost:8080/synonyms
# Тот же запрос через CLI
sku-cli synonyms list

Ответ:

{
  "synonyms": {
    "цинк": ["оцинкованный", "zn", "zinc"],
    "болт": ["болтик", "винт"]
  }
}

POST /feedback — обратная связь для обучения

POST/feedback
curl -X POST http://localhost:8080/feedback \
  -H "Content-Type: application/json" \
  -d '{
    "query_name": "болт м16 цинк",
    "matched_id_out": "1C-GUID-0001",
    "action": "reject"
  }'
# Тот же запрос через CLI
sku-cli feedback --query "болт м16 цинк" --matched-id "1C-GUID-0001" --action reject

Ответ:

{
  "status": "logged"
}
`action` может быть `"accept"` (подтвердить), `"reject"` (отклонить) или `"zero_result"` (по запросу ничего не нашлось).
Помимо обязательных полей query_name, matched_id_out и action, запрос может содержать опциональные поля: product_name, product_art, product_barcode, matched_by, position, session_id, expected_id.

GET /health — проверить состояние сервиса

GET/health
curl http://localhost:8080/health
# Тот же запрос через CLI
sku-cli health

Ответ:

{
  "status": "ok",
  "version": "0.2.9",
  "edition": "pro",
  "uptime_seconds": 3600,
  "config_path": "/app/config.toml",
  "config_hash": "a2476ef4e23468b5",
  "db_record_count": 20001,
  "db_size_mb": 142.5,
  "disk_free_gb": 180.2,
  "synonyms_count": 42,
  "cpu_usage_percent": 2.1,
  "ram_used_mb": 11912,
  "backups_count": 3,
  "cache_hits": 1234,
  "cache_misses": 567,
  "cache_size": 1000,
  "qps": 12.5,
  "index_status": {
    "optimized": true,
    "segments_count": 1
  },
  "orchestrator": {
    "strategy": "hybrid",
    "fs_enabled": true,
    "embedding_enabled": true,
    "total_searches": 0,
    "avg_time_ms": 0.0
  },
  "embedding": {
    "enabled": true,
    "model_loaded": true,
    "vector_count": 20399,
    "vector_dimension": 1024,
    "avg_search_time_ms": 0.0
  },
  "embedding_queue": {
    "enabled": true,
    "pending": 0,
    "processing": 0,
    "completed": 20399,
    "failed": 0,
    "dead": 0,
    "total": 20399
  },
  "background_workers": {
    "worker_count": 2,
    "active_workers": 2,
    "total_restarts": 0,
    "restarts_last_minute": 0,
    "max_restarts_per_minute": 8,
    "monitor_interval_secs": 2
  },
  "license": {
    "enabled": true,
    "active": true,
    "fingerprint": "sha256:..."
  },
  "last_error": null
}
В Free-режиме блоки `embedding`, `embedding_queue` и `background_workers` возвращают {"enabled": false, "model_loaded": false, "vector_count": 0} (для embedding) или {"enabled": false} (для остальных). Поле last_error всегда присутствует и равно null, если ошибок не было.

GET /export — выгрузить все данные

GET/export?format=csv&limit=1000&offset=0
curl "http://localhost:8080/export?format=csv&limit=1000&offset=0" -o export.csv

Параметры:

  • format — "json" (по умолчанию) или "csv"
  • limit — количество строк (макс. из конфига, по умолчанию 1000)
  • offset — смещение (для пагинации)

Ответ (CSV):

id_out,name,code,barcode,art
1C-GUID-0001,Болт М16х60 оцинкованный ГОСТ 7798-70,BOLT-M16-60-ZN,"[""4607000010015""]",78454
1C-GUID-0002,Гайка М16 нержавеющая,NUT-M16-A2,"[""4607000010022""]",GN-16

GET /api/search-config — получить конфигурацию поиска (для UI)

GET/api/search-config
curl http://localhost:8080/api/search-config
# Тот же запрос через CLI
sku-cli config

Ответ:

{
  "extended_fields": [
    {"field": "supplier", "weight": 0.7, "stemmed": true, "fuzzy": true},
    {"field": "brand", "weight": 0.6, "stemmed": true, "fuzzy": true}
  ],
  "extended_search_enabled": true,
  "require_name_for_fuzzy": false,
  "pro_enabled": true,
  "embedding_enabled": true,
  "search_strategy": "parallel",
  "pro_info_url": "https://example.com/pro",
  "purchase_url": "https://example.com/purchase"
}
В Free-режиме extended_fields возвращается пустым массивом, pro_enabled и embedding_enabled — false. Поля pro_info_url и purchase_url присутствуют в обеих редакциях, если заданы в конфигурации.

PRO API — Аналитика и тюнинг (только PRO версия)

Доступно только в PRO версии! Требуют pro.analytics_enabled = true.

GET /admin/analytics/stats — статистика поиска

GET/admin/analytics/stats
curl http://localhost:8080/admin/analytics/stats
# Тот же запрос через CLI
sku-cli analytics stats

POST /admin/analytics/reset — сброс статистики

POST/admin/analytics/reset

GET /admin/analytics/tuning — рекомендации по настройке

GET/admin/analytics/tuning

PRO API — Иерархия (BOM / Where-Used)

Доступно только в PRO версии! Требует pro.plugins.hierarchy.enabled = true.

POST /hierarchy — построение дерева спецификаций

POST/hierarchy

Запрос (разузлование вниз):

curl -X POST http://localhost:8080/hierarchy \
  -H "Content-Type: application/json" \
  -d '{
    "root_id": "DETAL-001",
    "direction": "down",
    "max_depth": 5,
    "include_cross_codes": true,
    "limit": 100
  }'

Параметры:

  • root_id — ID корневого элемента (обязательно). Для direction=down это начало дерева; для direction=up — деталь, для которой ищутся родители.
  • direction — только строчные значения: "down" (разузлование, от изделия к деталям) или "up" (Where-Used, от детали к изделиям). Значения с заглавной буквы ("Down", "UP") вернут ошибку 422.
  • max_depth — максимальное количество уровней от корня. Корень имеет уровень 0, его прямые потомки/родители — уровень 1 и т.д. По умолчанию 5 (из конфига pro.plugins.hierarchy.default_max_depth).
  • include_cross_codes — включать аналоги для каждого узла. Сам узел в свой список аналогов не попадает. По умолчанию false (из конфига pro.plugins.hierarchy.include_cross_codes_by_default).
  • limit — общий лимит узлов во всем дереве или цепочке, включая корень. Не «на уровень». По умолчанию 1000 (из конфига pro.plugins.hierarchy.default_limit).

PRO API — Управление эмбеддингами

GET /admin/embedding/stats — статистика эмбеддингов

GET/admin/embedding/stats

POST /admin/embedding/reindex — переиндексация векторов

POST/admin/embedding/reindex

POST /admin/embedding/reindex/background — фоновая переиндексация

POST/admin/embedding/reindex/background

POST /admin/embedding/clear — очистить векторное хранилище

POST/admin/embedding/clear

POST /admin/embedding/optimize — оптимизировать HNSW индекс

POST/admin/embedding/optimize

POST /admin/embedding/cache/clear — очистить кэш эмбеддингов

POST/admin/embedding/cache/clear

Административные эндпоинты

PRO only: очистка индекса, оптимизация, аналитика, управление эмбеддингами, иерархия и кросс-коды доступны только в PRO.\ Free + PRO: `/admin/config` и `/admin/config/update` работают в обеих редакциях (при включенных мутациях).

POST /admin/clear — очистить весь индекс (PRO only)

POST/admin/clear
Необратимая операция! Удаляет все документы из индекса.

GET /admin/learn — анализ фидбека и предложение синонимов

GET/admin/learn

GET /admin/index/stats — статистика индекса

GET/admin/index/stats

POST /admin/index/optimize — оптимизация индекса (мерж сегментов)

POST/admin/index/optimize

GET /admin/queries/top — топ запросов

GET/admin/queries/top?limit=10

POST /admin/cache/clear — очистить кэш запросов

POST/admin/cache/clear

POST /admin/config/update — обновить конфигурацию на лету

POST/admin/config/update
curl -X POST http://localhost:8080/admin/config/update \\
  -H "Content-Type: application/json" \\
  -d '{"search":{"auto_match_threshold":0.9}}'
Принимает JSON с partial-обновлением секций конфига. Изменения применяются без перезапуска сервиса.

GET /admin/config — текущая конфигурация

GET/admin/config
GET /admin/config и GET /api/config возвращают одинаковую редактируемую конфигурацию (секции search, pro, csv, export). Различий между «admin» и «public» представлением нет.

GET /api/config — текущая конфигурация

GET/api/config

GET /swagger-ui — интерактивная документация OpenAPI

GET/swagger-ui

GET / — embedded GUI

GET/

Возвращает HTML-страницу встроенного интерфейса (Free/PRO GUI или страница активации), а не JSON-статус.

Полный список эндпоинтов

Мутации (/add, /delete, /feedback, /synonyms, /admin/config/update, /admin/clear, /admin/index/optimize, /admin/cache/clear, /admin/analytics/reset, /admin/embedding/*, /hierarchy и др.) регистрируются только при allow_mutations = true. В режиме «только для сайта» (site.enabled = true) мутации возвращают 403 Forbidden.
МетодПутьОписаниеFreePRO
GET/Embedded GUI (Free/PRO/активация)✓✓
GET/sample_queriesПримеры поисковых запросов✓✓
GET/docs/*Встроенная документация (mdbook)✓✓
GET/static/*Статические файлы GUI✓✓
GET/swagger-uiИнтерактивная документация OpenAPI✓✓
GET/api-docs/openapi.jsonOpenAPI-спецификация✓✓
GET/api/update-checkПроверка обновлений✓✓
POST/findПоиск номенклатуры✓✓
POST/addДобавить/обновить товары✓✓
POST/deleteУдалить товары✓✓
POST/synonymsУправление синонимами✓✓
DELETE/synonyms/:wordУдалить синоним✓✓
GET/synonymsПолучить синонимы✓✓
POST/feedbackОбратная связь для обучения✓✓
GET/healthСостояние сервиса✓✓
GET/exportЭкспорт данных✓✓
GET/api/search-configКонфигурация для UI✓✓
GET/api/configТекущая конфигурация✓✓
POST/api/activateАктивация PRO-лицензии—✓
GET/api/license/statusСтатус лицензии—✓
GET/api/license/fingerprintFingerprint сервера—✓
POST/api/license/uploadЗагрузка файла лицензии—✓
GET/api/license/heartbeatHeartbeat лицензии—✓
GET/api/license/crlСписок отозванных лицензий—✓
POST/api/license/recoverВосстановление лицензии—✓
GET/api/subscription-statusСтатус подписки—✓
GET/adminAdmin GUI✓✓
POST/admin/clearОчистить индекс—✓
GET/admin/learnАнализ фидбека—✓
GET/admin/index/statsСтатистика индекса—✓
POST/admin/index/optimizeОптимизация индекса—✓
GET/admin/queries/topТоп-10 запросов—✓
POST/admin/cache/clearОчистить кэш—✓
POST/admin/config/updateОбновить конфигурацию на лету✓✓
GET/admin/configТекущая конфигурация✓✓
POST/hierarchyИерархия (BOM)—✓
GET/admin/analytics/statsСтатистика аналитики—✓
POST/admin/analytics/resetСброс аналитики—✓
GET/admin/analytics/tuningРекомендации по настройке—✓
GET/admin/embedding/statsСтатистика эмбеддингов—✓
POST/admin/embedding/reindexПереиндексация векторов—✓
POST/admin/embedding/reindex/backgroundФоновая переиндексация—✓
POST/admin/embedding/clearОчистить векторное хранилище—✓
POST/admin/embedding/optimizeОптимизировать HNSW—✓
POST/admin/embedding/cache/clearОчистить кэш эмбеддингов—✓
GET/admin/background/statsСтатистика фоновой очереди—✓