Understand the objects
- A thread is one provider post and the comments on it.
- A comment is a message in a thread. The connected account can write a comment too.
- A reply is a comment that OpenPMM sends for you.
- A conversation is a comment from another person and all the replies below it.
- A post part is a comment from the connected account that continues its own post, such as part 2 of a thread. A post part is not in a conversation.
A comment from the connected account has no state.
OpenPMM changes a comment from
unanswered to replied when the account answers it.
A reply from the account also answers every earlier comment in the same conversation.
OpenPMM does not change a resolved comment.
Check the capability of each channel
SendGET /workspaces/{workspace_id}/inbox.
The response gives a capability for each Destination.
Connect a Destination again after OpenPMM adds inbox access for its channel.
The existing connection continues to publish Posts.
Coverage for each channel
OpenPMM shows only channels that your deployment enabled.
LinkedIn does not give OpenPMM the names of people who comment.
Send
POST /workspaces/{workspace_id}/inbox/refresh to check for new comments now.
OpenPMM accepts one check for each Destination every 2 minutes.
List threads and comments
SendGET /workspaces/{workspace_id}/inbox/threads for the posts that have comments.
Send GET /workspaces/{workspace_id}/inbox/comments for a flat list of comments.
The default order shows unanswered comments first.
Use state=unanswered to get the open queue.
Send GET /workspaces/{workspace_id}/inbox/threads/{thread} to read one thread.
The comments are in time order. Use parent_id to find a nested reply.
The response also groups the comments:
post_part_idslists the post parts. They are neverunanswered.conversationslists each conversation, with the conversations that wait for a reply first.
Send your reply to
latest_waiting_id, the newest comment that waits.
The reply answers every earlier comment in the conversation.
Send a reply
SendPOST /workspaces/{workspace_id}/inbox/comments/{comment}/replies.
Send an Idempotency-Key header and use a live API credential.
202 with the reply in the queued state.
OpenPMM usually sends the reply in a few seconds.
Get the comment to see the reply state: queued, sending, sent, or failed.
Use the same idempotency key when you retry a request.
OpenPMM sends one reply for one key.
OpenPMM sends the body without changes.
On X, Mastodon, Bluesky, Threads, and Instagram, a reply usually starts with the author handle.
Add the handle yourself when you want it.
A read-only or unsupported Destination refuses a reply with inbox_reply_unavailable.
Resolve a comment
SendPATCH /workspaces/{workspace_id}/inbox/comments/{comment} with {"state": "resolved"}.
Send {"state": "unanswered"} to open the comment again.
A comment with a reply goes back to replied.
Send POST /workspaces/{workspace_id}/inbox/threads/{thread}/resolve to resolve every unanswered comment in a thread.
Receive new comments
Subscribe a webhook endpoint tocomment.received.
OpenPMM sends the event for each new comment from another person.
OpenPMM does not send events for the comments that it reads when you first connect a Destination.
Subscribe to comment.reply.failed to learn about a reply that OpenPMM cannot send.
See Receive webhook events.
You can also get a Slack message about new comments.
Send PATCH /workspaces/{workspace_id}/notification-settings with {"comment_digest_enabled": true}.
OpenPMM sends at most one message every 15 minutes to the Workspace channel.
The message gives the number of new comments and a link to the inbox.
It does not contain the comment text.
Data retention
OpenPMM keeps a comment for 90 days after the author posted it. OpenPMM deletes a comment when it finds that the author deleted it on the provider.API scopes
Read operations requireinbox:read.
Reply, resolve, and refresh operations require inbox:write.
An API credential that you created before the inbox does not have these scopes.
Create a new credential, or run openpmm auth login again for the CLI.