UnloadZones
UnloadZones — документация для интеграции
Модуль UnloadZones предоставляет REST API, через которое ваша информационная система обновляет данные по зонам.
1. Обзор
- Централизованная передача на экран текстов для зон.
- Простые HTTP-запросы к REST API с аутентификацией по API-ключу (
X-API-Key). - Надёжность:
ETag, условные запросы (If-None-Match,If-Match), ограничение частоты, аудит-логи обращений.
2. Модель данных зоны
Пример объекта зоны в ответе API:
{
"zone_id": 1,
"name": "Пост 1",
"text": "ИВАНОВ В.Г.",
"message_color": "#FF0000",
"layout_w": 160,
"layout_h": 20,
"updated_at": "2025-09-20T12:30:00Z",
"etag": "8792368e99e2742968bc935ccdbe85f6c7226611"
}
3. Аутентификация и лимиты
- Каждый запрос должен содержать заголовок
X-API-Key. - Базовый URL REST:
/api/v1(например:http://your_url/api/v1). - Лимит: 120 запросов/минуту на IP.
- Используйте
If-None-MatchиIf-MatchсETagдля синхронизации изменений.
4. Эндпоинты API: Зоны
GET /zones
Возвращает список всех зон.
Пример ответа:
[
{ "id": 1, "name": "Зона 1", "text": "ОЖИДАНИЕ", "message_color": "#FF0000" },
{ "id": 2, "name": "Зона 2", "text": "ГОТОВО", "message_color": "#00FF00" }
]
GET /zones/{zone_id}
Возвращает данные конкретной зоны.
Поддерживает заголовок If-None-Match (ETag) для оптимизации кэширования.
Пример ответа:
{
"id": 1,
"name": "Зона 1",
"text": "ОЖИДАНИЕ",
"message_color": "#FF0000",
"layout_w": 192,
"layout_h": 64
}
PUT /zones/{zone_id}
Полная замена данных зоны (upsert).
Требует заголовок If-Match для контроля версий.
Пример запроса:
{
"name": "Зона 1",
"text": "ГОТОВО",
"message_color": "#00FF00",
"layout_w": 256,
"layout_h": 64
}
PATCH /zones/{zone_id}/text
Изменяет только текст зоны.
Пример запроса:
{ "text": "ГОТОВО К ВЪЕЗДУ" }
PATCH /zones/{zone_id}/color
Изменяет только цвет сообщения.
Пример запроса:
{ "message_color": "#00FF00" }
PATCH /zones/{zone_id}/size
Изменяет только размеры зоны (layout_w, layout_h).
Пример запроса:
{ "layout_w": 256, "layout_h": 64 }
PATCH /zones/{zone_id}/name
Изменяет только название зоны.
Пример запроса:
{ "name": "Зона ожидания" }
5. Примеры запросов
curl
BASE="http://your_url"
KEY="ABCD-EFGH-1234-IJKL"
# список зон
curl -i -H "X-API-Key: $KEY" -H "Accept: application/json" "$BASE/api/v1/zones"
# зона 1
curl -i -H "X-API-Key: $KEY" -H "Accept: application/json" "$BASE/api/v1/zones/1"
# изменить только текст
curl -i -X PATCH -H "X-API-Key: $KEY" -H "Content-Type: application/json" -d '{"text":"TEST"}' "$BASE/api/v1/zones/1/text"
# полный PUT c If-Match
ETAG="8792368e99e2742968bc935ccdbe85f6c7226611"
curl -i -X PUT -H "X-API-Key: $KEY" -H "If-Match: $ETAG" -H "Content-Type: application/json" -d '{"name":"Пост 1","text":"ИВАНОВ В.Г.","message_color":"#FF0000","layout_w":160,"layout_h":20}' "$BASE/api/v1/zones/1"
Node (fetch)
const BASE = 'http://your_url';
const KEY = 'ABCD-EFGH-1234-IJKL';
const res = await fetch(`${BASE}/api/v1/zones/1/text`, {
method: 'PATCH',
headers: {
'X-API-Key': KEY,
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({ text: 'TEST' })
});
console.log(await res.json());
6. Использование ETag: If-None-Match и If-Match
ETag используется для обеспечения целостности данных и предотвращения конфликтов при одновременных изменениях ресурса.
If-None-Matchприменяется приGET, чтобы вернуть304 Not Modified, если данные не изменились.If-Matchиспользуется приPUT/PATCH, чтобы обновление прошло только если версия совпадает.
curl
BASE="http://your_url"
KEY="${UZ_API_KEY:?Set UZ_API_KEY first}"
ZONE_ID=1
# GET зоны
curl -sS -D headers.txt -H "X-API-Key: $KEY" -H "Accept: application/json" "$BASE/api/v1/zones/$ZONE_ID" -o body.json
ETAG=$(awk -F': ' 'tolower($1)=="etag"{print $2}' headers.txt | tr -d '
"')
echo "ETag: $ETAG"
# Повторный GET c If-None-Match
curl -i -H "X-API-Key: $KEY" -H "If-None-Match: "$ETAG"" "$BASE/api/v1/zones/$ZONE_ID"
# PATCH с If-Match
curl -i -X PATCH -H "X-API-Key: $KEY" -H "If-Match: "$ETAG"" -H "Content-Type: application/json" -d '{"text":"ГОТОВО К ВЪЕЗДУ"}' "$BASE/api/v1/zones/$ZONE_ID/text"
Node.js
let res = await fetch(`${BASE}/api/v1/zones/${zoneId}`, { headers:{ "X-API-Key": KEY } });
let etag = (res.headers.get("etag")||"").replaceAll('"','');
let pr = await fetch(`${BASE}/api/v1/zones/${zoneId}/text`, {
method:"PATCH",
headers:{
"X-API-Key": KEY,
"If-Match": `"${etag}"`,
"Content-Type":"application/json"
},
body: JSON.stringify({ text: "ГОТОВО К ВЪЕЗДУ" })
});
Python
import requests, os
BASE="http://your_url"
KEY=os.environ["UZ_API_KEY"]
H={"X-API-Key":KEY}
r=requests.get(f"{BASE}/api/v1/zones/1",headers=H)
etag=r.headers.get("ETag","").strip('"')
resp=requests.patch(f"{BASE}/api/v1/zones/1/text",
headers={**H,"If-Match":f'"{etag}"',"Content-Type":"application/json"},
json={"text":"ГОТОВО К ВЪЕЗДУ"})
print(resp.status_code)
7. Коды ошибок
401 Unauthorized— неверный API-ключ.404 Not Found— зона не найдена.412 Precondition Failed— ETag устарел.422 Unprocessable Content— ошибки валидации.429 Too Many Requests— превышен лимит.5xx— техническая ошибка.
8. Троблшутинг
Изменения не видны→ убедитесь, что ответ200иtextнепустой.412 Precondition Failed→ получите новыйETagи повторитеPUT.401 Unauthorized→ проверьтеX-API-Key.429 Too Many Requests→ снизьте частоту запросов.
9. Безопасность
- Храните API-ключ в секрете.
- Ограничьте доступ к REST-узлу (VPN, доверенные IP).
- Используйте
If-Matchдля защиты от перезаписи данных. - Ведите аудит логов.
10. Поддержка
- Личный кабинет → раздел ИнфоЛедСпектрум / Поддержка.
- Приложите пример запроса/ответа (без ключа).
- Укажите время, метод и путь.
- В экстренных случаях — телефон из договора.
11. Визуальный интерфейс и тестирование API
В админ-панели доступен раздел API Test (Playground).
Здесь можно проверять работу всех эндпоинтов без кода.

12. Управление API-ключами

Создайте ключ, скопируйте его и используйте в заголовке X-API-Key.
Можно временно отключить или удалить ключ.
13. Логи API-запросов

В логах фиксируются:
- время запроса,
- ключ,
- метод и путь,
- статус ответа,
- ETag.
14. Управление зонами

Через интерфейс можно создавать зоны, изменять текст и цвет, видеть дату последнего обновления.
15. Документация внутри панели

Содержит описание методов, лимитов и примеров — быстрый справочник для разработчиков.
16. Валидация параметров
| Поле | Тип / Ограничения | Обязательность |
|---|---|---|
| name | строка, максимум 64 символа | необязательно |
| text | строка, длина 1..255 | обязательно для PATCH /text и при PUT |
| message_color | строка, формат HEX ^#[0-9A-Fa-f]{6}$ |
обязательно для PATCH /color и при PUT |
| layout_w | целое число ≥ 1 | обязательно для PATCH /size и при PUT |
| layout_h | целое число ≥ 1 | обязательно для PATCH /size и при PUT |
| zone_id | целое число ≥ 1 (передаётся в пути URL) | всегда |
| If-Match | строка (валидный ETag) | рекомендуется для PUT и PATCH |
Заметки
- API стабильно возвращает JSON; указывайте
Accept: application/json. - В системе используется
UTC+3