Skip to main content

Read user feedback

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.
NameLocationTypeRequiredDescriptionExample
AuthorizationheaderstringYesApplication API key, passed as a Bearer token.Bearer qwk_***
X-Request-IdheaderstringNoOptional request tracing identifier; generated by the server if omitted.req-20260831-001

Request parameters

NameLocationTypeRequiredDescriptionExample
fromquerystring · date-timeRequiredInclusive creation/event time, RFC3339 with timezone; keep fixed while paging."2026-08-27T10:00:00Z"
toquerystring · date-timeRequiredExclusive creation/event time, after from and at most 180 days later; keep fixed while paging."2026-08-27T10:00:00Z"
cursorquerystringNoOpaque next_cursor from the previous page of the same organization and time interval."<string>"
page_sizequeryinteger · int64NoPage size20

Request example

cURL
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
NameTypeRequiredDescriptionExample
has_morebooleanYesWhether more results are availablefalse
itemsarray<OpenapifacadeFeedbackRecord>YesRecords[{"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_reportbooleanYesWhether the feedback can be reported to the official servicefalse
items[].created_atstring · date-timeYesCreated at"2026-08-27T10:00:00Z"
items[].descriptionstringYesDescription"<string>"
items[].diagnosticobject | nullYesDiagnostic log file; null if absent, otherwise containing the fields below.null
items[].diagnostic.urlstringWhen a file is presentTemporary signed download URL. Download and archive the file before expiration; long-term availability is not guaranteed."<signed-url>"
items[].diagnostic.namestringWhen a file is presentDiagnostic log filename."diagnostic.zip"
items[].diagnostic.expires_atstring · date-timeWhen a file is presentExpiration time of the diagnostic log URL, in RFC3339 format."2026-08-27T10:15:00Z"
items[].diagnostic_availablebooleanYesWhether a diagnostic package is availablefalse
items[].diagnostic_filenamestringNoDiagnostic package filename"<string>"
items[].idstringYesFeedback ID"<string>"
items[].official_issue_idstring | nullYesOfficial feedback ID"<string>"
items[].org_idstringYesOrganization ID"<string>"
items[].read_atstring | null · date-timeYesRead at"2026-08-27T10:00:00Z"
items[].read_bystring | nullYesReader ID"<string>"
items[].report_statusstringYesReporting status"<string>"
items[].reported_atstring | null · date-timeYesReported at"2026-08-27T10:00:00Z"
items[].screenshotsarray<OpenapifacadeFeedbackAttachment>YesScreenshots[{"download_url":"<string>","expires_at":"2026-08-27T10:00:00Z","name":"<string>","url":"<string>"}]
items[].screenshots[].download_urlstringNoTemporary signed download URL. Download and archive the file before expiration."<string>"
items[].screenshots[].expires_atstring · date-timeYesExpiration time of the screenshot preview and download URLs, in RFC3339 format."2026-08-27T10:00:00Z"
items[].screenshots[].namestringYesName"<string>"
items[].screenshots[].urlstringYesTemporary signed preview URL; long-term availability is not guaranteed."<string>"
items[].statusstringYesStatus"unread"
items[].updated_atstring · date-timeNoUpdated at"2026-08-27T10:00:00Z"
items[].updated_bystringNoUpdater ID"<string>"
items[].updated_by_emailstringNoUpdater email"<string>"
items[].updated_by_namestringNoUpdated by"<string>"
items[].user_emailstringYesUser email"<string>"
items[].user_idstringYesUser ID"<string>"
items[].user_namestringYesUser name"<string>"
next_cursorstringYesNext page cursor"<string>"
official_reporting_enabledbooleanYesWhether official reporting is enabledfalse
Response example
default Flat business error
NameTypeRequiredDescriptionExample
codestringNoStable business error code"<string>"
detailstringYesHuman-readable error description"<string>"
detailsOpenapiErrorDetailsNoError details{"field":"<string>","reason":"<string>","suggestion":"<string>"}
details.fieldstringNoRequest field that failed validation"<string>"
details.reasonstringNoStable validation failure reason"<string>"
details.suggestionstringNoSuggested normalized value"<string>"
errorstringYesStable HTTP error type"<string>"
Response example