Fetch a device
const url = 'https://api.canaro.ca/external/v1/devices/example';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/example \ --header 'Authorization: Bearer <token>'Fetch one device of the workspace by its id.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”Successful Response
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
{ "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" ]}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.

