Bluesky
Social PostingPublish text, image, video and thread posts to Bluesky with the Zernio API, connected with an app password instead of OAuth.
Authentication details
Connecting accounts guideApp Password
Connect endpoints
POST /v1/connect/bluesky/credentialsConnect Bluesky account
Publish text, image, video and thread posts to Bluesky with POST /v1/posts and platform: "bluesky".
Bluesky connects with an app password instead of OAuth. The same account also serves DMs and comments.
Quick reference
| Property | Value |
|---|---|
| Character limit | 300 (hard limit) |
| Images per post | 4 |
| Videos per post | 1 |
| Image formats | JPEG, PNG, WebP, GIF |
| Image max size | 1 MB (auto-compressed) |
| Video format | MP4 only |
| Video max size | 50 MB |
| Video max duration | 60 seconds |
| Post types | Text, Image, Video, Thread |
| Scheduling | Yes |
| Inbox (DMs) | Yes (text only) |
| Inbox (comments) | Yes |
| Analytics | Limited (likes, comments, reposts) |
Before you start
Bluesky requires an app password for the account, created in Bluesky's settings, and a handle. Custom domain handles work (brand.com as well as brand.bsky.social).
The 300-character count includes text, URLs and mentions.
Cross-posting from a platform with a longer limit? Set customContent on the Bluesky entry with a shorter version, or the Bluesky entry fails.
Connect
Call POST /v1/connect/bluesky/credentials with the handle, the app password and state (Connect Bluesky account).
state is {userId}-{profileId}. userId is currentUserId from GET /v1/users, and profileId comes from GET /v1/profiles.
The full sample is under Bluesky in the connecting accounts guide.
curl -X POST https://zernio.com/api/v1/connect/bluesky/credentials \
-H "Authorization: Bearer $ZERNIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"identifier": "yourhandle.bsky.social",
"appPassword": "xxxx-xxxx-xxxx-xxxx",
"state": "66a0e8b1c2d3e4f5a6b7c8d9-66a1f0c2a4b9d3e8f1a2b3c4"
}'Response (200):
{
"message": "Bluesky connected successfully",
"account": {
"platform": "bluesky",
"username": "yourhandle.bsky.social",
"displayName": "Your Name",
"isActive": true
}
}There are no OAuth scopes. The app password grants API access to the account over the AT Protocol, without exposing the main password.
The user can revoke it at any time from Bluesky's settings.
In this section
Posts & Threads
Publish a text, image, video or thread post to Bluesky, set the post language, and every platformSpecificData field.
Media requirements
Image and video requirements for Bluesky posts.
Analytics
Which engagement metrics Bluesky returns for posts.
Inbox
Text direct messages and comments on Bluesky through the inbox API.
Limits & errors
What Bluesky's API does not expose and the common errors when publishing.
Related
- Connecting accounts: the app-password flow.
- Create post: every field of the request.
- Media uploads: upload images and videos instead of hosting them.
- Analytics: post performance metrics.
- Messages and Comments: the inbox API.
Bluesky
12- GET
- POST
- GET
- DELETE
- GET
- GET
- GET
- POST
- GET
- POST
- GET
- PATCH
Publishing
24· Unified API, shared with other platforms- POST
- POST
- POST
- POST
- GET
- POST
- GET
- PUT
- DELETE
- POST
- POST
- POST
Analytics
8· Unified API, shared with other platforms- GET
- GET
- GET
- GET
- GET
- GET
- GET
- GET
Direct messages
24· Unified API, shared with other platforms- GET
- POST
- GET
- GET
- PUT
- DELETE
- GET
- POST
- PATCH
- DELETE
- POST
- POST
Comments
15· Unified API, shared with other platforms- GET
- GET
- POST
- DELETE
- PATCH
- POST
- POST
- DELETE
- POST
- DELETE
- POST
- DELETE