OmniSocialsOmniSocials
DocumentationAPI reference
Help centerSupport
  • Documentation
  • API reference
Developers
  • Quickstart
  • API reference
  • SDKs
  • MCP server
  • CLI
For AI agents
  • Docs for AI agents
  • llms.txt
  • OpenAPI spec
  • Postman collection
Product
  • OmniSocials
  • Pricing
  • Changelog
  • Help center
Company
  • Support
  • Privacy policy
  • Terms of service

© 2026 OmniSocials

OmniSocials on GitHubOmniSocials on XOmniSocials on LinkedIn
Information
Posts
    List postsgetList live platform postsgetGet a postgetDelete a postdeleteUpdate a postpatchCreate a postpostCreate and publish postpostPublish a post nowpostRetry failed postpostApprove a postpostReject a postpostGet approval reviewget
Media
    List mediagetGet a media itemgetDelete a media itemdeleteRename or move mediapatchUpload a filepostUpload from base64postUpload from a URLpostCreate an upload URLpostSplit a PDF into pagespostCheck media limitspostUpload with a tokenpost
Folders
    List foldersgetCreate a folderpostDelete a folderdeleteRename or move a folderpatch
Hashtag Sets
    List hashtag setsgetCreate a hashtag setpostGet a hashtag setgetDelete a hashtag setdeleteUpdate a hashtag setpatch
Accounts
    List accountsgetGet an accountget
Analytics
    Get bulk post analyticsgetGet post analyticsgetGet analytics overviewgetGet account analyticsgetGet best posting timesget
Approvals
    List approval workflowsget
Webhooks
    List webhooksgetCreate a webhookpostGet a webhookgetDelete a webhookdeleteUpdate a webhookpatchRotate webhook secretpost
Locations
    Search locationsgetValidate a locationget
Audio
    Search Instagram audioget
Pinterest
    List product PinsgetCheck a product Pinget
Inbox
    List conversationsgetList messagesgetMark conversation readpostReply to a conversationpostHide or unhide a commentpostDelete a commentdeleteGet next conversationget
Automations
    List automationsgetCreate an automationpostGet an automationgetDelete an automationdeleteUpdate an automationpatchList automation eventsget
Schemas
OmniSocials API
OmniSocials API

Inbox

Download schema

Read and reply to Instagram and Facebook DMs, comments, and mentions, LinkedIn company-page comments and mentions (LinkedIn has no API DMs), TikTok video comments (comments only; replies capped at 150 characters), YouTube video comments, X DMs for opted-in workspaces, and Threads replies and mentions. GET /inbox/next is a work queue: it serves the next item that needs an answer together with its conversation and the post it is on, and a reply sent with include_next chains straight to the following one. Comments on Facebook, Instagram, TikTok, YouTube and Threads can be hidden (POST /inbox/messages/{id}/hide); Facebook, Instagram and TikTok comments can be deleted (DELETE /inbox/messages/{id}). Replies sent from the native apps are mirrored into the inbox and count as answers. Reads require the inbox:read scope; replies, marking read, hiding and deleting require inbox:write. Replies are limited to existing conversations (no cold outreach) and to the platform messaging window. Each workspace can send up to 1,000 replies per rolling 24 hours; contact [email protected] for a higher limit.


List conversations

GET
https://api.omnisocials.com/v1
/inbox/conversations

Returns one entry per conversation (the latest message in each), across Instagram and Facebook DMs, comments, and mentions, LinkedIn company-page comments and mentions (LinkedIn has no DMs via API), TikTok video comments (comments only; requires the TikTok comments authorization on the channel), YouTube video comments (comments only; each channel is checked once per day, YouTube has no comment webhooks), X DMs for workspaces that opted in to X DMs in the dashboard (X is DM-only; no history from before opt-in), and Threads replies on your posts plus mentions (requires a Threads connection with the reply-reading permission). Sorted by newest activity first. Cursor-paginated: follow pagination.next_cursor until it is null. Requires the inbox:read scope (API keys) or the access_social_inbox permission (OAuth/MCP).

List conversations › query Parameters

limit
​integer · max: 100

Max conversations per page (1-100, default 25).

Default: 25
cursor
​string

Opaque pagination cursor from a previous response.

