Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
IVEDAAI_BASE_URLYesOrigin of your IvedaAI server, e.g. https://ivedaai.example.com. No path.
IVEDAAI_PASSWORDYesIvedaAI account password.
IVEDAAI_USERNAMEYesIvedaAI account username.
IVEDAAI_CLIENT_IDNoSent as HTTP Basic auth on the token request, if your deployment requires client credentials.
IVEDAAI_READ_ONLYNotrue serves reads only: non-GET operations are withheld from every tool, and the two write-oriented convenience tools are not registered.false
IVEDAAI_TIMEOUT_MSNoPer-request timeout, including reading the response body. Several IvedaAI endpoints block rather than failing fast when a camera is unreachable, so this matters.30000
IVEDAAI_SWAGGER_PATHNoPath to an alternate OpenAPI 3 document, if your deployment's API differs from the bundled one.bundled
IVEDAAI_CLIENT_SECRETNoSent as HTTP Basic auth on the token request, if your deployment requires client credentials.
IVEDAAI_REDACT_SECRETSNoMasks credential-shaped fields (keys, secrets, passphrases) in responses. false disables it.true
IVEDAAI_ALLOW_INSECURE_TLSNotrue skips TLS certificate verification, for on-prem deployments with self-signed certificates. Traffic stays encrypted; the certificate is not checked. Scoped to this server's requests, not process-wide.false
IVEDAAI_ALLOW_LOSSY_UPDATENotrue disables the lossy-update guard. Intended for the maintainers' CRUD probe; leave it unset.false
IVEDAAI_MAX_RESPONSE_BYTESNoResponse body bytes read before truncating.2000000
IVEDAAI_ALLOW_COLLECTION_DELETENotrue permits the 20 DELETEs that name no record — see Destructive operations.false

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
ivedaai_accountA

IvedaAI API — Account operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/accounts — List accounts query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, userGroupId?:string, userGroupNameContains?:string, authenticationTypes?:string enum:Ldap|Local|OpenID, excludeSupremeAdmin?:boolean

POST /api/accounts — Create account body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields

DELETE /api/accounts/{accountId} — Delete account by id path: accountId*:integer

GET /api/accounts/{accountId} — Find account by id path: accountId*:integer

PATCH /api/accounts/{accountId} — Patch account path: accountId*:integer body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields NOTE: GET /api/accounts/{accountId} returns this field under a different key — userGroupId → userGroup.userGroupId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/accounts/{accountId} — Update account path: accountId*:integer body: AccountRequest — required: email, locale, name, password, userGroupId; ivedaai_get_schema for all fields NOTE: GET /api/accounts/{accountId} returns this field under a different key — userGroupId → userGroup.userGroupId. This endpoint refuses partial bodies outright, so the full object is required regardless.

GET /api/accounts/{accountId}/permissions — List account permissions path: accountId*:integer query: type?:string enum:Camera|FaceCategory|LicensePlateCategory

DELETE /api/accounts/api-keys — Delete API key in batch query: apiKeyIds*:string

GET /api/accounts/api-keys — Find all API keys for the account

POST /api/accounts/api-keys — Create API key for the specific account body: { isActive*:boolean, name?:string }

DELETE /api/accounts/api-keys/{keyId} — Delete API key path: keyId*:string

PATCH /api/accounts/api-keys/{keyId} — Patch API key path: keyId*:string body: { isActive*:boolean, name?:string }

GET /api/accounts/findByName — Find account by name query: accountName*:string

ivedaai_ainvrA

IvedaAI API — Ainvr operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/ainvrs — List Ainvrs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/ainvrs — Create Ainvr body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs — Sync Cluster(s) by id query: ainvrIds*:integer, notify?:boolean

DELETE /api/ainvrs/{ainvrId} — Delete ainvr by id path: ainvrId*:integer

GET /api/ainvrs/{ainvrId} — Find Ainvr by id path: ainvrId*:integer

PATCH /api/ainvrs/{ainvrId} — patch Ainvr path: ainvrId*:integer body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs/{ainvrId} — Update Ainvr path: ainvrId*:integer body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

PUT /api/ainvrs/{ainvrId}/cameras — Sync Ainvr Cameras path: ainvrId*:integer

POST /api/ainvrs/validate — Check Ainvr connection body: AinvrRequest — required: host, name, password, port, scheme, username; ivedaai_get_schema for all fields

ivedaai_alertA

IvedaAI API — Alert operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alerts — Find alerts query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, ainvrIds?:integer, cameraIds?:integer, alertRuleIds?:string, alertTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING, states?:string enum:InProgress|Resolved|Unresolved

PUT /api/alerts — Chage alert state body: { alertIds*:integer[], state*:enum(InProgress|Resolved|Unresolved) }

POST /api/alerts/_search — Search alerts body: AlertQuery — ivedaai_get_schema for all fields

DELETE /api/alerts/{alertId} — Delete alert by id path: alertId*:integer

GET /api/alerts/{alertId} — Get alert details path: alertId*:integer

GET /api/alerts/latest — Find latest alerts query: size?:integer, ainvrIds?:integer, alertRuleIds?:string, cameraIds?:integer, alertTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING, states?:string enum:InProgress|Resolved|Unresolved, start*:string(yyyy-MM-dd HH:mm:ss)

POST /api/alerts/latest — Query latest alerts body: AlertQuery — ivedaai_get_schema for all fields

POST /api/alerts/pairs — Find alerts with rule with camera pars body: AlertRequest — ivedaai_get_schema for all fields

POST /api/alerts/statistics — Get alert statistics query: by*:string enum:camera|day|hour|minute|month|rule|state|type body: AlertQuery — ivedaai_get_schema for all fields

ivedaai_alert_ruleA

IvedaAI API — AlertRule operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alertRules — Find alert rules query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, cameraIds?:integer, name?:string, camName?:string, eventTypes?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|INTRUSION|LPR|OBJECT_COUNTING

POST /api/alertRules — Create alert rule body: AlertRuleRequest — ivedaai_get_schema for all fields

DELETE /api/alertRules/{alertRuleId} — Delete alert rule by id path: alertRuleId*:string

GET /api/alertRules/{alertRuleId} — Find alert rule by id path: alertRuleId*:string

PATCH /api/alertRules/{alertRuleId} — Patch alert rule path: alertRuleId*:string body: AlertRuleRequest — ivedaai_get_schema for all fields NOTE: GET /api/alertRules/{alertRuleId} returns these fields under a different key — cameraIds → condition (JSON string).cameras, cooldownInterval → condition (JSON string).cooldownInterval, enableForever → schedule.forever, hashtags → condition (JSON string).hashtags, name → alertName, roiIds → condition (JSON string).roiIds, typeLogic → condition (JSON string).typeLogic, weekdays → schedule.weekdays. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it. NOTE: "abnormalTypes", "countingRule", "faceCategoryIds", "idrAccess", "lineIds", "lprCategoryIds", "lprTypes", "personTypes", "roiTypes" have no known equivalent in GET /api/alertRules/{alertRuleId}, so they cannot be read back — but this endpoint keeps omitted fields, so they survive an update that leaves them out.

