Read user feedback. GET /api/openapi/v1/client-feedback, scope admin.v1.client-feedback.read.
- Scope: admin.v1.client-feedback.read
- Permission: Read user feedback (client-feedback)
- Permission type: Read
- Endpoint: GET/api/openapi/v1/client-feedback
Authentication and request headers
Call with an application API key. This endpoint checks only the scope above; read, manage and execute permissions do not imply one another.
| Name | Location | Type | Required | Description | Example |
|---|---|---|---|---|---|
| Authorization | header | string | Yes | Application API key, passed as a Bearer token. | Bearer qwk_*** |
| X-Request-Id | header | string | No | Optional request tracing identifier; generated by the server if omitted. | req-20260831-001 |
Request parameters
| Name | Location | Type | Required | Description | Example |
|---|---|---|---|---|---|
| from | query | string · date-time | Required | Inclusive creation/event time, RFC3339 with timezone; keep fixed while paging. | "2026-08-27T10:00:00Z" |
| to | query | string · date-time | Required | Exclusive creation/event time, after from and at most 180 days later; keep fixed while paging. | "2026-08-27T10:00:00Z" |
| cursor | query | string | No | Opaque next_cursor from the previous page of the same organization and time interval. | "<string>" |
| page_size | query | integer · int64 | No | Page size | 20 |
Request example
cURL
File link expiration and archival
Screenshot links (screenshots[].url and screenshots[].download_url) and the diagnostic log link (diagnostic.url) are temporary signed URLs, not permanent file locations. Use each file’s expires_at value for its expiration time; do not hardcode the validity period.
After retrieving feedback, download files you need to retain before expires_at and archive them in your own object or file storage. Keep the association between the feedback id and the archived files. Do not store only the returned URL as a permanent file address.
Download files using the complete returned URL. No OpenAPI API key is required; do not send your API key to object storage. The URL contains a temporary access signature: protect it as a credential and keep it out of public logs.
If a URL expires before download, retrieve the original from and to time range again, deduplicate by id, and download immediately using the new URL. Refreshing a URL does not guarantee permanent file retention. Retrieving feedback again cannot restore a file that no longer exists.
diagnostic is null when there is no diagnostic file. Otherwise, it is an object containing url, name and expires_at. The download and archival requirements above apply to both screenshots and diagnostic logs.
Responses
200 OK
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
| has_more | boolean | Yes | Whether more results are available | false |
| items | array<OpenapifacadeFeedbackRecord> | Yes | Records | [{"can_report":false,"created_at":"2026-08-27T10:00:00Z","description":"<string>","diagnostic":{"url":"<signed-url>","name":"diagnostic.zip","expires_at":"2026-08-27T10:15:00Z"},"diagnostic_available":true,"diagnostic_filename":"<string>","id":"<string>","official_issue_id":"<string>","org_id":"<string>","read_at":"2026-08-27T10:00:00Z","read_by":"<string>","report_status":"<string>","reported_at":"2026-08-27T10:00:00Z","screenshots":[{"download_url":"<string>","expires_at":"2026-08-27T10:00:00Z","name":"<string>","url":"<string>"}],"status":"unread","updated_at":"2026-08-27T10:00:00Z","updated_by":"<string>","updated_by_email":"<string>","updated_by_name":"<string>","user_email":"<string>","user_id":"<string>","user_name":"<string>"}] |
| items[].can_report | boolean | Yes | Whether the feedback can be reported to the official service | false |
| items[].created_at | string · date-time | Yes | Created at | "2026-08-27T10:00:00Z" |
| items[].description | string | Yes | Description | "<string>" |
| items[].diagnostic | object | null | Yes | Diagnostic log file; null if absent, otherwise containing the fields below. | null |
| items[].diagnostic.url | string | When a file is present | Temporary signed download URL. Download and archive the file before expiration; long-term availability is not guaranteed. | "<signed-url>" |
| items[].diagnostic.name | string | When a file is present | Diagnostic log filename. | "diagnostic.zip" |
| items[].diagnostic.expires_at | string · date-time | When a file is present | Expiration time of the diagnostic log URL, in RFC3339 format. | "2026-08-27T10:15:00Z" |
| items[].diagnostic_available | boolean | Yes | Whether a diagnostic package is available | false |
| items[].diagnostic_filename | string | No | Diagnostic package filename | "<string>" |
| items[].id | string | Yes | Feedback ID | "<string>" |
| items[].official_issue_id | string | null | Yes | Official feedback ID | "<string>" |
| items[].org_id | string | Yes | Organization ID | "<string>" |
| items[].read_at | string | null · date-time | Yes | Read at | "2026-08-27T10:00:00Z" |
| items[].read_by | string | null | Yes | Reader ID | "<string>" |
| items[].report_status | string | Yes | Reporting status | "<string>" |
| items[].reported_at | string | null · date-time | Yes | Reported at | "2026-08-27T10:00:00Z" |
| items[].screenshots | array<OpenapifacadeFeedbackAttachment> | Yes | Screenshots | [{"download_url":"<string>","expires_at":"2026-08-27T10:00:00Z","name":"<string>","url":"<string>"}] |
| items[].screenshots[].download_url | string | No | Temporary signed download URL. Download and archive the file before expiration. | "<string>" |
| items[].screenshots[].expires_at | string · date-time | Yes | Expiration time of the screenshot preview and download URLs, in RFC3339 format. | "2026-08-27T10:00:00Z" |
| items[].screenshots[].name | string | Yes | Name | "<string>" |
| items[].screenshots[].url | string | Yes | Temporary signed preview URL; long-term availability is not guaranteed. | "<string>" |
| items[].status | string | Yes | Status | "unread" |
| items[].updated_at | string · date-time | No | Updated at | "2026-08-27T10:00:00Z" |
| items[].updated_by | string | No | Updater ID | "<string>" |
| items[].updated_by_email | string | No | Updater email | "<string>" |
| items[].updated_by_name | string | No | Updated by | "<string>" |
| items[].user_email | string | Yes | User email | "<string>" |
| items[].user_id | string | Yes | User ID | "<string>" |
| items[].user_name | string | Yes | User name | "<string>" |
| next_cursor | string | Yes | Next page cursor | "<string>" |
| official_reporting_enabled | boolean | Yes | Whether official reporting is enabled | false |
default Flat business error
| Name | Type | Required | Description | Example |
|---|---|---|---|---|
| code | string | No | Stable business error code | "<string>" |
| detail | string | Yes | Human-readable error description | "<string>" |
| details | OpenapiErrorDetails | No | Error details | {"field":"<string>","reason":"<string>","suggestion":"<string>"} |
| details.field | string | No | Request field that failed validation | "<string>" |
| details.reason | string | No | Stable validation failure reason | "<string>" |
| details.suggestion | string | No | Suggested normalized value | "<string>" |
| error | string | Yes | Stable HTTP error type | "<string>" |