List a device's telemetry
const url = 'https://api.canaro.ca/external/v1/devices/example/telemetry?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/example/telemetry?limit=50' \ --header 'Authorization: Bearer <token>'A device’s telemetry readings, newest first.
A request may span at most the plan’s history_max_days (null = no limit).
A wider window is refused with range_too_large; given neither after
nor before, you get the most recent days allowed.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Query Parameters
Section titled “Query Parameters”Responses
Section titled “Responses”Successful Response
A page of readings for one device, newest first.
object
One telemetry reading as the device reported it.
object
When the reading was received, RFC 3339 UTC.
Sensor keys and their values, as reported.
object
Example
{ "data": [ { "recorded_at": "2026-09-04T17:12:03Z", "values": { "battery": 92, "humidity": 71.4, "temperature": 6.2 } } ], "device_id": "TCTA-F2EA5A000001"}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.

