Video Management System

This API is used to export Video Incidents from systems like Genetec in to ALO

In order to have access to the VMS endpoints you will need extra permissions associated with your API Authentication Key. Contact ALO for more information about obtaining this permission.

Multipart File Uploads

For large files (100+ MB )you will need to upload in chunks. This process involve multiple steps:

  • Signal to ALO that you need to start a multipart upload (Create Multipart Upload)

  • Make a request to ALO to get the signed urls for all the file parts (Get Upload Urls)

  • Upload the URLs directly to S3 using the upload urls

  • Signal to ALO the you completed uploading the files (Complete Multipart Upload) if you have successfully uploaded the files.

  • Signal to ALO to abort the process (Abort Multipart Upload) if you were unable to upload the videos.

Create Multipart Upload

This starts the process of upload multipart files

GET/vms/incidents/{incident_id}/create_multipart_upload?file_id={fileId}&filename={filename}

Path Parameters

Query Parameters

Example Request

https://api.alo.ai/v1/vms/incidents/8d1635ed-f747-427c-9b35-d83a08d08ab5/create_multipart_upload?file_id=abc1&filename=test.mov

Success Response

A successful get response will have an HTTP status of 200

Response Properties

Example Response

{
    "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/1dda6e79-ee85-4f85-a5e5-5429a65307c3/8d1635ed-f747-427c-9b35-d83a08d08ab5/test.mov",
    "upload_id": "sW2iCVWSqEZjSao9zVEIAoKkvBXY0mLZUPnCZEUHSB.3pGyLoNQT2_mVMzM.KwU.s.knO.4Hu2MLGsAi5tUZcchoPtrfowe9ZLVLdtFZh4uqcoKKo98Xv6x1tc3JQWNQ"
}

Get Upload Urls

In order for you to upload video files and thumbnails you need to make a request to get a signed S3 upload url.

For small files (under 100 MB) you can upload the filed on 1 piece.

For larger files you will need to upload in chunks. See Multipart File Uploads

POST /vms/incidents/{incident_id}/upload_urls

Path Parameters

Body Parameters

File Object Definition

Example Payload

This is what a payload might look like if you need urls for a multipart video and its thumbnail

{
    "files": {
        "fileId1": {            
            "part_count": 3, 
            "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov", 
            "upload_id": "RYol1AUyBSuv7IEz7aXuvz8TwHsyfxAH6IR9O_8RVJaZGcaW2P3i_b_q0XcY6r1SVNyKo4Uxw0DXEwYIEVB5sQ0BlY1iEDDrJrDPlgF4cHZzeJOyY7Erpswl7TUEQa1K"
            },
         "fileId2": {"filename": "myThumbnail.jpg"}
         }
}

Success Response

A successful get response will have an HTTP status of 200

Response Properties

Example Response

{
    "incident_id": "8d1635ed-f747-427c-9b35-d83a08d08ab5",
    "max_upload_size_mb": -1,
    "uploads": {
        "fileId1": {
            "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov",
            "signed_urls": [
                "https://.../vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov?partNumber=1&uploadId=RYol1AUyBSuv7IEz7aXuvz8TwHsyfxAH6IR9O_8RVJaZGcaW2P3i_b_q0XcY6r1SVNyKo4Uxw0DXEwYIEVB5sQ0BlY1iEDDrJrDPlgF4cHZzeJOyY7Erpswl7TUEQa1K&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQPM6APGZG4E7AS7S%2F20240304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240304T193827Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=dede63b4e807952fb860fd805d00f3a2ad8a7fefc9a4555c24bd1efde3e3aade",
                "https://.../vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov?partNumber=2&uploadId=RYol1AUyBSuv7IEz7aXuvz8TwHsyfxAH6IR9O_8RVJaZGcaW2P3i_b_q0XcY6r1SVNyKo4Uxw0DXEwYIEVB5sQ0BlY1iEDDrJrDPlgF4cHZzeJOyY7Erpswl7TUEQa1K&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQPM6APGZG4E7AS7S%2F20240304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240304T193827Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=31ee977feb09db5d3cf22414c64796887ca7502008be7f4b73f83d3473ca2787",
                "https://.../vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov?partNumber=3&uploadId=RYol1AUyBSuv7IEz7aXuvz8TwHsyfxAH6IR9O_8RVJaZGcaW2P3i_b_q0XcY6r1SVNyKo4Uxw0DXEwYIEVB5sQ0BlY1iEDDrJrDPlgF4cHZzeJOyY7Erpswl7TUEQa1K&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQPM6APGZG4E7AS7S%2F20240304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240304T193827Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=f45fed45a2200eb05ac657df5d0edc1f0deaff75f956c35299a8a78f7aca44be"
            ]
        },
        "fileId2": {
            "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/1dda6e79-ee85-4f85-a5e5-5429a65307c3/8d1635ed-f747-427c-9b35-d83a08d08ab5/myThumbnail.jpg",
            "signed_urls": "https://.../vms/08697d4a-dd01-457f-a4f7-823f0ab35814/1dda6e79-ee85-4f85-a5e5-5429a65307c3/8d1635ed-f747-427c-9b35-d83a08d08ab5/myThumbnail.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQPM6APGZG4E7AS7S%2F20240304%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240304T193827Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=f88a081c07f5b04ad67812429cd4464368dc184b94ec2069ff691017ee4c60a2"
        }
    }
}