PUT /api/alertRules/{alertRuleId} — Update alert rule path: alertRuleId*:string body: AlertRuleRequest — ivedaai_get_schema for all fields NOTE: GET /api/alertRules/{alertRuleId} returns these fields under a different key — cameraIds → condition (JSON string).cameras, cooldownInterval → condition (JSON string).cooldownInterval, enableForever → schedule.forever, hashtags → condition (JSON string).hashtags, name → alertName, roiIds → condition (JSON string).roiIds, typeLogic → condition (JSON string).typeLogic, weekdays → schedule.weekdays. This endpoint refuses partial bodies outright, so the full object is required regardless. NOTE: "abnormalTypes", "countingRule", "faceCategoryIds", "idrAccess", "lineIds", "lprCategoryIds", "lprTypes", "personTypes", "roiTypes" have no known equivalent in GET /api/alertRules/{alertRuleId}, so they cannot be read back — but this endpoint refuses partial bodies, so an update omitting them fails rather than resetting anything.

GET /api/alertRules/types — Find alert rule types

GET /api/alertTypes — Find alert rule types

ivedaai_alert_triggerA

IvedaAI API — AlertTrigger operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/alert-triggers/metadata — Get alert trigger metadata query: view?:string enum:All|Fr|Id|Lpr|Pc|Post|Vc

POST /api/alertTriggers — Test alert triggers body: { trigger?:AlertTrigger }

ivedaai_analytic_configA

IvedaAI API — AnalyticConfig operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/analytic-configs — Find analytic configs query: cameraId*:integer, engines?:string

POST /api/analytic-configs — Create analytic config body: { cameraId*:integer, config*:JsonObject, engine*:string }

DELETE /api/analytic-configs/{configId} — Delete analytic config path: configId*:integer

GET /api/analytic-configs/{configId} — Find analytic config path: configId*:integer

PATCH /api/analytic-configs/{configId} — Update analytic config path: configId*:integer body: { cameraId*:integer, config*:JsonObject, engine*:string }

ivedaai_audit_trailA

IvedaAI API — AuditTrail operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/auditTrails — Find audit trails query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), accountName?:string, accountIds?:integer, keyword?:string, sourceIp?:string, action?:string enum:ACTIVATE|ADD|BATCH_DELETE|CANCEL|DEACTIVATE|DELETE|DISABLE|DOWNLOAD

POST /api/auditTrails — create audit trails body: AuditTrailRequest — required: action, message, objectType; ivedaai_get_schema for all fields

ivedaai_authenticationA

IvedaAI API — Authentication operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/auth — Get X-Auth-Token body: { password?:string, username?:string }

ivedaai_brandA

IvedaAI API — Brand operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/brands — List brands

ivedaai_cameraA

IvedaAI API — Camera operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/cameras — Find cameras query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrId?:integer, name?:string, nameContains?:string, cameraTypes?:string enum:App|External|Footage|General|Onvif|RecordedAnalytic|VideoSource, isLocal?:boolean, latitude?:number, longitude?:number, isActivate?:boolean, plugins?:string, pluginsAll?:string, floorPlanId?:string, cameraIds?:integer, cameraGroupIds?:string, groupNameContains?:string, fetchCameraGroups?:boolean

POST /api/cameras — Create camera query: ainvrId?:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

DELETE /api/cameras/{cameraId} — Delete camera by id path: cameraId*:integer

GET /api/cameras/{cameraId} — Find camera by id path: cameraId*:integer

PATCH /api/cameras/{cameraId} — Patch cameara path: cameraId*:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields NOTE: GET /api/cameras/{cameraId} returns this field under a different key — nvrId → nvr.nvrId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it. NOTE: "doRecording", "engineConfig" have no known equivalent in GET /api/cameras/{cameraId}, so they cannot be read back — but this endpoint keeps omitted fields, so they survive an update that leaves them out.

PUT /api/cameras/{cameraId} — Update cameara path: cameraId*:integer body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields NOTE: GET /api/cameras/{cameraId} returns this field under a different key — nvrId → nvr.nvrId. This endpoint refuses partial bodies outright, so the full object is required regardless. NOTE: "doRecording", "engineConfig" have no known equivalent in GET /api/cameras/{cameraId}, so they cannot be read back — but this endpoint refuses partial bodies, so an update omitting them fails rather than resetting anything.

POST /api/cameras/{cameraId}/jobs — Operate jobs by camera id path: cameraId*:integer query: activate*:boolean

GET /api/cameras/{cameraId}/rva-heatmap — Get RVA heatmap path: cameraId*:integer query: from?:string, to?:string

PUT /api/cameras/{cameraId}/status — Reset camera status path: cameraId*:integer query: resetHour?:integer

POST /api/cameras/pseudo — Create pseudo camera body: PseudoCameraRequest — required: name; ivedaai_get_schema for all fields

GET /api/cameras/recommend-engines — Get recommend engine for camera query: cameraIds*:integer, allCameras?:boolean, excludeEngines?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine

POST /api/cameras/recommend-engines — Apply recommend engine to camera body: array of CameraAutoConfiguration — required: cameraId, recommendEngines; ivedaai_get_schema for all fields

GET /api/cameras/uri-schemes — List schemes for camera url connection

ivedaai_camera_stateA

IvedaAI API — Camera State operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/camerastatehistorys — Find camera state history query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, cameraId*:integer

ivedaai_camera_groupA

IvedaAI API — CameraGroup operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/camera-groups — Find camera groups query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, ainvrIds?:integer, plugins?:string, numberOfCameras?:boolean, fetchCameras?:boolean, excludeNoCamera?:boolean, excludeNotInGroup?:boolean

POST /api/camera-groups — Create a camera group body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

DELETE /api/camera-groups/{cameraGroupId} — Remove camera group path: cameraGroupId*:string

GET /api/camera-groups/{cameraGroupId} — Get camera group path: cameraGroupId*:string query: ainvrIds?:integer, plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine

PUT /api/camera-groups/{cameraGroupId} — Update camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields NOTE: GET /api/camera-groups/{cameraGroupId} returns this field under a different key — cameraIds → cameras[].cameraId (item read only — the collection read returns null). This endpoint replaces the record, so omitted fields revert to their defaults — send the full object. CAUTION: "cameraGroupIds" has no known equivalent in GET /api/camera-groups/{cameraGroupId}, so its current value cannot be read back. Set it explicitly, or accept that it may be reset.

GET /api/camera-groups/{cameraGroupId}/all — Get camera group for group admin path: cameraGroupId*:string

DELETE /api/camera-groups/{cameraGroupId}/cameras — Remove cameras from camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

PUT /api/camera-groups/{cameraGroupId}/cameras — Add cameras to camera group path: cameraGroupId*:string body: CameraGroupRequest — required: cameraIds, name; ivedaai_get_schema for all fields

