Перейти к содержимому

Методы Integration API

Проверяет валидность ключа интеграции.

POST /v1/integration-key/validate
ЗаголовокТипОбязательныйОписание
X-Integration-Keystringдаключ интеграции

Пример:

Окно терминала
curl -X POST \
"https://cloud.faceter.cam/integration-api/v1/integration-key/validate" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY"

Response 200:

{ "isValid": true }
ПолеТипОписание
isValidbooleanпризнак валидности ключа

GET /v1/cameras/{cameraId}
ПараметрТипОписание
cameraIduuidидентификатор камеры

Пример:

Окно терминала
curl -X GET \
"https://cloud.faceter.cam/integration-api/v1/cameras/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY"

Response 200:

{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deviceId": "1fa85f64-5717-4562-b3fc-2c963f66afb1",
"title": "Entrance Camera",
"previewUrl": "https://example.com/preview.jpg",
"archiveApiToken": { "signature": "string", "exp": 1712745600 },
"archiveApiUrl": "https://archive.example.com",
"archiveDays": 30,
"liveRtspUrl": "rtsp://example.com/live",
"liveHlsUrl": "https://example.com/live.m3u8",
"isOnline": true,
"lastOnlineDate": "2026-04-10T09:00:00Z",
"cameraModel": "Model X",
"platform": "Embedded",
"serialNumber": "ABC123",
"firmwareVersion": "1.0.0",
"applicationVersion": "2.1.0",
"isOwner": true,
"isFullAccess": true,
"isArchiveGranted": true,
"isAudioGranted": true,
"tempAccessExpiryDate": "2026-04-20T09:00:00Z",
"location": {
"id": "loc-1",
"title": "Main Office",
"room": { "id": "room-1", "title": "Hall" }
}
}
ПолеТипОписание
iduuidидентификатор камеры
deviceIduuidидентификатор устройства
titlestringназвание камеры
previewUrlstringссылка на превью
archiveApiTokenobjectтокен для Archive API
archiveApiToken.signaturestringподпись токена
archiveApiToken.expint64срок действия в Unix time
archiveApiUrlstringбазовый URL Archive API
archiveDaysintegerглубина архива в днях
liveRtspUrlstringRTSP URL live-потока
liveHlsUrlstringHLS URL live-потока
isOnlinebooleanкамера онлайн
lastOnlineDatedatetimeдата последнего онлайна
cameraModelstringмодель камеры
platformstringEmbedded / ThirdParty / Mobile
serialNumberstringсерийный номер
firmwareVersionstringверсия прошивки
applicationVersionstringверсия приложения
isOwnerbooleanпользователь — владелец
isFullAccessbooleanполный доступ
isArchiveGrantedbooleanдоступ к архиву
isAudioGrantedbooleanдоступ к аудио
tempAccessExpiryDatedatetimeсрок временного доступа
location.idstringидентификатор локации
location.titlestringназвание локации
location.room.idstringидентификатор комнаты
location.room.titlestringназвание комнаты

Ошибки: 404 Not Found


GET /v1/cameras

Пример:

Окно терминала
curl -X GET \
"https://cloud.faceter.cam/integration-api/v1/cameras" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY"

Response 200 — массив объектов, каждый имеет ту же структуру, что и ответ метода GET /v1/cameras/{cameraId}.


GET /v1/cameras/{cameraId}/events

Path-параметры:

ПараметрТипОписание
cameraIduuidидентификатор камеры

Query-параметры:

ПараметрТипОписание
eventTypesarray[string]список типов событий
startDatedatetimeдата начала периода
endDatedatetimeдата окончания периода
mergeIntervalintegerинтервал объединения событий
limitintegerмаксимальное количество записей
sortOrderstringNone / Asc / Desc

Типы событий: Motion, Human, Vehicle, LineCrossing, Intrusion, PeopleCounting, LicensePlate, Pet, PersonalMobilityVehicle, Face, Custom

Пример:

