Skip to main content
SocialAPI’s comments API reads the comments on the posts of your connected accounts and acts on them: reply publicly, send a private reply, hide, unhide, delete, and like. The endpoints are the same on every platform that has comments, and each comment tells you which actions the platform allows for it in its capabilities object. A public reply costs 1 interaction credit. Reading, private replies, hiding, deleting, and liking cost none. Platform pages hold the rules that differ per platform.

Endpoints

{postId} is the platform’s post ID (targets[].platform_post_id on a post you published through SocialAPI, or id from GET /v1/inbox/comments). {commentId} and comment_id accept the comment’s sapi_cmt_ ID or the platform’s comment ID. See IDs.

Your first reply

List the posts that have comments on one account:
Response (HTTP 200):
Read the comments on that post. account_id is required:
Response (HTTP 200):
Reply to that comment:
Response (HTTP 200):
The reply is public when the platform accepts it. comment_id in the response is the new reply’s sapi_cmt_ ID.

List posts with comments

GET /v1/inbox/comments returns the posts that received comments, newest published first. Each post has id (the platform’s post ID, the value for {postId}), user_id (the ID of your SocialAPI account), account_id, page_id (Facebook only), platform, content, thumbnail, permalink, comment_count, like_count, published_at, created_at, and updated_at. pagination holds has_more, and next_cursor when has_more is true. Paging is in Pagination. YouTube videos with comments appear only when you pass account_id, and that list is 1 page with no cursor.

List comments and replies

GET /v1/inbox/comments/{postId} lists the comments on a post. GET /v1/inbox/comments/{postId}/{commentId}/replies lists the replies to one comment in the same shape. Both need account_id, the connected account that owns the post. A missing account_id returns 400 validation.field_required. A page can hold fewer comments than limit, because the platform sets its own page size. Follow next_cursor until has_more is false: see Pagination. Comments in webhook events use the nested Interaction shape instead of this flat one. Read capabilities instead of assuming. A call the platform does not support returns 501 resource.not_supported.

Reply to a comment

POST /v1/inbox/comments/{postId} posts a public reply. A reply costs 1 interaction credit. When the plan’s interaction allowance is used up, the call returns 429 validation.interaction_limit_exhausted. A credit is returned when the request fails with a validation.* error: see When a credit comes back.

Send a private reply

A private reply is a DM to the person who wrote a comment. It has its own endpoint: POST /v1/inbox/comments/{postId}/{commentId}/private-reply. The reply endpoint above never sends one.
Response (HTTP 200):
Private replies exist on Instagram and Facebook. The platform allows 1 private reply per comment, within 7 days of the comment. A second reply, or a comment older than 7 days, returns 400 platform.instagram.private_reply_ineligible or 400 platform.facebook.private_reply_ineligible. error.meta.reason says why: already_replied, platform_refused, or window_expired. This 400 is final, so retrying never succeeds. Every other platform returns 501 resource.not_supported. A private reply does not open the messaging window. You cannot message the person again until they answer, and their answer opens the window. To answer comments by keyword with no handler of your own, use an Automation: it sends the private reply and handles each button tap, including a Follow gate on Instagram.

Hide and unhide a comment

Hiding removes a comment from public view. Unhiding restores it.
Response (HTTP 200):
Unhide with DELETE on the same path and account_id as a query parameter:
Hiding is free. A platform without it returns 501 resource.not_supported. Threads hides replies only on an account connected on or after 2026-10-17: reconnect an older account first. See Threads.

Delete a comment

DELETE /v1/inbox/comments/{postId}/{commentId}?account_id={account_id} deletes the comment on the platform. It returns { "success": true } and cannot be undone. On Threads, TikTok, X, Bluesky, and YouTube, you can delete only comments the connected account wrote. Each other platform’s page states its rule.

Like and unlike a comment

POST /v1/inbox/comments/{postId}/{commentId}/like likes a comment as the connected account. DELETE on the same path removes the like. Both take account_id: in the body for POST, as a query parameter for DELETE. They return { "success": true }. A platform without comment likes returns 501 resource.not_supported, and can_like is false on its comments.

Filter YouTube comments

GET /v1/inbox/comments/{postId} accepts 3 more parameters. Only YouTube uses them. Every other platform ignores them. A value outside these lists, or a longer q, returns 400 validation.field_invalid. See YouTube comments.

Platform support

Every platform has its own comment rules: whether replies nest, who can hide or delete what, and which account permissions and platform scopes the connection needs. The capability matrix compares platforms, and each platform page has the details: Instagram, Facebook, Threads, TikTok, YouTube, X, and Bluesky. Google Business Profile has no comments or Q&A: its calls return 501 resource.not_supported. Read reviews on Reviews.

Limits

Errors and debugging

Check these in order when a comment call fails or returns nothing:
  1. 401, 403 auth.insufficient_scope. The key is invalid, or a scoped key lacks the scope in Scopes.
  2. 404 account.not_found, 403 account.reconnection_required. The acc_ ID is not yours, or the account needs reconnecting.
  3. 403 account.permission_missing. The account lacks the permission the call needs: comments.read to list the comments on a post and the replies to a comment, comments.write to reply, hide, unhide, delete, or like, and messages.write for a private reply. error.meta.permission names it. GET /v1/inbox/comments lists the posts SocialAPI stored and never returns this error: an account without comments.read stores no new posts.
  4. 400 validation.field_required, 400 validation.field_invalid. A required field is missing, or a parameter has a wrong value. error.meta.field names it.
  5. 400 validation.id_invalid, 400 validation.id_platform_mismatch. The comment ID is the wrong type or belongs to another platform: see IDs.
  6. 501 resource.not_supported. The platform lacks the action. Read capabilities on the comment.
  7. 404 resource.not_found. The post was deleted on the platform. The same post returns the same 404 afterwards.
  8. 400 platform.instagram.private_reply_ineligible, 400 platform.facebook.private_reply_ineligible. The comment already received its private reply, or is older than 7 days.
  9. 429 validation.interaction_limit_exhausted, 429 platform.{platform}.rate_limit. Your allowance, or the platform’s own limit. Read Retry-After: see Rate limits.
  10. 422 platform.youtube.processing_failure. YouTube refused to delete a comment that your channel did not write. Hide it instead.
When the list is empty, check that the post has comments, that account_id owns the post, and, on a platform that sends events, that the comment arrived: see Webhook events. The full catalog is in Errors.

Scopes

Events

SocialAPI sends comment.received when a person comments on a post of a connected account, on the platforms that report comments to SocialAPI. See comment.received for the platforms and the payload. Platforms that report nothing, such as X, YouTube, and Bluesky, need the list endpoints above. An account without the comments.read permission receives no comment.received events.

Use from an AI agent

The tool list and error shape are in MCP tools.
Last modified on October 19, 2026