ivedaai_cloud_storageA

IvedaAI API — CloudStorage operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/cloud-storages — Get cloud storage

POST /api/cloud-storages — Create cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

PUT /api/cloud-storages — Update cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

POST /api/cloud-storages/buckets — Create bucket on cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

POST /api/cloud-storages/buckets/list — Get bucket list from cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

GET /api/cloud-storages/object — Get cloud storage object query: objectKey*:string

POST /api/cloud-storages/regions — Get region list from cloud storage body: CloudStorage — required: cloudStorageType, lifecycleRules; ivedaai_get_schema for all fields

GET /api/cloud-storages/s3 — Get Qumulo S3 image file query: objectKey*:string

ivedaai_configurationA

IvedaAI API — Configuration operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/configs — Find configurations query: properties*:string

PUT /api/configs/basic — Apply basic system settings body: SystemSetting — ivedaai_get_schema for all fields

GET /api/configs/certificate — Get certificate details

ivedaai_countingA

IvedaAI API — Counting operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/counting/dashboard — Counting dashboard query: start*:string(yyyy-MM-dd HH:mm:ss[Z]), lineSetIds*:integer, types*:string

GET /api/countings — Counting history query: start*:string(yyyy-MM-dd HH:mm:ss[Z]), end*:string(yyyy-MM-dd HH:mm:ss[Z]), lineSetIds*:integer, types*:string, measure*:string enum:Daily|Fifteen_Minutely|Five_Minutely|Hourly|Minutely|Monthly|Ten_Minutely|Thirty_Minutely

ivedaai_detectionA

IvedaAI API — Detection operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/detection/classifiers — List available classifier

POST /api/detection/classifiers/{classifierName} — Do classification path: classifierName*:string file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): threshold?:number

POST /api/detection/clip/image — Use clip encode image file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/clip/text — Use clip encode text body: array of string

POST /api/detection/colors — Detect colors file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/colors.image — Detect and draw colors file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): label?:boolean

POST /api/detection/objects — Detect objects query: plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, profileId?:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/objects.image — Detect and draw objects query: plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, profileId?:integer, label?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/plates — Detect License Plate query: profileId?:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

POST /api/detection/plates.image — Detect and draw License Plate query: profileId?:integer, label?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

ivedaai_dwell_historyA

IvedaAI API — DwellHistory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/dwellHistories — Find dwell histories query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), dwellHistoryId?:integer, localTrackId?:integer, type?:string enum:bicycle|bus|car|motorcycle|person|truck|vehicle, cameraId?:integer, roiId?:integer, dwellTime?:integer, sceneObjectId?:integer

ivedaai_engine_modelA

IvedaAI API — Engine Model operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engineModels — List AI Models query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrId?:integer

POST /api/engineModels — Upload AI Model file: provide as {path, filename?, contentType?} — local file to upload as "file"

DELETE /api/engineModels/{engineModelId} — Delete AI Model by Id path: engineModelId*:integer

POST /api/engineModels/{engineModelId} — Replace AI Model path: engineModelId*:integer file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/engineModels/{engineModelIds} — Enable AI Model path: engineModelIds*:string

GET /api/engineModels/configuration — Get suggested configuration query: ainvrId?:integer

GET /api/engineModels/service/status — Is AI Model Loading

ivedaai_engine_objectA

IvedaAI API — EngineObject operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engine-objects — List EngineObjects query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

ivedaai_engine_profileA

IvedaAI API — EngineProfile operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/engineProfiles — Find profiles query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string, engineModelIds?:integer, isDefault?:boolean, ainvrId?:integer

POST /api/engineProfiles — Create engine profile query: ainvrId?:integer body: EngineProfileRequest — required: name; ivedaai_get_schema for all fields

DELETE /api/engineProfiles/{profileId} — Delete profile by id path: profileId*:integer

GET /api/engineProfiles/{profileId} — Find profile by id path: profileId*:integer

PUT /api/engineProfiles/{profileId} — Update engine profile path: profileId*:integer body: EngineProfileRequest — required: name; ivedaai_get_schema for all fields NOTE: GET /api/engineProfiles/{profileId} returns this field under a different key — engineModelIds → engineModelId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

POST /api/engineProfiles/default/{engineModelIds} — Create default profile path: engineModelIds*:string query: ainvrId?:integer

ivedaai_eventA

IvedaAI API — Event operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/commonEvents — Find events query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), timezone?:string, types*:string enum:CROWD_DETECTION|DWELL|FALL|INTRUSION|OBJECT_LEFT_BEHIND|OBJECT_WRONG_DIRECTION|SCENE_CHANGE, ainvrIds?:integer, cameraIds?:integer, roiIds?:integer, allCameras?:boolean

DELETE /api/commonEvents/{commonEventId} — Delete event by id path: commonEventId*:integer

GET /api/commonEvents/{commonEventId} — Find event by id path: commonEventId*:integer

GET /api/commonEvents/latest — Find latest events query: types*:string enum:CROWD_DETECTION|DWELL|FALL|INTRUSION|OBJECT_LEFT_BEHIND|OBJECT_WRONG_DIRECTION|SCENE_CHANGE, ainvrIds?:integer, cameraIds?:integer, roiIds?:integer, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), size?:integer

ivedaai_external_cameraA

IvedaAI API — ExternalCamera operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/externalCameras/{mappingId} — Get camera analysis meta path: mappingId*:string query: applicationId?:string

POST /api/externalCameras/{mappingId} — put camera image path: mappingId*:string file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): applicationId?:string, height?:integer, latitude?:number, longitude?:number, timestamp?:integer, width?:integer

GET /api/externalCameras/{mappingId}/meta — get camera meta path: mappingId*:string

ivedaai_faceA

IvedaAI API — Face operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/face — Face detection file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): agQualityLevel?:string enum:high|low|medium, qualityLevel?:string enum:high|low|medium, sceneId?:integer, url?:string

DELETE /api/face/{faceKeyId} — Delete faceKey path: faceKeyId*:integer

POST /api/face/search — Face search query: ainvrIds?:integer, allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, descriptor*:string, end*:string(yyyy-MM-dd[ HH:mm:ss[Z]]), footageIds?:integer, limit?:integer, scores?:number, start*:string(yyyy-MM-dd[ HH:mm:ss[Z]])

POST /api/face/similarity — Face similarity body: { descriptor1?:string, descriptor2?:string }

POST /api/face/statistics — Get face statistics body: FaceStatisticRequest — required: by; ivedaai_get_schema for all fields

ivedaai_face_categoryA

IvedaAI API — FaceCategory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/face/categories — List face categories

POST /api/face/categories — Create face category body: { colorCode?:string, name*:string }

DELETE /api/face/categories/{faceCategoryId} — Delete face category path: faceCategoryId*:string

PUT /api/face/categories/{faceCategoryId} — Update face category path: faceCategoryId*:string body: { colorCode?:string, name*:string }

