§ IV — API Reference

SPLASH
External API

Полный доступ к датасету SPLASH 2.0: консолидированные данные о продуктах, технические параметры, конкурентные аналоги, LLM-прокси и хранение результатов.

Быстрый старт

Все запросы требуют заголовок X-API-Key. Ключ выдаётся администратором.

Base URL: https://splash.heuristics.ru/api/ext/v1
bash
# Проверить ключ и лимиты
curl -H "X-API-Key: ext_ваш_ключ" \
  https://splash.heuristics.ru/api/ext/v1/me

# Получить первые 5 продуктов
curl -H "X-API-Key: ext_ваш_ключ" \
  "https://splash.heuristics.ru/api/ext/v1/products?limit=5"

Архитектура

API предоставляет три канала доступа к системе:

Датасет

Консолидированные данные: stock + product_meta + content + аналоги + линейка. Read-only.

LLM Proxy

Промпты через единый API — нейросеть с автоматическим failover при сбое провайдера.

Хранение

Сохраняйте результаты генерации — карточки привязаны к вашему ключу и модулю.

схема
Ваш модуль ──► X-API-Key ──► ext-auth middleware
                                    │
                  ┌─────────────────┼─────────────────┐
                  ▼                 ▼                 ▼
            SPLASH 2.0 DB     LLM (DeepSeek       Module Storage
            (read-only)        + Wormsoft)         (read / write)
            ├─ stock           (auto failover)     ├─ module_cards
            ├─ product_meta                        └─ module_data
            ├─ product_content
            └─ analog_candidates

Аутентификация

Каждый запрос должен содержать заголовок X-API-Key. Ключ начинается с ext_, содержит 48 hex-символов. На сервере хранится только SHA-256 хеш.

GET /me — response
{
  "name": "Module Author",
  "email": "dev@example.com",
  "rate_limit": {
    "llm_per_hour": 500,
    "max_tokens_per_request": 128000
  },
  "usage": {
    "requests_last_hour": 3,
    "llm_requests_last_hour": 1,
    "llm_remaining": 499,
    "total_requests": 127,
    "total_tokens": 45000
  }
}

Датасет

Консолидированный read-only доступ ко всем данным SPLASH 2.0. Каждый продукт — это объединение таблиц stock (цена, остатки), product_meta (категория, технические параметры), product_content (описание, изображения) и analog_candidates (конкурентные аналоги со скоринговыми оценками).

МетодПутьОписание
GET/meСтатус ключа, лимиты, текущее использование
GET/categoriesСправочник метакатегорий (slug + display_name + items_count)
GET/productsСписок продуктов — пагинация, поиск, фильтр по категории
GET/products/:articleПолные консолидированные данные по одному продукту

GET /products

Возвращает список продуктов с базовыми полями из stock + product_meta.

ПараметрТипDefaultОписание
limitint50Кол-во записей (max 200)
offsetint0Смещение для пагинации
searchstringПоиск по артикулу или наименованию (ILIKE)
categorystringФильтр по slug метакатегории
response — каждый элемент products[]
{
  "article": "01-0214-5",
  "name": "SUPRLAN Premium UTP 5e 2x2x0,51 Cu PVC In. 500м",
  "price": 12500,
  "stock_qty": 340,
  "meta_category": "lan_cable",
  "key_params": { "category_range": "Cat.5e", "pairs": "2x2", "shielding": "UTP" },
  "extracted_params": { "conductor": "Cu", "jacket": "PVC" }
}

GET /products/:article

Полные данные продукта: объединение stock + product_meta + product_content + аналоги + линейка (товары той же категории). Всё, что нужно для генерации описания.

