API reference
Support
Your support cases: summary and status.
List support cases
GET/v0/tenants/{tenant_id}/support-cases
Lists your workspace's support cases: diagnostics that Cloudraw Connect or a connector sent, with their status and the conversation with Cloudraw support. Only summaries are returned, never the raw logs.
Two modes. Display (default): newest activity first, at most limit cases (default and maximum 500), next_cursor is always null and has_more says whether cases were cut off. Polling (send cursor, updated_since or order=updated): cases in ascending updated_at order, limit per page (maximum 500); keep calling with next_cursor until has_more is false. Polling never skips a case, so use it to mirror cases into another system. When the last page is empty, next_cursor stays the cursor you sent, so you can store it and poll again later.
Token: read-only or full access · Created by: owner or security admin
Path parameters
- tenant_idstringrequired
Your workspace id (Settings → Workspace in the console; it is also in every console URL).
Query parameters
- statusstring
Only cases in this status.
- updated_sincestring (date-time)
Only cases updated strictly after this time (ISO 8601). Starts polling mode.
- orderstring
updatedswitches to polling mode (ascending by last update). - limitinteger
Page size, 1-500 (default 500).
- cursorstring
Polling mode: pass back
next_cursorfrom the previous page, unchanged.
Responses
200 Cases.
application/json
- itemsarray of SupportCaserequired
items fields
- case_idstringrequired
Case number,
SC-followed by 6 characters. - codestring | null
The support code shown on the device or connector when the diagnostics were sent.
- productstring
What sent the diagnostics.
- client_versionstring | null
Version of the app that sent the first report.
- osstring | null
Operating system reported by the app.
- diagnosisobject
diagnosis fields
- codestring | null
Machine-readable diagnosis code from the app.
- causestring | null
Plain-English cause, when the app found one.
- statusstringrequired
- status_labelstring
statusas shown in the console (e.g. "Waiting for you"). - attributionstringrequired
How the case was tied to your workspace:
cert= sent by an enrolled device or connector;claim_ref= sent during setup with a one-time setup code of your workspace;hint/anonymous= sent without a sign-in and attached by an admin. - attached_viastring | null
For a report attached by an admin: by entering its support code (
code_claim) or by confirming "is this yours?" (hint_confirm); otherwise null. - deviceone of
The device or connector that sent the diagnostics, when known.
- countersobject
counters fields
- reportsinteger
Diagnostics reports received for this case (including ones no longer listed in
reports).
- reportsarray of object
Reports on this case (the most recent 100). Only summaries: the full log is never available through the API.
reports fields
- codestring | null
Support code of this report.
- received_atstring (date-time)
- client_versionstring | null
- created_atstring (date-time)required
- last_seenstring (date-time)
When the latest report arrived.
- updated_atstring (date-time)required
Last change of any kind (new report, status change, reply).
- status_changed_atstring | null (date-time)
- staff_accessarray of object
Every time Cloudraw staff opened the full log of this case.
staff_access fields
- atstring (date-time)
- reasonstring
Why Cloudraw staff opened the full log.
- textstring
Ready-made sentence for display.
- messagesarray of object
The conversation both sides see, oldest first (the most recent 200).
messages fields
- idstring
- atstring (date-time)
- bystring
- authorstring | null
Display name: "Cloudraw support" or the admin who replied.
- kindstring
known_issue= an automatic note when the case matches a known problem. - textstring
- known_issueone of
Set when the case matches a known problem.
- can_replyboolean
False once the case is closed. Replies are sent from the Cloudraw console.
- response_timeone of
The response time Cloudraw support commits to, or null when none is published.
- has_morebooleanrequired
More cases exist beyond this page.
- next_cursorstring | nullrequired
In polling mode: pass it back as
cursorfor the next page. Always null in the default (display) mode. - totalintegerrequired
Cases matching
status/updated_since, before paging. - generated_atstring (date-time)required
- response_timeone of
The response time Cloudraw support commits to, or null when none is published.
400 invalid-cursor
invalid-cursor: cursor is not a next_cursor value returned by this endpoint.
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.
curl -sS -X GET "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases" \
-H "Authorization: Bearer $CLOUDRAW_TOKEN"$headers = @{ Authorization = "Bearer $env:CLOUDRAW_TOKEN" }
Invoke-RestMethod -Method Get -Uri "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases" -Headers $headersimport os, uuid, requests
r = requests.get(
"https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases",
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/support-cases", {
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": [
{
"case_id": "SC-4K7M2Q",
"code": "7KQ2M9X4D8R1T",
"product": "connect",
"client_version": "0.4.8",
"os": "Windows 11 23H2",
"diagnosis": {
"code": "tunnel.dns.unreachable",
"cause": "The internal DNS server 10.20.0.10 did not answer."
},
"status": "waiting_customer",
"status_label": "Waiting for you",
"attribution": "cert",
"attached_via": null,
"device": {
"id": "dvc_5mxq2b7r8k",
"name": "LT-DANA-02",
"kind": "device"
},
"counters": {
"reports": 2
},
"reports": [
{
"code": "7KQ2M9X4D8R1T",
"received_at": "2026-10-12T07:41:02.000Z",
"client_version": "0.4.8"
},
{
"code": "M3D8K1Q7X2R9V",
"received_at": "2026-10-13T08:02:44.000Z",
"client_version": "0.4.8"
}
],
"created_at": "2026-10-12T07:41:02.000Z",
"last_seen": "2026-10-13T08:02:44.000Z",
"updated_at": "2026-10-13T09:24:11.000Z",
"status_changed_at": "2026-10-13T09:24:11.000Z",
"staff_access": [
{
"at": "2026-10-12T09:15:00.000Z",
"reason": "Checking the DNS errors in the log",
"text": "Cloudraw staff opened the full log of case SC-4K7M2Q on 2026-10-12"
}
],
"messages": [
{
"id": "m_2k9x0d8s",
"at": "2026-10-13T09:24:11.000Z",
"by": "support",
"author": "Cloudraw support",
"kind": "reply",
"text": "Is 10.20.0.10 reachable from the connector host? Please check and reply here."
}
],
"known_issue": null,
"can_reply": true,
"response_time": {
"text": "We reply within 1 business day."
}
}
],
"has_more": false,
"next_cursor": "WyIyMDI2LTEwLTEzVDA5OjI0OjExLjAwMFoiLCJTQy00SzdNMlEiXQ",
"total": 1,
"generated_at": "2026-10-13T09:24:11.000Z",
"response_time": {
"text": "We reply within 1 business day."
}
}Get a support case
GET/v0/tenants/{tenant_id}/support-cases/{case_id}
Returns one support case: summary, status, report list, staff log access and the conversation with Cloudraw support. The raw diagnostics log is never returned. Replying to a case is done in the Cloudraw console.
Token: read-only or full access · Created by: owner or security admin
Path parameters
- tenant_idstringrequired
Your workspace id (Settings → Workspace in the console; it is also in every console URL).
- case_idstringrequired
Case number (
SC-…).
Responses
200 The case.
application/json
- case_idstringrequired
Case number,
SC-followed by 6 characters. - codestring | null
The support code shown on the device or connector when the diagnostics were sent.
- productstring
What sent the diagnostics.
- client_versionstring | null
Version of the app that sent the first report.
- osstring | null
Operating system reported by the app.
- diagnosisobject
diagnosis fields
- codestring | null
Machine-readable diagnosis code from the app.
- causestring | null
Plain-English cause, when the app found one.
- statusstringrequired
- status_labelstring
statusas shown in the console (e.g. "Waiting for you"). - attributionstringrequired
How the case was tied to your workspace:
cert= sent by an enrolled device or connector;claim_ref= sent during setup with a one-time setup code of your workspace;hint/anonymous= sent without a sign-in and attached by an admin. - attached_viastring | null
For a report attached by an admin: by entering its support code (
code_claim) or by confirming "is this yours?" (hint_confirm); otherwise null. - deviceone of
The device or connector that sent the diagnostics, when known.
- countersobject
counters fields
- reportsinteger
Diagnostics reports received for this case (including ones no longer listed in
reports).
- reportsarray of object
Reports on this case (the most recent 100). Only summaries: the full log is never available through the API.
reports fields
- codestring | null
Support code of this report.
- received_atstring (date-time)
- client_versionstring | null
- created_atstring (date-time)required
- last_seenstring (date-time)
When the latest report arrived.
- updated_atstring (date-time)required
Last change of any kind (new report, status change, reply).
- status_changed_atstring | null (date-time)
- staff_accessarray of object
Every time Cloudraw staff opened the full log of this case.
staff_access fields
- atstring (date-time)
- reasonstring
Why Cloudraw staff opened the full log.
- textstring
Ready-made sentence for display.
- messagesarray of object
The conversation both sides see, oldest first (the most recent 200).
messages fields
- idstring
- atstring (date-time)
- bystring
- authorstring | null
Display name: "Cloudraw support" or the admin who replied.
- kindstring
known_issue= an automatic note when the case matches a known problem. - textstring
- known_issueone of
Set when the case matches a known problem.
- can_replyboolean
False once the case is closed. Replies are sent from the Cloudraw console.
- response_timeone of
The response time Cloudraw support commits to, or null when none is published.
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 case-not-found tenant-not-found
case-not-found: No case with this number in your workspace (it may have been deleted on request).
tenant-not-found: No workspace with this id.
curl -sS -X GET "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases/SC-4K7M2Q" \
-H "Authorization: Bearer $CLOUDRAW_TOKEN"$headers = @{ Authorization = "Bearer $env:CLOUDRAW_TOKEN" }
Invoke-RestMethod -Method Get -Uri "https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases/SC-4K7M2Q" -Headers $headersimport os, uuid, requests
r = requests.get(
"https://cdapi.cloudraw.com/v0/tenants/tq7x2m9k4ab/support-cases/SC-4K7M2Q",
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/support-cases/SC-4K7M2Q", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.CLOUDRAW_TOKEN}`,
},
});
if (!res.ok) throw new Error((await res.json()).code);
console.log(await res.json());{
"case_id": "SC-4K7M2Q",
"code": "7KQ2M9X4D8R1T",
"product": "connect",
"client_version": "0.4.8",
"os": "Windows 11 23H2",
"diagnosis": {
"code": "tunnel.dns.unreachable",
"cause": "The internal DNS server 10.20.0.10 did not answer."
},
"status": "waiting_customer",
"status_label": "Waiting for you",
"attribution": "cert",
"attached_via": null,
"device": {
"id": "dvc_5mxq2b7r8k",
"name": "LT-DANA-02",
"kind": "device"
},
"counters": {
"reports": 2
},
"reports": [
{
"code": "7KQ2M9X4D8R1T",
"received_at": "2026-10-12T07:41:02.000Z",
"client_version": "0.4.8"
},
{
"code": "M3D8K1Q7X2R9V",
"received_at": "2026-10-13T08:02:44.000Z",
"client_version": "0.4.8"
}
],
"created_at": "2026-10-12T07:41:02.000Z",
"last_seen": "2026-10-13T08:02:44.000Z",
"updated_at": "2026-10-13T09:24:11.000Z",
"status_changed_at": "2026-10-13T09:24:11.000Z",
"staff_access": [
{
"at": "2026-10-12T09:15:00.000Z",
"reason": "Checking the DNS errors in the log",
"text": "Cloudraw staff opened the full log of case SC-4K7M2Q on 2026-10-12"
}
],
"messages": [
{
"id": "m_2k9x0d8s",
"at": "2026-10-13T09:24:11.000Z",
"by": "support",
"author": "Cloudraw support",
"kind": "reply",
"text": "Is 10.20.0.10 reachable from the connector host? Please check and reply here."
}
],
"known_issue": null,
"can_reply": true,
"response_time": {
"text": "We reply within 1 business day."
}
}