Стиль API и контракт ответов#
Метаданные#
Документ ID:
REG-TECH-005Версия:
0.1.1Ответственный:
ООО "Аросса"Статус:
Готово
1. Базовые правила API#
Базовый префикс всех публичных REST endpoint:
/api/v1.Имена ресурсов:
kebab-case, множественное число (accounts,status-events,device-profiles).Ресурсные операции:
GET/POST/PUT/PATCH/DELETE; командные операции оформляются как отдельный ресурс (/api/v1/device-commands).Нотация полей в JSON:
snake_case.Временные метки:
UTC, форматRFC3339.
2. Канонический маршрутный шаблон#
GET /api/v1/<resource>/list— выборка списка с фильтрацией/сортировкой/пагинацией.GET /api/v1/<resource>/scheme— схема/метаданные ресурса для UI.GET /api/v1/<resource>/{id}— получение одной сущности.POST /api/v1/<resource>— создание сущности или команды.PATCH /api/v1/<resource>/{id}— частичное изменение.DELETE /api/v1/<resource>/{id}— архивирование или удаление по политике ресурса.
3. Фильтрация, сортировка, пагинация#
Для всех
GET /api/v1/.../listобязательны query-параметры:limit,offset.Базовые дополнительные query-параметры:
sort,order,q.Значения
order:asc | desc.Сложные фильтры передаются явными параметрами ресурса (
status,priority,source,tenant_id).Пагинация в ответе возвращает
has_moreи следующийoffset.
4. Контракт успешного ответа#
Списочный ответ:
{
"items": [],
"offset": 0,
"limit": 20,
"total": 0,
"has_more": false,
"meta": {
"request_id": "req-20260304-001",
"timestamp": "2026-03-04T17:50:00Z"
}
}
Ответ по одной сущности:
{
"item": {},
"meta": {
"request_id": "req-20260304-002",
"timestamp": "2026-03-04T17:50:03Z"
}
}
5. Контракт ошибки#
{
"error": {
"code": "validation_error",
"message": "Некорректное значение поля status",
"details": [
{
"field": "status",
"reason": "unsupported_value"
}
]
},
"meta": {
"request_id": "req-20260304-003",
"timestamp": "2026-03-04T17:50:05Z"
}
}
HTTP-статусы:
200/201/204для успешных операций,400/401/403/404/409/422для бизнес-ошибок,500для внутренних сбоев.Поле
codeфиксируется в реестре ошибок и не меняется в минорных версиях.
6. Идемпотентность и совместимость#
Для критичных
POSTопераций (команды, создание задач, платежно-учетные операции) используется заголовокIdempotency-Key.При повторе запроса с тем же ключом сервис возвращает исходный результат без повторного выполнения операции.
Обратно-совместимые изменения в
v1: добавление полей, новых endpoint и новых значений перечислений.Несовместимые изменения: только в новом major-префиксе (
/api/v2).