Окно терминала
curl -G \
"https://cloud.faceter.cam/integration-api/v1/cameras/3fa85f64-5717-4562-b3fc-2c963f66afa6/events" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY" \
--data-urlencode "startDate=2026-04-01T00:00:00Z" \
--data-urlencode "endDate=2026-04-10T00:00:00Z" \
--data-urlencode "eventTypes=Motion" \
--data-urlencode "sortOrder=Desc" \
--data-urlencode "limit=100"

Response 200:

{
"items": [
{
"id": "7fa85f64-5717-4562-b3fc-2c963f66afa1",
"cameraId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "Motion",
"startTime": "2026-04-10T08:00:00Z",
"endTime": "2026-04-10T08:01:00Z",
"previewUrl": "https://example.com/event-preview.jpg",
"mergedEventsCount": 2,
"attributes": [{ "confidence": "0.98" }]
}
],
"hasMore": false
}
ПолеТипОписание
itemsarrayсписок событий
hasMorebooleanесть ли ещё данные
iduuidидентификатор события
typestringтип события
startTimedatetimeвремя начала
endTimedatetimeвремя окончания
previewUrlstringссылка на превью
mergedEventsCountintegerколичество объединённых событий
attributesarrayдополнительные атрибуты

Ошибки: 400 Bad Request, 404 Not Found


POST /v1/cameras/{cameraId}/events
Content-Type: multipart/form-data

Тело запроса передаётся как multipart/form-data. Текстовые значения отправляются отдельными полями формы, а snapshot и objectSnapshot — как бинарные файлы.

Поля формы:

ПолеТипОписание
eventIduuidидентификатор события
startDatedatetimeдата начала события в UTC в формате ISO 8601
endDatedatetime, nullableдата окончания события в UTC в формате ISO 8601
eventTypestringтип события
instantbooleanпризнак мгновенного события
grid.rowsintegerколичество строк сетки
grid.colsintegerколичество колонок сетки
grid.cellsint64, повторяемое полезначения ячеек сетки; каждое значение передаётся отдельным полем grid.cells
attributes[key]stringдополнительный атрибут, где key — имя атрибута
snapshotbinary file, nullableснимок события размером не более 5 МБ
objectSnapshotbinary file, nullableснимок объекта размером не более 5 МБ

Если grid передаётся, значения grid.rows и grid.cols должны быть больше нуля, а grid.cells не должен быть пустым. Ключи и значения в attributes не должны быть пустыми.

Пример:

Окно терминала
curl -X POST \
"https://cloud.faceter.cam/integration-api/v1/cameras/<cameraId>/events" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY" \
--form 'eventId=7fa85f64-5717-4562-b3fc-2c963f66afa1' \
--form 'startDate=2026-04-10T08:00:00Z' \
--form 'endDate=2026-04-10T08:01:00Z' \
--form 'eventType=Motion' \
--form 'instant=false' \
--form 'grid.rows=3' \
--form 'grid.cols=3' \
--form 'grid.cells=1' \
--form 'grid.cells=0' \
--form 'grid.cells=0' \
--form 'grid.cells=1' \
--form 'grid.cells=1' \
--form 'grid.cells=0' \
--form 'grid.cells=0' \
--form 'grid.cells=0' \
--form 'grid.cells=1' \
--form 'attributes[confidence]=0.98' \
--form 'snapshot=@./event.jpg;type=image/jpeg' \
--form 'objectSnapshot=@./object.jpg;type=image/jpeg'

Заголовок Content-Type вручную устанавливать не нужно — curl сам добавит в него необходимый boundary.

Response 204 — событие принято, тело ответа отсутствует.

Ошибки:

КодПричина
400 Bad Requestнекорректные поля формы, пустой файл, файл более 5 МБ или некорректные параметры события
404 Not Foundкамера не найдена или недоступна интеграции
429 Too Many Requestsпревышено ограничение в 10 запросов создания событий в секунду; время до повторного запроса — в заголовке Retry-After

GET /v1/cameras/{cameraId}/recordings

Response 200:

