Interaction shape, so you build inbox logic once instead of per platform.
SocialAPI provides a unified inbox API for reading and responding to all inbound engagement across your connected accounts. Comments, DMs, reviews, and mentions are accessed through consistent endpoints with the same response shape regardless of platform.
SocialAPI proxies comments, reviews, and mentions live from the platform API, so you always see the latest state. DM conversations and messages are stored in SocialAPI’s database to support threading and pagination.
Comments
List comments across all connected accounts, reply, and moderate.Endpoints
:postId accepts a platform post ID (e.g., 17895695668004550). :commentId accepts a SocialAPI interaction ID (sapi_cmt_...). See Interaction IDs for the encoding.
Comment likes are supported on Facebook and LinkedIn Page only (see the matrix below); other platforms return 501 with code resource.not_supported. Private replies (Instagram and Facebook) are limited by Meta to one per comment, within 7 days of the comment. On Facebook the commenter’s response continues as a normal Messenger conversation; on Instagram a private reply does not open a standard 24-hour messaging window.
Platform capabilities
For Threads, Hide is available on comments not owned by the user; Delete is available on own replies. LinkedIn Page (
linkedin_page) is the organization page connector and is available in beta. Each comment in the response includes a capabilities object so your code can check what is actually allowed for that specific item.
Example: list and reply
Direct messages
Read conversations and send messages across platforms that support DMs.Endpoints
List conversations query parameters
Platform support
Sending text and attachments
A message can carry text, an attachment, interactive content, or a combination. Providetext, attachment_url, or interactive content (quick_replies, buttons, or cards): at least one is required.
On Facebook and Instagram,
attachment_url is delivered as a Messenger attachment. The attachment type (image, video, audio, or file) is inferred from the URL file extension, so use a direct media link with the correct extension (for example .jpg, .mp4, .mp3). URLs without a recognized media extension are sent as a generic file. The media must be hosted on a publicly reachable URL (max 25 MB); the platform fetches it directly.
Interactive messages
On Instagram and Facebook you can send structured, tappable content alongside or instead of plain text. Set at most one ofquick_replies, buttons, or cards per message. When the recipient taps a quick reply or a postback button, you receive a dm.postback webhook carrying the payload you defined, so you can drive automated flows.
These features require the recipient to be inside the 24 hour messaging window, the same as any other message.
Quick replies render up to 13 tappable chips above the keyboard. They require text and are plain text only.
Buttons render a text bubble with 1 to 3 call-to-action buttons. They use
text as the bubble body (640 characters or fewer).
Cards render a horizontally scrollable carousel of up to 10 cards, each with an image, title, subtitle, and up to 3 buttons. (Carousels are not available in the MCP
send_dm tool; use the REST endpoint.)
Example: list conversations and send a message
Manual sync
Conversations and messages are normally refreshed on a staleness window: a read that finds stale data syncs before serving it. Use/v1/inbox/sync when you want to trigger a refresh independently of a read, for example to warm a thread before opening it.
There are two targets. With only account_id, the job refreshes that account’s conversation list, not every thread’s messages: refreshing 200 threads on one button press is a rate-limit incident waiting to happen, so a list sync stays scoped to the list. Add conversation_id to instead refresh one thread’s messages.
POST body
GET query parameters
Response
POST returns immediately (
202) with the job’s starting state. Calling it again for the same target while a job is already running returns that running job rather than starting a second one.
Rate limit. Each target accepts one forced sync every 5 minutes. A second attempt inside that window returns 429 with a Retry-After header carrying the seconds to wait, and the error code inbox.sync_rate_limited. Wait that long rather than retrying sooner: the limit exists because the platforms have their own, stricter limits, and burning them affects every sync for that account.
The limit applies only to syncs you trigger. Ordinary reads of the inbox refresh data on their own schedule and never consume it, so opening the inbox does not make the next manual refresh fail.
A sync that is already running is not rate-limited: polling POST for a target you are already waiting on returns that job’s state rather than a 429.
The poll pattern is: POST /v1/inbox/sync, then poll GET /v1/inbox/sync until state is no longer syncing, then refetch the conversation or message list.
If you want a fast cold open on a slow platform (Instagram in particular), sync the thread first and read it once it is warm, rather than opening it cold: the read path still blocks on a cold open, so reading first gets you the same wait either way.
GET /v1/inbox/conversations and GET /v1/inbox/conversations/:id/messages also return sync_state and last_synced_at on the list response itself, so a client already polling those lists can watch sync state without a separate call to /v1/inbox/sync. Both fields are additive: a client that ignores them sees exactly the response it saw before.
Reviews
Read and reply to reviews on platforms that support them.Endpoints
Platform support
Example
Mentions
Read mentions of a connected account, and reply to them as a public comment.Endpoints
Mentions are scoped to a single connected account, not the workspace.
Replying works even when the mention is on someone else’s post, where the normal
comment-reply endpoint is not allowed. Pass
media_id (the post the mention is
on, or the sapi_mnt_ id from the list response) and text. Set comment_id
only when the mention was inside a comment; omit it to reply to a mention in the
post caption. A reply consumes 1 interaction credit.
Platform support
Example
Interaction IDs
Every interaction returned by the inbox has a stable ID with a type prefix:
The suffix encodes the platform and the platform-native ID, so you can route actions without a database lookup. See Interaction IDs for the full encoding scheme.
Webhooks
SocialAPI can notify your server when new inbound interactions arrive (new comment, new DM, new review). Register a webhook endpoint and subscribe to the event types you care about. See Webhooks for setup and event reference.Related
- Platform support for the full capability matrix
- Interaction IDs for the ID encoding scheme
- Webhooks for real-time event delivery
- API Reference for complete endpoint schemas