Complete Multipart Upload

Call the endpoint after you have uploaded your multipart files

POST /vms/incidents/{incident_id}/complete_multipart_upload

Body Parameters

Example Payload

{            
    "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov", 
    "upload_id": "RYol1AUyBSuv7IEz7aXuvz8TwHsyfxAH6IR9O_8RVJaZGcaW2P3i_b_q0XcY6r1SVNyKo4Uxw0DXEwYIEVB5sQ0BlY1iEDDrJrDPlgF4cHZzeJOyY7Erpswl7TUEQa1K",
    "parts": ["b6e2499aae6e4d7794b7a8cc23216cec", "70a52b9815e0b2796a2d911f1d08eef3", "d3295896bbec7e52efc32ad256f48c9a"]
}

Success Response

A successful get response will have an HTTP status of 200

The body of the response will contain the s3_key and upload_id

Abort Multipart Upload

If you start a mutlipart upload and it fails you need to make a request to abort the process.

GET /vms/incidents/{incident_id}/abort_multipart_upload?s3_key={s3_key}&upload_id={upload_id}

Path Parameters

Query Parameters

Example Request

https://api.alo.ai/v1/vms/incidents/8d1635ed-f747-427c-9b35-d83a08d08ab5/abort_multipart_upload?s3_key=test2.MP4&upload_id=Nuen6pGbsLisRzlYM2Khi1F7cpXOAp_Uiy7HtAJGx0MEEyVaLLmpzeilojbKBi.b3M73UuEr4CRppIE4bpElxhvLoHO2KKC9Y3FuM49EHsbJvL1DiNESNEeWGppKBwd2

Success Response

A successful get response will have an HTTP status of 200

The body of the response will contain the s3_key and upload_id

Get An Incident

Get information about an incident that has already been uploaded to ALO

GET /vms/incidents/{incident_id}

Path Parameters

Success Response

A successful get response will have an HTTP status of 200

Response Properties

Example Response Body

{
    "vms_incident": {
        "id": "8d1635ed-f747-427c-9b35-d83a08d08ab6",
        "title": "Hey There!",
        "description": "Something else description",
        "incident_at": "2023-02-02T11:04:12.987Z",
        "created_at": "2024-02-02T11:04:41.030Z",
        "updated_at": "2024-02-02T12:01:19.643Z",
        "longitude": 0,
        "latitude": 0,
        "uploaded_videos": [
            {
                "id": "good-file-2",
                "started_at": "2024-02-02T11:49:22.000Z",
                "ended_at": "2024-02-02T11:51:32.000Z",
                "camera_name": "192.168.0.241 - Camera - 01a",
                "camera_description": "",
                "camera_longitude": 0,
                "camera_latitude": 0,
                "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxxxxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov",
                "s3_thumbnail_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxxxxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.jpg"
            }
        ],
        "failed_videos": [
            {
                "id": "bad-file-2",
                "started_at": "2024-02-02T11:49:22.000Z",
                "ended_at": "2024-02-02T11:51:32.000Z",
                "camera_name": "192.168.0.241 - Camera - 01",
                "camera_description": "",
                "camera_longitude": 0,
                "camera_latitude": 0,
                "upload_errors": [
                    "G64 export failed with: No video available for the camera during the selected time period. Try exporting using a different time range.."
                ]
            }
        ]
    }
}

Create/Update Incident

PUT /vms/incidents/{incident_id}

Path Parameters

Body Parameters

Video Object Definition

Example Payload

{
  "vms_incident": {
    "title": "Hey There!!",
    "description": "Something else description",
    "created_at": "2024-02-02T11:04:41.03Z",
    "updated_at": "2024-02-02T12:01:19.643Z",
    "incident_at": "2023-02-02T11:04:12.987Z",
    "latitude": 0.0,
    "longitude": 0.0,
    "uploaded_videos": [
        {
            "id": "good-file-2",
            "started_at": "2024-02-02T11:49:22Z",
            "ended_at": "2024-02-02T11:51:32Z",
            "camera_id": "01000000-0001-babe-0007-48ea632b7f71",
            "camera_name": "192.168.0.241 - Camera - 01a",
            "camera_description": "",
            "camera_latitude": 0.0,
            "camera_longitude": 0.0,
            "s3_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.mov",
            "s3_thumbnail_key": "vms/08697d4a-dd01-457f-a4f7-823f0ab35814/xxxx/8d1635ed-f747-427c-9b35-d83a08d08ab5/abc1_test.jpg"
        }
    ],
    "failed_videos": [
        {
            "id": "bad-file-2",
            "started_at": "2024-02-02T11:49:22Z",
            "ended_at": "2024-02-02T11:51:32Z",
            "camera_id": "01000000-0001-babe-0007-48ea632b7f71",
            "camera_name": "192.168.0.241 - Camera - 01",
            "camera_description": "",
            "camera_latitude": 0.0,
            "camera_longitude": 0.0,
            "errors": [
                "G64 export failed with: No video available for the camera during the selected time period. Try exporting using a different time range.."
            ]
        }
    ]
  }
}

Success Response

A successful get response will have an HTTP status of 200/201

Response Properties

The payload in the response will be the same as seen when calling GET on an existing incident

Last updated