Skip to content

List devices

GET
/devices
curl --request GET \
--url 'https://api.canaro.ca/external/v1/devices?limit=50' \
--header 'Authorization: Bearer <token>'

List the workspace’s devices, hubs and add-ons alike, by device id.

Add-ons are returned beside their hubs rather than nested under them, so one page is one flat list; parent_device_id says which hub an add-on reports to.

limit
Limit
integer
default: 50 >= 1 <= 200
cursor
Any of:
string

A cursor from a previous page.

Successful Response

Media typeapplication/json
DeviceList

A page of devices.

object
data
required
Data
Array<object>
Device

One device in the workspace: a hub, or an add-on nested under one.

object
device_id
required
Device Id

Stable identifier; use it to fetch this device.

string
firmware_version
Any of:
string
is_addon
required
Is Addon

Whether this is an add-on rather than a hub.

boolean
last_seen_at
Any of:
string format: date-time
latitude
Any of:
number
lifecycle_status
required
Lifecycle Status

Active, paused, shelved or retired.

string
location_updated_at
Any of:
string format: date-time
longitude
Any of:
number
model_id
Any of:
string
name
Any of:
string
online
required
Online

Whether the device is currently reporting.

boolean
parent_device_id
Any of:
string
presence
required
Presence

Why it is or is not reporting.

string
tags
Tags
Array<string>
next_cursor
Any of:
string
Example
{
"data": [
{
"device_id": "TCTA-F2EA5A000001",
"firmware_version": "2.4.1",
"is_addon": false,
"last_seen_at": "2026-09-04T17:12:03Z",
"latitude": 51.0447,
"lifecycle_status": "active",
"location_updated_at": "2026-08-27T09:31:00Z",
"longitude": -114.0719,
"model_id": "canaro_pro",
"name": "North Barn",
"online": true,
"presence": "online",
"tags": [
"barn",
"priority"
]
}
],
"next_cursor": "eyJkZXZpY2VfaWQiOiJUQ1RBLUYyRUE1QTAwMDAwMSJ9"
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

The key is missing, unknown, revoked or expired.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
WWW-Authenticate
string

Always Bearer.

X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

The plan grants no external API access, or the key lacks the required scope.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

No such resource in this key’s workspace, or no such endpoint.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

That method is not allowed on this endpoint.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

The request could not be understood, or its time range is too wide.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

The workspace’s external allowance is spent.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
Retry-After
integer

Whole seconds to wait before retrying. Never less than one.

X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.

Something went wrong on our side.

Media typeapplication/json
ErrorResponse

Every non-success response the external API produces.

object
error
required
Error

What a refusal says. code is drawn from one declared set; per-code members such as required_scope and max_days are additive.

object
code
required
Code

Machine-readable reason, from the published set.

string
message
required
Message

What went wrong, in words.

string
key
additional properties
any
Example
{
"error": {
"code": "insufficient_scope",
"message": "This key does not hold devices:read.",
"required_scope": "devices:read"
}
}
X-RateLimit-Limit
integer

Requests allowed in the window this response was counted against.

X-RateLimit-Remaining
integer

Requests left in that window. A refusal costs no allowance.