Spot AI Historical Footage API

The Historical Footage API from Spot AI — 2 operation(s) for historical footage.

Operations 2

POST /v1/cameras/{cameraId}/footage Create historical footage job #
GET /v1/cameras/{cameraId}/footage/{footageId} Get details of a submitted historical footage request #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/spot-ai-historical-footage-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

spot-ai-historical-footage-api-openapi.yml Raw ↑
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