ivedaai_face_matchA

IvedaAI API — FaceMatch operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/face/{faceKeyId}/matches — Get match list path: faceKeyId*:integer

GET /api/face/matches — Search face matches query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), ainvrIds?:integer, cameraIds?:integer, footageIds?:integer, categories?:string, nameContains?:string, scores?:number, age?:string enum:1-19|20-29|30-39|40-49|50-59|60-69|70-100, gender?:string enum:Female|Male|Unknown, emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, hasMask?:boolean, allCameras?:boolean, allFootages?:boolean

DELETE /api/face/matches/{matchId} — Delete face match path: matchId*:integer

GET /api/face/matches/latest — Latest face matches query: ainvrIds?:integer, cameraIds*:integer, categories?:string, nameContains?:string, age?:string enum:1-19|20-29|30-39|40-49|50-59|60-69|70-100, gender?:string enum:Female|Male|Unknown, emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, scores?:number, hasMask?:boolean, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), size?:integer

ivedaai_face_targetA

IvedaAI API — FaceTarget operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/face/keys — Face Target Key Search query: descriptor*:string, limit?:integer, scores?:number

DELETE /api/face/keys/{targetKeyId} — Delete face target key path: targetKeyId*:string

GET /api/face/keys/{targetKeyId} — Find face target key path: targetKeyId*:string

POST /api/face/keys/{targetKeyId} — Update face target key path: targetKeyId*:string query: url?:string, faceKeyId?:integer, descriptor?:string file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/face/targets — List face targets query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, category?:string, nameContains?:string

POST /api/face/targets — Create face target body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

DELETE /api/face/targets/{targetId} — Delete face target path: targetId*:string

GET /api/face/targets/{targetId} — Get face target path: targetId*:string

PATCH /api/face/targets/{targetId} — Patch face target path: targetId*:string body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

PUT /api/face/targets/{targetId} — Update face target path: targetId*:string body: FaceTargetRequest — required: name; ivedaai_get_schema for all fields

GET /api/face/targets/{targetId}/keys — List face target keys path: targetId*:string

POST /api/face/targets/{targetId}/keys — Add face target key path: targetId*:string form fields (pass via body): descriptor?:string, faceKeyId?:integer, url?:string

GET /api/face/targets/export — Export Face target lists query: fileType?:string, category?:string, nameContains?:string

GET /api/face/targets/unqualified — Get unqualified face target list

ivedaai_false_reportA

IvedaAI API — False-report operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/false-report — Check the connection is available

POST /api/false-report — Send false detection report to server body: { description?:string, sceneId?:integer }

ivedaai_filterA

IvedaAI API — Filter operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/filters — List filters query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/filters — Create filter body: FilterRequest — required: name, type; ivedaai_get_schema for all fields

DELETE /api/filters/{filterId} — Delete filter path: filterId*:integer

GET /api/filters/{filterId} — Find filter by id path: filterId*:integer

PUT /api/filters/{filterId} — Update filter path: filterId*:integer body: FilterRequest — required: name, type; ivedaai_get_schema for all fields NOTE: GET /api/filters/{filterId} returns these fields under a different key — cameraIds → expression.cameraIds, query → expression.query, type → expression.type. This endpoint refuses partial bodies outright, so the full object is required regardless.

ivedaai_footageB

IvedaAI API — Footage operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/footages — List footages query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, cameraIds?:integer, latitude?:number, longitude?:number, fileName?:string, fileNameContains?:string, startTime?:string(yyyy-MM-dd HH:mm:ss), endTime?:string(yyyy-MM-dd HH:mm:ss), statuses?:string enum:Complete|Failed|Waiting

DELETE /api/footages/{footageId} — Delete footage by id path: footageId*:integer

GET /api/footages/{footageId} — Find footage by id path: footageId*:integer

PUT /api/footages/{footageId} — Cancel footage by id path: footageId*:integer

ivedaai_gatewayA

IvedaAI API — Gateway operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/gateways — List Gateway query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, name?:string, macAddress?:string

POST /api/gateways — Create Gateway body: GatewayReq — required: macAddress, name, type; ivedaai_get_schema for all fields

PUT /api/gateways/{gatewayId} — Update Gateway path: gatewayId*:string body: GatewayReq — required: macAddress, name, type; ivedaai_get_schema for all fields

GET /api/gateways/{gatewayId}/cameras — List Camera in Gateway path: gatewayId*:string

ivedaai_hashtagA

IvedaAI API — Hashtag operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/hashtags — Find hashtag query: prefix?:string

POST /api/hashtags — Create hashtag body: string

PUT /api/hashtags — Setup live hashtag body: { cameraId?:integer, hashtags?:string[] }

DELETE /api/hashtags/{keyword} — Delete hashtag path: keyword*:string

ivedaai_identity_recognitionA

IvedaAI API — IdentityRecognition operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/identity-recognition — Identity recognition history query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), ainvrIds?:integer, cameraIds?:integer, categories?:string, nameContains?:string, dlnContains?:string, granted?:boolean

GET /api/identity-recognition/config — Identity recognition config

GET /api/identity-recognition/latest — Latest identity recognition query: ainvrIds?:integer, cameraIds?:integer, categories?:string, nameContains?:string, dlnContains?:string, granted?:boolean, allCameras?:boolean, size?:integer

ivedaai_imageB

IvedaAI API — Image operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/image/rotate — Image Rotation form fields (pass via body): usrFileName?:string

ivedaai_indoor_mapA

IvedaAI API — IndoorMap operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/indoor-maps — List Indoor Maps query: sorted?:boolean, unsorted?:boolean, withPermission*:boolean

POST /api/indoor-maps — Create Indoor Map body: IndoorMapReq — required: location; ivedaai_get_schema for all fields

DELETE /api/indoor-maps/{indoorMapId} — Delete Indoor Map by ID path: indoorMapId*:string

GET /api/indoor-maps/{indoorMapId} — Find Indoor Map by ID path: indoorMapId*:string

PUT /api/indoor-maps/{indoorMapId} — Update Indoor Map path: indoorMapId*:string body: IndoorMapReq — required: location; ivedaai_get_schema for all fields

GET /api/indoor-maps/{indoorMapId}/floor-plans — Find Floor Plans for Indoor Map path: indoorMapId*:string query: sorted?:boolean, unsorted?:boolean

POST /api/indoor-maps/{indoorMapId}/floor-plans — Create Floor Plans for IndoorMap path: indoorMapId*:string body: array of FloorPlanReq — required: filePath, name; ivedaai_get_schema for all fields

DELETE /api/indoor-maps/floor-plans/{floorPlanId} — Delete Floor Plan by ID path: floorPlanId*:string

GET /api/indoor-maps/floor-plans/{floorPlanId} — Find Floor Plan by ID path: floorPlanId*:string

