Blueye HTTP API 1.1.0
API for Blueye drone diagnostics and system management
Media
Pictures
Picture processing and download
Get MD5 checksum of uploaded logo
GET /asset/logo/md5
Get the MD5 checksum of the currently uploaded logo, can be used to verify that the logo was uploaded correctly.
Response 200 OK
{
"md5sum": "10194c9eb82fd0237342ce80a2747ed2"
}
Schema
{
"type": "object",
"properties": {
"md5sum": {
"type": "string",
"description": "MD5 checksum",
"example": "10194c9eb82fd0237342ce80a2747ed2"
}
}
}
Response 404 Not Found
No custom logo found!
"string"
Schema
{
"type": "string",
"description": "No custom logo found!"
}
Code Samples
curl -X GET "http://192.168.1.101/asset/logo/md5"
import requests
response = requests.get("http://192.168.1.101/asset/logo/md5")
print(response.json())
Download a picture
GET /picture
Get a picture file or list all pictures if no file specified
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
file |
query | string | No | Picture filename (optional - if not provided, returns list) | |||
logo |
query | integer | 0 | No | Add logo to picture.0 - No logo1 - Drone default logo* 2 - User uploaded logo |
||
tz-offset |
query | integer | No | Add timezone offset to the picture EXIF data in minutes, can also be a negative number. For example in Norway during summer time the correct value would be 60, while it would be -180 in Chile |
Response 200 OK
If no file parameter is given, returns a list of all available pictures
"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ="
Schema
{
"type": "string",
"format": "binary"
}
If no file parameter is given, returns a list of all available pictures
"{'filename': 'picture_BYEDP070027_2025-10-13_155527.231.jpg'},\n {'filename': 'picture_BYEDP070027_2025-10-13_155528.166.jpg'}]"
Schema
{
"type": "array",
"items": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "Picture filename"
}
}
},
"description": "If no file parameter is given, returns a list of all available\npictures",
"example": "{'filename': 'picture_BYEDP070027_2025-10-13_155527.231.jpg'},\n {'filename': 'picture_BYEDP070027_2025-10-13_155528.166.jpg'}]"
}
Response 400 Bad Request
Invalid logo parameter
"string"
Schema
{
"type": "string",
"description": "Invalid logo parameter"
}
Response 404 Not Found
Picture file not found
"string"
Schema
{
"type": "string",
"description": "Picture file not found"
}
Code Samples
curl -X GET -G "http://192.168.1.101/picture" \
-d "file=picture_BYEDP123456_2019-01-01_000001.001.jpg"
import requests
# Query parameters
params = {
"file": "picture_BYEDP123456_2019-01-01_000001.001.jpg",
}
response = requests.get(f"http://192.168.1.101/picture", params=params)
with open("output.jpg", "wb") as f:
f.write(response.content)
Download pictures with metadata overlay
GET /picture/overlay
Generate picture with telemetry data overlay
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
date-format |
query | string | %Y-%m-%d %H:%M:%S | No | Format of the date/time. | ||
field-date |
query | integer | 1 | No | Enable or disable the date field.1 - Enable0 - Disable |
||
field-depth |
query | integer | 1 | No | Display water depth in the image overlay.1 - Enable0 - Disable |
||
field-gps |
query | integer | 0 | No | Display GPS coordinates (decimal degrees) in the image overlay. Requires Blunux 3.0 or newer. If a positioning system is used, the coordinates of the drone is shown, else the operator position reported by the app is shown. 1 - Enable0 - Disable |
||
field-guestport |
query | integer | 1 | No | Display data from connected guestport sensors in the image overlay.1 - Enable0 - Disable |
||
field-heading |
query | integer | 1 | No | Display compass heading in the image overlay.1 - Enable0 - Disable |
||
field-temp |
query | integer | 1 | No | Display water temperature in the image overlay.1 - Enable0 - Disable |
||
field-tilt |
query | integer | 0 | No | Display camera tilt angle in the image overlay.1 - Enable0 - Disable |
||
fileRequired |
query | string | No | Name of the image file to download. | |||
ignore-exif-titles |
query | integer | 0 | No | Ignore title and subtitle set by the app during the dive. If title andsubtitle is not specified, the title and/or subtitle selected for the video overlay will bewritten unless this parameter is enabled. 1 - Ignore exif titles0 - Use title from exif |
||
length-units |
query | string | meter | No | Unit to use for all distance/length measurements such as depth, altitude, distance etc. For shorter lengths mm or inches will be used accordingly.meter - Metric unitfeet - Imperial unit |
||
logo |
query | integer | 0 | No | Which logo to overlay.0 - No logo1 - Drone default logo* 2 - User uploaded logo |
||
subtitle |
query | string | No | Subtitle of the image. Maximum 72 characters. | |||
temp-units |
query | string | celsius | No | Unit to use for the temperature field and any temperature related measurements. celsius - Metric unitfahrenheit - Imperial unit |
||
title |
query | string | No | Title of the image. Maximum 24 characters. | |||
tz-offset |
query | integer | 0 | No | The drone stores all time in UTC+0, so if you were diving in another timezone and want to correct for that in the displayed time you can add a timezone offset here. The unit is minutes and both positive and negative values are supported. |
Response 200 OK
Schema
{
"type": "object"
}
Response 400 Bad Request
Invalid parameters were provided
"Invalid parameter temp_unit: Kelvin"
Schema
{
"type": "string",
"description": "Invalid parameters were provided",
"example": "Invalid parameter temp_unit: Kelvin"
}
Response 404 Not Found
A picture with the provided file name was not found.
"Picture file not found or not valid"
Schema
{
"type": "string",
"description": "A picture with the provided file name was not found.",
"example": "Picture file not found or not valid"
}
Code Samples
curl -X GET -G "http://192.168.1.101/picture/overlay" \
-d "file=picture_BYEDP123456_2019-01-01_000001.001.jpg" \
-d "title=My title"
import requests
# Query parameters
params = {
"file": "picture_BYEDP123456_2019-01-01_000001.001.jpg",
"title": "My title",
}
response = requests.get(f"http://192.168.1.101/picture/overlay", params=params)
with open("output.jpg", "wb") as f:
f.write(response.content)
Download a thumbnail of a picture
Deprecated Endpoint
Deprecated.
Downloads a picture (jpg) with EXIF metadata from when the photo was captured.
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
fileRequired |
query | string | No | Name of the image file to download | |||
height |
query | integer | 576 | No | Height of the thumbnail in pixels. | ||
quality |
query | integer | 85 | No | JPG compression level, 0-100. 100 is best quality, 0 is worst quality. | ||
width |
query | integer | 1024 | No | Width of the thumbnail in pixels. |
Response 200 OK
"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ="
Schema
{
"type": "string",
"format": "binary"
}
Response 400 Bad Request
Invalid options were provided
"Options not valid"
Schema
{
"type": "string",
"description": "Invalid options were provided",
"example": "Options not valid"
}
Response 404 Not Found
A picture with the provided file name was not found.
"Picture file not found or not valid"
Schema
{
"type": "string",
"description": "A picture with the provided file name was not found.",
"example": "Picture file not found or not valid"
}
Code Samples
curl -X GET -G "http://192.168.1.101/picture/thumbnail" \
-d "file=picture_BYEDP123456_2019-01-01_000001.001.jpg"
import requests
# Query parameters
params = {
"file": "picture_BYEDP123456_2019-01-01_000001.001.jpg",
}
response = requests.get(f"http://192.168.1.101/picture/thumbnail", params=params)
with open("output.jpg", "wb") as f:
f.write(response.content)
Logos
Download logo
GET /asset/logo
Download the original user uploaded logo (PNG or JPG)
Response 200 OK
Schema
{
"type": "object"
}
Schema
{
"type": "object"
}
Response 404 Not Found
No custom logo found!
"string"
Schema
{
"type": "string",
"description": "No custom logo found!"
}
Code Samples
curl -X GET "http://192.168.1.101/asset/logo"
import requests
response = requests.get("http://192.168.1.101/asset/logo")
with open("output.png", "wb") as f:
f.write(response.content)
Upload logo
POST /asset/logo
Upload user selectable logo for watermarking videos and pictures. Allowed filetype: JPG or PNG. Max resolution: 2000px. Max file size: 5MB.
Request body
{
"image": "logo.png"
}
Schema of the request body
{
"type": "object",
"description": "Serializer for the logo image upload.",
"properties": {
"image": {
"type": "string",
"format": "binary",
"example": "logo.png",
"description": "The logo image file to upload (PNG, JPG). <5MB, <2000px Will be converted to\nPNG."
}
},
"required": [
"image"
]
}
Response 200 OK
Image upload successful!
"string"
Schema
{
"type": "string",
"description": "Image upload successful!"
}
Response 507 Insufficient Storage
Not enough storage space left on the drone
"string"
Schema
{
"type": "string",
"description": "Not enough storage space left on the drone"
}
Response 400 Bad Request
Schema
{
"oneOf": [
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "File not present in POST request"
}
}
},
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "File size is too large"
}
}
},
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "Image is corrupt"
}
}
},
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "Invalid image file"
}
}
},
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "Image resolution is too high"
}
}
}
]
}
Code Samples
curl -X POST "http://192.168.1.101/asset/logo"
--form 'image=@"logo.png"'
import requests
with open("logo.png", "rb") as f:
files = {'image': f}
response = requests.post(f"http://192.168.1.101/asset/logo", files=files)
print(response.text)
Delete logo
DELETE /asset/logo
Delete the uploaded logo
Response 200 OK
Schema
{
"oneOf": [
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "Custom logo deleted!"
}
}
},
{
"type": "object",
"properties": {
"text/plain": {
"type": "string",
"description": "No logo found to delete!"
}
}
}
]
}
Code Samples
curl -X DELETE "http://192.168.1.101/asset/logo"
import requests
response = requests.delete("http://192.168.1.101/asset/logo")
print(response.text)
Subtitles
Video subtitle generation
Download subtitle file
GET /srt
Downloads a subtitle file (srt) for a video file containing log data from the dive. The data is gathered from the videos accompanying logfile. By passing in varius queries it is possible to select which data one wants displayed, and where to display it.
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
date-format |
query | string | %Y-%m-%d %H:%M:%S | No | Format of the date/time. | ||
field-date |
query | integer | 0 | No | Enable or disable the date field. "1" to enable, "0" to disable. | ||
field-depth |
query | integer | 1 | No | Enable or disable the depth field. "1" to enable, "0" to disable. | ||
field-heading |
query | integer | 1 | No | Enable or disable the heading field. "1" to enable, "0" to disable. | ||
field-temp |
query | integer | 1 | No | Enable or disable the temperature field. "1" to enable, "0" to disable. | ||
field-tilt |
query | integer | 0 | No | Enable or disable the tilt field. "1" to enable, "0" to disable. | ||
fileRequired |
query | string | No | Name of the videofile to download subtitle file for. | |||
format |
query | string | srt | No | Subtitles can also be retrived in the WEBVTT format. Use format=vtt to get a .vtt file instead of a .srt file. |
||
length-units |
query | string | meter | No | Unit to use for length. Use "meter" for metric units, and "feet" for imperial. |
||
placement |
query | string | top | No | Where to place the subtitle. Use "top" for placing on the top, "bottom" for placing on the bottom, and "" for using the player default. |
||
temp-units |
query | string | celsius | No | Unit to use for temperature. Use "celsius" for metric units, and "fahrenheit" for imperial. |
||
title |
query | string | No | Title of the video. | |||
tz-offset |
query | integer | 0 | No | The drone stores all time in UTC+0, so if you were diving in another timezone and want to correct for that in the displayed time you can add a timezone offset here. The unit is minutes and both positive and negative values are supported. |
Response 200 OK
Subtitle file for the requested video file
Schema
{
"type": "object",
"description": "Subtitle file for the requested video file"
}
Response 400 Bad Request
No video file given or other bad request
Schema
{
"description": "No video file given or other bad request"
}
Response 404 Not Found
Log file not found or invalid format/placement
Schema
{
"description": "Log file not found or invalid format/placement"
}
Code Samples
curl -X GET -G "http://192.168.1.101/srt" \
-d "file=video_BYEDP123456_2019-01-01_000001.mp4" \
-d "title=My title"
import requests
# Query parameters
params = {
"file": "video_BYEDP123456_2019-01-01_000001.mp4",
"title": "My title",
}
response = requests.get(f"http://192.168.1.101/srt", params=params)
with open("output.srt", "wb") as f:
f.write(response.content)
Dive data
Logs
Binary log file operations
Array of binary logs
GET /logs/
Returns an array of binary logs from the drone. Each array item represents an available log file on the drone. Use the /logs/{filename}/binlog endpoint to get the full log.
Response 200 OK
[
{
"name": "BYEDP070018_ea9add4d0c1961d4_00386",
"log_number": 0,
"is_open": true,
"has_binlog": true,
"is_dive": true,
"videos": [
"/videos/video_BYEDP070018_2023-07-31_125743.mp4",
"/videos/video_BYEDP070018_2023-07-31_125743_cam2.mp4"
],
"pictures": [
"/videos/picture_BYEDP070018_2023-07-31_125743.mp4",
"/videos/picture_BYEDP070018_2023-07-31_125743_cam2.mp4"
],
"multibeam_recordings": [
"/videos/multibeam_BYEDP070018_2023-07-31_123743.mbez",
"/videos/multibeam_BYEDP070018_2023-07-31_125743.mbez"
],
"binlog_size": 1099448,
"has_dive_info": true,
"start_time": 1692002908,
"blunux_version": "3.0.47-honister-master",
"model_name": "Pioneer",
"max_depth_magnitude": 0
}
]
Schema
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the logfile. First part is the drones serial number,\n seconds is the unique hardware ID, and the last part is the dive number.\n Note: Unlike the csv logs there is no extension in this name.",
"example": "BYEDP070018_ea9add4d0c1961d4_00386"
},
"log_number": {
"type": "integer",
"description": "Number of the log. This is the same as the number in the filename."
},
"is_open": {
"type": "boolean",
"description": "If this log is currently being written to."
},
"has_binlog": {
"type": "boolean",
"description": "If this log has a binlog or not. Unless something unexpected\n has occured this should be True."
},
"is_dive": {
"type": "boolean",
"description": "If this log is a dive or not. If maximum depth has exceeded\n 0.25m or if any of the auto functions have been used the log will be\n classified as a dive."
},
"videos": {
"description": "List of paths to videos recorded during the dive.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"/videos/video_BYEDP070018_2023-07-31_125743.mp4",
"/videos/video_BYEDP070018_2023-07-31_125743_cam2.mp4"
]
},
"pictures": {
"description": "List of paths to pictures taken during the dive.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"/videos/picture_BYEDP070018_2023-07-31_125743.mp4",
"/videos/picture_BYEDP070018_2023-07-31_125743_cam2.mp4"
]
},
"multibeam_recordings": {
"description": "List of paths to multibeam recordings taken during the dive.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"/videos/multibeam_BYEDP070018_2023-07-31_123743.mbez",
"/videos/multibeam_BYEDP070018_2023-07-31_125743.mbez"
]
},
"binlog_size": {
"type": "integer",
"description": "Size of binary log file in bytes",
"example": 1099448
},
"has_dive_info": {
"type": "boolean",
"description": "If this log has dive info or not. Unless something unexpected\n has occured this should be True."
},
"start_time": {
"type": "integer",
"description": "Unix timestamp of the start of the dive.",
"example": 1692002908
},
"blunux_version": {
"type": "string",
"description": "Version of the Blunux operating system running on the drone.\n Format is $(Major).$(Minor).$(Build)-$(Yocto version)-$(Branch)",
"example": "3.0.47-honister-master"
},
"model_name": {
"type": "string",
"description": "Drone model name",
"enum": [
"Pioneer",
"Pro",
"X1",
"X3",
"X3 Ultra"
]
},
"max_depth_magnitude": {
"type": "integer",
"description": "Maximum depth of the dive, rounded down to the nearest meter\n for dives up to 10 meters, rounded down to the nearest 10 meters for dives up\n to 100 meters, and rounded down to the nearest 100 meters for deeper dives."
}
},
"required": [
"name",
"log_number",
"is_open",
"has_binlog",
"is_dive",
"videos",
"pictures",
"multibeam_recordings",
"binlog_size",
"has_dive_info",
"start_time",
"blunux_version",
"model_name",
"max_depth_magnitude"
]
}
}
Code Samples
curl -X GET "http://192.168.1.101/logs/"
import requests
response = requests.get("http://192.168.1.101/logs/")
print(response.json())
Download protobuf binary log file
Returns the binary content of the requested log
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
lognameRequired |
path | string | No | Name of the log to download |
Response 200 OK
Binary log file. See https://blueye-robotics.github.io/blueye.sdk/latest/logs/plotting/ for instructions on how to parse the file.
Schema
{
"type": "object",
"description": "Binary log file. See\n https://blueye-robotics.github.io/blueye.sdk/latest/logs/plotting/ for instructions on\n how to parse the file."
}
Response 404 Not Found
No log found
Schema
{
"description": "No log found"
}
Code Samples
curl -X GET "http://192.168.1.101/logs/BYEDP070018_ea9add4d0c1961d4_00386/binlog"
import requests
# Path parameters
logname = "BYEDP070018_ea9add4d0c1961d4_00386"
response = requests.get(f"http://192.168.1.101/logs/{logname}/binlog")
with open(f"{logname}.bez", "wb") as f:
f.write(response.content)
Get dive info for binlog
Returns extended meta data for the requested log.
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
lognameRequired |
path | string | No | Name of the log to download info for |
Response 200 OK
{
"blunux_version": "3.0.47-honister-master",
"is_dive": true,
"is_valid": true,
"log_name": "BYEDP070018_ea9add4d0c1961d4_00386",
"max_depth_magnitude": 0,
"model_name": "Pioneer",
"start_time": 1692002908,
"videos": [
"/videos/video_BYEDP070018_2023-07-31_125743.mp4",
"/videos/video_BYEDP070018_2023-07-31_125743_cam2.mp4"
],
"pictures": [
"/videos/picture_BYEDP070027_2025-10-13_155525.759.jpg",
"/videos/picture_BYEDP070027_2025-10-13_155527.231.jpg"
],
"multibeam_recordings": [
"/videos/multibeam_BYEDP070027_2025-10-15_140613.mbez",
"/videos/multibeam_BYEDP070027_2025-10-15_141043.mbez"
],
"error_flags": [
"string"
],
"gp_info": {
"gp1": null,
"gp2": null,
"gp3": null
}
}
Schema
{
"type": "object",
"properties": {
"blunux_version": {
"type": "string",
"description": "Version of the Blunux operating system running on the drone.\nFormat is $(Major).$(Minor).$(Build)-$(Yocto version)-$(Branch)\n",
"example": "3.0.47-honister-master"
},
"is_dive": {
"type": "boolean",
"description": "If this log is a dive or not. If maximum depth has exceeded\n0.25m or if any of the auto functions have been used the log will be classified as a dive."
},
"is_valid": {
"type": "boolean",
"description": "If this log is valid or not. Unless something unexpected has\noccured this should be True."
},
"log_name": {
"type": "string",
"description": "Name of the logfile. First part is the drones serial number,\nthe second part is the unique hardware ID, and the last part is the dive number.\nNote: Unlike the csv logs there is no extension in this name.",
"example": "BYEDP070018_ea9add4d0c1961d4_00386"
},
"max_depth_magnitude": {
"type": "integer",
"description": "Maximum depth of the dive, rounded down to the nearest meter\nfor dives up to 10 meters, rounded down to the nearest 10 meters for dives up to 100 meters, and\nrounded down to the nearest 100 meters for deeper dives.\n"
},
"model_name": {
"type": "string",
"description": "Name of the drone model.",
"enum": [
"Pioneer",
"Pro",
"X1",
"X3",
"X3 Ultra"
]
},
"start_time": {
"type": "integer",
"description": "Unix timestamp of the start of the dive.",
"example": 1692002908
},
"videos": {
"description": "List of paths to videos recorded during the dive.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"/videos/video_BYEDP070018_2023-07-31_125743.mp4",
"/videos/video_BYEDP070018_2023-07-31_125743_cam2.mp4"
]
},
"pictures": {
"description": "List of paths to pictures taken during the dive.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"/videos/picture_BYEDP070027_2025-10-13_155525.759.jpg",
"/videos/picture_BYEDP070027_2025-10-13_155527.231.jpg"
]
},
"multibeam_recordings": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of associated multibeam recordings",
"example": [
"/videos/multibeam_BYEDP070027_2025-10-15_140613.mbez",
"/videos/multibeam_BYEDP070027_2025-10-15_141043.mbez"
]
},
"error_flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of error flags"
},
"gp_info": {
"type": "object",
"properties": {
"gp1": {
"oneOf": [
{
"type": "object",
"properties": {
"device_list": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"depth_rating": {
"type": "integer",
"example": "700"
},
"name": {
"type": "string",
"example": "Blueye Blind Plug"
},
"manufacturer": {
"type": "string",
"example": "Blueye Robotics"
},
"serial_number": {
"type": "string",
"example": "BP00-00000"
}
}
}
}
}
},
"guest_port_number": {
"type": "string",
"enum": [
"GUEST_PORT_NUMBER_PORT_1",
"GUEST_PORT_NUMBER_PORT_2",
"GUEST_PORT_NUMBER_PORT_3"
],
"example": "GUEST_PORT_NUMBER_PORT_1"
}
}
},
{
"type": "object",
"properties": {
"error": {
"type": "string",
"description": "Error code for what went wrong with\nthe guest port",
"example": "GUEST_PORT_ERROR_NOT_FLASHED"
}
}
}
]
},
"gp2": {
"oneOf": [
{
"type": "object",
"properties": {
"device_list": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"depth_rating": {
"type": "integer",
"example": "700"
},
"name": {
"type": "string",
"example": "Blueye Blind Plug"
},
"manufacturer": {
"type": "string",
"example": "Blueye Robotics"
},
"serial_number": {
"type": "string",
"example": "BP00-00000"
}
}
}
}
}
},
"guest_port_number": {
"type": "string",
"enum": [
"GUEST_PORT_NUMBER_PORT_1",
"GUEST_PORT_NUMBER_PORT_2",
"GUEST_PORT_NUMBER_PORT_3"
],
"example": "GUEST_PORT_NUMBER_PORT_2"
}
}
},
{
"type": "object",
"properties": {
"error": {
"type": "string",
"description": "Error code for what went wrong with\nthe guest port",
"example": "GUEST_PORT_ERROR_NOT_FLASHED"
}
}
}
]
},
"gp3": {
"oneOf": [
{
"type": "object",
"properties": {
"device_list": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"depth_rating": {
"type": "integer",
"example": "700"
},
"name": {
"type": "string",
"example": "Blueye Blind Plug"
},
"manufacturer": {
"type": "string",
"example": "Blueye Robotics"
},
"serial_number": {
"type": "string",
"example": "BP00-00000"
}
}
}
}
}
},
"guest_port_number": {
"type": "string",
"enum": [
"GUEST_PORT_NUMBER_PORT_1",
"GUEST_PORT_NUMBER_PORT_2",
"GUEST_PORT_NUMBER_PORT_3"
],
"example": "GUEST_PORT_NUMBER_PORT_3"
}
}
},
{
"type": "object",
"properties": {
"error": {
"type": "string",
"description": "Error code for what went wrong with\nthe guest port",
"example": "GUEST_PORT_ERROR_NOT_FLASHED"
}
}
}
]
}
}
}
}
}
Response 404 Not Found
No dive info found
"string"
Schema
{
"type": "string",
"description": "No dive info found"
}
Code Samples
curl -X GET "http://192.168.1.101/logs/BYEDP070018_ea9add4d0c1961d4_00386/dive_info"
import requests
# Path parameters
logname = "BYEDP070018_ea9add4d0c1961d4_00386"
response = requests.get(f"http://192.168.1.101/logs/{logname}/dive_info")
print(response.json())
Legacy logs
CSV log file operations
Array of logs
GET /logcsv/
Returns an array of logs from the drone. Each array item represents an available log file on the drone. Use the /logcsv/{filename} endpoint to get the full log.
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
all |
query | string | No | Add all to the parameter list to show logs that are not classified asdives (no auto functions enabled, and max depth < 0.25m). All logs will be shown regardless of the content of the all parameter (even false, 0, etc). |
|||
filter_depth_min_mm |
query | integer | 250 | No | Filter the minimum depth of the listed logs. Will be ignored if all isincluded in parameter list. |
Response 200 OK
[
{
"name": "ea9ac92e1817a1d4-00073.csv",
"binsize": 1099448,
"timestamp": "2019-01-01T00:00:00.000001",
"maxdepth": 21050
}
]
Schema
{
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the logfile. First part is the drones unique id,\nsecond part is the dive count.",
"example": "ea9ac92e1817a1d4-00073.csv"
},
"binsize": {
"type": "integer",
"description": "Size of the log file. Unit is bytes.",
"example": 1099448
},
"timestamp": {
"type": "string",
"description": "Start time of the dive. Unit is ISO8601 datetime without\ntimezone data.",
"example": "2019-01-01T00:00:00.000001"
},
"maxdepth": {
"type": "number",
"format": "float",
"description": "Maximum depth reached during the dive. Unit is\nmillimeters.",
"example": 21050
}
}
}
}
Code Samples
curl -X GET -G "http://192.168.1.101/logcsv/"
import requests
# Query parameters
params = {
}
response = requests.get(f"http://192.168.1.101/logcsv/", params=params)
print(response.json())
CSV log-file
Downloads a comma-separated-value (CSV) log-file with the requested name.
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
divisor |
query | integer | 10 | No | Divisor to use when downsampling CSV before downloading. Set to 1 to get max resolution. |
||
filenameRequired |
path | string | No | Filename of log to download (format: {machineid}-{logid}) |
Response 200 OK
"string"
Schema
{
"type": "string"
}
Code Samples
curl -X GET -G "http://192.168.1.101/logcsv/ea9ac92e1817a1d4-00090"
import requests
# Path parameters
filename = "ea9ac92e1817a1d4-00090"
# Query parameters
params = {
}
response = requests.get(f"http://192.168.1.101/logcsv/{filename}", params=params)
with open(f"{filename}.csv", "wb") as f:
f.write(response.content)
Zipped CSV log files
Download all CSV log files as a zlib compressed zip file
Response 200 OK
All the csv log files compressed into one archive
"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQ="
Schema
{
"type": "string",
"format": "binary",
"description": "All the csv log files compressed into one archive"
}
Code Samples
curl -X GET "http://192.168.1.101/logcsv/binary_logs.zip"
import requests
response = requests.get("http://192.168.1.101/logcsv/binary_logs.zip")
with open("output.zip", "wb") as f:
f.write(response.content)
Photogrammetry
Dive-specific data extraction
Download CSV file with data for creating scaled 3D models
GET /agisoft
Download CSV file with data for creating scaled 3D models in Agisoft
Input parameters
| Parameter | In | Type | Default | Minimum | Maximum | Nullable | Description |
|---|---|---|---|---|---|---|---|
fileRequired |
query | string | No | Name of the video file to download data for | |||
frame-step |
query | integer | 1 | No | Amount of steps between each frame grab | ||
mag-dist |
query | integer | 180 | No | Expected compass variance induced from magnetic disturbance in degrees. The most important data for an accurate 3D model are roll and pitch, which are not affected by magnetic disturbance, so the default is set quite high (180). If you trust that the data has not been skewed by magnetic interference you can set this to a medium (60) or even low (10) value. |
||
no-file-check |
query | boolean | No | Skip video file existence check | |||
title |
query | string | frame | No | Prefix title for each frame. Frame number and .png will be appended. |
Response 200 OK
CSV file with data for Agisoft
"Label;X;Y;Z;X Accuracy;Y Accuracy;Z Accuracy;Yaw;Pitch;Roll;Yaw Accuracy;Pitch Accuracy;Roll Accuracy;Enable\nframe0.png;0.0;0.0;0.253;10.0;10.0;0.05;0.7;82.7;1.0;180.0;5.0;5.0;1"
Schema
{
"type": "string",
"description": "CSV file with data for Agisoft",
"example": "Label;X;Y;Z;X Accuracy;Y Accuracy;Z Accuracy;Yaw;Pitch;Roll;Yaw Accuracy;Pitch Accuracy;Roll Accuracy;Enable\nframe0.png;0.0;0.0;0.253;10.0;10.0;0.05;0.7;82.7;1.0;180.0;5.0;5.0;1"
}
Response 400 Bad Request
No videoname or invalid options
"string"
Schema
{
"type": "string",
"description": "No videoname or invalid options"
}
Response 404 Not Found
Log file not found or not valid
"string"
Schema
{
"type": "string",
"description": "Log file not found or not valid"
}
Code Samples
curl -X GET -G "http://192.168.1.101/agisoft" \
-d "file=video_BYEDP123456_2019-01-01_000001.mp4"
import requests
# Query parameters
params = {
"file": "video_BYEDP123456_2019-01-01_000001.mp4",
}
response = requests.get(f"http://192.168.1.101/agisoft", params=params)
with open("output.csv", "wb") as f:
f.write(response.content)
System
Diagnostics
System diagnostics and health monitoring
Drone information
Returns a JSON string of drone information. Using this endpoint is the easiest way to check if there is a drone connected to your network.
Response 200 OK
{
"commit_id_csys": "299238949a",
"depth_sensor": "MS5837_30BA26",
"features": "tilt,gpdrone",
"hardware_id": "ea9ac92e1817a1d4",
"manufacturer": "Blueye Robotics",
"model_description": "X3 Underwater Drone",
"model_name": "Blueye X3",
"model_url": "https://www.blueyerobotics.com",
"operating_system": "blunux",
"serial_number": "BYEDP123456",
"sw_version": "1.4.7-warrior-master",
"services": [
{
"type": "videostream",
"options": {
"primary": true,
"url": "rtsp://192.168.1.101:8554/test"
}
}
],
"persistent_storage": {
"acc_calibration": true,
"binlog": true,
"compass_calibration": true,
"control_system_log": true,
"gyro_calibration": true,
"images": true,
"multibeam": true,
"videos": true,
"webserver_log": true
},
"required_app_version": {
"android": "3.10",
"ios": "3.10"
},
"guest_port_info": {
"gp1": {
"device_list": {
"devices": [
{
"depth_rating": 700,
"name": "Blueye Blind Plug",
"manufacturer": "Blueye Robotics",
"serial_number": "BP00-00000"
}
]
},
"guest_port_number": "GUEST_PORT_NUMBER_PORT_1"
},
"gp2": {
"error": "GUEST_PORT_ERROR_NOT_FLASHED"
},
"gp3": {
"error": "GUEST_PORT_ERROR_NOT_FLASHED"
}
}
}
{
"commit_id_csys": "abc123def4",
"depth_sensor": "Keller_PA7LD",
"features": "tilt",
"hardware_id": "12345678abcdef90",
"manufacturer": "Blueye Robotics",
"model_description": "Pioneer Underwater Drone",
"model_name": "Pioneer",
"model_url": "https://www.blueyerobotics.com",
"operating_system": "blunux",
"serial_number": "BYEDP000123",
"sw_version": "2.1.0-dunfell-release",
"services": [
{
"type": "videostream",
"options": {
"primary": true,
"url": "rtsp://192.168.1.101:8554/test"
}
}
],
"persistent_storage": {
"acc_calibration": true,
"binlog": true,
"compass_calibration": false,
"control_system_log": true,
"gyro_calibration": true,
"images": false,
"multibeam": false,
"videos": true,
"webserver_log": true
},
"required_app_version": {
"android": "3.10",
"ios": "3.10"
}
}
Schema
{
"type": "object",
"description": "Response serializer for drone_info endpoint",
"properties": {
"commit_id_csys": {
"type": "string",
"description": "Commit-id of the software currently running on the drone."
},
"depth_sensor": {
"type": "string",
"description": "Name of the depth sensor, f. ex. MS5837_30BA26, Keller_PA7LD. Available from Blunux 2.3"
},
"features": {
"type": "string",
"description": "Comma-separated list of available features on the drone."
},
"hardware_id": {
"type": "string",
"description": "Unique hardware id of the built-in single board computer."
},
"manufacturer": {
"type": "string"
},
"model_description": {
"type": "string",
"description": "Description of the drone model."
},
"model_name": {
"$ref": "#/components/schemas/ModelNameEnum"
},
"model_url": {
"type": "string"
},
"operating_system": {
"type": "string",
"description": "The operating system currently running on the drone."
},
"serial_number": {
"type": "string",
"description": "Serial number for the whole drone package as it left the factory."
},
"sw_version": {
"type": "string",
"description": "Human-friendly name of software running on the drone. Format is $(Major).$(Minor).$(Build)-$(Yocto version)-$(Branch)"
},
"services": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Service"
}
},
"persistent_storage": {
"$ref": "#/components/schemas/PersistentStorage"
},
"required_app_version": {
"$ref": "#/components/schemas/RequiredAppVersion"
},
"guest_port_info": {
"$ref": "#/components/schemas/GuestPortInfo"
}
},
"required": [
"commit_id_csys",
"depth_sensor",
"features",
"hardware_id",
"manufacturer",
"model_description",
"model_name",
"model_url",
"operating_system",
"persistent_storage",
"required_app_version",
"serial_number",
"services",
"sw_version"
]
}
Code Samples
curl -X GET "http://192.168.1.101/diagnostics/drone_info"
import requests
response = requests.get("http://192.168.1.101/diagnostics/drone_info")
print(response.json())
Tether bandwidth test
Deprecated Endpoint
Use POST method instead.
Performs a bandwidth test on the connection between the surface unit and the drone. Always uses a fixed duration of 10 seconds.
Response 200 OK
{
"received_Mbps": 79.55458795899487,
"sent_Mbps": 80.37122746322603,
"success": true
}
Schema
{
"type": "object",
"properties": {
"received_Mbps": {
"type": "number",
"format": "float",
"description": "Bandwidth from surface unit to drone. Unit is Mbps.",
"example": 79.55458795899487
},
"sent_Mbps": {
"type": "number",
"format": "float",
"description": "Bandwidth from drone to surface unit. Unit is Mbps.",
"example": 80.37122746322603
},
"success": {
"type": "boolean",
"description": "If the test was succesful or not.",
"enum": [
true,
false
],
"example": true
}
}
}
Code Samples
curl -X GET "http://192.168.1.101/diagnostics/iperf"
import requests
response = requests.get("http://192.168.1.101/diagnostics/iperf")
print(response.json())
Tether bandwidth test
POST /diagnostics/iperf
Performs a bandwidth test on the connection between the surface unit and the drone. Set the test duration with the "duration"-parameter. A longer duration should yield a more accurate result.
Request body
{
"duration": 0
}
Schema of the request body
{
"type": "object",
"properties": {
"duration": {
"type": "integer",
"description": "Test duration",
"default": 10,
"minimum": 0
}
}
}
Response 200 OK
{
"received_Mbps": 79.55458795899487,
"sent_Mbps": 80.37122746322603,
"success": true
}
Schema
{
"type": "object",
"properties": {
"received_Mbps": {
"type": "number",
"format": "float",
"description": "Bandwidth from surface unit to drone. Unit is Mbps.",
"example": 79.55458795899487
},
"sent_Mbps": {
"type": "number",
"format": "float",
"description": "Bandwidth from drone to surface unit. Unit is Mbps.",
"example": 80.37122746322603
},
"success": {
"type": "boolean",
"description": "If the test was succesful or not.",
"enum": [
true,
false
],
"example": true
}
}
}
Code Samples
curl -X POST "http://192.168.1.101/diagnostics/iperf" \
-d "duration=10"
import requests
data = {
"duration": "10",
}
response = requests.post(f"http://192.168.1.101/diagnostics/iperf", data=data)
print(response.json())
Surface unit
Update the surface unit firmware
POST /surface_unit/update
Updates the surface unit firmware. If a binary image is included in the request, it will use that image for the update. If not, it will use the version stored on the drone.
Request body
{
"update-file": "firmware.bin"
}
Schema of the request body
{
"type": "object",
"properties": {
"update-file": {
"type": "string",
"format": "binary",
"description": "The upgrade file for the surface unit.",
"example": "firmware.bin"
}
}
}
Response 200 OK
Update initialized successfully.
"string"
Schema
{
"type": "string",
"description": "Update initialized successfully."
}
Response 400 Bad Request
Invalid request type or unable to authorize with the surface unit
"string"
Schema
{
"type": "string",
"description": "Invalid request type or unable to authorize with the surface unit"
}
Code Samples
curl -X POST "http://192.168.1.101/surface_unit/update"
--form 'update-file=@"firmware.bin"'
import requests
with open("firmware.bin", "rb") as f:
files = {'update-file': f}
response = requests.post(f"http://192.168.1.101/surface_unit/update", files=files)
print(response.text)
Get current version(s)
Get version of update file stored on drone and the version installed on the surface unit
Response 200 OK
{
"version_on_drone": {
"version": "2.2.4-master.190",
"commit": "815cce8a95ea0d448a85996bcf82a241109d575b"
},
"installed_version": {
"version": "2.2.4-master.190",
"commit": "815cce8a95ea0d448a85996bcf82a241109d575b"
}
}
Schema
{
"type": "object",
"properties": {
"version_on_drone": {
"type": "object",
"properties": {
"version": {
"type": "string",
"description": "Version string for surface unit firmware. Format is\n{major}.{minor}.{patch}-{branch}.{build}\n",
"example": "2.2.4-master.190"
},
"commit": {
"type": "string",
"description": "Commit id of the surface unit firmware.\n",
"example": "815cce8a95ea0d448a85996bcf82a241109d575b"
}
}
},
"installed_version": {
"type": "object",
"properties": {
"version": {
"type": "string",
"description": "Version string for surface unit firmware. Format is\n{major}.{minor}.{patch}-{branch}.{build}",
"example": "2.2.4-master.190"
},
"commit": {
"type": "string",
"description": "Commit id of the surface unit firmware.",
"example": "815cce8a95ea0d448a85996bcf82a241109d575b"
}
}
}
}
}
Code Samples
curl -X GET "http://192.168.1.101/surface_unit/version"
import requests
response = requests.get("http://192.168.1.101/surface_unit/version")
print(response.json())