6.4.2026 - API Updates
New Endpoints
The following new endpoints have been added.
Vehicle Surveillance: Visit Tracking
A new endpoint has been added for retrieving Vehicle Surveillance Package (VSP) visits. A visit is a session created by pairing LPR entry and exit events for the same vehicle within a single site location, and each record includes the plate, location, entry and exit event details, and the visit duration in seconds.
curl --request GET \
--url 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/vspVisits?plate=ABC123&pageSize=100' \
--header 'accept: application/json'using RestSharp;
var options = new RestClientOptions("https://api.cxxx.eagleeyenetworks.com/api/v3.0/vspVisits?plate=ABC123&pageSize=100");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
import requests
url = "https://api.cxxx.eagleeyenetworks.com/api/v3.0/vspVisits"
querystring = {"plate": "ABC123", "pageSize": 100}
headers = {"accept": "application/json"}
response = requests.get(url, params=querystring, headers=headers)
print(response.text)const url = 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/vspVisits?plate=ABC123&pageSize=100';
const options = {method: 'GET', headers: {accept: 'application/json'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));The endpoint supports filtering by plate (exact), plate__fuzzy (up to 2-character variance), locationId__in, and eventId (to look up the visit that contains a specific LPR event).
Updated Endpoints
The following Eagle Eye API resources have been updated.
Media: Video Summary Export
A new export type, videoSummary, has been added to the /exports endpoint. Video summary exports condense a longer time range into a short highlight reel of the most relevant events, with a configurable maximum duration (30 – 600 seconds, defaults to 300) and an explicit list of event types to prioritize.
curl --request POST \
--url https://api.cxxx.eagleeyenetworks.com/api/v3.0/exports \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '
{
"deviceId": "10058b7a",
"type": "videoSummary",
"period": {
"startTimestamp": "2026-06-03T08:00:00.000Z",
"endTimestamp": "2026-06-03T17:00:00.000Z"
},
"maxDurationSeconds": 300,
"eventTypes": [
"een.motionDetectionEvent.v1",
"een.personDetectionEvent.v1"
],
"osd": {
"timeZone": "America/Chicago"
},
"info": {
"name": "daily_motion_summary"
}
}
'using RestSharp;
var options = new RestClientOptions("https://api.cxxx.eagleeyenetworks.com/api/v3.0/exports");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddJsonBody("{\"deviceId\":\"10058b7a\",\"type\":\"videoSummary\",\"period\":{\"startTimestamp\":\"2026-06-03T08:00:00.000Z\",\"endTimestamp\":\"2026-06-03T17:00:00.000Z\"},\"maxDurationSeconds\":300,\"eventTypes\":[\"een.motionDetectionEvent.v1\",\"een.personDetectionEvent.v1\"],\"osd\":{\"timeZone\":\"America/Chicago\"},\"info\":{\"name\":\"daily_motion_summary\"}}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
import requests
url = "https://api.cxxx.eagleeyenetworks.com/api/v3.0/exports"
payload = {
"deviceId": "10058b7a",
"type": "videoSummary",
"period": {
"startTimestamp": "2026-06-03T08:00:00.000Z",
"endTimestamp": "2026-06-03T17:00:00.000Z"
},
"maxDurationSeconds": 300,
"eventTypes": [
"een.motionDetectionEvent.v1",
"een.personDetectionEvent.v1"
],
"osd": {"timeZone": "America/Chicago"},
"info": {"name": "daily_motion_summary"}
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const url = 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/exports';
const options = {
method: 'POST',
headers: {accept: 'application/json', 'content-type': 'application/json'},
body: JSON.stringify({
deviceId: '10058b7a',
type: 'videoSummary',
period: {
startTimestamp: '2026-06-03T08:00:00.000Z',
endTimestamp: '2026-06-03T17:00:00.000Z'
},
maxDurationSeconds: 300,
eventTypes: [
'een.motionDetectionEvent.v1',
'een.personDetectionEvent.v1'
],
osd: {timeZone: 'America/Chicago'},
info: {name: 'daily_motion_summary'}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Automations: New Rule Type — LPR Overstay
A new Alert Condition Rule type, lprRuleOverstay, has been added for vehicle overstay detection. The rule fires when a vehicle that has entered a site has not exited by a daily clock time (e.g. "22:00"). Four filter modes are supported via the configuration.filterType discriminator:
plate— overstay for a specific license platevehicleList— overstay for any plate in a named vehicle listanyPlateExcept— overstay for any plate not in a named vehicle listallPlates— overstay for any vehicle observed entering the site
POST - /eventAlertConditionRules
curl --request POST \
--url https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '
{
"type": "lprRuleOverstay",
"name": "Overstay alert at 22:00",
"priority": 10,
"enabled": true,
"eventFilter": {
"eventTypes": ["een.lprPlateReadEvent.v1"],
"resourceFilter": {
"actors": [{"id": "100b913c", "type": "camera"}]
}
},
"configuration": {
"filterType": "allPlates",
"alertTime": "22:00"
}
}
'using RestSharp;
var options = new RestClientOptions("https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddJsonBody("{\"type\":\"lprRuleOverstay\",\"name\":\"Overstay alert at 22:00\",\"priority\":10,\"enabled\":true,\"eventFilter\":{\"eventTypes\":[\"een.lprPlateReadEvent.v1\"],\"resourceFilter\":{\"actors\":[{\"id\":\"100b913c\",\"type\":\"camera\"}]}},\"configuration\":{\"filterType\":\"allPlates\",\"alertTime\":\"22:00\"}}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
import requests
url = "https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules"
payload = {
"type": "lprRuleOverstay",
"name": "Overstay alert at 22:00",
"priority": 10,
"enabled": True,
"eventFilter": {
"eventTypes": ["een.lprPlateReadEvent.v1"],
"resourceFilter": {
"actors": [{"id": "100b913c", "type": "camera"}]
}
},
"configuration": {
"filterType": "allPlates",
"alertTime": "22:00"
}
}
headers = {
"accept": "application/json",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const url = 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules';
const options = {
method: 'POST',
headers: {accept: 'application/json', 'content-type': 'application/json'},
body: JSON.stringify({
type: 'lprRuleOverstay',
name: 'Overstay alert at 22:00',
priority: 10,
enabled: true,
eventFilter: {
eventTypes: ['een.lprPlateReadEvent.v1'],
resourceFilter: {actors: [{id: '100b913c', type: 'camera'}]}
},
configuration: {filterType: 'allPlates', alertTime: '22:00'}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Automations: Configurable Alert Images
Alert Condition Rules now accept an imageOptions object that controls which images are attached when the rule fires. Up to six images can be requested per alert: one primary alert image (with optional embedded overlay and an optional cropped variant) plus up to four context images captured at specified second offsets from the event timestamp.
POST/PATCH - /eventAlertConditionRules
curl --request POST \
--url https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '
{
"enabled": true,
"name": "Alert with extra images",
"priority": 5,
"eventFilter": {
"eventTypes": ["een.personDetectionEvent.v1"],
"resourceFilter": {"actors": ["camera:100d4c41"]}
},
"imageOptions": {
"alertImage": {
"embeddedOverlay": true,
"includeCropUrl": true
},
"contextImages": [
{"offsetSeconds": -5, "imageType": "full"},
{"offsetSeconds": 5, "imageType": "full"}
]
}
}
'When imageOptions is omitted, the previous single-image behavior is preserved.
Automations: State Source Filtering
The /eventAlertConditionRules listing endpoint accepts two new query parameters:
includeStateSource— include the rule's state source in the response.stateSource__in— filter rules to those backed by one of the given state sources.
curl --request GET \
--url 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/eventAlertConditionRules?includeStateSource=true' \
--header 'accept: application/json'Devices: Bridge Relationships and Connection Status
Camera and Bridge responses now include richer status data:
- Cameras returned by
/camerasand/cameras/{id}include a newbridgeSummaryfield that names the bridge currently managing the camera, plus acloudConnectionStatusfield with counts of how that camera's resources are split acrossconnected/disconnectedstates. - Bridges returned by
/bridgesand/bridges/{id}include the samecloudConnectionStatusfield.
curl --request GET \
--url 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/cameras?include=bridgeSummary,cloudConnectionStatus' \
--header 'accept: application/json'Grouping: Resource Status v2 Counts
Layouts and Locations now expose a richer status summary via resourceStatusV2Counts, which separates cloud connection status (connected, disconnected) from edge-reported device status (operational, disabled, unreachable, error, unknown, initializing) for both cameras and bridges. The existing resourceStatusCounts field continues to work for backward compatibility.
curl --request GET \
--url 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/layouts?include=resourceStatusV2Counts' \
--header 'accept: application/json'import requests
url = "https://api.cxxx.eagleeyenetworks.com/api/v3.0/layouts"
querystring = {"include": "resourceStatusV2Counts"}
headers = {"accept": "application/json"}
response = requests.get(url, params=querystring, headers=headers)
print(response.text)const url = 'https://api.cxxx.eagleeyenetworks.com/api/v3.0/layouts?include=resourceStatusV2Counts';
const options = {method: 'GET', headers: {accept: 'application/json'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.cxxx.eagleeyenetworks.com/api/v3.0/layouts?include=resourceStatusV2Counts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
OAuth Clients: User-Level vs Application-Level
OAuth client creation under /applications/{applicationId}/oauthClients now distinguishes between two client types:
- User-level clients issue tokens that inherit the permissions of the user that created them. Permissions cannot be specified explicitly.
- Application-level clients require an explicit
permissionsobject on creation. The permissions schema has been expanded to a fine-grained bitmap that controls editing of accounts, layouts, users, roles, webhooks, automations, and per-camera settings independently from billing-affecting settings.
curl --request POST \
--url https://api.cxxx.eagleeyenetworks.com/api/v3.0/applications/{applicationId}/oauthClients \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '
{
"type": "application",
"name": "Integration Service",
"permissions": {
"editAccounts": true,
"createLayouts": true,
"editNoBillingDeviceSettings": true,
"layoutAdministrator": false
}
}
'Audit Logs: Structured Detail Records
Audit log entries now return their per-event details as a structured GenericDetails object containing a header and a rows array of LabelValuePair entries. Each row exposes the API field name as id, the UI-facing label as label, and the current value as value — allowing integrations to render audit records without hand-mapping field names to display labels.
Video Search: Result Grouping by Camera or Entity
Video search responses now support grouping results by either the source camera (CameraGroupInfo) or by the detected person entity (EntityGroupInfo). Each group includes the group id and name alongside its result list.
New Event Types
The following event types have been added.
Access Activation Event
Generated when an access activation occurs at an access control point (door, gate, reader, etc.). The event is device-centric — the access point itself is the actor — and uses separate data schemas for the user-access decision and the credential that was presented, so user activity and credential usage can be tracked independently.
een.accessActivationEvent.v1
Visitor Registration Event
Generated when a visitor to a site or building is registered. The event payload may include person detection, object classification, full-frame and cropped imagery, display overlays, and a new een.personVisitorDetails.v1 data schema describing the visitor.
een.visitorRegistrationEvent.v1
Purge Event
Generated when a recorded-data purge operation is initiated due to insufficient disk space. A purge represents the start of the operation; individual deletions are reported via Data Purged Events (below).
een.purgeEvent.v1
Data Purged Event
Generated for each portion of recorded data that is deleted during a purge operation. The event's startTimestamp and endTimestamp represent the time range of the recorded data that was deleted, and the new een.purgedDataDetails.v1 data schema reports the number of bytes freed.
een.dataPurgedEvent.v1
{
"id": "Y1C2207ab2ALl5k4Lhpa",
"startTimestamp": "2026-06-03T02:14:00.000+00:00",
"endTimestamp": "2026-06-03T02:34:00.000+00:00",
"span": true,
"accountId": "00001106",
"actorId": "100d4c41",
"actorAccountId": "00001106",
"actorType": "camera",
"creatorId": "een.recordingManager",
"type": "een.dataPurgedEvent.v1",
"dataSchemas": ["een.purgedDataDetails.v1"],
"data": [
{
"type": "een.purgedDataDetails.v1",
"bytes": 1572864000
}
]
}