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

Bluesky app passwords only get direct-message access if the box was ticked when the password was created. It cannot be added afterwards. If DMs return a permission error, create a new app password with direct messages enabled and reconnect the channel.

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.