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

# Publish session typing

> Shows the typing indicator in a conversation while a plugin prepares its
reply: in the Talqui app, and on the channel where it supports one
(WhatsApp Cloud, WhatsApp via Gupshup, WebChat). Accepted for a plugin
installed on the tenant (`Plugin` token) or the tenant's plugin connection;
operator tokens are refused. The event carries no operatorID, so the app
shows it as an automation typing.

The indicator is anchored to the latest message the contact sent in the
session. Omit `messageID` and that message is used. When `messageID` is
sent it must be that message, or the call answers 409 with the latest one in
`fields[0].allowed`. On WhatsApp the indicator also marks that message, and
every one before it, as read.

There is no need to call `stop` after replying: the indicator ends when the
reply is delivered, after about 25s on WhatsApp and 90s in the Talqui app.
`stop` only has an effect on WebChat. One `start` per session is published
every 5s; the extra calls answer 202 with `published: false`.

Returns 202: the channel is reached asynchronously.



## OpenAPI

````yaml /api/services-api.yaml post /v1/tenants/{tenantID}/sessions/{sessionID}/typing
openapi: 3.0.3
info:
  description: >-
    Talqui is an omnichannel customer service platform that unifies
    conversations from WhatsApp, Instagram, Telegram, and many other channels
    into a single attendant panel, alongside a broader ecosystem of plugins and
    integrations. This API gives developers programmatic access to Talqui's
    services layer, exposing the operations needed to read and manage tenants,
    conversations, plugins, and related resources that power that platform.


    Authentication is available on behalf of an Operator (the default for this
    API), a Plugin Connection, or a Plugin — see the [Talqui authentication
    guide](https://docs.talqui.chat/guides/introduction/authentication/) for how
    each token is obtained and when to use it.


    Need help or have questions not covered here? Reach out to
    support@talqui.com.
  license:
    name: ISC
    url: https://opensource.org/license/isc-license-txt
  title: Talqui - Services API
  version: 0.78.1
servers:
  - description: Production
    url: https://services-api.talqui.chat
security: []
tags:
  - name: Tenants
  - name: Settings
  - name: Analytics/Reports
  - name: Analytics
  - name: Campaigns
  - name: Campaigns/Models
  - name: Contacts
  - name: Contacts/Imports
  - name: Handoff links
  - name: Inboxes
  - name: Messages
  - name: Notifications
  - name: Sessions
  - name: Operators/Shortcuts
  - name: Operators
  - name: Plugins
  - name: Setup
  - name: Uploads
paths:
  /v1/tenants/{tenantID}/sessions/{sessionID}/typing:
    post:
      tags:
        - Sessions
      summary: Publish session typing
      description: >-
        Shows the typing indicator in a conversation while a plugin prepares its

        reply: in the Talqui app, and on the channel where it supports one

        (WhatsApp Cloud, WhatsApp via Gupshup, WebChat). Accepted for a plugin

        installed on the tenant (`Plugin` token) or the tenant's plugin
        connection;

        operator tokens are refused. The event carries no operatorID, so the app

        shows it as an automation typing.


        The indicator is anchored to the latest message the contact sent in the

        session. Omit `messageID` and that message is used. When `messageID` is

        sent it must be that message, or the call answers 409 with the latest
        one in

        `fields[0].allowed`. On WhatsApp the indicator also marks that message,
        and

        every one before it, as read.


        There is no need to call `stop` after replying: the indicator ends when
        the

        reply is delivered, after about 25s on WhatsApp and 90s in the Talqui
        app.

        `stop` only has an effect on WebChat. One `start` per session is
        published

        every 5s; the extra calls answer 202 with `published: false`.


        Returns 202: the channel is reached asynchronously.
      operationId: PublishSessionTypingController
      parameters:
        - in: path
          name: tenantID
          required: true
          schema:
            description: The tenant of the conversation.
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
        - in: path
          name: sessionID
          required: true
          schema:
            description: The session where the typing indicator is shown.
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
            type: string
      requestBody:
        content:
          application/json:
            schema:
              properties:
                action:
                  description: >-
                    `start` shows the indicator; `stop` clears it on the
                    channels that support it (WebChat).
                  enum:
                    - start
                    - stop
                  type: string
                messageID:
                  description: >-
                    Contact message being answered. Omit it to use the latest
                    message the contact sent in the session; when sent, it must
                    be that message.
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  type: string
              required:
                - action
              type: object
        required: true
      responses:
        '202':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  action:
                    description: The action received.
                    enum:
                      - start
                      - stop
                    type: string
                  hasExternalID:
                    description: >-
                      `false` when that message has no channel id: only the
                      Talqui app shows the indicator.
                    type: boolean
                  messageID:
                    description: The contact message the indicator was anchored to.
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                    type: string
                  published:
                    description: >-
                      `false` when the call fell inside the throttle window and
                      nothing was sent.
                    type: boolean
                  reason:
                    description: Why nothing was published, when `published` is `false`.
                    enum:
                      - throttled
                    type: string
                required:
                  - published
                  - action
                  - messageID
                  - hasExternalID
                type: object
          description: Response for status 202.
        '400':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/RequestValidationError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            RequestValidationError (error_code 1002): params or body fail schema
            validation.
        '401':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnauthorizedError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: 'UnauthorizedError (error_code 1003): missing/invalid token.'
        '403':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/ForbiddenError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            ForbiddenError (error_code 1004): operator token, another tenant's
            connection, or a plugin not installed on the tenant.
        '404':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/SessionNotFoundError'
                        - $ref: '#/components/schemas/TypingMessageNotFoundError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            SessionNotFoundError (error_code 1060): sessionID does not exist for
            this tenant. | TypingMessageNotFoundError (error_code 1842):
            messageID is not a message of this session.
        '409':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/SessionNotActiveError'
                        - $ref: >-
                            #/components/schemas/TypingReferenceMessageMissingError
                        - $ref: '#/components/schemas/TypingMessageNotInboundError'
                        - $ref: '#/components/schemas/TypingMessageNotLatestError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            SessionNotActiveError (error_code 1840): the session is closed. |
            TypingReferenceMessageMissingError (error_code 1841): the contact
            has not sent any message in the session. |
            TypingMessageNotInboundError (error_code 1843): messageID was not
            sent by the contact. | TypingMessageNotLatestError (error_code
            1844): messageID is not the latest contact message.
        '500':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnknownError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            UnknownError (error_code 5999): Unexpected internal error not
            otherwise documented for this endpoint.
        '502':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/MessagingError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: 'MessagingError (error_code 5005): the event could not be published.'
components:
  schemas:
    RequestValidationError:
      additionalProperties: false
      properties:
        error:
          enum:
            - RequestValidationError
          type: string
        error_code:
          enum:
            - 1002
          type: number
        fields:
          items:
            additionalProperties: false
            properties:
              allowed:
                type: string
              field:
                type: string
              received:
                type: string
            required:
              - field
              - received
              - allowed
            type: object
          type: array
        message:
          example: Invalid request data.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
        - fields
      type: object
    UnauthorizedError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnauthorizedError
          type: string
        error_code:
          enum:
            - 1003
          type: number
        message:
          example: You are not authorized to perform this request.
          type: string
        statusCode:
          enum:
            - 401
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    ForbiddenError:
      additionalProperties: false
      properties:
        error:
          enum:
            - ForbiddenError
          type: string
        error_code:
          enum:
            - 1004
          type: number
        message:
          example: You do not have access to this resource.
          type: string
        statusCode:
          enum:
            - 403
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    SessionNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - SessionNotFoundError
          type: string
        error_code:
          enum:
            - 1060
          type: number
        message:
          example: Session not found.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    TypingMessageNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - TypingMessageNotFoundError
          type: string
        error_code:
          enum:
            - 1842
          type: number
        message:
          example: Message not found in this session.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    SessionNotActiveError:
      additionalProperties: false
      properties:
        error:
          enum:
            - SessionNotActiveError
          type: string
        error_code:
          enum:
            - 1840
          type: number
        message:
          example: The session is not active.
          type: string
        statusCode:
          enum:
            - 409
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    TypingReferenceMessageMissingError:
      additionalProperties: false
      properties:
        error:
          enum:
            - TypingReferenceMessageMissingError
          type: string
        error_code:
          enum:
            - 1841
          type: number
        message:
          example: The session has no message from the contact to answer.
          type: string
        statusCode:
          enum:
            - 409
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    TypingMessageNotInboundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - TypingMessageNotInboundError
          type: string
        error_code:
          enum:
            - 1843
          type: number
        message:
          example: The typing indicator must reference a message sent by the contact.
          type: string
        statusCode:
          enum:
            - 409
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    TypingMessageNotLatestError:
      additionalProperties: false
      properties:
        error:
          enum:
            - TypingMessageNotLatestError
          type: string
        error_code:
          enum:
            - 1844
          type: number
        message:
          example: >-
            The typing indicator must reference the latest message sent by the
            contact.
          type: string
        statusCode:
          enum:
            - 409
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    UnknownError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnknownError
          type: string
        error_code:
          enum:
            - 5999
          type: number
        message:
          example: For some unknown reason your request has not succeeded.
          type: string
        statusCode:
          enum:
            - 500
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    MessagingError:
      additionalProperties: false
      properties:
        error:
          enum:
            - MessagingError
          type: string
        error_code:
          enum:
            - 5005
          type: number
        message:
          example: Messaging operation failed.
          type: string
        statusCode:
          enum:
            - 502
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.