Comments (all platforms)
List, create, delete, and moderate comments on your posts across multiple social networks with a single, consistent API. These endpoints call each platform's native API in real-time using the connection stored for the given profile. Reddit comments currently return HTTP 503 error_code: "reddit_unavailable".
Every operation is one endpoint with a platform, never one endpoint per network — the same reason /audience, /suggestions and /post-analytics are shaped that way. A network that cannot do something yet answers 400 with error_code: "platform_not_supported" and names the ones that can.
Platform support
| Platform | List | Create | Delete | Replies | Hide / Like / Pin | Notes |
|---|---|---|---|---|---|---|
| ✅ | ✅ | ✅ | — | hide / unhide; enable/disable comments | Creating a comment requires comment_id. like and pin are not supported. | |
| ✅ | ✅ | ✅ | — | hide / unhide / like / unlike / edit | pin returns 400. Create accepts attachment_url (image) and attachment_share_url (GIF). | |
| YouTube | ✅ | ✅ | ✅ | ✅ | hide / unhide / hold | hide maps to rejected, unhide to published, hold to heldForReview. ban_author=true only with hide. |
| ✅ | ✅ | ✅ | — | — | Organization (company page) posts. Use the post URN as post_id. | |
| TikTok | ✅ | ✅ | ✅ | ✅ | ✅ | Needs a reconnected TikTok account (the comments capability). post_id is the video id. See below. |
| X | ✅ | ✅ | ✅ | — | — | List uses mentions (source: "mentions"). Hide is not available. |
| Threads | ✅ | ✅ | ❌ | ✅ | hide / unhide / approve / ignore | Everyone's replies only on connections with read-replies permission; otherwise partial (partial: true). See below. Delete returns platform_not_supported. |
| Bluesky | ✅ | ✅ | ✅ | — | — | post_id is the at:// URI. |
| ❌ | ❌ | ❌ | — | — | HTTP 503 reddit_unavailable. |
Replies are the same listing narrowed to a parent (comment_id on
List Comments); hide / like / pin are
one endpoint with a verb.
- TikTok needs a reconnected account: comment permission is granted at connect time, so only accounts reconnected from Manage Users report
commentsincapabilities. Older connections still publish, but every comment call returns400(error_code: "tiktok_reconnect_required") until reconnect. Checkcapabilitiesbefore showing a comment inbox.post_idis the video id (same as the upload);post_urlis accepted as that id. - Threads
post_idis the numeric Threads post id. Reading other people's replies needs Meta's read-replies permission, which is being rolled out: on a connection that granted it, List returns every reply to the post (top-level and nested, newest first, withusername,parent_id,hiddenandis_owner), andcomment_idreturns the direct replies to that reply. Any other connection gets only the replies posted through Upload-Post (first comments and Create Comment), withpartial: trueand awarning; reconnect Threads once the permission is available to your account. - YouTube needs the
youtube.force-sslOAuth scope. Accounts connected before that scope existed must reconnect or comment calls fail.post_idis the video ID (e.g.dQw4w9WgXcQ). - LinkedIn
post_id/post_urlis the post URN, e.g.urn:li:ugcPost:1234567890. Same URN for list, create and delete. - Facebook
post_idis the id returned when you published: the video id for reels and videos,{page_id}_{post_id}for photo and text posts.post_urlis read into that id for these forms:facebook.com/reel/{id},/{page}/videos/{id},/watch/?v={id},/photo/?fbid={id},/{page}/photos/.../{id},/permalink.php?story_fbid={id}&id={page_id},/{page}/posts/{id}andfacebook.com/{page_id}_{post_id}. Share links (/share/...),fb.watchshort links andpfbid...permalinks can't be read, so the call returns400witherror_code: "invalid_post_url". Usepost_idfor those.
List Comments
Retrieve comments on one of your posts. Returns the comments as provided by the target platform.
Add comment_id and the same call returns the replies under that comment
instead of the post's top-level comments. It is not a different URL: it is the
same question — show me the comments — narrowed to a parent.
Endpoint
GET /api/uploadposts/comments
Headers
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
platform | String | No | One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky. Defaults to instagram. Reddit returns 503 reddit_unavailable. |
user | String | Yes | Profile username (as configured in Upload-Post). |
post_id | String | Yes* | Post identifier. YouTube = the video ID; TikTok = the video id; LinkedIn = the post URN (urn:li:ugcPost:...); Instagram = numeric media ID. Use post_id or post_url. |
post_url | String | Yes* | Full post URL. Alternative to post_id. |
limit | Integer | No | Maximum comments to return per page. |
after | String | No | Pagination cursor returned in the previous response. Pass it back to fetch the next page. |
comment_id | String | No | TikTok. Return the replies hanging off this comment instead of the post's top-level comments. post_id is still required. |
* Provide either post_id or post_url (one is required).
Example Requests
Instagram:
curl 'https://api.upload-post.com/api/uploadposts/comments?platform=instagram&user=my-profile&post_id=17890455123456789&limit=50' \
-H 'Authorization: Apikey your-api-key-here'
YouTube (post_id is the video ID):
curl 'https://api.upload-post.com/api/uploadposts/comments?platform=youtube&user=my-profile&post_id=dQw4w9WgXcQ' \
-H 'Authorization: Apikey your-api-key-here'
LinkedIn (post_id is the post URN):
curl 'https://api.upload-post.com/api/uploadposts/comments?platform=linkedin&user=my-profile&post_id=urn:li:ugcPost:1234567890' \
-H 'Authorization: Apikey your-api-key-here'
TikTok (post_id is the video id):
curl 'https://api.upload-post.com/api/uploadposts/comments?platform=tiktok&user=my-profile&post_id=7401234567890123456&limit=20' \
-H 'Authorization: Apikey your-api-key-here'
TikTok — the replies under one comment (add comment_id):
curl 'https://api.upload-post.com/api/uploadposts/comments?platform=tiktok&user=my-profile&post_id=7401234567890123456&comment_id=7401234567890999888&limit=20' \
-H 'Authorization: Apikey your-api-key-here'
TikTok indexes a new comment or reply asynchronously. Listing immediately after
creating one returns a list without it — the call
succeeded, the comment exists, TikTok has simply not indexed it yet. Wait about
10 seconds before re-listing, or render the comment you just created from the
create response instead of re-fetching. An empty list right after a write is
not a failure.
Successful Response (200 OK)
{
"success": true,
"comments": [
{
"id": "17858893269123456",
"text": "Great post!",
"timestamp": "2025-06-15T10:30:00+0000",
"user": {
"id": "17841400123456789",
"username": "commenter_user"
}
}
],
"pagination": {
"next_cursor": "QVFIUm9TbGd...",
"has_next": true
}
}
The exact comment fields vary by platform (each network returns its own shape). Pagination fields are present when the platform supports cursor-based paging.
Error Responses
- 400 Bad Request — missing parameters, invalid post identifier, or an unsupported platform.
- 400 Bad Request —
error_code: "tiktok_reconnect_required": the TikTok connection cannot manage comments. The account owner must reconnect it from Manage Users. - 403 Forbidden — the connected account lacks the required scope (e.g. YouTube not connected with
youtube.force-ssl). - 409 Conflict — the TikTok token expired and the account must be reconnected (
"reauth_required": true). - 500 Internal Server Error
Create Comment
Post a comment or a reply. Provide exactly one of comment_id, post_id, or post_url to identify the target:
comment_id→ reply to that comment.post_id/post_url→ top-level comment on that post.
Instagram only supports replies — you must send comment_id. It cannot create a top-level comment via the API.
On TikTok, post_id (the video id) is always required, for a top-level comment and for a reply. Adding comment_id turns the call into a reply. You can only comment on your own videos.
Endpoint
POST /api/uploadposts/comments/create
Headers
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
| Content-Type | application/json | Request body format |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
platform | String | Yes | One of instagram, facebook, youtube, linkedin, tiktok, x, threads, bluesky. Reddit returns 503 reddit_unavailable. |
user | String | Yes | Profile username (as configured in Upload-Post). |
message | String | Yes | The comment text. |
comment_id | String | Yes* | Reply to this comment. Required for Instagram. |
post_id | String | Yes* | Top-level comment on this post. LinkedIn = the post URN (urn:li:ugcPost:...); YouTube = the video ID; TikTok = the video id, required even when replying. |
post_url | String | Yes* | Top-level comment on this post (by URL). Alternative to post_id. |
attachment_url | String | No | Facebook: image attached to the comment. |
attachment_share_url | String | No | Facebook: GIF attached to the comment. |
* Provide exactly one of comment_id, post_id, or post_url — except on TikTok, where post_id is always required and comment_id is added to it to reply.
Example Requests
Reply to a comment (Instagram):
curl -X POST https://api.upload-post.com/api/uploadposts/comments/create \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "instagram",
"user": "my-profile",
"comment_id": "17858893269123456",
"message": "Thanks for your comment!"
}'
Reply to a TikTok comment (post_id AND comment_id):
curl -X POST https://api.upload-post.com/api/uploadposts/comments/create \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "tiktok",
"user": "my-profile",
"post_id": "7401234567890123456",
"comment_id": "7401234567890999888",
"message": "Thanks! The full guide is in the bio."
}'
Top-level comment on a LinkedIn post (post_id is the URN):
curl -X POST https://api.upload-post.com/api/uploadposts/comments/create \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "linkedin",
"user": "my-profile",
"post_id": "urn:li:ugcPost:1234567890",
"message": "Great update!"
}'
Successful Response (200 OK)
{
"success": true,
"id": "17858893269654321",
"message": "Comment created successfully"
}
On TikTok the answer names the platform and returns TikTok's own result object:
{
"success": true,
"platform": "tiktok",
"result": { "comment_id": "7401234567890777111" }
}
Error Responses
- 400 Bad Request — missing fields, more than one target provided, Instagram without
comment_id, TikTok withoutpost_id, or an unsupported platform. - 400 Bad Request —
error_code: "tiktok_reconnect_required": the TikTok connection cannot manage comments; reconnect the account. - 403 Forbidden — the connected account lacks the required scope.
- 409 Conflict — the TikTok token expired (
"reauth_required": true). - 500 Internal Server Error
Delete Comment
Delete a comment you own (or that is on your post). Accepts DELETE or POST.
Endpoint
DELETE /api/uploadposts/comments/delete
This endpoint also accepts
POSTwith the same body, for clients that cannot send a body withDELETE.
Headers
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
| Content-Type | application/json | Request body format |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
platform | String | Yes | One of instagram, facebook, youtube, linkedin, tiktok. |
user | String | Yes | Profile username (as configured in Upload-Post). |
comment_id | String | Yes | The ID of the comment to delete. |
post_id | String | Yes* | Required for LinkedIn only — the post URN (urn:li:ugcPost:...) the comment belongs to. |
* post_id is required for LinkedIn; ignored for the other platforms. TikTok deletes a comment from its comment_id alone — and only a comment written by the connected account itself.
Example Requests
Delete a Facebook comment:
curl -X DELETE https://api.upload-post.com/api/uploadposts/comments/delete \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "facebook",
"user": "my-profile",
"comment_id": "17858893269123456"
}'
Delete a LinkedIn comment (post_id required):
curl -X DELETE https://api.upload-post.com/api/uploadposts/comments/delete \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "linkedin",
"user": "my-profile",
"comment_id": "urn:li:comment:(urn:li:ugcPost:1234567890,9876543210)",
"post_id": "urn:li:ugcPost:1234567890"
}'
Successful Response (200 OK)
{
"success": true,
"message": "Comment deleted successfully"
}
Error Responses
- 400 Bad Request — missing fields, LinkedIn without
post_id, or an unsupported platform. - 400 Bad Request —
error_code: "tiktok_reconnect_required": the TikTok connection cannot manage comments; reconnect the account. - 403 Forbidden — the connected account lacks the required scope, or you do not own the comment.
- 409 Conflict — the TikTok token expired (
"reauth_required": true). - 500 Internal Server Error
Hide, Like or Pin a Comment
Moderate a comment on one of your own posts. One endpoint, because every action
here is a verb that carries its own inverse: hide / unhide, like /
unlike, pin / unpin. You send the verb you want, never a boolean, so
replaying a request can never flip a comment back to where it started.
Endpoint
POST /api/uploadposts/comments/action
Headers
| Name | Value | Description |
|---|---|---|
| Authorization | Apikey your-api-key-here | Your API key for authentication |
| Content-Type | application/json | Request body format |
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
platform | String | Yes | tiktok, facebook, instagram, youtube, threads. Others answer 400 platform_not_supported. |
user | String | Yes | Profile username (as configured in Upload-Post). |
comment_id | String | Conditional | The comment to act on. Required except Instagram enable_comments / disable_comments. |
action | String | Yes | TikTok: hide, unhide, like, unlike, pin, unpin. Facebook: hide, unhide, like, unlike, edit (needs message); pin is 400. Instagram: hide, unhide (comment_id); enable_comments, disable_comments (post_id). YouTube: hide, unhide, hold (ban_author=true only with hide). Threads: hide, unhide, approve, ignore. |
post_id | String | Conditional | Required for TikTok hide / unhide / pin / unpin, Instagram comment-enable/disable, and YouTube moderation. |
message | String | Conditional | Required for Facebook action=edit. |
ban_author | Boolean | No | YouTube: only with action=hide. |
Example Requests
Hide a comment:
curl -X POST https://api.upload-post.com/api/uploadposts/comments/action \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "tiktok",
"user": "my-profile",
"comment_id": "7401234567890999888",
"action": "hide",
"post_id": "7401234567890123456"
}'
Like a comment (no post_id):
curl -X POST https://api.upload-post.com/api/uploadposts/comments/action \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "tiktok",
"user": "my-profile",
"comment_id": "7401234567890999888",
"action": "like"
}'
Pin a comment to the top of the post:
curl -X POST https://api.upload-post.com/api/uploadposts/comments/action \
-H 'Authorization: Apikey your-api-key-here' \
-H 'Content-Type: application/json' \
-d '{
"platform": "tiktok",
"user": "my-profile",
"comment_id": "7401234567890777111",
"action": "pin",
"post_id": "7401234567890123456"
}'
To undo any of them, send the inverse verb with the same body: unhide,
unlike, unpin.
Successful Response (200 OK)
{
"success": true,
"platform": "tiktok",
"action": "hide",
"comment_id": "7401234567890999888"
}
The echoed action is the confirmation to branch on.
Error Responses
- 400 Bad Request — a platform that cannot moderate comments yet:
{
"success": false,
"error": "'instagram' cannot act on comments yet. Supported: tiktok.",
"error_code": "platform_not_supported"
}
- 400 Bad Request — an
actionoutside the six verbs:
{ "success": false, "error": "action must be one of: hide, like, pin, unhide, unlike, unpin" }
- 400 Bad Request —
post_idomitted onhide/unhide/pin/unpin:
{ "success": false, "error": "post_id is required to pin a comment" }
- 400 Bad Request —
error_code: "tiktok_reconnect_required": the TikTok connection cannot manage comments; reconnect the account. - 404 Not Found — profile not found.
- 409 Conflict — the TikTok token expired (
"reauth_required": true). - 502 Bad Gateway — the platform rejected the operation; its message comes
back in
error.
Additional Notes
- Only comments on your own posts can be moderated. Anything else is refused
upstream and comes back as a
502carrying the platform's message. - Pinning is exclusive: pinning a second comment moves the pin, it does not add one.
- A comment you hide stays visible to whoever wrote it — that is TikTok's own behaviour, not something this API changes.
Related
- Account capabilities — check
commentsbefore offering a TikTok inbox. - Instagram private & public replies — Instagram-specific private-reply DMs and public replies.
- Direct Messages — send DMs to a commenter using their user ID.