---
title: "Send private reply"
method: POST
path: "/v1/inbox/comments/{postId}/{commentId}/private-reply"
tags: ["Comments"]
---

# Send private reply

`POST /v1/inbox/comments/{postId}/{commentId}/private-reply`

Send a private message to the author of a comment. Supported on Instagram and Facebook only.
One reply per comment, must be sent within 7 days. Optionally attach interactive elements:
`quickReplies` (chips above the keyboard, max 13) or `buttons` (1-3 inline postback/url
buttons rendered in the same bubble via Meta's button_template). Chips do not render in
the Instagram Message Requests folder. Since late August 2026 Instagram refuses buttons,
cards and attachments to commenters who do not follow the account (Meta code 2, subcode
1545133, returned here as a non-retryable 400 that says so), and the failed call still
consumes the comment's single private reply. To reach non-followers send plain text and
add buttons once they reply. `quickReplies` and `buttons` are mutually exclusive. When
the comment's single private reply is spent (by this call or an earlier one) the 400
carries `details.privateReplyConsumed: true`; never retry it.

## Path parameters

- `postId` string, required
- `commentId` string, required

## Request body

- object
  - `accountId` string, required — The social account ID (Instagram or Facebook)
  - `message` string, required — The message text to send as a private DM
  - `quickReplies` object[] — Optional quick-reply chips appended to the message. Visible only in the Instagram and Messenger apps (not on web). Maximum 13 entries. Mutually exclusive with `buttons`. Note: chips do NOT render in the Instagram Message Requests folder where DMs from non-followers land — use `buttons` instead for cold reach.
    - `title` string, required — Label shown on the chip. Truncated by Meta beyond 20 characters.
    - `payload` string, required — Opaque value returned in the inbound webhook when the user taps the chip.
    - `imageUrl` string, uri — Optional thumbnail shown next to the chip title.
  - `buttons` union[] — Optional 1-3 inline buttons rendered as part of the same message bubble via Meta's button_template. Visible in the Instagram Message Requests folder (unlike quick replies). Mutually exclusive with `quickReplies`.
    - union
      - object
        - `type` 'url', required
        - `title` string, required — Label shown on the button.
        - `url` string, uri, required — URL opened when the button is tapped.
      - object
        - `type` 'postback', required
        - `title` string, required — Label shown on the button.
        - `payload` string, required — Opaque value returned in the inbound webhook when the user taps the button.
      - object
        - `type` 'phone', required
        - `title` string, required — Label shown on the button. Facebook only.
        - `phone` string, required — E.164 phone number dialed when tapped. Facebook only.

## Response `200`

Private reply sent successfully

- object
  - `status` string
  - `messageId` string — The ID of the sent message
  - `commentId` string — The comment ID that was replied to
  - `platform` 'instagram' | 'facebook'

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Inbox addon required
- `404` — Account not found

## Changes

- **2026-09-04** `2d81890d21d5` — 6 info
  - added the optional property `details` to the response with the `400` status
  - added the optional property `param` to the response with the `400` status
  - added the optional property `platform` to the response with the `400` status
  - added the optional property `platformError` to the response with the `400` status
  - …2 more

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/inbox/comments/:postId/:commentId/private-reply/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/zernio/zernio-api/revisions/2d81890d21d5/schema)
