Bluesky API
Postproxy publishes feed posts and post chains to Bluesky over the AT Protocol, and supports text direct messages through the Bluesky chat service.
Every request below uses the base URL https://api.postproxy.dev and an Authorization: Bearer YOUR_API_KEY header. Replace YOUR_API_KEY and the example IDs with your own.
At a glance
Section titled “At a glance”| Platform ID | bluesky |
| Formats | post (default) |
| Character limit | 300 (graphemes) |
| Media | Optional |
| Placements | None |
| Comments | No |
| Direct messages | Yes — text only |
| Post chains | Yes |
Publishing
Section titled “Publishing”Parameters
Section titled “Parameters”Bluesky has no custom parameters — pass an empty object (or omit it).
| Media | Max size | Formats | Count | Duration |
|---|---|---|---|---|
| Image | 1 MB | jpg, png, webp, gif | 4 | — |
| Video | 50 MB | mp4, mov | 1 | 1 s – 60 s |
- Text-only posts are allowed; media is optional.
- Images and video cannot be mixed.
- The 1 MB per-image limit is strict — compress images before uploading.
# Simple postcurl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "Shipping a new feature today 🚀 https://example.com/launch" }, "profiles": ["prof_abc123"], "media": ["https://example.com/image.jpg"], "platforms": { "bluesky": {} } }'Post chains
Section titled “Post chains”Bluesky supports thread conversations. Pass a thread array of follow-up posts; each child can carry its own media.
# A 2-post threadcurl -X POST "https://api.postproxy.dev/api/posts" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "post": { "body": "1/ Quick thread on what we shipped 🧵" }, "profiles": ["prof_abc123"], "thread": [ { "body": "2/ Faster sync and a new webhook.", "media": ["https://example.com/shot.jpg"] } ] }'Comments
Section titled “Comments”Not currently exposed through the Comments API.
Direct messages
Section titled “Direct messages”Bluesky DMs go through the AT Protocol chat service and are supported through the Direct Messages API, with some limits relative to the Meta networks.
| Capability | Supported |
|---|---|
| Send / receive text | Yes |
| Attachments | No |
| Reactions | No |
| Edit outbound message | No |
| Delivery / read receipts | No |
| Archive (mute) chat | Yes |
| Inbound delivery | Poller (~5 min) |
- No webhooks for inbound. A per-profile poller runs every ~5 minutes; new inbound messages still fire
message.received, with up to ~5 minutes of latency. - No messaging window, but the recipient must have DMs enabled and allow messages from you, or the send fails with a Bluesky-side error.
- Archive = mute — archive / unarchive map to
muteConvo/unmuteConvo. - Start a chat with the recipient’s DID as
participant_external_id.
# Create or find a chat by DIDcurl -X POST "https://api.postproxy.dev/api/profiles/prof_abc123/chats" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "participant_external_id": "did:plc:abcdefghijklmnopqrstuvwx" }'# Send a text message (Bluesky is text-only)curl -X POST "https://api.postproxy.dev/api/chats/chat_abc123/messages" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "body": "Thanks for following! Anything we can help with?" }'# Archive (mute) / unarchive a chatcurl -X POST "https://api.postproxy.dev/api/chats/chat_abc123/archive" \ -H "Authorization: Bearer YOUR_API_KEY"
curl -X DELETE "https://api.postproxy.dev/api/chats/chat_abc123/archive" \ -H "Authorization: Bearer YOUR_API_KEY"Webhooks
Section titled “Webhooks”Subscribe with the Webhooks API:
curl -X POST "https://api.postproxy.dev/api/webhooks" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com/webhooks/postproxy", "events": ["platform_post.published", "message.received"] }'Events relevant to Bluesky:
| Event | When |
|---|---|
post.processed | A post is ready to publish |
platform_post.published | A post was published to the platform |
platform_post.failed | A post failed to publish (retries exhausted) |
platform_post.failed_waiting_for_retry | A publish attempt failed; will retry |
platform_post.insights | New analytics snapshot |
message.received | Inbound DM (via the ~5 min poller) |
message.sent | An outbound DM was accepted by the platform |
message.failed_waiting_for_retry | An outbound DM failed; will retry |
message.failed | An outbound DM failed permanently |
profile.connected / .disconnected | Connection state changed |
profile.stats | New profile stats snapshot |
media.failed | A media attachment failed to process |
Bluesky does not expose delivery/read receipts, reactions, edits, or deletion events.
- The character limit is counted in graphemes — emoji and combining sequences count as one character.
- Images are capped at 1 MB each; plan to compress.