response — 200
{
  "article": "10-0201",
  "name": "Коннекторы 8P8C FTP 5e 3U (RJ-45) уп. 100шт",
  "brand": "SUPRLAN",
  "price": 1489,
  "stock_qty": 2500,
  "meta_category": "rj45_connector",
  "key_params": {
    "shielding": "FTP",
    "category_range": "Cat.5e",
    "conductor_type": "Universal"
  },
  "extracted_params": { ... },
  "class_signature": "rj45_connector:FTP:Cat.5e:Universal",
  "raw_description": "Полное описание со страницы сайта (до 5000 символов)...",
  "images": ["https://suprlan.ru/upload/image1.jpg"],
  "competitors": [
    {
      "article": "RJ45-FTP-5E",
      "brand": "NETLAN",
      "name": "Коннекторы RJ45 FTP Cat.5e",
      "price": 1200,
      "score": 0.95,
      "status": "approved",
      "axis_scores": { "shielding": 1.0, "category_range": 1.0 },
      "key_params": { "shielding": "FTP", "category_range": "Cat.5e" }
    }
  ],
  "lineup": [
    { "article": "10-0202", "name": "Коннекторы 8P8C UTP 5e", "price": 989, "key_params": {...} },
    { "article": "10-0301", "name": "Коннекторы 8P8C FTP 6", "price": 2100, "key_params": {...} }
  ]
}

GET /categories

Справочник всех метакатегорий. Каждая категория имеет slug (для фильтрации), display_name и items_count.

response
{
  "categories": [
    { "slug": "lan_cable", "display_name": "LAN Cable", "items_count": 245 },
    { "slug": "patch_cords", "display_name": "Патч-корды", "items_count": 180 },
    { "slug": "rj45_connector", "display_name": "Коннекторы RJ-45", "items_count": 42 }
  ]
}

LLM Proxy

Единый эндпоинт для генерации текстов. При сбое основного провайдера — автоматическое переключение на резервный, без изменений на стороне клиента.

ПолеТипОбяз.Описание
promptstringТекст промпта
systemstringСистемный промпт
max_tokensintМаксимум токенов ответа (default 8000)
temperaturefloatТемпература генерации (0–1, default 0)
request
POST /api/ext/v1/llm/chat
Content-Type: application/json
X-API-Key: ext_ваш_ключ

{
  "system": "Ты — эксперт по кабельным системам.",
  "prompt": "Напиши описание: Коннектор RJ-45 FTP Cat.5e",
  "max_tokens": 4000,
  "temperature": 0
}
response — 200
{
  "model": "deepseek-ai/deepseek-v4-pro",
  "content": "# Коннектор RJ-45\n\nПрофессиональный коннектор...",
  "thinking": "Размышления модели (если поддерживается)...",
  "tokens": { "total": 2100, "prompt": 600, "completion": 1500 },
  "time_ms": 8500
}

Карточки

Сохраняйте результаты генерации. Ключ уникальности: (api_key_id, article, module_name). Повторный POST с теми же article + module_name обновит существующую карточку (upsert).

МетодПутьОписание
POST/cardsСохранить / обновить карточку
GET/cardsСписок ваших карточек
GET/cards/:articleПолучить карточку по артикулу
DELETE/cards/:article?module_name=XУдалить карточку
POST /cards — request body
{
  "article": "10-0201",
  "module_name": "my_generator_v1",
  "sections": {
    "A1": "# Полное описание\nПрофессиональный коннектор...",
    "C1": "Коннектор SUPRLAN RJ-45 FTP Cat.5e — краткое описание",
    "C2": "Надёжное экранированное подключение"
  },
  "metadata": {
    "version": "1.0",
    "generation_time_ms": 45000,
    "model": "deepseek-v4-pro"
  }
}

Хранилище данных

Key-value хранилище для конфигурации модуля, промежуточных результатов и состояния.

МетодПутьОписание
PUT/data/:keyСохранить JSON-данные по ключу
GET/data/:keyПолучить сохранённые данные
PUT /data/my_config
{ "value": { "prompt_version": 3, "temperature": 0.1, "style": "professional" } }

Ошибки

Все ошибки возвращают JSON { "error": "описание" }.