PUT /api/indoor-maps/floor-plans/{floorPlanId} — Update Floor Plan path: floorPlanId*:string body: FloorPlanReq — required: filePath, name; ivedaai_get_schema for all fields

ivedaai_jobA

IvedaAI API — Job operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/jobs — Get jobs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, types*:string enum:RetrieveJob|StreamJob|UploadJob, cameraIds?:integer, footageIds?:integer, statuses?:string enum:Canceled|Completed|Delete|DuplicateExec|Failed|FailedRetry|Running|Suspended

POST /api/jobs — Create job query: type*:string enum:RetrieveJob|StreamJob|UploadJob, cameraId?:integer, channel?:string, startTime?:string, endTime?:string, description?:string, usrFileName?:string, brightness?:string, engineProfileId?:integer, plugins?:string enum:AgeGenderClassifier|CrossCameraTrackingEngine|CrowdDetectionEngine|DwellEngine|ExtraAlertTrigger|FaceGdpr|FaceRecognitionEngine|HumanAttributeEngine, faceFeatures?:string, url?:string, gdprThreshold?:number, nvrId?:string, channelName?:string, latitude?:number, longitude?:number, doTranscode?:boolean file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/jobs — Operate all jobs query: action*:string enum:CANCEL|SUSPEND

POST /api/jobs/{cameraId} — Cancel job by camera path: cameraId*:integer query: doWait?:boolean

DELETE /api/jobs/{jobId} — Delete job by id path: jobId*:integer

GET /api/jobs/{jobId} — Get job by id path: jobId*:integer

PUT /api/jobs/{jobId} — Stop job by id path: jobId*:integer

POST /api/jobs/retrieve — Create retrieve job query: channel*:string, channelName*:string, description?:string, doTranscode?:boolean, endTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z]), engineProfileId*:integer, faceFeatures?:string[], gdprThreshold?:number, latitude?:number, longitude?:number, nvrId*:string, plugins?:string[], startTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z])

POST /api/jobs/stream — Create stream job query: cameraId*:integer, description?:string

POST /api/jobs/upload — Create upload job file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): cameraId*:integer, description?:string, doTranscode?:boolean, engineProfileId*:integer, faceFeatures?:string[], gdprThreshold?:number, latitude?:number, longitude?:number, plugins?:string[], startTime*:string(yyyy-MM-dd[T][hh:mm:ss][Z]), url?:string, usrFileName*:string

ivedaai_licenseA

IvedaAI API — License operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/hardwareInfo — Get hardware info

GET /api/licenses — Get License query: ainvrIds?:integer

POST /api/licenses — Activate license query: activationType?:string enum:MANUAL|ONLINE file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/licenses/ainvr — Get AINVR License query: ainvrIds*:integer

GET /api/licenses/ainvr/date — Get license date

GET /api/licenses/lpr — Get LPR License query: ainvrId*:integer

ivedaai_license_plateA

IvedaAI API — LicensePlate operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/plates — List license plates query: ainvrIds?:integer, offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, categories?:string, type?:string, color?:string, characters?:string, make?:string, model?:string, country?:string, state?:string, vehicleType?:string, disabled?:boolean, allCameras?:boolean, allFootages?:boolean

DELETE /api/lpr/plates/{licensePlateId} — Delete license plate path: licensePlateId*:integer

PUT /api/lpr/plates/{licensePlateId} — Update license plate path: licensePlateId*:integer body: { characters*:string }

GET /api/lpr/plates/latest — Latest license plates query: ainvrIds?:integer, cameraIds*:integer, categories?:string, type?:string, color?:string, characters?:string, make?:string, model?:string, country?:string, state?:string, vehicleType?:string, disabled?:boolean, size?:integer, allCameras?:boolean, start*:string(yyyy-MM-dd HH:mm:ss)

ivedaai_license_plate_categoryA

IvedaAI API — LicensePlateCategory operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/categories — List license plate categories

POST /api/lpr/categories — Create license plate category body: { colorCode?:string, name*:string }

DELETE /api/lpr/categories/{categoryId} — Delete license plate category path: categoryId*:string

POST /api/lpr/categories/{categoryId} — Import license plate target path: categoryId*:string query: columnSeperator?:string file: provide as {path, filename?, contentType?} — local file to upload as "file"

PUT /api/lpr/categories/{categoryId} — Update license plate category path: categoryId*:string body: { colorCode?:string, name*:string }

ivedaai_license_plate_targetA

IvedaAI API — LicensePlateTarget operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lpr/targets — List license plate targets query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, category?:string, plateNumber?:string, vehicleOwner?:string, address?:string, description?:string

POST /api/lpr/targets — Create license plate target body: LicensePlateTargetRequest — required: category, plateNumber; ivedaai_get_schema for all fields

DELETE /api/lpr/targets/{targetId} — Delete license plate target path: targetId*:string

GET /api/lpr/targets/{targetId} — Find license plate target path: targetId*:string

PUT /api/lpr/targets/{targetId} — Update license plate target path: targetId*:string body: LicensePlateTargetRequest — required: category, plateNumber; ivedaai_get_schema for all fields

GET /api/lpr/targets/export — Export license plate lists query: fileType?:string, category?:string, plateNumber?:string, vehicleOwner?:string, address?:string, description?:string

ivedaai_line_setA

IvedaAI API — LineSet operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/lineSets — Find lineSets query: ainvrIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, cameraIds?:integer, nameContains?:string, types?:string enum:Dwell|ObjectCounting|ObjectDirection, inCountingEnabled?:boolean, outCountingEnabled?:boolean, excludeUnused?:boolean, lineSetIds?:integer

POST /api/lineSets — Create lineSet body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields

DELETE /api/lineSets/{lineSetId} — Delete lineSet path: lineSetId*:integer

GET /api/lineSets/{lineSetId} — Get lineSet path: lineSetId*:integer

PATCH /api/lineSets/{lineSetId} — Patch lineSet path: lineSetId*:integer body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields NOTE: GET /api/lineSets/{lineSetId} returns this field under a different key — cameraId → camera.cameraId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/lineSets/{lineSetId} — Update lineSet path: lineSetId*:integer body: LineSetRequest — required: cameraId, name; ivedaai_get_schema for all fields NOTE: GET /api/lineSets/{lineSetId} returns this field under a different key — cameraId → camera.cameraId. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

ivedaai_make_modelB

IvedaAI API — MakeModel operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/make-models — Find make model list

ivedaai_mediaB

IvedaAI API — Media operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/media/stream — Get stream info query: cameraId?:integer, doEstimate?:boolean body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

ivedaai_moduleA

IvedaAI API — Module operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

DELETE /api/modules — Uninstall module query: moduleId*:string

GET /api/modules — Find modules query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, name?:string, vendor?:string, version?:string

POST /api/modules — Install module file: provide as {path, filename?, contentType?} — local file to upload as "module"

PUT /api/modules — Reload module path: moduleId*:string

GET /api/modules/{moduleId} — Get module path: moduleId*:string

