List devices
const url = 'https://api.canaro.ca/external/v1/devices?limit=50';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Responses
Section titled “Responses”Successful Response
A page of devices.
object
One device in the workspace: a hub, or an add-on nested under one.
object
Stable identifier; use it to fetch this device.
Whether this is an add-on rather than a hub.
Active, paused, shelved or retired.
Whether the device is currently reporting.
Why it is or is not reporting.
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"}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
The key is missing, unknown, revoked or expired.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Always Bearer.
Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
The plan grants no external API access, or the key lacks the required scope.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
No such resource in this key’s workspace, or no such endpoint.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
That method is not allowed on this endpoint.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
The request could not be understood, or its time range is too wide.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
The workspace’s external allowance is spent.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Whole seconds to wait before retrying. Never less than one.
Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.
Something went wrong on our side.
Every non-success response the external API produces.
object
What a refusal says. code is drawn from one declared set; per-code
members such as required_scope and max_days are additive.
object
Machine-readable reason, from the published set.
What went wrong, in words.
Example
{ "error": { "code": "insufficient_scope", "message": "This key does not hold devices:read.", "required_scope": "devices:read" }}Headers
Section titled “Headers”Requests allowed in the window this response was counted against.
Requests left in that window. A refusal costs no allowance.

