ivedaai-mcp-server
The ivedaai-mcp-server provides a natural-language MCP interface to the IvedaAI video analytics API, exposing 63 tools and direct access to 316 underlying operations.
Camera & streaming: add, list, update, delete, group, and configure cameras (RTSP, ONVIF, external, pseudo, footage-based); automatic activation and error recovery; live snapshots/MJPEG; ONVIF discovery; camera state history; AI tracking targets.
Video analytics & detection: object, face, license plate, and color detection; AI classification; scene search by time, camera, hashtags, or image similarity; similar object re-identification; heatmaps; dwell history; line-cross counting and statistics.
Alerts & rules: create, update, and delete alert rules (intrusion, crowd, face/LPR, dwell, fall, etc.); search, filter, and update alert states; alert statistics; integrations via webhooks, email, mobile push, and 13 VMS/PSIM platforms (Milestone, Genetec, Avigilon, etc.).
Face & LPR: manage watchlists, categories, and targets; upload face images; search face matches; compute face similarity; export/import license plate targets and lists.
Footage, scenes & jobs: upload and manage footage; search scenes; create and control retrieval, streaming, and upload jobs with engine profiles.
ROIs & line sets: define detection zones and manage counting lines/direction.
NVR / Ainvr / gateways: add and manage NVRs; browse channels and previews; manage clusters and sync cameras; manage gateways.
AI engines & profiles: upload, enable, and delete AI models; manage engine profiles; get and apply recommended engine configurations.
Users & access: manage accounts, user groups, permissions, API keys, OpenID, MFA, password resets; read-only operation and secret redaction.
System administration: system configuration, cloud storage, audit trails, licenses, modules/plugins, diagnostics, hardware info, SSE subscriptions, indoor maps/floor plans.
Direct API access: call any raw API operation via the
operationparameter and inspect request/response schemas withivedaai_get_schema.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ivedaai-mcp-server list the cameras that are currently offline"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
. . . SIGNAL // LOCKED . . .
[CAM] [ALERT] [RULE]
\ | /
\ | /
[FACE] ----\------ [ MCP ] ------/---- [LPR]
\ | /
\ | /
[SEARCH] | [ANALYSIS]
|
██╗██╗ ██╗███████╗██████╗ █████╗ █████╗ ██╗ ███╗ ███╗ ██████╗██████╗
██║██║ ██║██╔════╝██╔══██╗██╔══██╗██╔══██╗██║ ████╗ ████║██╔════╝██╔══██╗
██║██║ ██║█████╗ ██║ ██║███████║███████║██║ ██╔████╔██║██║ ██████╔╝
██║╚██╗ ██╔╝██╔══╝ ██║ ██║██╔══██║██╔══██║██║ ██║╚██╔╝██║██║ ██╔═══╝
██║ ╚████╔╝ ███████╗██████╔╝██║ ██║██║ ██║██║ ██║ ╚═╝ ██║╚██████╗██║
╚═╝ ╚═══╝ ╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝
| |
| VIDEO INTELLIGENCE <-> AI TOOLS |
+-------------------+-------------------+
|
316 API OPERATIONS
63 MCP TOOLS
:: DECODE // OBSERVE // ACT ::ivedaai-mcp-server
An MCP server for the IvedaAI video analytics API. Point a client that launches local MCP processes, such as Claude Desktop or Claude Code, at your IvedaAI deployment and drive it in natural language: search footage, manage cameras and alert rules, run analysis jobs, work with face and licence-plate watchlists.
Transports: the default command uses stdio. An authenticated HTTP preview
is available through node dist/http.js /protected/path/customer.json: read-only by default, with optional
administrator-enabled actions and separate user consent to changes. It uses a fixed
customer server and isolated user accounts. Customers can use their existing IvedaAI login;
no separate sign-in vendor is required. An HTTPS reverse proxy and approved AI-client callback
configuration are needed; real browser-client/TLS validation is still outstanding.
See browser connection requirements for deployment options.
Pilot teammates can use the team quickstart; operators should start
with the per-user pilot route.
IVEDAAI_BASE_URL is the upstream application's address, not an MCP connection URL.
The bundled API defines 316 operations. By default, 295 are exposed through 63 resource tools, plus three helper tools; 21 collection-wide DELETEs are withheld. See why.
Quickstart
The npm package was not yet available when checked on 2026-09-04. Until the initial release is
published, clone this repository, run npm ci and npm run build, then configure the client with command: "node"
and args: ["/absolute/path/to/ivedaAI-mcp-server/dist/index.js"].
After publication, this configuration lets npx fetch the package:
{
"mcpServers": {
"ivedaai": {
"command": "npx",
"args": ["-y", "ivedaai-mcp-server"],
"env": {
"IVEDAAI_BASE_URL": "https://ivedaai.example.com",
"IVEDAAI_USERNAME": "your-username",
"IVEDAAI_PASSWORD": "your-password"
}
}
}
}Where that file lives:
client | path |
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Claude Code |
|
Restart the client, and ask it something like "list the cameras that are currently offline".
Try it without a client:
IVEDAAI_BASE_URL=https://ivedaai.example.com \
IVEDAAI_USERNAME=you IVEDAAI_PASSWORD=secret \
npx -y ivedaai-mcp-serverIt speaks JSON-RPC over stdin/stdout and logs a startup line to stderr. --help prints the
configuration reference; --version prints the version.
Related MCP server: Discovery Engine MCP Server
Read-only first
If you are evaluating this, or connecting it to anything you would not want to write to, start here:
"env": { "IVEDAAI_READ_ONLY": "true", "IVEDAAI_BASE_URL": "…", "IVEDAAI_USERNAME": "…", "IVEDAAI_PASSWORD": "…" }Mutating operations are withheld from the tool list. Reads include GETs and the three verified query-only POSTs for alert statistics, search, and latest alerts. The two write-oriented convenience tools are withheld too.
Configuration
Only the first three are required.
Variable | Default | Description |
| — | Origin of your IvedaAI server, e.g. |
| — | IvedaAI account username. |
| — | IvedaAI account password. |
|
|
|
|
|
|
|
| Masks credential-shaped fields (keys, secrets, passphrases) in responses. |
|
|
|
|
| Per-request timeout, including reading the response body. Several IvedaAI endpoints block rather than failing fast when a camera is unreachable, so this matters. |
|
| Response body bytes read before truncating. Sized for what a model client can receive, not for what the API can send — bisected against a real client, 38 KB reached the model and 57 KB did not. Larger responses come back flagged |
|
| Image responses are handed to the client as viewable images. |
|
| Separate budget for images, because a client charges for an image by its dimensions rather than the length of its base64 — holding them to the response cap above would truncate every one for no saving. An image larger than this is described rather than attached, since a partly-read image is a corrupt file, not a smaller one. |
| — | Directory containing files the server may upload. Local-file uploads are disabled until this is set. Symlinks that escape the directory are refused. |
|
| Emergency compatibility escape hatch. |
|
| Maximum bytes read from an approved upload file. Reads are descriptor-bound and stop at the cap even if the file grows after validation. |
| — | Sent as HTTP Basic auth on the token request, if your deployment requires client credentials. |
|
|
|
| bundled | Path to an alternate OpenAPI 3 document, if your deployment's API differs from the bundled one. |
Copy .env.example if you prefer a file. The server does not load .env automatically:
export its values into the environment or run a local build with node --env-file=.env dist/index.js.
Authentication
OAuth2 password grant against POST {base}/ainvr/api/oauth2/token. The server logs in on first use,
caches the access token, and refreshes it as it nears expiry. Note that the token endpoint is rate
limited: a client that starts a fresh process per request will hit it.
Destructive operations
Twenty-one of this API's DELETEs take no id in the path — DELETE /api/cameras versus
DELETE /api/cameras/{cameraId}. The only subject would come from an optional request body, and what
the API does when that body is omitted is not specified anywhere. One character of difference, and
the mistake cannot be undone.
They are withheld by default: absent from the tool descriptions and the operation enum, and
refused with an explanation naming the single-record alternative if a client sends one anyway. Set
IVEDAAI_ALLOW_COLLECTION_DELETE=true to permit them. IVEDAAI_READ_ONLY=true overrides that.
See SECURITY.md for the rest of the defaults, and for what leaves your deployment.
Using it
Every tool takes an operation and the arguments that operation needs:
{ "operation": "GET /api/cameras", "query": { "size": 20, "nameContains": "lobby" } }Usage guide — calling conventions and worked workflows: onboarding cameras, alert rules, analysis jobs, face and licence-plate watchlists.
Tool reference — every tool, operation and parameter.
Design and behaviour — why one tool per resource type, what the server does about partial updates the API silently discards, and the response format.
If a model needs the exact shape of a request body, ivedaai_get_schema returns it on demand rather
than every tool description carrying it.
Requirements
Node 22.16.0+ in the 22.x line, or Node 24+, and an IvedaAI 10.0 deployment. Use the latest patched Node 22 or 24 LTS
release in production; Node 20 is no longer supported. The bundled API document is 10.0; point
IVEDAAI_SWAGGER_PATH at your own if you run something else.
Earlier Node 22 versions and Node 23 are unsupported because request deadlines depend on the
AbortSignal.any() timeout fix included in Node 22.16.0.
CI covers the minimum supported Node 22 version and Node 24.
Production operation
For stdio, each MCP client starts its own process and communicates over stdin/stdout; that entry point has no HTTP listener. The separate HTTP preview uses existing IvedaAI login behind an operator-managed HTTPS proxy. Neither mode provisions a database, container or separate health endpoint. Successful MCP initialization and a small authorized read provide integration checks.
Use HTTPS with a valid certificate, a dedicated IvedaAI account with only the required application permissions, and read-only mode for monitoring. The server adds read-only, collection-delete, lossy-update, and upload restrictions; record-level authorization remains IvedaAI's responsibility. Treat client configuration as a secret and approve an upload directory only when uploads are needed. After release, pin the approved npm version in your client configuration for reproducible installs.
Outbound redirects are refused. Configure the final deployment origin directly. Incomplete or malformed JSON is withheld when redaction is enabled, since its credential fields cannot be reliably masked. Reduce the page size or narrow the filter; SSE reads retain only complete, redacted events. Cancellation and client disconnect stop further API work, but cannot undo an application write already received. Inspect uncertain writes before retrying.
Contributing
See CONTRIBUTING.md. Upgrading the API document?
npm run diff:spec -- --against <new-spec.json> reports what changed and, more usefully, whether
anything this repo records now points at an operation that no longer exists.
License
MIT — see LICENSE.
Available Tools
66 toolsivedaai_accountIvedaAI: AccountADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_add_cameraIvedaAI: add cameras from an IP or RTSP URLA
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: falseis 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_errorwith the real cameraId instead of a falsefailed, 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.
Inputs: cameras (required), ainvrId, activate.
ivedaai_ainvrIvedaAI: AinvrADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_alertIvedaAI: AlertADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_alert_integrationIvedaAI: configure and test alert-routing integrationsA
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).
Inputs: action (required), type, config, timeoutMs, +1 more.
ivedaai_alert_ruleIvedaAI: AlertRuleADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_alert_triggerIvedaAI: AlertTriggerA
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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_analytic_configIvedaAI: AnalyticConfigADestructive
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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_audit_trailIvedaAI: AuditTrailA
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_authenticationIvedaAI: 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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_brandIvedaAI: BrandARead-only
IvedaAI API — Brand operations. Response JSON: "status" is the HTTP status code; "truncated"/"timedOut" flag a cut-off response.
GET /api/brands — List brands
Inputs: operation (required), body, file, path, +1 more.
ivedaai_cameraIvedaAI: CameraADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_camera_groupIvedaAI: CameraGroupADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_camera_stateIvedaAI: Camera StateARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_cloud_storageIvedaAI: CloudStorageA
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_configurationIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_countingIvedaAI: CountingARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_detectionIvedaAI: 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"
Inputs: operation (required), body, file, path, +1 more.
ivedaai_dwell_historyIvedaAI: DwellHistoryARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_engine_modelIvedaAI: Engine ModelADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_engine_objectIvedaAI: EngineObjectARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_engine_profileIvedaAI: EngineProfileADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_eventIvedaAI: EventADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_external_cameraIvedaAI: ExternalCameraA
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_faceIvedaAI: FaceADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_face_categoryIvedaAI: FaceCategoryADestructive
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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_face_matchIvedaAI: FaceMatchADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_face_targetIvedaAI: FaceTargetADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_false_reportIvedaAI: 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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_filterIvedaAI: FilterADestructive
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.
Inputs: operation (required), body, file, path, +1 more.
ivedaai_footageIvedaAI: FootageBDestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_gatewayIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_get_schemaIvedaAI: look up a request/response schema definitionARead-only
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.
Inputs: name.
ivedaai_hashtagIvedaAI: HashtagADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_identity_recognitionIvedaAI: IdentityRecognitionARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_imageIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_indoor_mapIvedaAI: IndoorMapADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_jobIvedaAI: JobADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_licenseIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_license_plateIvedaAI: LicensePlateADestructive
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)
Inputs: operation (required), body, file, path, +1 more.
ivedaai_license_plate_categoryIvedaAI: LicensePlateCategoryADestructive
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 }
Inputs: operation (required), body, file, path, +1 more.
ivedaai_license_plate_targetIvedaAI: LicensePlateTargetADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_line_setIvedaAI: LineSetADestructive
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.
Inputs: operation (required), body, file, path, +1 more.
ivedaai_make_modelIvedaAI: MakeModelBRead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_mediaIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_moduleIvedaAI: ModuleADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_multi_factor_authenticationIvedaAI: MultiFactorAuthenticationA
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_nvrIvedaAI: NvrADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_oauthIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_object_typeIvedaAI: ObjectTypeARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_onvifIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_openidIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_passwordIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_pluginIvedaAI: PluginADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_resourceIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_roiIvedaAI: RoiADestructive
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.
Inputs: operation (required), body, file, path, +1 more.
ivedaai_sceneIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_scene_objectIvedaAI: SceneObjectA
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_soundIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_sseIvedaAI: SseARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_statisticIvedaAI: StatisticARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_streamingIvedaAI: StreamingARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_timeIvedaAI: TimeARead-only
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_trackingIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_user_groupIvedaAI: UserGroupADestructive
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
Inputs: operation (required), body, file, path, +1 more.
ivedaai_utilityIvedaAI: 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
Inputs: operation (required), body, file, path, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 66 tools
With 66 tools spanning many overlapping domains, several tools have unclear boundaries—e.g., ivedaai_camera vs ivedaai_add_camera, ivedaai_alert_rule vs ivedaai_alert_trigger vs ivedaai_alert_integration, and ivedaai_alert vs ivedaai_event. Despite detailed descriptions, the volume and conceptual overlap make misselection likely.
All tools share the 'ivedaai_' prefix, but the remainder mixes singular and plural nouns (account, accounts), acronyms (ainvr), and verbs (get_schema, add_camera), with no consistent verb_noun pattern. While snake_case is used for multi-word names, the convention is resource-name based rather than action-based.
66 tools is far beyond the typical well-scoped range and falls into the extreme mismatch category (50+). Even for a comprehensive API, this is an enormous surface that burdens discovery and selection.
The surface is remarkably comprehensive for the IvedaAI domain, covering CRUD for cameras, accounts, groups, alerts, rules, faces, license plates, scenes, jobs, NVRs, and more. Minor gaps exist (e.g., no delete for cloud storage, read-only histories for camera state), but core workflows are well covered.
Maintenance
Related MCP Connectors
MCP server for AI access to Swagger by SmartBear.
MCP server for Google Veo AI video generation
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
A paid remote MCP for AI SDK data query MCP, built to return verdicts, receipts, usage logs, and aud
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that helps developers integrate Vonage API capabilities by providing AI-assisted access to Vonage documentation through specialized search functionality.-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables natural language interaction with Google's Discovery Engine API, allowing users to search, recommend, and manage data through conversational interfaces.-
- AlicenseNot gradedqualityBmaintenanceMCP server for storing, managing, and analyzing IETF vCon (Virtual Conversation) data with AI assistants.52 npm4MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for fal model discovery, execution, pricing, and local media processing, enabling AI model workflows via natural language.98 npmMIT