ivedaai_multi_factor_authenticationA

IvedaAI API — MultiFactorAuthentication operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/mfa/email — verify mfa query: access_token*:string, otp_code*:string

ivedaai_nvrA

IvedaAI API — Nvr operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/nvrs — List Nvrs query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/nvrs — Create Nvr body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields

DELETE /api/nvrs/{nvrId} — Delete Nvr by id path: nvrId*:string

GET /api/nvrs/{nvrId} — Find Nvr by id path: nvrId*:string

PUT /api/nvrs/{nvrId} — Update Nvr path: nvrId*:string body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields NOTE: GET /api/nvrs/{nvrId} returns this field under a different key — brandId → brand.brandId. This endpoint refuses partial bodies outright, so the full object is required regardless.

GET /api/nvrs/{nvrId}/cameras — List cameras by nvr id path: nvrId*:string query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

GET /api/nvrs/{nvrId}/channels — Find Nvr channels path: nvrId*:string

GET /api/nvrs/{nvrId}/preview-channel/{channelIndex} — Preview NVR channel snapshot path: nvrId*:string, channelIndex*:string query: protocol?:string enum:Both|TCP|UDP

GET /api/nvrs/{nvrType}/alerts — get the list of alert from NVR path: nvrType*:string enum:avigilon|digifort|ocularis query: ip*:string, port*:string, username*:string, password*:string, cameraIds?:integer

POST /api/nvrs/connection — Check Nvr connection body: NvrRequest — required: brandId, ip, name, port; ivedaai_get_schema for all fields

ivedaai_oauthA

IvedaAI API — OAuth operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/oauth2/token — Get token query: code?:string, code_verifier?:string, grant_type*:string enum:authorization_code|client_credentials|password|refresh_token, password?:string, refresh_token?:string, scope?:string, username?:string

ivedaai_object_typeA

IvedaAI API — ObjectType operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/objectTypes — List all object types contain synonyms query: ainvrId?:integer

GET /api/types — List object types query: ainvrIds?:integer

GET /api/types/{category} — List object types by category path: category*:string enum:animal|car|human|object|others|transportation query: ainvrIds?:integer

ivedaai_onvifA

IvedaAI API — Onvif operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/onvif/cameras — Discover onvif cameras

POST /api/onvif/rtsps — List onvif camera rtsp body: CameraRequest — required: cameraType; ivedaai_get_schema for all fields

ivedaai_openidA

IvedaAI API — Openid operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/openid-providers — Create OpenID provider body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

PUT /api/openid-providers/{openidProviderId} — Update OpenID provider path: openidProviderId*:string body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

POST /api/openid-providers/connection — Test connect with OpenID provider body: OpenidProviderReq — required: clientCredentialScope, clientId, clientSecret, groupClaim, issuer, redirectUri; ivedaai_get_schema for all fields

ivedaai_passwordA

IvedaAI API — Password operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/passwords — Get available token query: token*:string

POST /api/passwords — Forget password by email body: { email*:string }

POST /api/passwords/{keys} — Reset password by key path: keys*:string body: { password*:string, username*:string }

GET /api/passwords/{keys}/expired — Check if the password reset key has expired path: keys*:string

ivedaai_pluginA

IvedaAI API — Plugin operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/plugins — List Plugins query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/plugins — Import Plugin file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): filePath?:string, password*:string, username*:string

DELETE /api/plugins/{pluginId} — Delete Plugin by Id path: pluginId*:integer

PATCH /api/plugins/{pluginId} — Update Plugin metadata by Id path: pluginId*:integer body: VoPlugin — ivedaai_get_schema for all fields

ivedaai_resourceA

IvedaAI API — Resource operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/resources — List resources query: direction?:string enum:asc|desc

GET /api/resources/costs — Get resource cost of plugin

POST /api/resources/estimation — Get estimation resource usage for recommend engines body: array of CameraAutoConfiguration — required: cameraId, recommendEngines; ivedaai_get_schema for all fields

GET /api/resources/usage — Get resource information query: ainvrIds?:integer

ivedaai_roiA

IvedaAI API — Roi operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/rois — Find rois query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, ainvrIds?:integer, nameContains?:string, cameraIds?:integer, types?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|HUMAN_ATTRIBUTE|INTRUSION|LPR, excludeUnused?:boolean, roiIds?:integer, roiParameters?:string

POST /api/rois — Create roi body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields

DELETE /api/rois/{roiId} — Delete roi by id path: roiId*:integer

GET /api/rois/{roiId} — Find roi by id path: roiId*:integer

PATCH /api/rois/{roiId} — Patch roi path: roiId*:integer body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields NOTE: GET /api/rois/{roiId} returns these fields under a different key — cameraId → camera.cameraId, condition → types, conditionLogic → logical, excludeRoiContour → excludedRegion, isEnabled → enabled, name → eventName, parameter → parameters, roiContour → region[].contour, type → eventType. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

PUT /api/rois/{roiId} — Update roi path: roiId*:integer body: RoiRequest — required: cameraId, condition, name, parameter, roiContour; ivedaai_get_schema for all fields NOTE: GET /api/rois/{roiId} returns these fields under a different key — cameraId → camera.cameraId, condition → types, conditionLogic → logical, excludeRoiContour → excludedRegion, isEnabled → enabled, name → eventName, parameter → parameters, roiContour → region[].contour, type → eventType. This endpoint has been confirmed to leave omitted fields alone, so this is for reading the value, not a warning about losing it.

ivedaai_sceneA

IvedaAI API — Scene operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/scenes — Search scenes query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, query?:string, hashtags?:string, roiPoints?:number, allCameras?:boolean, allFootages?:boolean

