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

# Read a message and its delivery status

> Read a message log belonging to the current tenant, including its current delivery_status. Use data.id from the send response, not the underlying chat message_id. Poll from your server with a delay and a timeout to track delivery or reading. Receipt timestamps and delivery webhooks are not exposed.



## OpenAPI

````yaml /openapi/sinjapp-business.v1.yaml get /messages/{messageLog}
openapi: 3.0.3
info:
  title: Sinjapp Business API
  version: 1.1.0
  description: |
    Sinjapp Business exposes a Tenant API for customer messaging operations.
  license:
    name: Proprietary
    url: https://sinjapp.com/legal/terms
servers:
  - url: '{tenantBaseUrl}/api/v1'
    description: Tenant API
    variables:
      tenantBaseUrl:
        default: https://your-tenant.sinjapp.org
        description: >-
          Full customer tenant URL, including https://. Use the exact tenant
          workspace domain shown in the dashboard.
security:
  - ApiKeyAuth: []
tags:
  - name: Auth
    description: Tenant identity and runtime context.
  - name: Subscription
    description: >-
      Tenant subscription status. Payment and plan changes happen inside the
      tenant dashboard.
  - name: API Keys
    description: Tenant API credentials and scopes.
  - name: Sender Numbers
    description: Sender number registration and activation state.
  - name: Messages
    description: Sending and reading message logs.
  - name: Contacts
    description: Contact reachability checks.
  - name: Usage
    description: Usage counters and limits.
paths:
  /messages/{messageLog}:
    get:
      tags:
        - Messages
      summary: Read a message and its delivery status
      description: >-
        Read a message log belonging to the current tenant, including its
        current delivery_status. Use data.id from the send response, not the
        underlying chat message_id. Poll from your server with a delay and a
        timeout to track delivery or reading. Receipt timestamps and delivery
        webhooks are not exposed.
      operationId: getMessage
      parameters:
        - name: messageLog
          in: path
          required: true
          description: Tenant message log ID returned as data.id when sending.
          schema:
            type: integer
            minimum: 1
          example: 121
      responses:
        '200':
          description: >-
            Message log with current delivery_status. A missing underlying chat
            message returns unknown.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/MessageLog'
              example:
                data:
                  id: 121
                  sender_number_id: 1
                  recipient_user_id: 2002
                  conversation_id: 42
                  message_id: 9001
                  message_type: text
                  content: Hello from Sinjapp Business
                  status: sent
                  delivery_status: read
                  sent_at: '2026-09-13T12:00:00.000000Z'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: The message log does not exist in the current tenant workspace.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
      security:
        - ApiKeyAuth:
            - messages.read
components:
  schemas:
    MessageLog:
      type: object
      properties:
        id:
          type: integer
          description: Tenant message log ID. Use this value in GET /messages/{messageLog}.
        sender_number_id:
          type: integer
        recipient_user_id:
          type: integer
          nullable: true
        conversation_id:
          type: integer
          nullable: true
        message_id:
          type: integer
          nullable: true
          description: >-
            Underlying Sinjapp chat message ID. This is not the ID accepted by
            GET /messages/{messageLog}.
        message_type:
          type: string
          enum:
            - text
            - image
            - voice
            - audio
            - document
        content:
          type: string
          nullable: true
          description: Text body or media caption.
        status:
          type: string
          description: >-
            Dispatch status recorded when sending. sent means accepted and
            stored by Sinjapp; use delivery_status for delivery and reading.
          example: sent
        delivery_status:
          type: string
          readOnly: true
          enum:
            - sent
            - delivered
            - read
            - unknown
          description: >-
            Current recorded receipt state. sent means stored without confirmed
            delivery; delivered means the recipient app received the message;
            read means the recipient read it and implies delivery; unknown means
            the underlying message is missing, does not match the log, or has an
            unrecognized state. The recipient app must report receipt before
            delivered or read can be confirmed. Returned on send, list, and
            single-message responses. Dedicated delivery/read timestamps are not
            available.
          example: read
        request_payload:
          type: object
          additionalProperties: true
        response_payload:
          type: object
          properties:
            conversation_id:
              type: integer
            message_id:
              type: integer
            media_url:
              type: string
              format: uri
              nullable: true
              description: >-
                Managed media URL. Treat this value as opaque and do not
                construct a storage path.
        sent_at:
          type: string
          format: date-time
          nullable: true
          description: Dispatch acceptance time, not delivery or read time.
  responses:
    Unauthorized:
      description: Missing, invalid, expired, or insufficient API credentials.
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Unauthenticated.
    Forbidden:
      description: The API key does not include the required scope.
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: The API key does not include the required scope.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-Api-Key

````