КодЗначениеКогда
400Bad RequestОтсутствуют обязательные поля (например, prompt)
401UnauthorizedНет заголовка X-API-Key или ключ не найден
403ForbiddenКлюч деактивирован
404Not FoundПродукт или карточка не найдены
429Rate LimitedПревышен лимит LLM-запросов
500Server ErrorВнутренняя ошибка

Полный пример на Python

python
import requests

API = "https://splash.heuristics.ru/api/ext/v1"
KEY = "ext_ваш_ключ"
H = {"X-API-Key": KEY}

# 1. Проверить подключение
me = requests.get(f"{API}/me", headers=H).json()
print(f"Подключен: {me['name']}, LLM осталось: {me['usage']['llm_remaining']}")

# 2. Получить продукты категории
products = requests.get(f"{API}/products", headers=H, params={
    "category": "patch_cords", "limit": 10
}).json()

for p in products["products"]:
    article = p["article"]

    # 3. Полные данные (stock + meta + content + аналоги + линейка)
    data = requests.get(f"{API}/products/{article}", headers=H).json()

    # 4. Генерация через LLM
    resp = requests.post(f"{API}/llm/chat", headers=H, json={
        "system": "Ты эксперт по СКС. Пиши профессионально.",
        "prompt": f"""Продукт: {data['name']}
Категория: {data['meta_category']}
Параметры: {data['key_params']}
Описание: {data.get('raw_description', 'нет')}
Конкуренты: {[c['name'] for c in data.get('competitors', [])]}
Линейка: {[l['name'] for l in data.get('lineup', [])[:5]]}

Создай маркетинговое описание для маркетплейса.""",
        "max_tokens": 4000
    }).json()

    # 5. Сохранить результат
    requests.post(f"{API}/cards", headers=H, json={
        "article": article,
        "module_name": "my_generator_v1",
        "sections": {"description": resp["content"]},
        "metadata": {"model": resp["model"], "tokens": resp["tokens"]}
    })

    print(f"✅ {article}: {len(resp['content'])} символов")

Контекст для AI-агентов

Скопируйте этот блок и передайте AI-агенту (Claude, GPT, Gemini и др.) как системный контекст. Агент сможет программировать модуль без дополнительных инструкций.

## SPLASH External Module API Base URL: https://splash.heuristics.ru/api/ext/v1 Auth: Header X-API-Key (provided separately) ### Endpoints GET /me — key status, usage stats GET /categories — list product categories (slug, display_name, items_count) GET /products?limit=N&offset=M — list products (filterable by category=slug, search=text) GET /products/:article — full consolidated product data POST /llm/chat — send prompt to LLM POST /cards — save/update generated card (upsert) GET /cards?limit=N&offset=M — list saved cards GET /cards/:article?module_name=X — get specific card DELETE /cards/:article?module_name=X — delete card PUT /data/:key — save arbitrary JSON config GET /data/:key — retrieve saved config ### Data Per Product (GET /products/:article) Each product is a consolidated view across multiple tables: - article, name, brand, price, stock_qty (from stock table) - meta_category, key_params, extracted_params, class_signature (from product_meta) - raw_description (up to 5000 chars), images[] (from product_content) - competitors[] — analog products with score, axis_scores, key_params, price (from analog_candidates) - lineup[] — same-category products for comparison (up to 15) ### LLM (POST /llm/chat) Body: { "system": str, "prompt": str (required), "max_tokens": int, "temperature": float } Response: { "model": str, "content": str, "thinking": str|null, "tokens": {total, prompt, completion}, "time_ms": int } Auto-failover between providers. Default max_tokens=8000. ### Saving Results (POST /cards) Body: { "article": str, "module_name": str, "sections": {key: value}, "metadata": {any} } Uniqueness key: (api_key_id, article, module_name) Re-POST same combo = UPDATE (upsert) ### Key-Value Storage (PUT /data/:key) Body: { "value": any_json } Use for configs, state, intermediate results. ### Errors All errors: { "error": "description" } 400 = missing required fields, 401 = no/invalid key, 403 = deactivated, 404 = not found, 429 = LLM rate limit, 500 = server error