Example: MjAyNi0xMC0yMVQwOTowMDowMC4wMDBafDg4MjMx
platform
​string · enum

Filter to a single platform.

Enum values:
instagram
facebook
linkedin
tiktok
youtube
x
threads
type
​string · enum

Filter to a single conversation type.

Enum values:
dm
comment
mention
unread
​boolean

When true, only conversations with unread incoming messages.

Example: true
unanswered
​boolean

When true, only conversations that still need an answer: the customer's latest DM has no reply after it (Instagram/Facebook DMs past the 24-hour messaging window included; they cannot be answered through the API but the customer is still waiting), or a comment/mention has not been replied to and is not hidden. Replies typed in the native apps count as answers (they are mirrored into the inbox). Read state is ignored here; use GET /inbox/next for a work queue.

Example: true

List conversations › Responses

200

A page of conversations

​InboxConversation[]
​InboxCursorPagination
GET/inbox/conversations
curl "https://api.omnisocials.com/v1/inbox/conversations?platform=instagram&unread=true&limit=25" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY"
Example Responses
{ "data": [ { "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "participant": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "unread_count": 1, "last_message": { "id": "88231", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } } ], "pagination": { "next_cursor": "MjAyNi0xMC0yMVQwOTowMDowMC4wMDBafDg4MjMx", "has_more": true, "limit": 25 } }
json
application/json

List messages

GET
https://api.omnisocials.com/v1
/inbox/conversations/{conversationId}/messages

Returns the full message history of a conversation, oldest first, cursor-paginated. Requires the inbox:read scope (API keys) or the access_social_inbox permission (OAuth/MCP).

List messages › path Parameters

conversationId
​string · required

List messages › query Parameters

limit
​integer · max: 100
Default: 50
cursor
​string

List messages › Responses

A page of messages

​InboxMessage[]
​InboxCursorPagination
GET/inbox/conversations/{conversationId}/messages
curl "https://api.omnisocials.com/v1/inbox/conversations/instagram_1234567890_17841400000000000/messages" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY"
Example Responses
{ "data": [ { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } } ], "pagination": { "next_cursor": "MjAyNi0xMC0yMVQwOTowMDowMC4wMDBafDg4MjMx", "has_more": true, "limit": 25 } }
json
application/json

Mark conversation read

POST
https://api.omnisocials.com/v1
/inbox/conversations/{conversationId}/read

Marks every unread incoming message in the conversation as read and returns how many were updated. Requires the inbox:write scope (API keys) or the access_social_inbox permission (OAuth/MCP).

Mark conversation read › path Parameters

conversationId
​string · required

Mark conversation read › Responses

Read state updated

conversation_id
​string
marked_read
​integer
POST/inbox/conversations/{conversationId}/read
curl -X POST "https://api.omnisocials.com/v1/inbox/conversations/instagram_1234567890_17841400000000000/read" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY"
Example Responses
{ "conversation_id": "instagram_comment_17912345678901234", "marked_read": 3 }
json
application/json

Reply to a conversation

POST
https://api.omnisocials.com/v1
/inbox/conversations/{conversationId}/reply

Sends a reply in an existing conversation (DM, comment, or mention) on Instagram, Facebook, LinkedIn, TikTok (comments only), YouTube (comments only), X (DM-only), or Threads (replies and mentions; needs a Threads connection with the reply permission, else 401 reauth_required). You can only reply to conversations that already exist in your inbox. The API cannot start new conversations (Instagram requires the user to message first, and cold outreach violates Meta policy). Direct-message replies must be within the platform's messaging window (24 hours since the user's last message); replies outside the window are rejected. TikTok replies are text-only, capped at 150 characters (400 validation_error beyond that), and can take a few minutes to appear on TikTok while they pass spam review. Each workspace can send up to 1,000 replies per rolling 24 hours (429 reply_limit_reached beyond that). Contact [email protected] if you need a higher limit. X DM replies debit 2 credits from the company balance before the send (auto-refunded if the send fails) and can return 402 insufficient_credits or 402 x_inbox_suspended. Requires the inbox:write scope (API keys) or the access_social_inbox permission (OAuth/MCP).

Reply to a conversation › path Parameters

conversationId
​string · required

Reply to a conversation › Request Body

Either `text` or `attachment_url` must be set.
text
​string · maxLength: 2000

Reply body (max 2000 characters; Instagram DMs max 1000; TikTok comments max 150). Optional when attachment_url is set: an attachment-only DM is allowed.

Example: It comes in S, M and L. Which size do you need?
attachment_url
​string

Optional media URL to send (Facebook and Instagram DMs only)

Example: https://example.com/size-chart.jpg
attachment_type
​string · enum

Required if attachment_url is set

Enum values:
image
video
audio
file
message_id
​string

For comment and mention threads: the inbox id of the specific incoming comment being answered (message.id from GET /inbox/next, or a message id from GET /inbox/conversations/{id}/messages). Every comment on a post shares one conversation, so without it the reply is posted under the newest comment on the post, which may be a different person than the one you drafted for. Always pass it when replying to an item served by the queue. Ignored for DMs (a DM reply goes to the conversation). 404 not_found when it is not an incoming message of this conversation.

Example: 88231
include_next
​boolean

When true, the response also carries next: the next conversation that needs an answer (same shape as GET /inbox/next, with its default queue order and filters), and remaining. Saves the extra call when working through the inbox.

Default: false

Reply to a conversation › Responses

Reply sent

​InboxMessage
next
​object | null

Only when include_next was set. Null when nothing is waiting.

remaining
​integer

Only when include_next was set: unanswered items still waiting after next (capped at 500).

Example: 4
POST/inbox/conversations/{conversationId}/reply
curl -X POST "https://api.omnisocials.com/v1/inbox/conversations/instagram_1234567890_17841400000000000/reply" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "Yes, we ship worldwide!"}'
Example Request Body
{ "text": "It comes in S, M and L. Which size do you need?", "attachment_url": "https://example.com/size-chart.jpg", "attachment_type": "image", "message_id": "88231", "include_next": false }
json
Example Responses
{ "data": { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "next": { "conversation": { "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "participant": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "unread_count": 1, "last_message": { "id": "88231", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "message": { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "messages": [ { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } } ], "reply_window": { "open": true, "closes_at": "2026-10-22T09:00:00.000Z" } }, "remaining": 4 }
json
application/json

Hide or unhide a comment

POST
https://api.omnisocials.com/v1
/inbox/messages/{id}/hide

Hides (or unhides) a comment someone left on one of your posts, on the platform, as the post owner. Facebook, Instagram, TikTok, YouTube and Threads comments (Threads: incoming top-level replies only; Threads does not allow hiding nested replies). On YouTube "hide" sets the comment's moderation status to rejected, which removes it and its replies from public view; unhide publishes it again. The message keeps its place in the conversation and hidden flips on the returned message. A hidden comment no longer counts as unanswered. The account must have been connected with the moderation permission (Facebook pages_manage_engagement, Instagram instagram_business_manage_comments); 403 reconnect_required otherwise. Requires the inbox:write scope (API keys) or the access_social_inbox permission (OAuth/MCP).

Hide or unhide a comment › path Parameters

id
​string · required

The inbox message id (from the conversation messages list).

Example: 88231

Hide or unhide a comment › Request Body optional

hide
​boolean

true to hide, false to unhide

Default: true

Hide or unhide a comment › Responses

Reply hidden or unhidden. On Facebook/Instagram, if the platform reports the comment no longer exists (its author deleted it, or it was already removed another way), this still returns 200 (there is nothing left to hide, and it stops counting as unanswered), but the response carries a note explaining that instead of silently implying the call hid something.

​InboxMessage
note
​string | null

Present only when the comment was already gone on the platform; explains that nothing was left to hide/unhide.

POST/inbox/messages/{id}/hide
curl -X POST "https://api.omnisocials.com/v1/inbox/messages/98765/hide" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"hide": true}'
Example Request Body
{ "hide": true }
json
Example Responses
{ "data": { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "note": "note" }
json
application/json

Delete a comment

DELETE
https://api.omnisocials.com/v1
/inbox/messages/{id}

Deletes a comment someone left on one of your posts, on the platform and from the inbox. Facebook, Instagram and TikTok comments only: YouTube's API does not let a channel delete other people's comments, hide those instead (POST /inbox/messages/{id}/hide). Replies under the deleted comment go with it (the platforms cascade the delete and the inbox mirrors that); their ids are returned. A comment that is already gone on the platform is still removed from the inbox. This cannot be undone. Requires the inbox:write scope (API keys) or the access_social_inbox permission (OAuth/MCP).

Delete a comment › path Parameters

id
​string · required

The inbox message id (from the conversation messages list or GET /inbox/next).

Example: 88231

Delete a comment › Responses

Comment deleted

​object
DELETE/inbox/messages/{id}
curl -X DELETE "https://api.omnisocials.com/v1/inbox/messages/98765" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY"
Example Responses
{ "data": { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "removed_reply_ids": [ "88240" ] } }
json
application/json

Get next conversation

GET
https://api.omnisocials.com/v1
/inbox/next

A work queue for answering the inbox. Returns one item that still needs a reply, together with its conversation so far and the post it belongs to, so a reply can be drafted from one call. An item needs an answer when it is the customer's latest DM with no reply after it, or a comment/mention that has not been replied to and is not hidden. Order: DMs that can still be answered come first (Instagram/Facebook DMs inside Meta's 24-hour window, the one whose window closes soonest first, and X DMs), then Instagram/Facebook DMs whose window has closed (served with reply_window.open = false: answer them from the native app or mark them read), then comments and mentions, oldest first by default. Pass message.id as message_id to the reply endpoint so a comment reply lands under the served comment. Replies typed in the native apps count as answers (they are mirrored into the inbox), so a thread a colleague answered on their phone is not served again. Instagram mentions are skipped (no reply path). Only unread items are served by default: marking a conversation read (POST /inbox/conversations/{id}/read) is how to skip one for good; pass include_read=true to include read-but-unanswered items. Looks at the last 30 days of activity. To chain the queue, pass include_next: true to the reply endpoint and it returns the next item in the same response. Requires the inbox:read scope (API keys) or the access_social_inbox permission (OAuth/MCP).

Get next conversation › query Parameters

platform
​string · enum

Only items from one platform.

Enum values:
instagram
facebook
linkedin
tiktok
youtube
x
threads
type
​string · enum

Only items of one type.

Enum values:
dm
comment
mention
order
​string · enum

oldest serves the item that has waited longest first; newest the most recent.

Enum values:
oldest
newest
Default: oldest
include_read
​boolean

Also serve items that were marked read but never answered.

Default: false
exclude
​string

Comma-separated conversation ids to leave out of this call (a session-local skip; up to 100).

Example: instagram_comment_17912345678901234,instagram_comment_17912345678905678

Get next conversation › Responses

The next item, or null when nothing is waiting

data
​InboxNextUnanswered

The next conversation that needs an answer, with everything needed to draft the reply. Null when the queue is empty.

remaining
​integer

Unanswered items still waiting after this one (capped at 500). 0 when data is null.

Example: 4
GET/inbox/next
curl "https://api.omnisocials.com/v1/inbox/next?platform=instagram" \ -H "Authorization: Bearer $OMNISOCIALS_API_KEY"
Example Responses
{ "data": { "conversation": { "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "participant": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "unread_count": 1, "last_message": { "id": "88231", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "message": { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } }, "messages": [ { "id": "88231", "conversation_id": "instagram_comment_17912345678901234", "platform": "instagram", "type": "comment", "direction": "incoming", "text": "What size is this?", "timestamp": "2026-10-21T09:00:00.000Z", "is_read": false, "is_replied": false, "reaction": "reaction", "parent_comment_id": "parent_comment_id", "hidden": false, "permalink": "permalink", "attachment": { "url": "https://example.com/photo.jpg", "type": "image" }, "sender": { "id": "id", "name": "Jamie Rivera", "username": "jamierivera", "profile_picture": "https://example.com/avatar.jpg" }, "post": { "id": "17912345678901234", "caption": "Our autumn menu is here. #autumnmenu", "thumbnail": "https://example.com/photo.jpg", "url": "https://www.instagram.com/p/Cxyz123ABC/", "media_type": "IMAGE" } } ], "reply_window": { "open": true, "closes_at": "2026-10-22T09:00:00.000Z" } }, "remaining": 4 }
json
application/json

PinterestAutomations