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

# Send private reply

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

## Request

- Base URL: `https://apihub.co.il`
- URL: `https://apihub.co.il/v1/messaging/inbox/comments/{postId}/{commentId}/private-reply`
- Auth: HTTP bearer

Send a direct 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. Instagram can refuse 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). The refusal is uneven: most accounts
do not get it, an affected account gets it on many of its non-followers, and only that
account's own past refusals show whether it is affected. The failed call still consumes the
comment's single private reply. On an affected account, send plain text to reach
non-followers 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.
A 502 means Meta answered a server error after receiving the reply; it carries
`details.privateReplyOutcome: "unknown"`, the reply is usually delivered and the comment's
private reply spent, so check the conversation before retrying.


**Billing:** Request; paid actions are priced in credits (see GET /v1/messaging/prices) · **Rate limit:** 60/min

## Path parameters

- `postId` string, required: The media/post ID (Instagram media ID or Facebook post ID)
- `commentId` string, required: The comment ID to send a private reply to

## Headers

- `Idempotency-Key` string
- `X-Tag` string

## Request body

- object
  - `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
        - `url` string, uri, required: URL opened when the button is tapped.
        - `type` 'url', required
        - `title` string, required: Label shown on the button.
      - 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
        - `phone` string, required: E.164 phone number dialed when tapped. Facebook only.
        - `title` string, required: Label shown on the button. Facebook only.
  - `message` string, required: The message text to send as a private DM
  - `accountId` string, required: The account ID (Instagram or Facebook)
  - `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.

## Response `200`

Completed

- object
  - `id` string: Execution id — stable across internal retries; use it with GET /v1/executions/{id}
  - `status` 'pending' | 'processing' | 'completed' | 'partial' | 'failed' | 'cancelled' | 'timeout'
  - `operation` string
  - `tag` string, nullable: Your X-Tag, if sent
  - `created_at` string, date-time
  - `completed_at` string, date-time, nullable
  - `output` object: Operation result (see each operation). While a Studio render is processing: `stage` (queued · transcribing · downloading · preparing · cleaning_voice · mixing_audio · rendering · finishing), `phase` (the engine's: download · prepare · voice · audio · encode · qa · upload, or null), `progress` (a percent, 0–100) and `progress_fraction` (0–1), `eta_seconds` (seconds left, never below 0) and `estimate_seconds`
    - `status` string
    - `platform` 'instagram' | 'facebook'
    - `commentId` string: The comment ID that was replied to
    - `messageId` string: The ID of the sent message
  - `error` string, nullable
  - `usage` object
    - `credits_charged` number, nullable
    - `credits_reserved` number
    - `estimated_credits` number
    - `cost_source` 'provider_reported' | 'calculated' | 'estimated' | 'null', nullable
    - `provider_usage` object, nullable: Normalised consumption, e.g. { VIDEO_SECOND: 22.4 }
  - `balance` object
    - `available` number
    - `reserved` number

## Other responses

- `400`: Invalid input
- `402`: Insufficient credits / project budget
- `404`: Resource not found (or not yours)
- `429`: Rate limited
- `503`: Service temporarily paused

---

[API](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai.md) · [All operations](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/revisions/a8caa42835ce?raw)
