SPLASH
External API
Полный доступ к датасету SPLASH 2.0: консолидированные данные о продуктах, технические параметры, конкурентные аналоги, LLM-прокси и хранение результатов.
Быстрый старт
Все запросы требуют заголовок X-API-Key. Ключ выдаётся администратором.
https://splash.heuristics.ru/api/ext/v1
# Проверить ключ и лимиты
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 хеш.
{
"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 | Описание |
|---|---|---|---|
limit | int | 50 | Кол-во записей (max 200) |
offset | int | 0 | Смещение для пагинации |
search | string | — | Поиск по артикулу или наименованию (ILIKE) |
category | string | — | Фильтр по slug метакатегории |
{
"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 + аналоги + линейка (товары той же категории). Всё, что нужно для генерации описания.
{
"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.
{
"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
Единый эндпоинт для генерации текстов. При сбое основного провайдера — автоматическое переключение на резервный, без изменений на стороне клиента.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
prompt | string | ✓ | Текст промпта |
system | string | — | Системный промпт |
max_tokens | int | — | Максимум токенов ответа (default 8000) |
temperature | float | — | Температура генерации (0–1, default 0) |
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
}
{
"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 | Удалить карточку |
{
"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 | Получить сохранённые данные |
{ "value": { "prompt_version": 3, "temperature": 0.1, "style": "professional" } }
Ошибки
Все ошибки возвращают JSON { "error": "описание" }.
| Код | Значение | Когда |
|---|---|---|
400 | Bad Request | Отсутствуют обязательные поля (например, prompt) |
401 | Unauthorized | Нет заголовка X-API-Key или ключ не найден |
403 | Forbidden | Ключ деактивирован |
404 | Not Found | Продукт или карточка не найдены |
429 | Rate Limited | Превышен лимит LLM-запросов |
500 | Server Error | Внутренняя ошибка |
Полный пример на 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 и др.) как системный контекст. Агент сможет программировать модуль без дополнительных инструкций.