Saved views Live
This bookmarks a report page's query string under a name, not an inbox filter set: reportPath (e.g. /reports/chats/total) plus queryJson (the query params on that page, like range and departmentId). Used for one-click re-entry into a specific report slice.
This is not a saved queue filter. There is no channel, status, assigneeId, or tags field, and it doesn't drive the inbox sidebar. It only bookmarks a Reports-tab page.
List saved views
Not paginated. Returns the union of every workspace-shared view plus the caller's own personal ones, shared first. Optional ?path=/reports/... narrows to views bookmarking one specific report page.
Code samples
curl 'https://app.message.com/api/v1/reports/saved-views' \
-H 'Authorization: Bearer YOUR_WORKSPACE_JWT'const res = await fetch('https://app.message.com/api/v1/reports/saved-views', {
headers: { Authorization: 'Bearer ' + token }
});
const { views } = await res.json();import requests
r = requests.get(
"https://app.message.com/api/v1/reports/saved-views",
headers={"Authorization": f"Bearer {token}"},
)
views = r.json()["views"]require "net/http"
require "json"
uri = URI("https://app.message.com/api/v1/reports/saved-views")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{token}"
http.request(req)
end
views = JSON.parse(res.body)["views"]<?php
$ctx = stream_context_create([
"http" => ["method" => "GET", "header" => "Authorization: Bearer $token"]
]);
$views = json_decode(file_get_contents("https://app.message.com/api/v1/reports/saved-views", false, $ctx), true)["views"];Saved view shape
There is no GET-by-ID. Find the one you want in the list response.
{
"id": "uuid",
"workspaceId": "uuid",
"reportPath": "/reports/chats/total",
"name": "This quarter, VIP department",
"queryJson": { "range": "90d", "departmentId": "uuid-vip" },
"createdBy": "uuid",
"isShared": true,
"createdAt": "2026-05-13T15:30:00Z",
"updatedAt": "2026-05-13T15:30:00Z"
}Create a saved view
| Field | Type | Description |
|---|---|---|
| namerequired | string | Display name, 1 to 120 characters. |
| reportPathrequired | string | The report page this bookmarks, e.g. /reports/chats/total. |
| queryJsonoptional | object | Query params on that page as string key/value pairs. Defaults to empty. |
| sharedoptional | boolean | Make it workspace-shared instead of personal. Silently ignored (falls back to personal) unless the caller is admin or supervisor. |
{
"name": "This quarter, VIP department",
"reportPath": "/reports/chats/total",
"queryJson": { "range": "90d", "departmentId": "uuid-vip" },
"shared": true
}Update a saved view
Only name and queryJson are editable; reportPath and sharing are fixed at creation. The owner can always edit their own personal view; admin/supervisor can edit any workspace-shared view; a plain agent cannot edit a shared view even if they can see it.
Delete a saved view
Same authorization rule as update.
Errors
| Code | When |
|---|---|
400 invalid_body | Payload failed validation. |
403 forbidden | PATCH/DELETE on a view the caller doesn't own and can't administer. |
404 not_found | View does not exist in this workspace. |
Common pitfalls
- Treating this as an inbox filter API. It isn't. It bookmarks Reports-tab pages, not the queue.
- Assuming
shared: truealways shares it. A plain agent'ssharedflag is silently dropped; the view is created personal instead of erroring. - Confusing saved views with saved replies. Views bookmark a report; replies populate the composer. Unrelated resources.