Download OpenAPI specification:
This document describes the HTTP-based local API supported by CANlink mobile 10000 devices.
Protocol: HTTPS, REST.
Authorization: Basic Authentication, required user is api or admin.
Authentication failure results in HTTP error 401 Unauthorized.
curl examples in this document use the plain-text authentication option --user username:password, but this can also be replaced with an Authorization header containing Basic followed by a base64-encoded username:password string. For instance, to authorize as user api with password password, use --user api:password or the header -H 'Authorization: Basic YXBpOnBhc3N3b3Jk'.
Certificate: The device provides a self-signed certificate, so the curl examples in this document use --insecure to skip TLS certificate verification.
Response type: JSON (Content-Type: application/json), with one exception — GET /api/downloads/{fileId}/content returns the raw file as application/octet-stream.
Every JSON endpoint wraps its result in a common envelope:
{"data": {"items": [ ... ]}}
This applies even to single-resource endpoints such as GET /api/device-info — the items array always holds exactly one element there. There is no bare/unwrapped object response anywhere in this API.
GET is supported on every /api/* resource; DELETE is additionally supported for the downloads resource. Any other HTTP method on an /api/* path returns 405 Method Not Allowed, and an unrecognized resource under /api/ returns 404 Not Found. See each endpoint's own responses for the specific conditions that trigger 400/404/500 for that endpoint.
POST /upload, POST /config and POST /firmware are bare top-level paths (no /api prefix) served by the same host, but are not part of the JSON envelope convention above: they accept multipart/form-data bodies (a single part named exactly file) and always return a zero-length response body regardless of outcome — only the HTTP status code is meaningful.
Return identity, hardware and firmware information for the device.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/device-info"
{- "data": {
- "items": [
- {
- "oem_variant": "standard",
- "api_compatibility": 0,
- "hardware_version": "Hw 0.0 469",
- "wake_up_reason": "WAKE_UP_REASON_CLAMP30",
- "firmware_version": "x.y.z",
- "firmware_update_time_ms": 9999999,
- "serial_number": "SN123456"
}
]
}
}Return the device's current UTC time.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/datetime"
{- "data": {
- "items": [
- {
- "utc_seconds_from_epoch": 123456789
}
]
}
}Read current configuration option values, and push configuration update files to the device.
Lists configuration options and their current values. No sensitive information is shared. Without any query parameter, all options are returned. The option parameter narrows the output to a single configuration option. Some options are profile-based (group_name-scoped) — e.g. per-profile Ethernet, WiFi or modem settings — and require group_name to be supplied alongside option; omitting it for such an option results in a 400 Bad Request. The group_name parameter on its own narrows the output to all options of a specific configuration group.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/config"
Filtered by option and profile:
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/config?option=CFG_OPTION_STR_IF_ETHERNET_IPV4_ADDRESS&group_name=Test%20group"
| option | string (ConfigOptionName) Enum: "CFG_OPTION_STR_DP_CU_ID" "CFG_OPTION_BOOL_DP_AUTO_UPLOAD_ENABLED" "CFG_OPTION_BOOL_ACCESS_LOCAL_UPLOAD_ENABLED" "CFG_OPTION_BOOL_IF_MODEM_ENABLED" "CFG_OPTION_BOOL_IF_MODEM_AUTOCONNECT" "CFG_OPTION_STR_IF_MODEM_APN" "CFG_OPTION_BOOL_IF_ETHERNET_ENABLED" "CFG_OPTION_BOOL_IF_ETHERNET_AUTOCONNECT" "CFG_OPTION_STR_IF_ETHERNET_IPV4_ADDRESS" "CFG_OPTION_STR_IF_ETHERNET_IPV4_METHOD" "CFG_OPTION_STR_IF_ETHERNET_IPV4_DHCP_FIRST_ADDRESS" "CFG_OPTION_STR_IF_ETHERNET_IPV4_DHCP_LAST_ADDRESS" "CFG_OPTION_BOOL_IF_WIFI_ENABLED" "CFG_OPTION_BOOL_IF_WIFI_AUTOCONNECT" "CFG_OPTION_UINT32_IF_WIFI_CHANNEL" "CFG_OPTION_STR_IF_WIFI_BAND" "CFG_OPTION_BOOL_IF_WIFI_HIDDEN_SSID" "CFG_OPTION_BYTES_IF_WIFI_SSID" "CFG_OPTION_BYTES_IF_WIFI_BSSID" "CFG_OPTION_STR_IF_WIFI_MODE" "CFG_OPTION_STR_IF_WIFI_SECURITY_KEY_MANAGEMENT" "CFG_OPTION_STR_IF_WIFI_IPV4_ADDRESS" "CFG_OPTION_STR_IF_WIFI_IPV4_METHOD" "CFG_OPTION_STR_IF_WIFI_IPV4_DHCP_FIRST_ADDRESS" "CFG_OPTION_STR_IF_WIFI_IPV4_DHCP_LAST_ADDRESS" "CFG_OPTION_BOOL_GNSS_ENABLED" "CFG_OPTION_BOOL_GNSS_GLONASS_ENABLED" "CFG_OPTION_BOOL_GNSS_BEIDOU_ENABLED" "CFG_OPTION_BOOL_GNSS_GALILEO_ENABLED" "CFG_OPTION_STR_DATETIME_TIMEZONE" "CFG_OPTION_UINT16_CFG_VERSION" "CFG_OPTION_BOOL_PWR_SLEEP_MODE_ENABLED" "CFG_OPTION_BOOL_PWR_TRANSPORT_MODE_ENABLED" "CFG_OPTION_UINT16_API_COMPATIBILITY" "CFG_OPTION_UINT32_IF_MODEM_MTU" "CFG_OPTION_BOOL_IF_BRIDGE_ENABLED" "CFG_OPTION_STR_IF_BRIDGE_WIFI_BAND" "CFG_OPTION_BOOL_IF_BRIDGE_WIFI_HIDDEN_SSID" "CFG_OPTION_BYTES_IF_BRIDGE_WIFI_SSID" "CFG_OPTION_BYTES_IF_BRIDGE_WIFI_BSSID" "CFG_OPTION_STR_IF_BRIDGE_WIFI_SECURITY_KEY_MANAGEMENT" "CFG_OPTION_STR_IF_BRIDGE_IPV4_ADDRESS" "CFG_OPTION_STR_IF_BRIDGE_IPV4_METHOD" "CFG_OPTION_STR_IF_BRIDGE_IPV4_DHCP_FIRST_ADDRESS" "CFG_OPTION_STR_IF_BRIDGE_IPV4_DHCP_LAST_ADDRESS" Filter to a single configuration option. See |
| group_name | string Example: group_name=Test group Name of a configuration profile (dynamic/group-based option group, e.g. an Ethernet, WiFi or modem connection profile). Required when |
{- "data": {
- "items": [
- {
- "option": "CFG_OPTION_STR_DP_CU_ID",
- "group_name": "Test group",
- "value": true
}
]
}
}Upload a configuration file to be applied to the device. This is a distinct, bare top-level path — not the same resource as GET /api/config (which only reads current configuration values over JSON). Uploading a file here triggers the same process as applying a configuration update through the CANlink mobile 10000's WebUI.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X POST \
--insecure \
--user "admin:yourPassword" \
-F "file=@./device-config.clm" \
"https://192.168.82.1/config"
The configuration file to apply.
| file required | string <binary> The file to upload, as a multipart part named exactly |
Return information about the most recent firmware update attempt.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/firmware-update"
{- "data": {
- "items": [
- {
- "firmware_version_before_update": "a.b.c",
- "firmware_update_time_ms": 6666666,
- "target_firmware_version": "x.y.z",
- "success": true
}
]
}
}Return the current in-progress firmware update state, if any.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/state-firmware-update"
{- "data": {
- "items": [
- {
- "state": "FIRMWARE_UPDATE_STATE_NONE",
- "source": "DATA_SOURCE_LOCAL",
- "transfer_progress_percent": 60
}
]
}
}Upload a .swu firmware image to flash onto the CANlink mobile 10000. A 200 response only confirms the image was fully transferred to the device — it does not confirm that flashing itself succeeded. Track the actual firmware update progress via GET /api/state-firmware-update; on success, the device reboots into the new firmware. If a firmware update is already in progress, the request is rejected immediately. There is no application-level file size limit; the Content-Length header is used only to compute a progress percentage, not to reject oversized bodies.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X POST \
--insecure \
--user "admin:yourPassword" \
-F "file=@./firmware-image.swu" \
"https://192.168.82.1/firmware"
The firmware image (.swu) to flash.
| file required | string <binary> The file to upload, as a multipart part named exactly |
Return the device's system uptime.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/state-system"
{- "data": {
- "items": [
- {
- "uptime": 0
}
]
}
}Return whether the device is currently connected to the DataPlatform.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/state-server"
{- "data": {
- "items": [
- {
- "connected": true
}
]
}
}Return connection/interface state for one or all network interfaces.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/state-network?type=NETWORK_TYPE_MODEM"
| type | string (NetworkType) Enum: "NETWORK_TYPE_MODEM" "NETWORK_TYPE_ETHERNET" "NETWORK_TYPE_WIFI" "NETWORK_TYPE_BRIDGE" Restrict the result to a single interface type. If omitted, all four interface types are returned (any type unsupported by the current hardware variant is silently skipped). If given explicitly and unsupported by the hardware, the request fails with |
{- "data": {
- "items": [
- {
- "type": "NETWORK_TYPE_MODEM",
- "active": true,
- "connection": {
- "active_profile": "Modem Test Connection",
- "ip": [
- "10.0.0.1/24"
], - "gateway": "192.168.0.1",
- "dhcp_first_addr": "string",
- "dhcp_last_addr": "string",
- "dns": [
- "8.8.4.4"
]
}, - "interface": {
- "modem_signal_quality": 50,
- "ethernet_carrier": true,
- "current_state": {
- "state": "NETWORK_IF_STATE_UNKNOWN",
- "description": "string",
- "timestamp_ms": 0
}, - "last_error_state": {
- "state": "NETWORK_IF_STATE_UNKNOWN",
- "description": "string",
- "timestamp_ms": 0
}
}, - "wan": true
}
]
}
}Return the device's current GNSS status. If GNSS is disabled, only enabled: false is returned.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/gnss"
{- "data": {
- "items": [
- {
- "enabled": true,
- "fix": "GNSS_FIX_DGPS",
- "fix_mode": "GNSS_FIX_MODE_NONE",
- "timestamp": 123456,
- "num_satellites": 8,
- "longitude": 34.75,
- "latitude": 12.34,
- "altitude": 56.25,
- "speed": 123.456,
- "track": 1.2
}
]
}
}All endpoints in this group relate to the file transfer functionality between the CANlink mobile 10000 and the Proemion DataPlatform.
The CANlink mobile 10000 device is capable of receiving files from the DataPlatform. The user can upload any file to the DataPlatform which will push it to the CANlink mobile 10000, thus making it available on the CANlink mobile 10000 local network. A common use case is to upload update and configuration files for ECUs connected to the CANlink mobile 10000 network.
Files uploaded to the DataPlatform are then transferred to the CANlink mobile 10000 which will hold them in the downloads location. Note that due to the implementation of the file transfer process, files that are still incomplete because they are still being transferred will be named part.{random}. Files that match this pattern should be ignored because they have still not been fully transferred to the CANlink mobile 10000.
List all files available in the downloads directory.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/downloads"
{- "data": {
- "items": [
- {
- "id": "8c9890dd-2da4-54e1-886f-7a031884a5fa",
- "filename": "update-file.bin",
- "timestamp": 1713988747,
- "size": 87833753
}
]
}
}Remove all files from the downloads directory.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X DELETE \
--insecure \
--user "admin:yourPassword" \
"https://192.168.82.1/api/downloads"
Get info of a specific file in the downloads directory.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/json" \
"https://192.168.82.1/api/downloads/8c9890dd-2da4-54e1-886f-7a031884a5fa"
| fileId required | string <uuid> Example: 8c9890dd-2da4-54e1-886f-7a031884a5fa UUIDv5 of the file. |
{- "data": {
- "items": [
- {
- "id": "8c9890dd-2da4-54e1-886f-7a031884a5fa",
- "filename": "update-file.bin",
- "timestamp": 1713988747,
- "size": 87833753
}
]
}
}Remove a file from the downloads directory.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X DELETE \
--insecure \
--user "admin:yourPassword" \
"https://192.168.82.1/api/downloads/8c9890dd-2da4-54e1-886f-7a031884a5fa"
| fileId required | string <uuid> Example: 8c9890dd-2da4-54e1-886f-7a031884a5fa UUIDv5 of the file. |
Download the raw contents of a given file.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/octet-stream" \
"https://192.168.82.1/api/downloads/8c9890dd-2da4-54e1-886f-7a031884a5fa/content"
This example prints file contents to the console output. If the received data has a binary form, curl will raise a warning and ask to save contents into a file.
Save file contents in /tmp/update-file.bin:
curl -X GET \
--insecure \
--user "admin:yourPassword" \
-H "Accept: application/octet-stream" \
"https://192.168.82.1/api/downloads/8c9890dd-2da4-54e1-886f-7a031884a5fa/content" --output "/tmp/update-file.bin"
| fileId required | string <uuid> Example: 8c9890dd-2da4-54e1-886f-7a031884a5fa UUIDv5 of the file. |
Submit a file to the device to be queued for transfer to the DataPlatform. The uploaded filename is sanitized, and the file is then stored persistently on the device until it has been successfully transferred to the DataPlatform (this response only confirms the file was received and queued — it does not confirm the DataPlatform transfer itself). If the upload is repeatedly interrupted or currently not possible, the device keeps retrying to send queued files to the DataPlatform (subject to the CFG_OPTION_BOOL_DP_AUTO_UPLOAD_ENABLED configuration option being enabled). There is no application-level file size limit; practical limits are disk space and connection timeout.
All examples assume HTTP Basic Authentication (--user admin:yourPassword) and a self-signed TLS certificate on the device, hence --insecure.
curl -X POST \
--insecure \
--user "admin:yourPassword" \
-F "file=@./update-file.bin" \
"https://192.168.82.1/upload"
The file to upload.
| file required | string <binary> The file to upload, as a multipart part named exactly |