[{ "startDate": "2026-04-10T08:00:00Z", "durationSeconds": 300 }]
ПолеТипОписание
startDatedatetimeначало записи
durationSecondsintegerдлительность в секундах

Ошибки: 404 Not Found


7. Получение фрагмента архива (синхронный)

Заголовок раздела «7. Получение фрагмента архива (синхронный)»
GET /v1/cameras/{cameraId}/archive/clip

Query-параметры:

ПараметрТипОписание
startDatedatetimeначало фрагмента
durationint64длительность в секундах

Пример:

Окно терминала
curl -G \
"https://cloud.faceter.cam/integration-api/v1/cameras/3fa85f64-5717-4562-b3fc-2c963f66afa6/archive/clip" \
-H "X-Integration-Key: YOUR_INTEGRATION_KEY" \
--data-urlencode "startDate=2026-04-10T08:00:00Z" \
--data-urlencode "duration=60" \
-o clip.mp4

Response 200 — бинарный файл видео.

Ошибки: 400 Bad Request, 404 Not Found


POST /v1/cameras/{cameraId}/archive/exports

Request Body:

{
"startDate": "2026-04-10T08:00:00Z",
"durationSeconds": 120,
"audioEnabled": true,
"callbackUrl": "https://example.com/webhook"
}
ПолеТипОписание
startDatedatetimeначало экспортируемого интервала
durationSecondsint32длительность в секундах
audioEnabledbooleanвключать аудио
callbackUrlstringURL для callback после завершения

Response 202:

{ "exportId": "9fa85f64-5717-4562-b3fc-2c963f66afa2", "status": "Queued" }

Ошибки: 400 Bad Request, 404 Not Found, 500 Server Error


GET /v1/cameras/{cameraId}/archive/exports/{exportId}

Response 200:

{
"exportId": "9fa85f64-5717-4562-b3fc-2c963f66afa2",
"status": "Completed",
"videoUrl": "https://example.com/archive.mp4",
"previewUrl": "https://example.com/archive-preview.jpg",
"errorMessage": null,
"createdAtUtc": "2026-04-10T08:00:00Z",
"completedAtUtc": "2026-04-10T08:02:00Z"
}
ПолеТипОписание
exportIduuidидентификатор экспорта
statusstringстатус экспорта
videoUrlstringссылка на готовое видео
previewUrlstringссылка на превью
errorMessagestringтекст ошибки (если есть)
createdAtUtcdatetimeдата создания
completedAtUtcdatetimeдата завершения

Ошибки: 403 Forbidden, 404 Not Found, 500 Server Error


POST /v1/cameras/{cameraId}/exports/audio

Request Body:

{
"startDate": "2026-04-10T08:00:00Z",
"durationSeconds": 120,
"callbackUrl": "https://example.com/webhook"
}

Response 202:

{ "exportId": "afa85f64-5717-4562-b3fc-2c963f66afa3", "status": "Queued" }

Ошибки: 400 Bad Request, 404 Not Found, 500 Server Error


GET /v1/cameras/{cameraId}/exports/audio/{exportId}

Response 200:

{
"exportId": "afa85f64-5717-4562-b3fc-2c963f66afa3",
"status": "Completed",
"audioUrl": "https://example.com/audio.mp3",
"errorMessage": null,
"createdAtUtc": "2026-04-10T08:00:00Z",
"completedAtUtc": "2026-04-10T08:02:00Z"
}
ПолеТипОписание
exportIduuidидентификатор экспорта
statusstringстатус экспорта
audioUrlstringссылка на аудиофайл
errorMessagestringтекст ошибки (если есть)
createdAtUtcdatetimeдата создания
completedAtUtcdatetimeдата завершения

Ошибки: 403 Forbidden, 404 Not Found, 500 Server Error


SortOrder: None · Asc · Desc

CameraPlatform: Embedded · ThirdParty · Mobile

ClientsEventType: Motion · Human · Vehicle · LineCrossing · Intrusion · PeopleCounting · LicensePlate · Pet · PersonalMobilityVehicle · Face · Custom