message.comDevelopers

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

GET/api/v1/reports/saved-viewsAuth: Bearer

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
curl 'https://app.message.com/api/v1/reports/saved-views' \
  -H 'Authorization: Bearer YOUR_WORKSPACE_JWT'
JavaScript
const res = await fetch('https://app.message.com/api/v1/reports/saved-views', {
  headers: { Authorization: 'Bearer ' + token }
});
const { views } = await res.json();
Python
import requests
r = requests.get(
    "https://app.message.com/api/v1/reports/saved-views",
    headers={"Authorization": f"Bearer {token}"},
)
views = r.json()["views"]
Ruby
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
<?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.

Saved view
{
  "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

POST/api/v1/reports/saved-viewsAuth: Bearer
FieldTypeDescription
namerequiredstringDisplay name, 1 to 120 characters.
reportPathrequiredstringThe report page this bookmarks, e.g. /reports/chats/total.
queryJsonoptionalobjectQuery params on that page as string key/value pairs. Defaults to empty.
sharedoptionalbooleanMake it workspace-shared instead of personal. Silently ignored (falls back to personal) unless the caller is admin or supervisor.
Body
{
  "name": "This quarter, VIP department",
  "reportPath": "/reports/chats/total",
  "queryJson": { "range": "90d", "departmentId": "uuid-vip" },
  "shared": true
}

Update a saved view

PATCH/api/v1/reports/saved-views/:idAuth: Bearer

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

DELETE/api/v1/reports/saved-views/:idAuth: Bearer

Same authorization rule as update.

Errors

CodeWhen
400 invalid_bodyPayload failed validation.
403 forbiddenPATCH/DELETE on a view the caller doesn't own and can't administer.
404 not_foundView 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: true always shares it. A plain agent's shared flag 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.