Skip to main content
The inbox is a unified social inbox API: a single endpoint that returns comments, direct messages, mentions, and reviews from every connected platform in one normalized 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. Provide text, 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 of quick_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.