Guides
Direct messages
Read and answer DMs through the same normalised shape as everything else.
Threads
GET /v1/conversations lists threads across every connected network that supports messaging, most recent first, with who is in each, the last message and an unread count.
Reading one
GET /v1/conversations/{id}/messages?account=acc_…. The account is required: a conversation id only means something on the connection it belongs to.
Each message carries fromMe, so you never have to compare handles to work out which side sent it.
Sending
curl -X POST https://api.postlake.dev/v1/conversations/CONVO_ID/messages \
-H "authorization: Bearer $POSTLAKE_KEY" \
-H "content-type: application/json" \
-d '{"account":"acc_7f3k9","text":"Thanks for getting in touch."}'Links and mentions in the text are made real rather than left as plain characters. Messaging is free and never spends credits.
Starting a new one
You do not need to find a conversation id first. POST /v1/conversations with a handle finds or opens the thread and returns it.
curl -X POST https://api.postlake.dev/v1/conversations \
-H "authorization: Bearer $POSTLAKE_KEY" \
-H "content-type: application/json" \
-d '{"account":"acc_7f3k9","handle":"alice.bsky.social"}'Bluesky: tick the DM box
What you cannot do, and why
Messaging is the most restricted thing any network offers. Bluesky is open. Meta requires app review and business accounts. X allows reading but its API sending has a history of account bans. LinkedIn messaging is partner-only. So this is per-network by nature rather than one universal inbox. Platform support shows where it works today.