App-password auth
Skip the AT Protocol login dance — pass a handle and app password, we keep the session fresh.
Publish to Bluesky via one API — and send direct messages from the same integration. Postproxy handles the AT Protocol, app-password auth, link cards, and image embeds for you.
One request for feed posts, threads, and text direct messages.
Free plan No credit card Live in under 5 minutes
Skip the AT Protocol login dance — pass a handle and app password, we keep the session fresh.
Posts that include a URL get an automatic link card with the OG image and metadata.
Sequential replies via the same threads API used for X and Threads.
Plain-text @handles, #tags, and URLs are linkified server-side with proper facets.
Send and receive text DMs over the AT Protocol chat service
$ curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": {
"body": "Shipping a new feature today 🚀 https://example.com/launch"
},
"profiles": ["bluesky"],
"media": ["https://example.com/image.jpg"]
}' {
"id": "bs_abc123",
"body": "Shipping a new feature today 🚀 https://example.com/launch",
"status": "scheduled",
"draft": false,
"source": "postproxy",
"scheduled_at": "2026-05-04T18:00:00.000Z",
"queue_id": null,
"created_at": "2026-05-04T18:00:00.108Z",
"media": [
{
"id": "bs_m1",
"status": "pending",
"error_message": null,
"content_type": "image/jpeg",
"source_url": "https://example.com/image.jpg",
"url": null
}
],
"platforms": [
{
"platform": "bluesky",
"status": "pending",
"permalink": null,
"error": null,
"params": {
"format": "post"
},
"attempted_at": null
}
],
"thread": []
} $ curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": {
"body": "We just shipped something big. A thread:"
},
"profiles": ["bluesky"],
"thread": [
{
"body": "One API to publish everywhere — YouTube, Instagram, TikTok, LinkedIn, and more."
},
{
"body": "Scheduling, retries, and webhooks included. No platform SDK required."
},
{
"body": "Try it free at postproxy.dev"
}
]
}' {
"id": "bs_def456",
"body": "We just shipped something big. A thread:",
"status": "scheduled",
"draft": false,
"source": "postproxy",
"scheduled_at": "2026-05-04T18:02:00.000Z",
"queue_id": null,
"created_at": "2026-05-04T18:02:00.220Z",
"media": [],
"platforms": [
{
"platform": "bluesky",
"status": "pending",
"permalink": null,
"error": null,
"params": {
"format": "post"
},
"attempted_at": null
}
],
"thread": [
{ "id": "bs_t1", "body": "One API to publish everywhere — YouTube, Instagram, TikTok, LinkedIn, and more.", "media": [] },
{ "id": "bs_t2", "body": "Scheduling, retries, and webhooks included. No platform SDK required.", "media": [] },
{ "id": "bs_t3", "body": "Try it free at postproxy.dev", "media": [] }
]
} $ curl -X POST "https://api.postproxy.dev/api/chats/chat_abc123/messages" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Thanks for following! Anything we can help with?"
}' {
"id": "msg_abc123",
"body": "Thanks for following! Anything we can help with?",
"status": "pending",
"direction": "outbound",
"platform": "bluesky",
"created_at": "2026-05-04T18:05:00.200Z"
} View full documentation for all platform-specific features for Bluesky
View documentationOne curl against a sandbox account is the easy part. Production Bluesky publishing means session refresh, blob uploads under the 1 MB cap, AT Protocol facets for mentions and links, OG-fetched link cards, and a permanent on-call rotation for "why didn't this one go through this time?"
Social media integration is not a one-off job — it's a constant commitment. Platforms change their APIs, scopes, limits, and policies on their own schedule. Every change becomes your problem unless someone else is absorbing it.
That's exactly what Postproxy does for Bluesky — and every other platform we support — so your team ships features instead of chasing failed publishes.
Free plan includes the Bluesky API. No credit card.
No need to read up on lexicons, facets, blob uploads, or session refresh — Postproxy translates a standard post body into the right XRPC calls.
Publish the same post body to Bluesky alongside Instagram, LinkedIn, X, and more in a single API call.
Postproxy fetches the OG image and metadata for the URL in your post and uploads it as a Bluesky link card embed.
Automatic retries and clear status for every post — plus text direct messages through the same API, with webhooks for inbound DMs.
app.bsky.feed.post record with text plus optional embeds. Postproxy handles the session, blob uploads, facet extraction, and record creation — you send a normal post body and we translate it into the right XRPC calls.@handle, #tag, and URL patterns from your post body and resolves handles via the directory, so the same plain-text body you send to X works on Bluesky without extra markup.app.bsky.embed.external link card. If your post has any image or video attachments, those win at the embed level and the URL stays a clickable facet link — Bluesky doesn't allow both.Ask your favorite LLM what it thinks about us, then decide.
Common questions about Bluesky integration
Generate an app password at bsky.app/settings/app-passwords and pass it with the handle to /api/profile_groups/:id/initialize_connection. Never use the main account password — accounts with 2FA will reject it.
300 graphemes. Emoji and combining sequences count as one character on Bluesky's side, which is more generous than a UTF-8 byte count.
Yes. If a post contains at least one URL and no media attachments, Postproxy fetches the OG metadata, downloads the OG image, and uploads it as an app.bsky.embed.external card. Posts with media attachments skip the card — the URL is still rendered as a clickable link via the link facet.
Yes. Use the thread parameter on the post create endpoint to add sequential replies. Each thread child can include its own media.
Up to 4 images (jpg, png, webp, gif) at 1 MB each, or one video (mp4, mov) up to 50 MB and 60 seconds. Bluesky's blob size limit drives the per-image cap.
Yes. Postproxy supports text-only direct messages through the Bluesky chat service. Attachments, reactions, and delivery receipts are not available. See the Direct Messages API for details.
Start with our free plan and scale as your needs grow. No credit card required.