Spot AI Historical Footage API
The Historical Footage API from Spot AI — 2 operation(s) for historical footage.
The Historical Footage API from Spot AI — 2 operation(s) for historical footage.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/spot-ai-historical-footage-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Spot AI — Spot Connect (beta) Analytics Historical Footage 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: Historical Footage
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:
- Historical Footage
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/{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:
- Historical Footage
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
components:
schemas:
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
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
CreateHistoricalFootageOutput:
properties:
id:
type: number
format: double
redirectId:
type: number
format: double
type: object
additionalProperties: false
ApiErrorResponse:
properties:
data: {}
statusCode:
type: number
format: double
message:
type: string
name:
type: string
required:
- message
- name
type: object
historicalFootageState:
description: Not deprecating enums from kysely because they are used all over the place
enum:
- FAILED
- PROCESSING
- QUEUED
- STALLED
- SUCCEEDED
type: string
securitySchemes:
bearer_security:
type: http
scheme: bearer