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

# Reply to a comment

> Posts a reply to a comment on the original platform.

Postbreeze sends the reply using the same account the original comment was made on, then saves the reply onto the comment so you can see the thread in your inbox.

If the account's login has expired (`TOKEN_EXPIRED`), you'll have to reconnect it before you can reply — otherwise you'll get a `403`.

Replying also marks the comment as read, since you've clearly seen it. The workspace is figured out automatically from the comment — anyone with access to that workspace can reply.



## OpenAPI

````yaml /openapi.json post /comments/{commentId}/reply
openapi: 3.0.0
info:
  title: Postbreeze API
  description: >-
    Public REST API for scheduling and managing social posts. Authenticate every
    request with `Authorization: Bearer pb_live_…`. All endpoints are scoped to
    a single workspace; an API key issued for workspace A cannot access
    workspace B.
  version: 1.0.0
  contact: {}
servers:
  - url: http://localhost:4100/api/v1
security:
  - bearer: []
tags: []
paths:
  /comments/{commentId}/reply:
    post:
      tags:
        - Comments
      summary: Reply to a comment
      description: >-
        Posts a reply to a comment on the original platform.


        Postbreeze sends the reply using the same account the original comment
        was made on, then saves the reply onto the comment so you can see the
        thread in your inbox.


        If the account's login has expired (`TOKEN_EXPIRED`), you'll have to
        reconnect it before you can reply — otherwise you'll get a `403`.


        Replying also marks the comment as read, since you've clearly seen it.
        The workspace is figured out automatically from the comment — anyone
        with access to that workspace can reply.
      operationId: CommentsV1Controller_reply
      parameters:
        - name: commentId
          required: true
          in: path
          description: >-
            Prefixed cuid of the inbox comment to reply to. Must belong to a
            workspace the caller has access to.
          schema:
            example: cmt_01HZY8N3M2K9R5T8V4P6Q1J0BC
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentReplyBodyDto'
      responses:
        '201':
          description: >-
            The updated comment row, now carrying the `reply` sub-object with
            the platform-side identifier of the reply Postbreeze posted.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: Prefixed cuid identifier of the comment row.
                  platform:
                    type: string
                    enum:
                      - INSTAGRAM
                      - FACEBOOK_PAGE
                      - X
                      - LINKEDIN_PERSON
                      - LINKEDIN_COMPANY
                      - TIKTOK_BUSINESS
                      - TIKTOK_PERSONAL
                      - YOUTUBE
                      - PINTEREST
                      - THREADS
                      - BLUESKY
                    description: Which platform this comment was pulled from.
                  socialAccountId:
                    type: string
                    description: >-
                      Prefixed cuid of the connected channel that owns the post.
                      Matches an `id` from `GET /social-accounts`, so consumers
                      can group inbox rows by channel without a second call.
                  externalCommentId:
                    type: string
                    description: >-
                      Platform-side identifier of the comment itself. Unique per
                      `(socialAccountId, externalCommentId)` — re-running
                      refresh upserts in place rather than creating duplicates.
                  externalParentId:
                    type: string
                    nullable: true
                    description: >-
                      Platform-side parent id when this comment is itself a
                      reply nested inside a thread. Null for top-level comments
                      on the post.
                  externalPostId:
                    type: string
                    description: >-
                      Platform-side identifier of the post the comment belongs
                      to. Stored even for posts that weren't scheduled through
                      Postbreeze, so the inbox can deep-link "View on platform".
                  externalUrl:
                    type: string
                    nullable: true
                    description: >-
                      Server-built deep link to the comment in the platform's
                      native UI. Null when the platform doesn't expose a stable
                      per-comment URL (some Instagram comments fall in this
                      bucket).
                  author:
                    description: >-
                      Author snapshot captured at fetch time. Frozen —
                      platform-side renames after fetch won't be reflected here.
                    allOf:
                      - type: object
                        properties:
                          handle:
                            type: string
                            nullable: true
                            description: >-
                              The author's user-facing handle on the platform
                              (e.g. `@brand`). Null when the platform doesn't
                              expose a handle for the responder.
                          displayName:
                            type: string
                            nullable: true
                            description: >-
                              Human-readable display name. Null when
                              unavailable.
                          avatarUrl:
                            type: string
                            nullable: true
                            description: Profile avatar URL when the platform provides one.
                  body:
                    type: string
                    description: Plain-text body of the comment.
                  createdAt:
                    type: string
                    format: date-time
                    description: When the platform says the comment was posted.
                  readAt:
                    type: string
                    format: date-time
                    nullable: true
                    description: >-
                      When a user marked the comment read in the Postbreeze
                      inbox. Null while the row is still unread. Filter on
                      `unread=true` to see only rows where this is null.
                  reply:
                    nullable: true
                    description: >-
                      The reply Postbreeze posted on this comment, if any. Null
                      when the comment hasn't been replied to through
                      Postbreeze. Replies posted natively on the platform are
                      not surfaced here.
                    type: object
                    allOf:
                      - type: object
                        properties:
                          body:
                            type: string
                            description: Plain-text body of the reply that was sent.
                          externalId:
                            type: string
                            description: >-
                              Platform-side identifier of the reply Postbreeze
                              posted. Useful for cross-referencing in the
                              platform's native UI.
                          createdAt:
                            type: string
                            format: date-time
                            description: When Postbreeze posted the reply.
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    example: 400
                  code:
                    type: string
                    example: VALIDATION_FAILED
                  message:
                    type: string
                  requestId:
                    type: string
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    example: 401
                  message:
                    type: string
                    example: Unauthorized
                  requestId:
                    type: string
components:
  schemas:
    CommentReplyBodyDto:
      type: object
      properties:
        text:
          type: string
          description: >-
            Plain-text reply to post on the platform. Trimmed before send. Each
            platform strips formatting on submission, so Markdown / HTML is
            silently dropped.
          example: Thanks for watching! 🙏
      required:
        - text
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: API key
      type: http
      description: Your Postbreeze API key

````