> ## Documentation Index
> Fetch the complete documentation index at: https://developers.chatwoot.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update message status

> Updates the delivery status of a single message. Available only for messages in
API channel inboxes, where your own system is responsible for delivering messages
and reporting what happened. Use this to push `sent`, `delivered`, and `read`
receipts into Chatwoot, for example, to mark an agent's message as read when the
end user views it in your client, so the agent sees the read indicator on the
message.

A message already marked `read` cannot be moved back to `delivered`. When
reporting a failure, include `external_error` with the reason, which is shown to
the agent along with the failed indicator.




## OpenAPI

````yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/application_swagger.json patch /api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{message_id}
openapi: 3.1.0
info:
  title: Chatwoot
  description: This is the API documentation for Chatwoot server.
  version: 1.1.0
  termsOfService: https://www.chatwoot.com/terms-of-service/
  contact:
    email: hello@chatwoot.com
  license:
    name: MIT License
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://app.chatwoot.com/
security: []
tags:
  - name: Account AgentBots
    description: Account-specific Agent Bots
  - name: Agents
    description: Agent management APIs
  - name: Campaigns
    description: >-
      Create, schedule, and manage campaigns. Requires an account administrator
      and API access enabled for the account.
  - name: Canned Responses
    description: Pre-defined responses for common queries
  - name: Contacts
    description: Contact management APIs
  - name: Contact Labels
    description: Manage contact labels
  - name: Conversation Assignments
    description: Manage conversation assignments
  - name: Conversation Labels
    description: Manage conversation labels
  - name: Conversations
    description: Conversation management APIs
  - name: Custom Attributes
    description: Custom fields for contacts and conversations
  - name: Custom Filters
    description: Saved filters for conversations
  - name: Inboxes
    description: Communication channels setup
  - name: Integrations
    description: Third-party integrations
  - name: Labels
    description: Account label management APIs
  - name: Messages
    description: Message management APIs
  - name: Profile
    description: User profile APIs
  - name: Reports
    description: Analytics and reporting APIs
  - name: Teams
    description: Team management APIs
  - name: Webhooks
    description: Event notification webhooks
  - name: Automation Rule
    description: Workflow automation rules
  - name: Help Center
    description: Knowledge base management
paths:
  /api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{message_id}:
    parameters:
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/conversation_id'
      - $ref: '#/components/parameters/message_id'
    patch:
      tags:
        - Messages
      summary: Update message status
      description: >
        Updates the delivery status of a single message. Available only for
        messages in

        API channel inboxes, where your own system is responsible for delivering
        messages

        and reporting what happened. Use this to push `sent`, `delivered`, and
        `read`

        receipts into Chatwoot, for example, to mark an agent's message as read
        when the

        end user views it in your client, so the agent sees the read indicator
        on the

        message.


        A message already marked `read` cannot be moved back to `delivered`.
        When

        reporting a failure, include `external_error` with the reason, which is
        shown to

        the agent along with the failed indicator.
      operationId: update-message-status
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - status
              properties:
                status:
                  type: string
                  enum:
                    - sent
                    - delivered
                    - read
                    - failed
                  description: The new status of the message
                external_error:
                  type: string
                  description: Error description, stored only when status is failed
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/generic_id'
                  - $ref: '#/components/schemas/message'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bad_request_error'
        '403':
          description: The message does not belong to an API channel inbox
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bad_request_error'
        '404':
          description: The message or conversation does not exist in the account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/bad_request_error'
      security:
        - userApiKey: []
components:
  parameters:
    account_id:
      in: path
      name: account_id
      schema:
        type: integer
      required: true
      description: The numeric ID of the account
    conversation_id:
      in: path
      name: conversation_id
      schema:
        type: integer
      required: true
      description: The numeric ID of the conversation
    message_id:
      in: path
      name: message_id
      schema:
        type: integer
      required: true
      description: The numeric ID of the message
  schemas:
    generic_id:
      type: object
      properties:
        id:
          type: number
    message:
      type: object
      properties:
        id:
          type: number
          description: The ID of the message
        content:
          type: string
          description: The text content of the message
        account_id:
          type: number
          description: The ID of the account
        inbox_id:
          type: number
          description: The ID of the inbox
        conversation_id:
          type: number
          description: The ID of the conversation
        message_type:
          type: integer
          enum:
            - 0
            - 1
            - 2
            - 3
          description: The type of the message
        created_at:
          type: integer
          description: The time at which message was created
        updated_at:
          type:
            - integer
            - string
          description: The time at which message was updated
        private:
          type: boolean
          description: The flags which shows whether the message is private or not
        status:
          type:
            - string
            - 'null'
          enum:
            - sent
            - delivered
            - read
            - failed
            - null
          description: The status of the message
        source_id:
          type:
            - string
            - 'null'
          description: The source ID of the message
        content_type:
          type:
            - string
            - 'null'
          enum:
            - text
            - input_text
            - input_textarea
            - input_email
            - input_select
            - cards
            - form
            - article
            - incoming_email
            - input_csat
            - integrations
            - sticker
            - voice_call
            - null
          description: The type of the template message
        content_attributes:
          type: object
          description: The content attributes for each content_type
        sender_type:
          type:
            - string
            - 'null'
          enum:
            - Contact
            - User
            - AgentBot
            - Captain::Assistant
            - null
          description: The type of the sender
        sender_id:
          type:
            - number
            - 'null'
          description: The ID of the sender
        external_source_ids:
          type: object
          description: The external source IDs of the message
        additional_attributes:
          type: object
          description: The additional attributes of the message
        processed_message_content:
          type:
            - string
            - 'null'
          description: The processed message content
        sentiment:
          type:
            - object
            - 'null'
          description: The sentiment of the message
        conversation:
          type:
            - object
            - 'null'
          description: The conversation object
        attachment:
          type:
            - object
            - 'null'
          description: The file object attached to the image
        sender:
          type: object
          description: User/Agent/AgentBot object
    bad_request_error:
      title: data
      type: object
      properties:
        description:
          type: string
        errors:
          type: array
          items:
            $ref: '#/components/schemas/request_error'
    request_error:
      type: object
      properties:
        field:
          type: string
        message:
          type: string
        code:
          type: string
  securitySchemes:
    userApiKey:
      type: apiKey
      in: header
      name: api_access_token
      description: >-
        This token can be obtained by visiting the profile page or via rails
        console. Provides access to  endpoints based on the user permissions
        levels. This token can be saved by an external system when user is
        created via API, to perform activities on behalf of the user.

````