Spot Cameras API
The Cameras API from Spot — 8 operation(s) for cameras.
The Cameras API from Spot — 8 operation(s) for cameras.
openapi: 3.0.0
info:
title: Spot AI — Spot Connect (beta) Analytics Cameras API
version: 1.10.0
description: Spot AI Developer API
contact:
name: Spot AI
url: https://developers.spot.ai/
servers:
- url: https://dev-api.spot.ai/
tags:
- name: Cameras
paths:
/v1/cameras/{cameraId}/footage:
post:
operationId: CreateHistoricalFootage
responses:
'200':
description: Redirected to existing job
content:
application/json:
schema:
$ref: '#/components/schemas/CreateHistoricalFootageOutput'
examples:
Example 1:
value:
redirectId: 2
'201':
description: Job created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/CreateHistoricalFootageOutput'
examples:
Example 1:
value:
id: 1
'404':
description: Camera or Organization not found
content:
application/json:
schema:
items:
properties:
message:
type: string
required:
- message
type: object
type: array
examples:
Example 1:
value:
- message: Camera not found
- message: Organization not found
'409':
description: Another request is already in progress for the same time range
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
examples:
Example 1:
value:
name: ApiError
statusCode: 409
message: Another request is already in progress for the same time range
data:
overlappingRequest:
id: 1
start: '2023-06-29T12:20:05.533Z'
end: '2023-06-30T12:20:05.533Z'
'422':
description: Start and End time for the request are invalid
content:
application/json:
schema:
items:
properties:
message:
type: string
required:
- message
type: object
type: array
examples:
Example 1:
value:
- message: Invalid date format
- message: Camera has no footage
- message: Start time is before the earliest available footage segment
- message: End time is in the future
- message: Start is before End
description: 'This endpoint allows you to trigger a background job to fetch and store historical footage for a camera.
The job will run asynchronously and the response will contain the id and status of the job.
The Id or redirectId returned can be used to query the status of the job.'
summary: Create historical footage job
tags:
- Cameras
security:
- bearer_security: []
parameters:
- in: path
name: cameraId
required: true
schema:
format: int32
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateHistoricalFootageInput'
/v1/cameras/shared/search:
post:
operationId: CreateSharedCameraSearch
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/SharedCameraSearch'
examples:
Example 1:
value:
token: 5d09fd895fc6b94c468b36a6b0b8788e
link: https://dashboard.spot.ai/o/org-name/s/search/5d09fd895fc6b94c468b36a6b0b8788e
start: '2023-08-26T10:20:05.533Z'
end: '2023-08-26T12:20:05.533Z'
camera_ids:
- 1
- 2
- 3
expiry: '2023-08-29T12:20:05.533Z'
description: 'This endpoint creates a new shared camera search view. The view has a publicly accessible link that can be shared with anyone.
The link will expire after the expiry time. The expiry time is optional. If not provided, the link will expire after 1 week.'
summary: Create shared camera search view
tags:
- Cameras
security:
- bearer_security: []
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateSharedCameraSearchInput'
/v1/cameras/{cameraId}:
get:
operationId: GetCameraById
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/Camera'
examples:
Example 1:
value:
id: 1
name: Camera 1
status: online
location_id: 1
location_name: Location 1
local_ip: 192.168.1.100
last_online: '2023-06-29T12:20:05.533Z'
mac_address: 01:23:45:67:89:0A
appliance_id: 42
has_speakers: true
'404':
description: Camera not found
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
examples:
Example 1:
value:
statusCode: 404
message: Camera not found
name: QueryError
description: Returns information about a single camera.
summary: Get camera information
tags:
- Cameras
security:
- bearer_security: []
parameters:
- description: '- Id of the camera'
in: path
name: cameraId
required: true
schema:
format: int32
type: integer
/v1/cameras/count:
get:
operationId: GetCameraCount
responses:
'200':
description: Ok
content:
application/json:
schema:
type: number
format: double
examples:
Example 1:
value: 2
description: Returns the number of enabled cameras for an organization
summary: Get camera count
tags:
- Cameras
security:
- bearer_security: []
parameters: []
/v1/cameras:
get:
operationId: GetCameras
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/GetCamerasForApiQueryResult'
examples:
Example 1:
value:
- id: 1
name: Camera 1
status: online
location_id: 1
location_name: Location 1
local_ip: 192.168.1.100
last_online: '2023-06-29T12:20:05.533Z'
mac_address: 01:23:45:67:89:0A
appliance_id: 42
has_speakers: true
- id: 2
name: Camera 2
status: offline
location_id: 1
location_name: Location 1
local_ip: 192.168.1.101
last_online: '2023-06-21T09:20:05.533Z'
mac_address: 01:23:45:67:89:0B
appliance_id: 42
has_speakers: false
'400':
description: Max limit error
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
examples:
Example 1:
value:
statusCode: 400
message: Max limit error
name: InvalidLimitError
description: Paginated list of cameras for an org. Response contains a cursor for pagination.
summary: Get a paginated list of cameras
tags:
- Cameras
security:
- bearer_security: []
parameters:
- description: '- Cursor for pagination'
in: query
name: cursor
required: false
schema:
default: ''
type: string
- description: '- Number of cameras to return. Max 100'
in: query
name: limit
required: false
schema:
default: 50
format: double
type: number
- description: '- Location ids to filter by. When present, only returns cameras associated with the indicated locations.'
in: query
name: location_ids
required: false
schema:
type: array
items:
type: integer
format: int32
- description: '- Appliance ids to filter by. When present, only returns cameras associated with the indicated appliances.'
in: query
name: appliance_ids
required: false
schema:
type: array
items:
type: integer
format: int32
- description: '- Status to filter by ("online" or "offline"). When present, only returns cameras with the indicated status.'
in: query
name: status
required: false
schema:
$ref: '#/components/schemas/CameraStatus'
/v1/cameras/{cameraId}/footage/{footageId}:
get:
operationId: GetHistoricalFootage
responses:
'200':
description: Historical footage request found
content:
application/json:
schema:
$ref: '#/components/schemas/GetHistoricalFootage'
examples:
Request processing:
value:
cameraId: 1
start: '2023-06-29T12:20:05.533Z'
end: '2023-06-30T12:20:05.533Z'
expiry: null
id: 1
progress: 20.1
createdAt: '2023-06-29T13:20:05.533Z'
objectPath: null
state: PROCESSING
stateDescription: Job is processing
updatedAt: '2023-06-29T13:20:05.533Z'
Request succeeded:
value:
cameraId: 1
start: '2023-06-29T12:20:05.533Z'
end: '2023-06-30T12:20:05.533Z'
expiry: '2023-07-02T13:20:05.533Z'
id: 1
progress: 100
createdAt: '2023-06-29T13:20:05.533Z'
objectPath: public/path/to/object
state: SUCCEEDED
stateDescription: Success
updatedAt: '2023-07-01T13:20:05.533Z'
Request failed:
value:
cameraId: 1
start: '2023-06-29T12:20:05.533Z'
end: '2023-06-30T12:20:05.533Z'
expiry: null
id: 1
progress: 75.21
createdAt: '2023-06-29T13:20:05.533Z'
objectPath: null
state: FAILED
stateDescription: Job failed because the camera was offline
updatedAt: '2023-07-01T13:20:05.533Z'
'404':
description: 'Footage request not found '
content:
application/json:
schema:
items:
properties:
message:
type: string
required:
- message
type: object
type: array
examples:
Example 1:
value:
- message: Camera not found
- message: Footage request not found
'410':
description: Footage has expired
content:
application/json:
schema:
$ref: '#/components/schemas/ApiErrorResponse'
examples:
Example 1:
value:
name: ApiError
statusCode: 410
message: Footage has expired
summary: Get details of a submitted historical footage request
tags:
- Cameras
security:
- bearer_security: []
parameters:
- in: path
name: cameraId
required: true
schema:
format: double
type: number
- in: path
name: footageId
required: true
schema:
format: double
type: number
/v1/cameras/live:
post:
operationId: GetLiveUrl
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/GetLiveUrlQueryResult'
description: Returns a url to a live stream of the cameras
summary: Get a url to a live stream of the cameras
tags:
- Cameras
security:
- bearer_security: []
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/GetLiveUrlInput'
/v1/cameras/shared/search/{token}:
get:
operationId: GetSharedCameraSearch
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/SharedCameraSearch'
examples:
Example 1:
value:
token: 5d09fd895fc6b94c468b36a6b0b8788e
link: https://dashboard.spot.ai/o/org-name/s/search/5d09fd895fc6b94c468b36a6b0b8788e
start: '2023-08-26T10:20:05.533Z'
end: '2023-08-26T12:20:05.533Z'
camera_ids:
- 1
- 2
- 3
expiry: '2023-08-29T12:20:05.533Z'
description: This endpoint retrieves the shared camera search URL details.
summary: Get shared camera search view details
tags:
- Cameras
security:
- bearer_security: []
parameters:
- in: path
name: token
required: true
schema:
type: string
patch:
operationId: UpdateSharedCameraSearch
responses:
'200':
description: Ok
content:
application/json:
schema:
$ref: '#/components/schemas/SharedCameraSearch'
examples:
Example 1:
value:
token: 5d09fd895fc6b94c468b36a6b0b8788e
link: https://dashboard.spot.ai/o/org-name/s/search/5d09fd895fc6b94c468b36a6b0b8788e
start: '2023-08-26T10:20:05.533Z'
end: '2023-08-26T12:20:05.533Z'
camera_ids:
- 1
- 2
- 3
expiry: '2023-08-29T12:20:05.533Z'
description: This endpoint updates an existing shared camera search view. It allows updating the start, end time and the expiry of the shared search.
summary: Update shared camera search view details
tags:
- Cameras
security:
- bearer_security: []
parameters:
- in: path
name: token
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Pick_UpdateSharedCameraSearchInput.Exclude_keyofUpdateSharedCameraSearchInput.token__'
components:
schemas:
Camera:
properties:
id:
type: number
format: double
name:
type: string
status:
$ref: '#/components/schemas/CameraStatus'
location_id:
type: number
format: double
location_name:
type: string
local_ip:
type: string
last_online:
type: string
format: date-time
mac_address:
type: string
appliance_id:
type: number
format: double
has_speakers:
type: boolean
description: 'Indicates whether the camera has speaker capabilities for audio playback.
Returns true if the camera has either:
- Built-in two-way audio enabled (ONVIF backchannel), or
- A Bullhorn integration configured for remote speaker playback
Use this field to determine if the camera is eligible for the /v1/audio/play endpoint.'
example: true
required:
- id
- name
- status
- location_id
- location_name
- local_ip
- last_online
- mac_address
- appliance_id
- has_speakers
type: object
additionalProperties: false
GetLiveUrlInput:
properties:
camera_ids:
items:
type: integer
format: int32
type: array
description: Ids of the cameras to create live urls for
example:
- 1
- 2
- 3
- 4
minItems: 1
maxItems: 4
required:
- camera_ids
type: object
additionalProperties: false
GetLiveUrlQueryResult:
properties:
url:
type: string
required:
- url
type: object
additionalProperties: false
CreateSharedCameraSearchInput:
properties:
expiry_in_seconds:
type: integer
format: int32
description: The expiry time of the created Shared search view
example: 86400
maximum: 604800
camera_ids:
items:
type: number
format: double
type: array
description: The list of cameras to be shown in the VOD view.
example:
- 1
- 2
- 3
minItems: 1
maxItems: 16
end:
type: string
description: The timestamp for the end of the VOD search view. Should be a valid ISO 8601 string
example: '2023-06-29T12:20:05.533Z'
start:
type: string
description: The timestamp for the start of the VOD search view. Should be a valid ISO 8601 string
example: '2023-06-29T10:20:05.533Z'
required:
- camera_ids
- end
- start
type: object
SharedCameraSearch:
properties:
expiry:
type: string
format: date-time
description: The timestamp after which the link will expire
example: '2023-06-29T12:20:05.533Z'
camera_ids:
items:
type: number
format: double
type: array
description: The list of cameras that are shown in the VOD view.
example:
- 1
- 2
- 3
end:
type: string
format: date-time
description: The timestamp for the end of the VOD search view
example: '2023-06-29T12:20:05.533Z'
start:
type: string
format: date-time
description: The timestamp for the start of the VOD search view
example: '2023-06-29T12:20:05.533Z'
link:
type: string
description: This is the link to the public page to view the share search VODs
token:
type: string
description: The token for the shared search
required:
- expiry
- camera_ids
- end
- start
- link
- token
type: object
ApiErrorResponse:
properties:
data: {}
statusCode:
type: number
format: double
message:
type: string
name:
type: string
required:
- message
- name
type: object
CreateHistoricalFootageInput:
properties:
start:
type: string
description: The timestamp for the start of historical footage. Should be a valid ISO 8601 string
example: '2023-06-29T10:20:05.533Z'
end:
type: string
description: The timestamp for the end of the historical footage. Should be a valid ISO 8601 string
example: '2023-06-29T12:20:05.533Z'
required:
- start
- end
type: object
additionalProperties: false
GetCamerasForApiQueryResult:
properties:
prev:
type: string
nullable: true
next:
type: string
nullable: true
cameras:
items:
$ref: '#/components/schemas/Camera'
type: array
required:
- prev
- next
- cameras
type: object
additionalProperties: false
CameraStatus:
enum:
- offline
- online
type: string
CreateHistoricalFootageOutput:
properties:
id:
type: number
format: double
redirectId:
type: number
format: double
type: object
additionalProperties: false
GetHistoricalFootage:
properties:
id:
type: number
format: double
createdAt:
type: string
format: date-time
start:
type: string
format: date-time
end:
type: string
format: date-time
cameraId:
type: number
format: double
expiry:
type: string
format: date-time
objectPath:
type: string
progress:
type: number
format: double
state:
$ref: '#/components/schemas/historicalFootageState'
stateDescription:
type: string
updatedAt:
type: string
format: date-time
required:
- id
- createdAt
- start
- end
- cameraId
- expiry
- objectPath
- progress
- state
- stateDescription
- updatedAt
type: object
additionalProperties: false
historicalFootageState:
description: Not deprecating enums from kysely because they are used all over the place
enum:
- FAILED
- PROCESSING
- QUEUED
- STALLED
- SUCCEEDED
type: string
Pick_UpdateSharedCameraSearchInput.Exclude_keyofUpdateSharedCameraSearchInput.token__:
properties:
start:
type: string
description: The timestamp for the start of the VOD search view. Should be a valid ISO 8601 string
example: '2023-06-29T10:20:05.533Z'
end:
type: string
description: The timestamp for the end of the VOD search view. Should be a valid ISO 8601 string
example: '2023-06-29T12:20:05.533Z'
expiry_in_seconds:
type: integer
format: int32
description: The expiry time of the created Shared search view
example: 86400
maximum: 604800
required:
- start
- end
type: object
description: From T, pick a set of properties whose keys are in the union K
securitySchemes:
bearer_security:
type: http
scheme: bearer