API reference
Dashboard tiles
The numbers on the dashboard: which tiles exist and their current values.
Get tile values
GET/v0/tenants/{tenant_id}/kpi
The current value of up to 20 tiles, each computed exactly like its detail page (for example devices_online = the Map's online devices). An id that is not in the catalog refuses the call (400); a tile your role may not use is left out and listed in dropped. A tile that cannot be computed carries error without failing the others. Values are cached for up to 5 minutes.
Token: read-only or full access · Created by: owner or security admin
Rate limit: 60 dashboard-tile calls per minute per person.
Path parameters
- tenant_idstringrequired
Your workspace id (Settings → Workspace in the console; it is also in every console URL).
Query parameters
- idsstring
Comma-separated tile ids.
- rangestring
Trend length:
7d(default) or30d.
Responses
200 The values.
application/json
- rangestringrequired
- itemsarray of objectrequired
items fields
- idstringrequired
- valuenumber | null
- unitstring
- statestring
- reasonstring
Why a tile is
not_availableorbuilding, e.g.no_devices,not_checked_yet,overlay_unavailable. - countsobject
Small counts that explain the value (e.g.
totalfor a ratio,unknownfor second-step coverage). - trendobject | null
{ step: "1d", points: [{ t: "YYYY-MM-DD", v }] }, oldest first; null for tiles without a trend. - errorobject
Set instead of
valuewhen this one tile could not be computed; the other tiles are unaffected.error fields
- codestring
- messagestring
- as_ofstring
When the value was computed (values are cached for up to 5 minutes).
- droppedarray of string
Requested tiles that are not available to your role.
400 invalid-range unknown-tile
invalid-range: range is not 7d or 30d.
unknown-tile: An id is not a tile from the catalog, or more than 20 tiles were asked for.
401 unauthorized invalid-token token-expired
unauthorized: No Authorization: Bearer crw_… header was sent.
invalid-token: The token is unknown or was revoked.
token-expired: The token is past its expiry date. Create a new one.
403 insufficient-role tenant-assertion-mismatch
insufficient-role: The token's role ceiling does not allow this call.
tenant-assertion-mismatch: The token belongs to another workspace than {tenant_id}.
404 tenant-not-found
tenant-not-found: No workspace with this id.
429 rate-limited
rate-limited: Too many calls; wait Retry-After seconds.
curl -sS -X GET "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi" \
-H "Authorization: Bearer $CLOUDRAW_TOKEN"$headers = @{ Authorization = "Bearer $env:CLOUDRAW_TOKEN" }
Invoke-RestMethod -Method Get -Uri "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi" -Headers $headersimport os, uuid, requests
r = requests.get(
"https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi",
headers={"Authorization": f"Bearer {os.environ['CLOUDRAW_TOKEN']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())const res = await fetch("https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.CLOUDRAW_TOKEN}`,
},
});
if (!res.ok) throw new Error((await res.json()).code);
console.log(await res.json());{
"range": "7d",
"items": [
{
"id": "devices_online",
"value": 21,
"unit": "ratio",
"state": "ok",
"counts": {
"total": 23
},
"trend": {
"step": "1d",
"points": [
{
"t": "2026-10-28",
"v": 20
}
]
},
"as_of": "2026-10-29T14:00:00.000Z"
}
]
}List the dashboard tiles
GET/v0/tenants/{tenant_id}/kpi/catalog
The tiles you may add to the dashboard, with their unit and area, and the starting layouts. Billing tiles (seats, monthly active users) need the owner role; second-step coverage needs owner or security admin.
Token: read-only or full access · Created by: owner or security admin
Rate limit: 60 dashboard-tile calls per minute per person.
Path parameters
- tenant_idstringrequired
Your workspace id (Settings → Workspace in the console; it is also in every console URL).
Responses
200 The catalog.
application/json
- itemsarray of objectrequired
The tiles YOUR role may use.
items fields
- idstringrequired
- areastringrequired
- unitstringrequired
ratio=valueout ofcounts.total. - modulestring | null
Paid module the tile needs, or null.
- trendboolean
Whether the tile keeps a daily trend.
- simple_okboolean
- mapboolean
One of the Map page's numbers (the default layout).
- presetsobject
Starting layouts by name (
map,owner,security,it), limited to what your role may use. - default_presetstring
The layout everyone starts from:
map. - statesarray of string
- limitsobject
limits fields
- idsinteger
Tiles per values call.
- layoutinteger
Tiles per layout.
- rangesarray of string
- cache_sinteger
Values are cached this long.
- k_mininteger
A share over fewer people is not shown.
401 unauthorized invalid-token token-expired
unauthorized: No Authorization: Bearer crw_… header was sent.
invalid-token: The token is unknown or was revoked.
token-expired: The token is past its expiry date. Create a new one.
403 insufficient-role tenant-assertion-mismatch
insufficient-role: The token's role ceiling does not allow this call.
tenant-assertion-mismatch: The token belongs to another workspace than {tenant_id}.
404 tenant-not-found
tenant-not-found: No workspace with this id.
429 rate-limited
rate-limited: Too many calls; wait Retry-After seconds.
curl -sS -X GET "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi/catalog" \
-H "Authorization: Bearer $CLOUDRAW_TOKEN"$headers = @{ Authorization = "Bearer $env:CLOUDRAW_TOKEN" }
Invoke-RestMethod -Method Get -Uri "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi/catalog" -Headers $headersimport os, uuid, requests
r = requests.get(
"https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi/catalog",
headers={"Authorization": f"Bearer {os.environ['CLOUDRAW_TOKEN']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())const res = await fetch("https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/kpi/catalog", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.CLOUDRAW_TOKEN}`,
},
});
if (!res.ok) throw new Error((await res.json()).code);
console.log(await res.json());{
"items": [
{
"id": "devices_online",
"area": "devices",
"unit": "ratio",
"module": null,
"trend": true,
"simple_ok": true,
"map": true
}
],
"presets": {
"map": [
{
"id": "devices_online",
"size": 1
}
]
},
"default_preset": "map",
"states": [
"ok",
"warn",
"bad",
"not_available",
"building",
"fewer_than_5"
],
"limits": {
"ids": 20,
"layout": 24,
"ranges": [
"7d",
"30d"
],
"cache_s": 300,
"k_min": 5
}
}