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 ( )
Make a request to ALO to get the signed urls for all the file parts ( )
Upload the URLs directly to S3 using the upload urls
Signal to ALO the you completed uploading the files ( ) if you have successfully uploaded the files.
Signal to ALO to abort the process ( ) 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
Id of the incident you are uploading files for
Query Parameters
Unique id of the file being uploaded
Name of the file being uploaded
Example Request
Copy 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
Copy {
"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.
POST /vms/incidents/{incident_id}/upload_urls
Path Parameters
Id of the incident you are uploading files for
Body Parameters
Hash of file objects by file id
File Object Definition
Yes (If multipart upload)
The number of part involved in the multipart upload
Yes (If multipart upload)
S3 key that you received when creating a multipart upload
Yes (If multipart upload)
Upload id that you received when creating a multipart upload
Yes (If not a multipart upload)
Name of the file you are uploading if its not a multipart upload
Example Payload
This is what a payload might look like if you need urls for a multipart video and its thumbnail
Copy {
"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
Copy {
"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
Array of etag strings. Each part will have an etag returned when you upload the part. The etags must be ordered by part (the first string in the array must be the etag for the first file part)
Example Payload
Copy {
"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
Id of the incident you are uploading files for
Query Parameters
Example Request
Copy 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
Id of the incident you are requesting information about
Success Response
A successful get response will have an HTTP status of 200
Response Properties
Example Response Body
Copy {
"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
Id of the incident you are creating or updating
Body Parameters
Date/Time Incident was created in external system
Date/Time Incident was created in external system
Longitude of the incident
Array of uploaded video objects
Array of video objects that failed to be uploaded to ALO
Video Object Definition
Date/Time the video started at
Name of the camera the recorded the video
Description of the camera the recorded the video
Longitude of the camera the recorded the video
Latitude of the camera the recorded the video
Yes (if video was successfully uploaded)
S3 key for the video file that was uploaded to ALO
S3 key for the thumbnail file that was uploaded to ALO
Yes (if the video failed to upload to ALO)
Array of strings representing any error messages that were gathered in the upload process
Example Payload
Copy {
"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