---
title: "Bulk Update Message Status"
method: PATCH
path: "/v1/bulk/message/"
---

# Bulk Update Message Status

`PATCH /v1/bulk/message/`

Change the status of messages by passing their id and notification action.

## Request body

- object
  - `messages` object[], required — List of messages to update. No duplicate `message_id`s allowed.
    - `message_id` string, required — Message-id to update.
    - `action` 'seen' | 'clicked' | 'dismissed' | 'read' | 'unread' | 'archived' | 'unarchived', required — Action to apply to the message. Each action sets the corresponding status or flag. - `seen` - Mark the message as seen by the recipient. - `clicked` - Mark the message as clicked or interacted with. - `dismissed` - Mark the message as dismissed (cleared without taking action). - `read` - Mark the inbox message as read. Applicable for Inbox channel only. Also sets flag is_read = true. - `unread` - Revert a previously read inbox message back to unread. Applicable for Inbox channel only. Sets flag is_read = false. - `archived` - Archive the inbox message (sets the `is_archived` flag to true; status is preserved). Applicable for Inbox channel only. - `unarchived` - Unarchive a previously archived inbox message. (sets the `is_archived` flag to false; status is preserved). Applicable for Inbox channel only. **Status progression (one-way):** `triggered` → `sent_by_vendor` → `delivered` → `seen` → `read` -> `clicked` / `dismissed`. Once a message reaches a later status, it cannot be moved back to an earlier one - for example, marking a `clicked` message as `seen` will not change the status to `seen`. **Toggles (reversible):** `read` ↔ `unread` and `archived` ↔ `unarchived` flip independent flags and can be applied in either direction any number of times.

## Response `202`

Bulk update accepted. Inspect each record's `status_code` and `error` for individual outcomes - a `null` `error` means success.

- object
  - `records` BulkPatchItemResult[] — Per-message results, in the same order as the request.
    - `message_id` string — Message-id to update.
    - `status_code` integer — Per-item status code: - `202` - success - `404` - `not_found` - `422` - `status_blocked` or `action_not_supported` - `500` - `internal_error`
    - `error` object, nullable — Null on success, populated on failure.
      - `type` 'not_found' | 'status_blocked' | 'action_not_supported' | 'internal_error', required — Machine-readable key for why the item failed: - `not_found` - message_id not found in this workspace - `status_blocked` - message is in a terminal state (`trigger_failed`, `trigger_blocked`, `failure_by_vendor`, `not_to_be_triggered`) that cannot be overridden - `action_not_supported` - action is invalid for the message's channel (for example, `dismissed` on inbox, `read` on sms) - `internal_error` - Internal error at SuprSend end. Reach out to support if you get this error code.
      - `message` string, required — Human-readable detail. Do not parse programmatically.

---

[API](https://skmtc.net/suprsend/apis/suprsend-api.md) · [All operations](https://skmtc.net/suprsend/apis/suprsend-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/suprsend/suprsend-api/versions/8bd2574bd2c3/schema)
