---
title: "Change chat state with a durable receipt"
method: POST
path: "/v1/chat/commands"
tags: ["chat"]
---

# Change chat state with a durable receipt

`POST /v1/chat/commands`

## Request

- Base URL: `https://app.legend.trade/api/rest`
- URL: `https://app.legend.trade/api/rest/v1/chat/commands`
- Auth: HTTP bearer

## Request body

- object
  - `operationId` string, uuid, required: Persist this UUID and input before transport. Retry the same pair after an unknown outcome. A new intent needs a new UUID.
  - `expectedUserId` string, uuid, required
  - `command` union, required
    - object
      - `kind` 'openDirectRoom', required
      - `targetUserId` string, uuid, required
    - object
      - `kind` 'setReaction', required
      - `messageId` string, uuid, required
      - `emoji` string, required
      - `enabled` boolean, required
    - object
      - `kind` 'setLike', required
      - `messageId` string, uuid, required
      - `enabled` boolean, required
    - object
      - `kind` 'editMessage', required
      - `messageId` string, uuid, required
      - `content` string, required
    - object
      - `kind` 'deleteMessage', required
      - `messageId` string, uuid, required
    - object
      - `kind` 'setMessagePinned', required
      - `messageId` string, uuid, required
      - `enabled` boolean, required
    - object
      - `kind` 'setRoomMuted', required
      - `roomId` string, uuid, required
      - `enabled` boolean, required
    - object
      - `kind` 'setRoomPinned', required
      - `roomId` string, uuid, required
      - `enabled` boolean, required
    - object
      - `kind` 'setRoomArchived', required
      - `roomId` string, uuid, required
      - `enabled` boolean, required
    - object
      - `kind` 'hideRoom', required
      - `roomId` string, uuid, required
      - `forEveryone` boolean, required
    - object
      - `kind` 'markRoomUnread', required
      - `roomId` string, uuid, required
    - object
      - `kind` 'updateRoom', required
      - `roomId` string, uuid, required
      - `name` string
      - `imageUrl` string, uri, nullable
    - object
      - `kind` 'addMember', required
      - `roomId` string, uuid, required
      - `targetUserId` string, uuid, required
    - object
      - `kind` 'removeMember', required
      - `roomId` string, uuid, required
      - `targetUserId` string, uuid, required
    - object
      - `kind` 'leaveRoom', required
      - `roomId` string, uuid, required
    - object
      - `kind` 'setMemberRole', required
      - `roomId` string, uuid, required
      - `targetUserId` string, uuid, required
      - `role` 'admin' | 'member', required
    - object
      - `kind` 'transferOwnership', required
      - `roomId` string, uuid, required
      - `targetUserId` string, uuid, required
    - object
      - `kind` 'respondRequest', required
      - `roomId` string, uuid, required
      - `action` 'accept' | 'decline', required

## Response `200`

Successful response

- ChatCommandReceipt: The original outcome. This receipt has no realtime cursor. Refresh through the existing chat snapshot API after recovery. Serialize conflicting intents in the client.
  - `operationId` string, uuid, required
  - `status` 'succeeded' | 'rejected', required
  - `result` ChatCommandResult, required
    - `viewerId` string, uuid, required
    - `administration` object
      - `roomId` string, uuid, required
      - `name` string, nullable, required
      - `imageUrl` string, nullable, required
      - `members` object[], required
        - `userId` string, uuid, required
        - `role` 'owner' | 'admin' | 'member', required
        - `status` 'accepted' | 'pending' | 'declined', required
      - `removedUserIds` string[], required
    - `message` object, nullable, required
      - `id` string, uuid, required
      - `roomId` string, uuid, required
      - `deletedAt` string, nullable, required
      - `pinnedAt` string, nullable, required
      - `liked` boolean, required
      - `likeCount` integer, required
      - `content` string: Present only when this command edits content.
      - `reaction` object, nullable, required
        - `emoji` string, required
        - `selected` boolean, required
    - `room` object, nullable, required
      - `id` string, uuid, required
      - `muted` boolean, required
      - `pinned` boolean, required
      - `archived` boolean, required
      - `hidden` boolean, required
      - `markedUnread` boolean, required
  - `error` object, nullable, required
    - `code` string, required
    - `message` string, required

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `500`: Internal server error

## Changes

- **2026-10-25** `8d368659667e`: 4 breaking, 4 info
  - the response property `result/anyOf[#/components/schemas/ChatCommandResult]/administration/imageUrl` became nullable for the status `200`
  - the response property `result/anyOf[#/components/schemas/ChatCommandResult]/administration/name` became nullable for the status `200`
  - the response property `result/anyOf[#/components/schemas/ChatCommandResult]/message/anyOf[subschema #1]/deletedAt` became nullable for the status `200`
  - the response property `result/anyOf[#/components/schemas/ChatCommandResult]/message/anyOf[subschema #1]/pinnedAt` became nullable for the status `200`
  - …4 more
- **2026-10-24** `47071fafc154`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/legend/apis/legend-api/changes/v1/chat/commands/post.md)

---

[API](https://skmtc.dev/legend/apis/legend-api.md) - [All operations](https://skmtc.dev/legend/apis/legend-api/llms.txt) - [OpenAPI document](https://skmtc.dev/legend/apis/legend-api/revisions/c3e45061cf81?raw)