POST /api/scenes — Create scene file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): cameraId*:integer, datetime?:string(yyyy-MM-dd'T'HH:mm:ss), forceSave?:boolean, frameIndex?:integer, hashtags?:string[], latitude?:number, longitude?:number, profileId?:integer, requiredEngines?:string, sceneObjects[0].confidence?:number, sceneObjects[0].h*:integer, sceneObjects[0].metadata.colors?:string[], sceneObjects[0].metadata.face.age?:integer, sceneObjects[0].metadata.face.ageGroup?:string enum:-|1-19|20-29|30-39|40-49|50-59|60-69|70-100, sceneObjects[0].metadata.face.categoryName?:string, sceneObjects[0].metadata.face.categoryUuid?:string, sceneObjects[0].metadata.face.confidence?:number, sceneObjects[0].metadata.face.emotion?:string enum:Angry|Happy|Neutral|Sad|Surprised|Unknown, sceneObjects[0].metadata.face.features*:number[], sceneObjects[0].metadata.face.gender?:string enum:Female|Male|Unknown, sceneObjects[0].metadata.face.matchConfidence?:number, sceneObjects[0].metadata.face.qualified?:boolean, sceneObjects[0].metadata.face.rect.height?:integer, sceneObjects[0].metadata.face.rect.width?:integer, sceneObjects[0].metadata.face.rect.x?:integer, sceneObjects[0].metadata.face.rect.y?:integer, sceneObjects[0].metadata.face.targetName?:string, sceneObjects[0].metadata.face.targetUuid?:string, sceneObjects[0].metadata.licensePlate.categoryId?:integer, sceneObjects[0].metadata.licensePlate.categoryName?:string, sceneObjects[0].metadata.licensePlate.categoryUuid?:string, sceneObjects[0].metadata.licensePlate.confidence?:number, sceneObjects[0].metadata.licensePlate.country?:string, sceneObjects[0].metadata.licensePlate.disabled?:boolean, sceneObjects[0].metadata.licensePlate.number?:string, sceneObjects[0].metadata.licensePlate.rect.height?:integer, sceneObjects[0].metadata.licensePlate.rect.width?:integer, sceneObjects[0].metadata.licensePlate.rect.x?:integer, sceneObjects[0].metadata.licensePlate.rect.y?:integer, sceneObjects[0].metadata.licensePlate.state?:string, sceneObjects[0].metadata.licensePlate.vehicleOwner?:string, sceneObjects[0].metadata.licensePlate.vehicleType?:string, sceneObjects[0].metadata.makeModel.make?:string, sceneObjects[0].metadata.makeModel.model?:string, sceneObjects[0].metadata.makeModel.possibility?:number, sceneObjects[0].metadata.mask.confidence?:number, sceneObjects[0].metadata.mask.hasMask?:boolean, sceneObjects[0].metadata.person.hasHelmet?:boolean, sceneObjects[0].metadata.person.hasVest?:boolean, sceneObjects[0].metadata.person.helmetConfidence?:number, sceneObjects[0].metadata.person.vestConfidence?:number, sceneObjects[0].metadata.speed?:string enum:AboveAverage|Average|BelowAverage, sceneObjects[0].objectType*:string, sceneObjects[0].w*:integer, sceneObjects[0].x*:integer, sceneObjects[0].y*:integer

GET /api/scenes/{sceneId} — Get scene details path: sceneId*:integer

PATCH /api/scenes/{sceneId} — update scene path: sceneId*:integer body: SceneUpdateRequest — ivedaai_get_schema for all fields

GET /api/scenes/{sceneId}/{type} — Get original image path: sceneId*:integer, type*:string enum:Alert|CommonEvent|VideoSearch query: eventType?:string enum:CAMERA_ABNORMAL|CROWD_DETECTION|DWELL|FACE_RECOGNITION|FALL|HUMAN_ATTRIBUTE|INTRUSION|LPR

GET /api/scenes/{sceneId}/objects — Get detail objects path: sceneId*:integer query: commonEventId?:integer, query?:string

GET /api/scenes/{sceneId}/playback — Get scene's playback path: sceneId*:integer query: duration?:integer, start?:string(yyyy-MM-dd HH:mm:ss)

POST /api/scenes/image — Search scenes by image file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/scenes/metadata — Get example of create scene metadata

GET /api/scenes/objects/count — Get total number of objects

ivedaai_scene_objectA

IvedaAI API — SceneObject operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/scene-objects/{id} — Find scene object by id path: id*:integer query: needDescriptor?:boolean

GET /api/scene-objects/search — Search similar scene object query: offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), unpaged?:boolean, end*:string(yyyy-MM-dd HH:mm:ss), cameraIds?:integer, footageIds?:integer, allCameras?:boolean, allFootages?:boolean, queryObjIds*:integer, removedObjIds?:integer, similarity?:number

POST /api/scene-objects/search — Search similar scene object query: allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, descriptors*:string, end*:string(yyyy-MM-dd HH:mm:ss), footageIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, removedTargetDescriptors?:string, similarity?:number, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), trackType*:string enum:Person|Vehicle, unpaged?:boolean

POST /api/scene-objects/search/image — Search similar scene object by image file: provide as {path, filename?, contentType?} — local file to upload as "file" form fields (pass via body): allCameras?:boolean, allFootages?:boolean, cameraIds?:integer, end*:string(yyyy-MM-dd HH:mm:ss), footageIds?:integer, offset?:integer, pageNumber?:integer, pageSize?:integer, paged?:boolean, similarity?:number, sort.sorted?:boolean, sort.unsorted?:boolean, start*:string(yyyy-MM-dd HH:mm:ss), trackType*:string enum:Person|Vehicle, unpaged?:boolean

ivedaai_soundA

IvedaAI API — Sound operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/sounds — List sounds query: isDeleted?:boolean, types?:string enum:alert|all|intrusion

POST /api/sounds — Upload sound query: type*:string enum:alert|all|intrusion file: provide as {path, filename?, contentType?} — local file to upload as "file"

GET /api/sounds/{soundId} — Find sound by id path: soundId*:integer

GET /api/sounds/findByType — Find sounds by event type query: type*:string enum:alert|all

ivedaai_sseA

IvedaAI API — Sse operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/system/events — Server sent event query: filter?:string enum:CameraAbnormal|ChannelEstablished|Cluster|ClusterAbnormal|ClusterSync|EngineModelFailed|EngineModelLoaded|EngineModelLoading, streamCameraIds?:integer

ivedaai_statisticA

IvedaAI API — Statistic operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/statistic/heatmap — Generate heatmap query: start*:string(yyyy-MM-dd HH:mm:ss), end*:string(yyyy-MM-dd HH:mm:ss), cameraId?:integer, footageId?:integer, query?:string, fineness?:integer, threshold?:number, forceRefresh?:boolean

ivedaai_streamingA

IvedaAI API — Streaming operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/streaming/{cameraId}/{type}.jpg — Get camera streaming image path: cameraId*:integer, type*:string enum:live

GET /api/streaming/{cameraId}/{type}.mjpeg — Get camera streaming motion jpeg path: cameraId*:integer, type*:string enum:live

ivedaai_timeA

IvedaAI API — Time operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/time — Find time configurations

ivedaai_trackingA

IvedaAI API — Tracking operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

PUT /api/cameras/{cameraId}/tracking — Set AI tracking target path: cameraId*:integer query: targetId*:integer

ivedaai_user_groupA

IvedaAI API — UserGroup operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

GET /api/user-groups — List user group query: nameContains?:string, offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean

POST /api/user-groups — Create user group body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields

DELETE /api/user-groups/{userGroupId} — Delete user group path: userGroupId*:string

PATCH /api/user-groups/{userGroupId} — Patch user group path: userGroupId*:string body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields CAUTION: this endpoint nulls "externalId" if the body omits it, and still returns 200. Send the full object, including the current value of that field. Omitting it is refused by this tool; pass it as null to clear it deliberately. NOTE: "accountIds" is not on the record at all, but a second endpoint returns it — read accountIds from GET /api/user-groups/{userGroupId}/accounts at content[].accountId. Read it there if you need the current value.

