# CLI Inbox Commands

Read and reply to DMs, comments, and mentions from Instagram, Facebook, and
LinkedIn company pages, TikTok and YouTube video comments, X (Twitter) DMs for
workspaces that have enabled them, and Threads replies and mentions. See the [Social Inbox guide](/inbox) for concepts, platform
coverage, and reply limits.

Inbox access is opt-in: your API key needs the `inbox:read` scope for reading and
`inbox:write` for replying, marking read, and hiding or deleting comments. Enable
them when creating the key under **Settings -> API**.

## Commands

| Command | Description |
|---------|-------------|
| `inbox:list` | List conversations (latest message each) with participant, unread count, and related post. Flags: `--platform <instagram\|facebook\|linkedin\|tiktok\|youtube\|x\|threads>`, `--type <dm\|comment\|mention>`, `--unread`, `--unanswered` (only conversations that still need a reply), `--limit`, `--cursor`. Requires `inbox:read` |
| `inbox:next` | The next conversation that needs an answer, with its thread (oldest first) and the post it is on, plus how many more are waiting. Flags: `--platform`, `--type <dm\|comment\|mention>`, `--order <oldest\|newest>` (default oldest), `--include-read`, `--exclude <conversation-id,...>`. Requires `inbox:read` |
| `inbox:messages <conversation-id>` | Full message history for one conversation, oldest to newest, each with its message id. Comment threads print the post (caption, url, thumbnail) first. Flags: `--limit`, `--cursor`. Requires `inbox:read` |
| `inbox:read <conversation-id>` | Mark a conversation's messages as read. Also the durable skip for `inbox:next`. Requires `inbox:write` |
| `inbox:reply <conversation-id>` | Send a reply. Flags: `--text` (required), `--attachment-url`, `--attachment-type`, `--next` (also returns the next conversation that needs an answer). Requires `inbox:write` |
| `inbox:hide <message-id>` | Hide a comment someone left on one of your posts, as the post owner; `--unhide` reverses it. Facebook, Instagram, TikTok, YouTube, and Threads (top-level replies only). Takes the message id from `inbox:messages` or `inbox:next`, not the conversation id. Requires `inbox:write` |
| `inbox:delete <message-id>` | Delete a comment from the platform. Facebook, Instagram, and TikTok comments only (YouTube: use `inbox:hide`). Cannot be undone; replies under the comment go with it. Takes the message id, not the conversation id. Requires `inbox:write` |

Conversation ids can contain `:` and `()` (LinkedIn URNs); the CLI URL-encodes them
for you. Lists are cursor-paginated: pass the `cursor` from the previous response
to fetch the next page.

Two ids show up in the output. The conversation id is what `inbox:messages`,
`inbox:read`, and `inbox:reply` take. The message id, printed on every message,
is what `inbox:hide` and `inbox:delete` take.

## What counts as unanswered

`inbox:list --unanswered` and `inbox:next` use the same rule. A conversation
still needs an answer when the customer's latest DM has no reply after it
(Instagram and Facebook DMs only within Meta's 24-hour messaging window, since
replies outside it are refused), or when a comment or mention has not been
replied to and is not hidden. Replies typed in the native apps (the Instagram
app, Messenger) are mirrored into the inbox as outgoing messages and count as
answers, so a thread a colleague answered on their phone is not served again.
Instagram mentions are skipped because there is no reply path for them.

## Examples

Triage unread Instagram DMs:

```bash
omnisocials inbox:list --platform instagram --type dm --unread
```

Only the conversations still waiting for a reply:

```bash
omnisocials inbox:list --unanswered
```

Work through everything that needs an answer:

```bash
omnisocials inbox:next
# Next up: instagram comment from Jane Doe (@janedoe)
# Conversation: ig_comment_18001
# Message to answer: 42
# On post: 17912345678901234  (IMAGE)
#     Caption: Summer drop is live
#     URL: https://www.instagram.com/p/abc123/
#     Thumbnail: https://cdn.example.com/p1.jpg
#
# Thread (oldest first)
# ...
# 3 more waiting.

omnisocials inbox:reply ig_comment_18001 --text "Link is in our bio!" --next
# Reply sent! ... followed by the next item. Repeat until the CLI prints
# "Nothing is waiting for an answer."
```

`inbox:next` serves unread items only, so marking a conversation read skips it
for good. To leave some out of a single call instead, pass `--exclude`:

```bash
omnisocials inbox:read ig_comment_18001
omnisocials inbox:next --exclude ig_comment_18001,fb_dm_555
omnisocials inbox:next --platform instagram --type comment --order newest
omnisocials inbox:next --include-read
```

Read a conversation and reply:

```bash
omnisocials inbox:messages 17845123456789
omnisocials inbox:reply 17845123456789 --text "Thanks for reaching out! Sending you the details now."
omnisocials inbox:read 17845123456789
```

Answer a TikTok video comment (replies are text only, 150 characters max):

```bash
omnisocials inbox:list --platform tiktok --unread
omnisocials inbox:reply tiktok_7301234567890_7449912345678 --text "Love this! Thanks for watching."
```

Answer a YouTube video comment (conversations group per video):

```bash
omnisocials inbox:list --platform youtube --unread
omnisocials inbox:reply youtube_comment_aBcDeFgHiJk --text "Glad it helped! More on this coming next week."
```

Hide a comment on your own post (Facebook, Instagram, TikTok, YouTube, Threads):

```bash
omnisocials inbox:messages threads_comment_17912345678901234
# each message prints its id; use it for inbox:hide and inbox:delete
omnisocials inbox:hide 20457105
omnisocials inbox:hide 20457105 --unhide
```

Delete a comment for good (Facebook, Instagram, TikTok):

```bash
omnisocials inbox:delete 20457105
# Comment 20457105 deleted from the platform.
# Conversation: fb_comment_1
# Also removed 2 replies under it: 20457110, 20457112
```

On YouTube, hiding sets the comment's moderation status to rejected, which
removes it and its replies from public view; there is no delete. Hiding needs
the account to have been connected with the moderation permission: a
`reconnect_required` error means reconnecting the account in the dashboard.
YouTube's daily API quota can return `quota_exceeded`; retry after midnight
Pacific.

Replies are limited to existing conversations (no cold outreach), the platform's
messaging window applies, and each workspace can send up to 1,000 replies per
rolling 24 hours. TikTok conversations are video comments only; see
[TikTok comments](/inbox#tiktok-comments). YouTube conversations are video
comments only too; channels are checked for new comments once per day, so a
new comment can take up to a day to show up; see
[Platform notes](/inbox#platform-notes). X conversations
are DMs only, require the workspace to opt in, and each reply uses 2 credits;
see [X direct messages](/inbox#x-direct-messages). Threads conversations are
replies on your posts and mentions, replies publish as native Threads replies,
and only incoming top-level replies on your own posts can be hidden. Threads
connections made before the inbox permissions were added need a one-time
reconnect in the dashboard; see
[Threads replies and mentions](/inbox#threads-replies-and-mentions).
