---
title: "Reply to comment"
method: POST
path: "/v1/inbox/comments/{postId}"
tags: ["Comments"]
---

# Reply to comment

`POST /v1/inbox/comments/{postId}`

Post a reply to a post or specific comment. Requires accountId in request body.

**Idempotency:** send an `Idempotency-Key` header to make retries safe
(e.g. after a client-side timeout where delivery is unknown): same key +
same body replays the original response (with `Idempotent-Replayed: true`)
instead of posting the comment a second time; same key + different body
returns 422; a key still in flight returns 409. Keys are retained for 24
hours and are scoped to the credential and to this exact path, so reusing
a key against a different postId returns 422 rather than replaying the
other post's response.

Only successful (2xx) responses are stored for replay. If the request
throws or returns a non-2xx status the key is released, so the header
protects the "request succeeded but the response was lost" case. After an
ambiguous failure (a 5xx or a network timeout) list the post's comments
before retrying with the same key, and treat an empty result as
inconclusive rather than as proof nothing was posted.

## Path parameters

- `postId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `accountId` string, required
  - `message` string, required
  - `attachmentUrl` string, uri — (Facebook only) URL of an image to attach, publishing a photo comment alongside the text. The URL must be publicly accessible so Meta can fetch it. Returns 400 for other platforms.
  - `commentId` string — Reply to specific comment (optional)
  - `parentCid` string — (Bluesky only) Parent content identifier
  - `rootUri` string — (Bluesky only) Root post URI
  - `rootCid` string — (Bluesky only) Root post CID

## Response `200`

Reply posted

- object
  - `success` boolean
  - `data` object
    - `commentId` string
    - `isReply` boolean
    - `cid` string, nullable — Bluesky CID

## Other responses

- `400` — Invalid request (e.g. attachmentUrl on a platform other than Facebook, code PLATFORM_NOT_SUPPORTED)
- `401` — Unauthorized
- `403` — Inbox addon required, or the connected account is not permitted to comment on this post on the platform (code platform_api_error, type platform_error)
- `409` — Same Idempotency-Key still processing; retry after a short backoff
- `422` — Idempotency-Key reused with a different request
- `429` — The connected account's upstream platform quota is exhausted. Reddit rate-limits per connected Reddit user (1000 requests per 10-minute window), and that budget is shared by every operation using that account. Retry after the window resets rather than retrying immediately; repeated calls while exhausted do not succeed and keep the budget spent. Google Ads: writes and reports run on one developer token shared by every Google Ads account on Zernio. The token holds Standard access (no daily operations cap), so this only happens when Google throttles the token or your ad account. The envelope has `code: rate_limited`, `platform: google`, `details.quotaScope: DEVELOPER` (`ACCOUNT` when it is your own ad account's quota), `details.resetsAt` (ISO instant when Google accepts requests again) and `Retry-After` counting down to it. Retrying earlier cannot succeed.
- `502` — Upstream platform error (code platform_api_error, type platform_error)

## Changes

- **2026-09-25** `2c04683ce694` — 4 info
  - added the optional property `details/adAccountId` to the response with the `429` status
  - added the optional property `details/createdObjects` to the response with the `429` status
  - added the optional property `details/stage` to the response with the `429` status
  - added the optional property `details/unconfirmedWrite` to the response with the `429` status
- **2026-09-16** `3e6ddf2a99ea` — 1 info
  - added the optional property `details/budgetScope` to the response with the `429` status
- **2026-09-15** `0dba7d004d75` — 2 info
  - added the optional property `details/quotaExhausted` to the response with the `429` status
  - added the optional property `details/quotaScope` to the response with the `429` status
- **2026-08-29** `e6f7a453bfb1` — 3 info
  - added the new optional `header` request parameter `Idempotency-Key`
  - added the non-success response with the status `409`
  - added the non-success response with the status `422`

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/inbox/comments/:postId/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.dev/zernio/apis/zernio-api/revisions/b2325332041a?raw)