PUT /api/user-groups/{userGroupId} — Update user group path: userGroupId*:string body: UserGroupRequest — required: externalId, name; ivedaai_get_schema for all fields NOTE: "accountIds" is not on the record at all, but a second endpoint returns it — read accountIds from GET /api/user-groups/{userGroupId}/accounts at content[].accountId. Read it there if you need the current value.

DELETE /api/user-groups/{userGroupId}/accounts — Remove user from group path: userGroupId*:string body: array of integer

GET /api/user-groups/{userGroupId}/accounts — List user in group path: userGroupId*:string query: offset?:integer, page?:any, pageNumber?:integer, pageSize?:integer, paged?:boolean, size?:any, sort?:any, sort.sorted?:boolean, sort.unsorted?:boolean, unpaged?:boolean, nameContains?:string

POST /api/user-groups/{userGroupId}/accounts — Add users to group path: userGroupId*:string body: array of integer

PUT /api/user-groups/{userGroupId}/accounts — Set users in group path: userGroupId*:string body: array of integer

GET /api/user-groups/{userGroupId}/permissions — List user group permissions path: userGroupId*:string query: type?:string enum:Camera|FaceCategory|LicensePlateCategory

POST /api/user-groups/{userGroupId}/permissions — Grant user group permissions path: userGroupId*:string body: array of Permission — required: actions, id, type; ivedaai_get_schema for all fields

ivedaai_utilityB

IvedaAI API — Utility operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.

POST /api/utility — Diagnose System query: method*:string, target*:string, parameters?:string

ivedaai_get_schemaA

Looks up the full JSON schema for a named IvedaAI API definition (e.g. "CameraRequest"). Use this when a tool's body schema summary is truncated or you need the exact shape of a nested field. Call ivedaai_get_schema with no name to list all available definition names.

ivedaai_alert_integrationA

Configures and tests AlertRule.trigger — the mechanism that routes IvedaAI alerts to external systems (generic HTTP webhooks, named VMS/PSIM platforms, email, Immix, mobile push). The raw API schema here is deeply nested and has undocumented gotchas (see below), confirmed by live testing rather than the spec alone.

Actions: list_types — no API call; returns this same type/testability reference as JSON. test — builds the correct trigger payload for type+config and calls POST /api/alertTriggers to live-test it, returning a plain-language verdict (success / unsupported / invalid_config / connection_failed). Only 'request', 'mobile', and the 13 VMS types are testable — 'mail'/'immix' always return 'unsupported' (confirmed against a real server). How long a VMS connection failure takes to report is unpredictable — repeated tests against the same unreachable address ranged from under a second to ~24s in testing, not tied to any particular vendor — the default 60000ms timeout is meant to cover the slow case regardless of which VMS type you're testing; override via timeoutMs if you need even more headroom. apply — attaches the built trigger to an existing alert rule (alertRuleId, its UUID). Does not require having called 'test' first, but doing so is recommended. It reads the rule first and re-sends everything the read exposes alongside the new trigger: name (returned as alertName), alertType, description, isEnabled, plus weekdays/enableForever from schedule and roiIds/cameraIds/hashtags/typeLogic/cooldownInterval parsed out of the condition JSON string. It refuses to write if that read fails or lacks the required fields. This is precaution rather than repair — PATCH /api/alertRules/{alertRuleId} was live-tested and merges, leaving omitted fields alone, so applying a trigger does not wipe the rule. (PUT on the same path is different: it rejects a partial body with a 500, so send the full object there.)

Config shape by category: webhook (request): { method, url, headers?, params?, authorization?, httpBody? } — authorization/httpBody default to {auth:"NONE"}/{type:"NONE"} automatically; the server requires them present even when unused, despite the spec marking them optional. vms (13 named platforms): { ip, port, username?, password?, protocol?, severity?, cameraIds?, ... } — see ivedaai_get_schema("AlertTriggerNvr") for the full field list. mail/immix: { emails: [{mailIds?, subject?, content?}], smtpServer, port } mobile: { enableCriticalAlertNotice? } (all fields optional)

Type reference: WEBHOOK: request — testable — Generic outbound HTTP webhook — POST/GET/etc. to any URL. MOBILE: mobile — testable — Push notification to the IvedaAI mobile app. VMS: milestone — testable — Milestone VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. genetec — testable — Genetec VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. nx — testable — Nx VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. dw — testable — Dw VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. lux — testable — Lux VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. salient — testable — Salient VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. axis — testable — Axis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. ocularis — testable — Ocularis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. digifort — testable — Digifort VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. avigilon — testable — Avigilon VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. hanwha — testable — Hanwha VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. amag — testable — Amag VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. idis — testable — Idis VMS/PSIM integration. Live-testable, but how long a failed connection takes to report back is unpredictable — repeated tests against the same unreachable address varied from under a second to ~24 seconds in testing, seemingly based on real-time network conditions (immediate rejection vs. a silent connect timeout) rather than being a fixed property of any one vendor. Use a generous timeout regardless of which VMS type you're testing. MAIL: mail — NOT testable via 'test' — SMTP email notification. Not live-testable via POST /api/alertTriggers (confirmed: returns "Unsupported check connection alert trigger type"). immix — NOT testable via 'test' — Immix alarm-monitoring-station notification. Shares mail's underlying type; not live-testable either (confirmed).

ivedaai_add_cameraA

Adds one or more cameras (e.g. from a list of IPs or RTSP stream URLs) and starts their connection. The raw CameraRequest schema has undocumented gotchas confirmed by live testing:

  • A schema-valid minimal body (name, streamUrl, engineProfileId, roiContour) still throws a bare server-side error unless several other optional-looking fields are also filled — this tool fills them with sane defaults automatically (resolution 1920x1080, frameRate 25, empty schedule/plugins, etc.).

  • Creating the record is NOT enough for the camera to actually connect or be fully visible in the product UI: a separate activation step (allocating a processing resource and starting the stream) is required, which this tool performs automatically unless activate: false is passed.

  • A creation error can still partially create the camera server-side before failing. This tool checks for that by exact name after any error and reports created_despite_error with the real cameraId instead of a false failed, so you don't end up with a confusing orphaned duplicate.

Only name plus either streamUrl or ip are required per camera — everything else is optional and defaulted (engineProfileId defaults to the first engine profile found; roiContour defaults to a full-frame rectangle). Providing the exact streamUrl is much more reliable than ip alone: this tool can only guess a generic RTSP root path from ip/account/password, which often doesn't match a specific camera's actual manufacturer-specific stream path.

IMPORTANT: activation starting successfully does NOT mean the stream is actually connected — that can take anywhere from under a second to failing after 90+ seconds with no error at all (observed live), which usually indicates a network-reachability problem between the IvedaAI server and the camera, not a problem with this tool. Check back later with the returned jobId via the ivedaai_job tool (GET /api/jobs/{jobId}), or re-check the camera via ivedaai_camera (GET /api/cameras/{cameraId}) for a populated status field, to confirm it actually connected.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/WillORepO/ivedaAI-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server