Skip to content

Blueye HTTP API 1.1.0

API for Blueye drone diagnostics and system management


Media

Pictures

Picture processing and download


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 logo
1 - 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 - Enable
0 - Disable
field-depth query integer 1 No Display water depth in the image overlay.
1 - Enable
0 - 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 - Enable
0 - Disable
field-guestport query integer 1 No Display data from connected guestport sensors in the image overlay.
1 - Enable
0 - Disable
field-heading query integer 1 No Display compass heading in the image overlay.
1 - Enable
0 - Disable
field-temp query integer 1 No Display water temperature in the image overlay.
1 - Enable
0 - Disable
field-tilt query integer 0 No Display camera tilt angle in the image overlay.
1 - Enable
0 - Disable
file
Required
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 and
subtitle is not specified, the title and/or subtitle selected for the video overlay will be
written unless this parameter is enabled.

1 - Ignore exif titles
0 - 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 unit
feet - Imperial unit
logo query integer 0 No Which logo to overlay.
0 - No logo
1 - 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 unit
fahrenheit - 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

GET /picture/thumbnail

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
file
Required
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


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)

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 /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.
file
Required
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

GET /logs/{logname}/binlog

Returns the binary content of the requested log

Input parameters

Parameter In Type Default Minimum Maximum Nullable Description
logname
Required
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

GET /logs/{logname}/dive_info

Returns extended meta data for the requested log.

Input parameters

Parameter In Type Default Minimum Maximum Nullable Description
logname
Required
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 as
dives (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 is
included 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

GET /logcsv/{filename}

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.
filename
Required
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

GET /logcsv/binary_logs.zip

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
file
Required
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

GET /diagnostics/drone_info

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

GET /diagnostics/iperf

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 /surface_unit/version

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())