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

# List Chat Notes

> Retrieve a page of the internal notes of a chat, newest first, with optional filters on the original author.

**Required token scopes:** `View notes of all chats`

Filters match the note's **original author**, not its last editor. When you set several filters, a note must match all of them.

Array parameters use brackets: send `authorSources[]=bot&authorSources[]=api`. A plain `authorSources=bot` is rejected with 400.

`total` counts every note that matches the filters, not only the notes on this page. More pages exist while `skip` + the number of returned notes is less than `total`.


## OpenAPI

````yaml api-reference/openapi.json GET /chats/{chatId}/chat-notes
openapi: 3.1.0
info:
  title: Texter API V2
  version: 2.0.0
  description: >-
    The **Texter API** lets your developers control the Texter platform
    programmatically:


    - Manage and send your WhatsApp template messages

    - Retrieve chats by ID or by various filters

    - Assign and resolve conversations

    - Send session messages into active chats

    - Manage labels

    - Monitor and resolve channel health issues

    - Subscribe to real-time webhook events

    - Manage quick replies (coming soon)


    For any questions please contact [Texter
    Support](https://wa.me/972586640430).


    ### Using the playground


    On any endpoint page: set **projectID** under *Server* to your project
    subdomain (if your Texter URL is `https://demo.texterchat.com`, the
    projectID is `demo`) and paste your API token into the **Authorization**
    field - both persist while you browse. Create tokens under **gear icon →
    Developers → API Tokens** with the scopes each endpoint lists.
  contact:
    name: Texter Support
    url: https://wa.me/972586640430
servers:
  - url: https://{projectID}.texterchat.com/server/api/v2
    description: Your Texter environment. Replace projectID with your project subdomain
    variables:
      projectID:
        default: demo
        description: >-
          Your unique project subdomain. If your environment URL is
          https://demo.texterchat.com, your projectID is "demo"
security:
  - bearerAuth: []
tags:
  - name: Manage Templates
    description: >-
      Create, localize, submit, update, delete and send WhatsApp template
      messages, and retrieve approved templates for your connected WhatsApp
      accounts.


      **Suggested token for this group** - create one API token with the scopes:
      *Send template messages*, *View template messages*, *Manage WhatsApp
      templates*, *Manage all chats*, *List all chats* (the last two also cover
      the Templates Subscriptions group). Each endpoint below also lists the
      exact scopes it needs.
  - name: Templates Subscriptions
    description: >-
      Manage recipient subscriptions for WhatsApp template messages -
      unsubscribe or resubscribe recipients, and list unsubscribed users across
      all channels or for a specific account.


      **Suggested token for this group** - scopes: *Manage all chats*, *List all
      chats*. Each endpoint below also lists the exact scopes it needs.
  - name: Messages
    description: >-
      Retrieve message history from a chat, or send new session messages - text,
      media, buttons, lists, contact cards and locations - within the active
      WhatsApp 24-hour session window.


      **Suggested token for this group** - scopes: *Send session message*, *View
      all chats*. Each endpoint below also lists the exact scopes it needs.
  - name: Chats
    description: >-
      Fetch chat details, search conversations, update chat properties, assign
      or resolve chats, and manage their CRM metadata.


      **Suggested token for this group** - scopes: *Manage all chats*, *List all
      chats*, *Send session message*. Each endpoint below also lists the exact
      scopes it needs.
  - name: Labels
    description: >-
      Create and edit labels, assign or remove them from chats, retrieve label
      data, or delete labels from your inbox.


      **Suggested token for this group** - scopes: *Manage labels*, *Manage all
      chats* (needed for managing labels on chats). Each endpoint below also
      lists the exact scopes it needs.
  - name: Chat Notes
    description: >-
      Read and write the internal notes of a chat. Agents see notes in the inbox
      next to the conversation; the contact never sees them. Notes record who
      wrote them (an agent, a bot, a scenario or an API token) and can show a
      custom author name. See The Chat Note object for the fields.


      **Suggested token for this group** - scopes: *View notes of all chats*,
      *Add notes to all chats*, *Edit and delete notes of all chats*. Each
      endpoint below also lists the exact scopes it needs.
  - name: Channels
    description: >-
      Monitor and maintain the health of connected messaging channels - retrieve
      active channel health problems, filter them by severity or account, and
      mark issues as resolved.


      **Suggested token for this group** - scopes: *Manage channels*. Each
      endpoint below also lists the exact scopes it needs.
  - name: Quick Replies
    description: >-
      Manage quick replies - prepared messages agents can send into matching
      chats with one click. Quick replies marked with `aiQuickReply` client
      metadata appear as **AI suggestions** in the Texter inbox (see Create
      Quick Reply for the full flow).


      **Suggested token for this group** - scopes: *View quick replies*, *Manage
      quick replies*. Each endpoint below also lists the exact scopes it needs.
  - name: Files
    description: >-
      Generate public access links to media files stored in Texter.


      **Suggested token for this group** - scopes: *View all files*, *View all
      chats* (both required). Each endpoint below also lists the exact scopes it
      needs.
  - name: Subscribe to Events
    description: >-
      Register webhooks for events occurring in your Texter environment. Under
      the hood this uses **Scenarios** - a workflow automation feature within
      Texter. To make integration easy, pre-defined templates are provided:
      import a scenario JSON, plug in your webhook URL and user UID, and the
      subscription is active.


      See the **Webhook Events** pages for the payload your URL receives for
      each event.


      **Suggested token for this group** - scopes: *View scenarios*, *Create
      scenarios*, *Delete scenarios*, *Activate/inactivate scenarios*, *Manage
      scenarios on behalf of user*. Each endpoint below also lists the exact
      scopes it needs.


      If the provided templates don't satisfy your needs, contact [Texter
      Support](https://wa.me/972586640430) and we'll gladly help modify any
      triggers, conditions or actions for your webhook.
  - name: Scenarios (Advanced)
    description: >-
      Full programmatic control over scenarios for advanced automations: create
      scenarios from scratch, copy them, edit drafts, publish revisions, inspect
      execution runs, and discover the available building blocks (events,
      conditions, loaders, actions). For plain webhook subscriptions, the
      **Subscribe to Events** group with its ready-made templates is the simpler
      path.


      **Suggested token for this group** - scopes: *View scenarios*, *Create
      scenarios*, *Edit scenarios*, *Delete scenarios*, *Activate/inactivate
      scenarios*, *Manage scenarios on behalf of user*, *View scenarios runs*.
      Each endpoint below also lists the exact scopes it needs.
paths:
  /chats/{chatId}/chat-notes:
    get:
      tags:
        - Chat Notes
      summary: List Chat Notes
      description: >-
        Retrieve a page of the internal notes of a chat, newest first, with
        optional filters on the original author.


        **Required token scopes:** `View notes of all chats`



        Filters match the note's **original author**, not its last editor. When
        you set several filters, a note must match all of them.


        Array parameters use brackets: send
        `authorSources[]=bot&authorSources[]=api`. A plain `authorSources=bot`
        is rejected with 400.


        `total` counts every note that matches the filters, not only the notes
        on this page. More pages exist while `skip` + the number of returned
        notes is less than `total`.
      operationId: list-chat-notes
      parameters:
        - name: chatId
          in: path
          required: true
          schema:
            type: string
          description: >-
            The unique identifier of the chat. You can obtain this value by
            using the Search Chats endpoint with the contact's phone number
          example: 67a87067aeed4dee1271cb4d
        - name: skip
          in: query
          schema:
            type: string
            pattern: ^\d+$
          description: How many notes to skip. Defaults to `0`
          example: '0'
        - name: limit
          in: query
          schema:
            type: string
            pattern: ^\d+$
          description: Maximum notes to return (1-1000). Defaults to `100`
          example: '20'
        - name: authorSources[]
          in: query
          schema:
            type: array
            items:
              type: string
              enum:
                - user
                - bot
                - scenario
                - api
                - unknown
            minItems: 1
            uniqueItems: true
          style: form
          explode: true
          description: >-
            Return notes whose original author comes from **any** of these
            sources: `user` (an agent in the inbox), `bot`, `scenario`, `api`
            (any API token), `unknown`. Repeat the parameter for several
            sources. Duplicate values return 400
        - name: authorUid
          in: query
          schema:
            type: string
            minLength: 1
          description: >-
            Return notes written by the agent with this user ID (the
            `author.actor.uid` of that agent's notes)
        - name: authorCustomName
          in: query
          schema:
            type: string
            minLength: 1
          description: Return notes whose author `customName` is exactly this value
          example: Refunds system
      responses:
        '200':
          description: A page of notes, newest first
          content:
            application/json:
              schema:
                type: object
                properties:
                  notes:
                    type: array
                    items:
                      $ref: '#/components/schemas/ChatNote'
                    description: Notes on this page, newest first
                  total:
                    type: integer
                    description: >-
                      Number of notes in the chat that match the filters, across
                      all pages
                required:
                  - notes
                  - total
              example:
                notes:
                  - _id: 6731f0c2a1b2c3d4e5f60718
                    chatId: 67a87067aeed4dee1271cb4d
                    text: Customer asked for a refund on order 1234
                    messageId: 6731efa0a1b2c3d4e5f60701
                    author:
                      actor:
                        type: jwt
                        issuer: https://texterchat.com/demo
                        kid: a1b2c3
                      customName: Refunds system
                    createdAt: 1762851000000
                    updatedAt: 1762851000000
                total: 1
        '400':
          description: Invalid query parameter
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                Plain array parameter:
                  value:
                    error: data/authorSources must be array
                Limit out of range:
                  value:
                    error: 'limit: Invalid value. Should be an integer from 1 to 1000'
        '401':
          description: Missing or invalid token, or missing required scope
        '404':
          description: Chat not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error: Chat not found
      x-codeSamples:
        - lang: bash
          label: Newest 20 notes
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?limit=20' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Next page of 20
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?skip=20&limit=20' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes written by the bot
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=bot' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes by bots or scenarios
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=bot&authorSources[]=scenario' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes written by agents
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=user' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes by one agent
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorUid=5f1b2c3d4e5f6a7b8c9d0e1f' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes written through the API
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=api' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Notes under your custom name
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=api&authorCustomName=Refunds%20system' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Latest note under your custom name
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=api&authorCustomName=Refunds%20system&limit=1' \
              --header 'Authorization: Bearer <token>'
        - lang: bash
          label: Count bot notes (read total)
          source: |-
            curl -g --request GET \
              --url 'https://demo.texterchat.com/server/api/v2/chats/67a87067aeed4dee1271cb4d/chat-notes?authorSources[]=bot&limit=1' \
              --header 'Authorization: Bearer <token>'
components:
  schemas:
    ChatNote:
      type: object
      description: An internal note on a chat
      properties:
        _id:
          type: string
          description: Unique note ID
          example: 6731f0c2a1b2c3d4e5f60718
        chatId:
          type: string
          description: ID of the chat the note belongs to
          example: 67a87067aeed4dee1271cb4d
        text:
          type: string
          description: The note text
        messageId:
          type: string
          description: >-
            ID of the chat message the note is attached to. Missing when the
            chat had no messages
        author:
          $ref: '#/components/schemas/ChatNoteAttribution'
          description: Who wrote the note. Kept as it is on every edit
        lastEditor:
          $ref: '#/components/schemas/ChatNoteAttribution'
          description: Who made the last text edit. Missing on notes that were never edited
        createdAt:
          type: integer
          description: Creation time, Unix milliseconds
          example: 1762851000000
        updatedAt:
          type: integer
          description: Last change time, Unix milliseconds
          example: 1762851000000
      required:
        - _id
        - chatId
        - text
        - author
        - createdAt
        - updatedAt
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message
      required:
        - error
    ChatNoteAttribution:
      type: object
      description: Author or editor of a note
      properties:
        actor:
          $ref: '#/components/schemas/ChatNoteActor'
        customName:
          type: string
          description: >-
            Name shown in the inbox instead of the default name for the actor.
            Missing when none was set
      required:
        - actor
    ChatNoteActor:
      type: object
      description: Who wrote or edited a note. The fields depend on `type`
      properties:
        type:
          type: string
          enum:
            - user
            - system
            - jwt
            - legacyToken
            - unknown
          description: >-
            `user`: an agent in the inbox. `system`: a bot or a scenario (see
            `component`). `jwt` / `legacyToken`: an API token. `unknown`: not
            known
        uid:
          type: string
          description: '`user` only. The agent''s user ID'
        email:
          type: string
          description: '`user` only, optional. The agent''s email'
        name:
          type: string
          description: '`user` only, optional. The agent''s name'
        component:
          type: string
          enum:
            - bot
            - scenario
            - cron
          description: '`system` only. The part of Texter that wrote the note'
        issuer:
          type: string
          description: '`jwt` only. The token issuer'
        kid:
          type: string
          description: '`jwt` only, optional. The token key ID'
        tokenSha256:
          type: string
          description: '`legacyToken` only. SHA-256 hash of the token'
      required:
        - type
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API token generated in Texter: gear icon → Developers → API Tokens. When
        creating a token, assign it the scopes required by the endpoints you
        plan to call - each endpoint lists its required scopes.

````

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