Submit image frames directly for AI crime-detection analysis. The caller provides a user token together with dealer group / site / zone identifiers; missing user-group, site, and camera rows are created automatically before analysis begins. The request is processed asynchronously and returns immediately with a job ID.
.jpg, .jpeg, .png, .bmp, .webp.
Authentication: Pass the API token as the
token form field
or as an Authorization: Bearer <token> header.
Rate limit: Minimum 30 seconds between requests per
group_id + site_id + zone_id/(per camera) combination.
Content-Type:
multipart/form-data
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
images |
file[] | Required | Image files to analyse — exactly 4, 6, or 8 files per request. |
token |
string | Required | API authentication token. Can also be supplied as Authorization: Bearer <token> header. |
group_id |
string | Required | Dealer group ID (also used as the dealer ID) — uniquely identifies your organisation. |
site_id |
string | Required | Vendor dealer site ID — identifies the physical location. |
zone_id |
string | Required | Vendor dealer zone / camera ID within the site. |
site_category |
string | Required | Site category — must match one of the values listed in the Accepted site_category Values section below (case-insensitive). |
vendor_event_id |
string | Required | Your system's original event identifier — stored with the alarm event for end-to-end tracing back to the source event. |
site_address |
string | Conditional | Physical address of the site (e.g. 123 Main St, New York, NY 10001). Used for automatic timezone resolution. Required if timestamp is not provided. |
timestamp |
string | Conditional | Local site time in 24-hour format: YYYY-MM-DD HH:MM or YYYY-MM-DD HH:MM:SS. When provided, bypasses address-based timezone lookup. Required if site_address is not provided. |
group_name |
string | Optional | Human-readable name for your group — defaults to group_<group_id> if omitted. |
site_name |
string | Optional | Human-readable name for the site — defaults to site_<site_id> if omitted. |
zone_name |
string | Optional | Human-readable zone / camera label — defaults to zone_<zone_id> if omitted. |
detection_sensitive_level |
integer | Optional |
Detection Sensitivity Level (integer). Controls how strictly person and vehicle detections are filtered before AI analysis. Select the setting based on whether the priority is No Trespassing detection or detailed behavioral analysis. 0 — High Sensitivity (Recommended for No Trespassing) All per-frame quality filters are skipped to maximise detection sensitivity. If any person or vehicle is detected, the system immediately returns crime_rate: "Maybe" (sends all events as alarm signals based on positive detection of Human/Vehicle target(s)) without running AI inference. This mode prioritises identifying any potential presence in restricted areas and is best suited for No Trespassing applications where early detection is more important than behavioural analysis.1 — Medium Sensitivity (Content-Focused Analysis) All per-frame quality filters are skipped, but AI analysis still runs normally. This mode places greater emphasis on the visible video content while relying on less AI-driven inference and interpretation. Recommended when the objective is to analyse what is clearly observable in the footage while minimising assumptions beyond the detected content. 2 — Full AI Inference (Default / Highest Accuracy) Full filtering mode. All quality filters are applied and the AI performs its complete inference process. This provides the highest accuracy for understanding and classifying observed human actions, behaviours, and events within the video. Best suited for detailed incident analysis and behavioural interpretation. Not recommended for No Trespassing categories, as filtering requirements may reduce sensitivity to initial detections compared to Mode 0. |
Accepted site_category Values
Use one of the following values exactly as shown (case-insensitive).
car_dealership
car_wash
construction
gaming_slots
gas_station
hotel
jewelry
logistics_warehouse
office
other
residence
restaurant_bar
retail
storage
Request Examples
Response
site_category
The API enforces a minimum 30-second cooldown per
group_id + site_id + zone_id / (per camera) combination.
Requests sent before the cooldown expires will be rejected.
vendor_event_id you supply is saved alongside the
event so you can correlate GuardLink AI results back to your own event records.
Fetch a single alarm event by its job_id and return it in a standardised
JSON format for external integration. When media_type=0 (default), the response
includes lightweight per-frame detection box JSON — frame filenames and bounding box
coordinates for every detected category — without transferring any image data.
Authorization: Bearer <token>
header or as a ?token= query parameter. The token determines which account's events
can be accessed — you can only retrieve events that belong to your account.Rate limit: The same
token + job_id combination is blocked for
10 minutes after the first successful call. Repeated requests within that window
return 429.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
job_id |
string | Required | The job ID returned when the event was submitted (e.g. raw_user42_g001_site01_zone01_3f8a…). |
token |
string | Conditional | API authentication token. Can also be supplied as Authorization: Bearer <token> header. One of the two is required. |
media_type |
integer | Optional |
Controls what is returned in the media field. Default: 0.0 — Per-frame box JSON: frame filenames and detection bounding boxes for all categories (person, vehicle, weapon), with no image data transferred. Any value other than 0 requires admin authority and will be rejected
with 403 Forbidden.
|
Request Examples
Response
Every response — success or error — returns the same top-level shape:
media.frames[].boxes will be empty objects
media_type requires admin authority
job_id in your account
Response Fields
| Field | Type | Description |
|---|---|---|
| vendor | ||
vendor_time | string | Local site time at which the event was recorded. |
vendor_event_id | string | The original event ID you supplied when submitting the event. |
dealer_group_id | string | Dealer group identifier. |
dealer_site_id | string | Dealer site identifier. |
dealer_zone_id | string | Dealer zone / camera identifier. |
group_name | string | Human-readable group name. |
site_name | string | Human-readable site name. |
camera_name | string | Camera label within the site. |
| server | ||
crime_rate | integer | 0 = No, 1 = Maybe, 2 = Yes. |
has_motion | boolean | Motion was detected in the frame sequence. |
has_person | boolean | AI detected at least one person. |
has_vehicle | boolean | AI detected at least one vehicle. |
ai_analysis_called | boolean | Whether AI was invoked for this event. |
ai_analysis_time | float | Time in seconds the AI inference took. |
ai_engine | string | AI model used. |
ai_decision_method | string | Decision routing: Local, C1, C2, C21, Cbr. |
ai_decision_time | string | Timestamp when the AI classification completed. |
ai_description | string | Scene description generated by AI. |
ai_decision | string | Final classification: No, Maybe, or Yes. |
ai_decision_indicators | array | List of factors that influenced the AI decision. |
| media (media_type=0) | ||
type | string | Always "boxes". |
frames | object[] | One entry per frame (up to 60), in manifest order. |
frames[].name | string | Frame filename, e.g. "frame_00.jpg". |
frames[].box_file | string | Corresponding box file name, e.g. "frame_00_box.json". |
frames[].boxes | object |
Detection boxes keyed by category ("person", "vehicle", "weapon").
Each value is an array of boxes for that frame: [[x1, y1, x2, y2, confidence], …].
Coordinates are in the frame's pixel space. Empty array when no detections for that category.
Empty object when frames_atlas_manifest.json is unavailable.
|
After a successful export call, the same
token + job_id combination is blocked for
10 minutes at the gateway level. Save the response — repeated calls within that window will
receive a 429 response without hitting the backend.