Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/postproxy-dev:postproxy-dev-comments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Postproxy Social Media Comments API
version: '2026-09-21'
summary: Unified social media API for publishing, comments, direct messages, and reviews.
description: 'The Postproxy API lets you programmatically create and manage social media posts across Facebook, Instagram, TikTok, LinkedIn, YouTube, X (Twitter), Threads, Pinterest, Bluesky, Telegram, and Google Business. Beyond publishing you can read and reply to comments, read and send direct messages, and reply to Google Business reviews and Facebook Page recommendations.
Send one payload; Postproxy maps it to each platform''s rules and returns a per-platform outcome. Sandbox mode is included on all plans for development without real accounts.
Human-readable reference: https://postproxy.dev/reference/overview/
## Versioning and deprecation
The API has a single stable version served at https://api.postproxy.dev/api. Releases are identified by this document''s date-based `info.version`. Changes are additive: new endpoints, new optional parameters, and new response fields may appear, and clients should ignore fields they do not recognize. Existing fields, parameters, and status codes are not changed or removed without a deprecation cycle.
When an endpoint or field is deprecated it is marked `deprecated: true` in this specification and announced in the changelog (https://postproxy.dev/getting-started/changelog/) at least 90 days before removal.'
termsOfService: https://postproxy.dev/terms-conditions/
contact:
name: Postproxy Support
url: https://postproxy.dev/developers/
email: support@postproxy.dev
x-versioning:
strategy: stable-single-version
spec-version-format: date (YYYY-MM-DD)
compatibility: additive-only; breaking changes go through a deprecation cycle
deprecation-signal: 'deprecated: true in this spec, plus a changelog announcement at least 90 days before removal'
changelog: https://postproxy.dev/getting-started/changelog/
servers:
- url: https://api.postproxy.dev
description: Production
security:
- bearerAuth: []
tags:
- name: Comments
description: Read and reply to comments on published posts
externalDocs:
url: https://postproxy.dev/reference/comments/
paths:
/api/comments:
get:
operationId: comments_list_across_posts
summary: List comments across posts
description: 'Retrieves comments spanning many posts and profiles in a single request. The response is flat: every comment, top-level or reply, is its own entry in data, linked to its parent by parent_external_id, ordered by created_at descending.'
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- name: post_ids
in: query
required: false
schema:
type: string
description: Comma-separated post IDs. Omit to include every post in scope. Unknown or out-of-scope IDs are ignored. Passing a thread's parent post also returns comments on that thread's child posts.
- name: profiles
in: query
required: false
schema:
type: string
description: Comma-separated profile IDs or network names (e.g. instagram,twitter, abc123,def456, or mixed). Network names are matched against known platforms (facebook, instagram, tiktok, linkedin, youtube, twitter, threads, pinterest, bluesky, telegram); anything else is treated as a profile ID.
- name: from
in: query
required: false
schema:
type: string
description: ISO 8601 date/time — only comments received (created_at) at or after this point. A bare date means that date's start of day.
- name: to
in: query
required: false
schema:
type: string
description: ISO 8601 date/time — only comments received (created_at) at or before this point.
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PerPage'
responses:
'200':
description: Flat, paginated list of comments across posts. Pagination counts every comment, not just top-level ones.
content:
application/json:
schema:
$ref: '#/components/schemas/CommentCrossPostListResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/api/posts/{post_id}/comments:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
get:
operationId: comments_list
summary: List comments on a post
description: Retrieves a paginated list of top-level comments for a published post on a specific profile. Each top-level comment includes a flat replies array containing all nested replies sorted by creation date.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PerPage'
- name: from
in: query
required: false
schema:
type: string
description: ISO 8601 date/time — only comments received (created_at) at or after this point. A bare date means that date's start of day. Applies to top-level comments only; a comment in range brings its full replies array. Unparseable values return 400.
- name: to
in: query
required: false
schema:
type: string
description: ISO 8601 date/time — only comments received (created_at) at or before this point.
responses:
'200':
description: Paginated list of top-level comments, each with a replies array. Pagination applies to top-level comments only.
content:
application/json:
schema:
$ref: '#/components/schemas/CommentListResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: comments_create
summary: Create comment or reply
description: Creates a new comment on a published post, or a reply when parent_id is given. The comment is stored immediately with status pending and published to the platform asynchronously.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CommentCreateRequest'
responses:
'201':
description: Comment created with status pending and external_id null; the status updates asynchronously once published to the platform.
content:
application/json:
schema:
$ref: '#/components/schemas/Comment'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'422':
$ref: '#/components/responses/ValidationError'
/api/posts/{post_id}/comments/{id}:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
get:
operationId: comments_get
summary: Get comment
description: Retrieves a single comment with its direct replies.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: The comment with its replies.
content:
application/json:
schema:
$ref: '#/components/schemas/Comment'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: comments_edit
summary: Edit comment
description: Replaces the text of a comment you published, asynchronously. Facebook and YouTube only. Once the platform confirms, `body` is replaced, `external_edited_at` is set and a `comment.edited` webhook fires; if the platform rejects the edit, `body` is unchanged and `comment.edit_failed` fires.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/#edit-comment
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- body
properties:
body:
type: string
description: New comment text (`text` is accepted as an alias).
responses:
'200':
description: Edit accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: comments_delete
summary: Delete comment
description: Deletes a comment from the platform asynchronously.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Deletion accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'422':
$ref: '#/components/responses/ValidationError'
/api/posts/{post_id}/comments/{id}/hide:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_hide
summary: Hide comment
description: Hides a comment on the platform asynchronously. Hidden comments are not visible to the public.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Hide accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
/api/posts/{post_id}/comments/{id}/unhide:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_unhide
summary: Unhide comment
description: Unhides a previously hidden comment on the platform asynchronously.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Unhide accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
/api/posts/{post_id}/comments/{id}/like:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_like
summary: Like comment
description: Likes a comment on the platform asynchronously.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Like accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
/api/posts/{post_id}/comments/{id}/unlike:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_unlike
summary: Unlike comment
description: Removes a like from a comment on the platform asynchronously.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Unlike accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
/api/posts/{post_id}/comments/{id}/pin:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_pin
summary: Pin comment
description: Pins a comment to the top of the video asynchronously. TikTok only — requires a profile connected on or after 2026-09-30. TikTok keeps one pinned comment per video, so pinning a second comment moves the pin.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Pin accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
/api/posts/{post_id}/comments/{id}/unpin:
parameters:
- name: post_id
in: path
required: true
schema:
type: string
description: Post ID
- name: id
in: path
required: true
schema:
type: string
description: Comment ID — accepts either the Postproxy hashid or the platform's native (external) comment ID
post:
operationId: comments_unpin
summary: Unpin comment
description: Removes the pin from a comment asynchronously. TikTok only.
tags:
- Comments
externalDocs:
url: https://postproxy.dev/reference/comments/
parameters:
- $ref: '#/components/parameters/ProfileGroupId'
- $ref: '#/components/parameters/IdempotencyKey'
- name: profile_id
in: query
required: true
schema:
type: string
description: Profile ID
responses:
'200':
description: Unpin accepted for asynchronous processing.
content:
application/json:
schema:
type: object
properties:
accepted:
type: boolean
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'405':
$ref: '#/components/responses/MethodNotAllowed'
components:
responses:
ValidationError:
description: Validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationErrors'
Unauthorized:
description: Invalid, missing, or insufficient API key permissions.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
invalidKey:
value:
error: Invalid API key
NotFound:
description: Resource does not exist or is not accessible.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
notFound:
value:
error: Not found
MethodNotAllowed:
description: Unsupported method for this platform or resource.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Missing required parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequestError'
schemas:
CommentCreateRequest:
type: object
description: Payload for creating a comment or reply on a published post.
required:
- body
properties:
body:
type: string
description: Comment text content. (The legacy text parameter is still accepted as an alias.)
parent_id:
type: string
description: ID of comment to reply to (Postproxy ID or external ID). Omit to comment on the post itself.
CommentCrossPostListResponse:
type: object
description: 'Flat, paginated list of comments across posts and profiles. Replies are not nested: every comment is its own entry, linked to its parent by parent_external_id.'
properties:
total:
type: integer
description: Total number of matching comments, replies included
page:
type: integer
description: Current page number
per_page:
type: integer
description: Items per page
data:
type: array
description: Flat array of comment objects
items:
allOf:
- $ref: '#/components/schemas/Comment'
- type: object
properties:
post_id:
type: string
description: ID of the post the comment belongs to
profile_id:
type: string
description: ID of the profile the comment was left on
platform:
type: string
description: Network name, e.g. instagram
PlatformErrorDetails:
type:
- object
- 'null'
description: Structured platform error (omitted when no platform error info is available).
properties:
platform_error_code:
type:
- string
- 'null'
description: Error code returned by the platform API
platform_error_subcode:
type:
- string
- 'null'
description: Error subcode returned by the platform API
platform_error_message:
type:
- string
- 'null'
description: Error message returned by the platform API
postproxy_note:
type:
- string
- 'null'
description: Additional context from Postproxy about the error
ValidationErrors:
type: object
properties:
errors:
type: array
items:
type: string
required:
- errors
CommentAttachment:
type: object
description: Media attached to a comment. Postproxy downloads each asset to durable storage; the url is stable once status is processed.
properties:
id:
type: string
description: Attachment hashid
type:
type: string
enum:
- image
- video
- audio
- gif
- external
- file
url:
type:
- string
- 'null'
description: Stable storage URL to the asset. While status is pending, this temporarily falls back to the source URL on the platform until the file is mirrored to Postproxy storage.
status:
type: string
enum:
- pending
- processed
- failed
description: pending (still being mirrored), processed (stored and ready), failed (could not be downloaded)
external_id:
type:
- string
- 'null'
description: Platform-side identifier for the attachment (e.g. Facebook attachment target ID). Omitted when the platform did not provide one.
Comment:
type: object
description: A comment on a published post.
properties:
id:
type: string
description: Unique comment identifier (ID)
external_id:
type:
- string
- 'null'
description: Platform's native comment ID (null for pending comments)
body:
type: string
description: Comment text content
status:
type: string
enum:
- synced
- pending
- published
- failed
- failed_waiting_for_retry
- delivery_unconfirmed
description: Comment status. Only published and failed are terminal — treat every other value as still in progress.
error:
type:
- string
- 'null'
description: Error summary if the comment failed to publish (null otherwise)
error_details:
$ref: '#/components/schemas/PlatformErrorDetails'
author_username:
type:
- string
- 'null'
description: Author's display name or username
author_avatar_url:
type:
- string
- 'null'
description: Stable Postproxy storage URL of the author's profile picture once mirrored; the platform URL until then
author_external_id:
type:
- string
- 'null'
description: Author's platform-specific ID
metadata:
$ref: '#/components/schemas/CommentMetadata'
parent_external_id:
type:
- string
- 'null'
description: Parent comment's external ID (null for top-level comments)
like_count:
type: integer
description: Number of likes on the comment
is_hidden:
type: boolean
description: Whether the comment is hidden
permalink:
type:
- string
- 'null'
description: Direct URL to the comment on the platform (when available)
platform_data:
type:
- object
- 'null'
description: Platform-specific metadata
additionalProperties: true
attachments:
type: array
items:
$ref: '#/components/schemas/CommentAttachment'
description: Media attached to the comment. Empty array when there are none. Always empty on a freshly created (pending) comment.
external_edited_at:
type:
- string
- 'null'
description: ISO 8601 timestamp of the last edit made through Postproxy (null if never edited)
posted_at:
type:
- string
- 'null'
description: ISO 8601 timestamp when the comment was posted on the platform
created_at:
type: string
description: ISO 8601 timestamp of record creation
replies:
type: array
items:
$ref: '#/components/schemas/Comment'
description: All replies (regardless of nesting depth) flattened under the root top-level comment, sorted by created_at ascending. Present on per-post list and get responses.
CommentListResponse:
type: object
description: Paginated list of top-level comments for a post.
properties:
total:
type: integer
description: Total number of top-level comments
page:
type: integer
description: Current page number
per_page:
type: integer
description: Items per page
data:
type: array
items:
$ref: '#/components/schemas/Comment'
description: Array of top-level comment objects, each with a replies array
BadRequestError:
type: object
properties:
status:
type: integer
const: 400
error:
type: string
message:
type: string
Error:
type: object
properties:
error:
type: string
required:
- error
CommentMetadata:
type:
- object
- 'null'
description: Additional author signals fetched asynchronously from the platform after the comment is ingested. Null until the lookup completes; individual keys may be absent depending on platform support.
properties:
author_fetched_at:
type: string
description: ISO 8601 timestamp of the last author-info refresh
is_verified_user:
type: boolean
description: Author has a verified account (instagram)
is_user_follow_business:
type: boolean
description: Author follows the business profile (instagram)
is_business_follow_user:
type: boolean
description: The business profile follows the author (instagram)
follower_count:
type: integer
description: Author's follower count (instagram)
additionalProperties: true
parameters:
PerPage:
name: per_page
in: query
required: false
description: Number of items per page.
schema:
type: integer
default: 10
ProfileGroupId:
name: profile_group_id
in: query
required: false
description: Profile group context for the request. Optional when the API key is scoped to a profile group (that group is used automatically); with a full-access key, defaults to the first profile group in the account.
schema:
type: string
Page:
name: page
in: query
required: false
description: Page number (1-based). Passing 0 returns page 1.
schema:
type: integer
default: 1
minimum: 0
IdempotencyKey:
name: Idempotency-Key
in: header
required: false
description: 'Optional idempotency key (up to 255 characters; a UUID is ideal). Retrying a successful write with the same key replays the original response (with an Idempotent-Replay: true header) instead of executing again. Stored responses are kept for 24 hours; only 2xx responses are stored.'
schema:
type: string
maxLength: 255
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API key sent as a Bearer token in the Authorization header. Keys are either full-access (entire account) or scoped to a single profile group. Create keys at https://app.postproxy.dev under Settings → API Keys.
externalDocs:
description: Full API reference
url: https://postproxy.dev/reference/overview/