How to Schedule Bluesky Posts via API
Schedule Bluesky posts programmatically with the SocialRails API. Covers character limits, AT Protocol details, media support, rate limits, and code examples for automated Bluesky posting.
Schedule Bluesky posts programmatically using the SocialRails API. This guide covers character limits, AT Protocol details, media support, code examples, and best practices for automated Bluesky posting.
Character Limits
- Posts: 300 characters (counted as grapheme clusters, not bytes)
- Alt text: 2,000 characters per image
- Display name: 64 characters
- Bio: 256 characters
Supported Content Types
API Example
# Schedule a Bluesky post
curl -X POST https://socialrails.com/api/v1/posts \
-H "Authorization: Bearer sr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Just shipped a new feature! Check out our API docs at socialrails.com/documentation",
"platform": "bluesky",
"scheduled_for": "2026-03-15T14:00:00Z"
}'# Schedule a Bluesky post with images
curl -X POST https://socialrails.com/api/v1/media/upload \
-H "Authorization: Bearer sr_live_YOUR_KEY" \
-F "file=@screenshot.png"
curl -X POST https://socialrails.com/api/v1/posts \
-H "Authorization: Bearer sr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Here is a sneak peek at the new dashboard",
"platform": "bluesky",
"media": ["MEDIA_KEY_FROM_UPLOAD"],
"scheduled_for": "2026-03-15T14:00:00Z"
}'AT Protocol Notes
Bluesky is built on the AT Protocol (Authenticated Transfer Protocol), a decentralized social networking protocol. Here is what you need to know:
- SocialRails handles all protocol details: You don't need to understand the AT Protocol to post via the SocialRails API. Simply set the platform to
"bluesky"and SocialRails handles record creation, blob uploads, and facet detection. - No special platform_settings required: Unlike some platforms, Bluesky does not require additional platform-specific configuration. Standard post fields (content, media, scheduled_for) work out of the box.
- Link detection: URLs, mentions (@handle.bsky.social), and hashtags in your content are automatically detected and converted to AT Protocol facets.
- Decentralized identity: Your Bluesky handle is a domain-based identifier. SocialRails manages authentication and token refresh automatically.
First Comment
Automatically post a reply to your Bluesky post right after it goes live. Use this to add context, a link, or a follow-up thought.
curl -X POST https://socialrails.com/api/v1/posts \
-H "Authorization: Bearer sr_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Just shipped a new feature!",
"platform": "bluesky",
"scheduled_for": "2026-03-15T14:00:00Z",
"first_comment": "Full details in the docs: socialrails.com/documentation"
}'The first comment is posted as a reply to the original post. Max 2,200 characters.
Best Practices
- Engage with replies: Bluesky's algorithm favors conversational posts, reply to comments to boost visibility
- Alt text: Always include alt text on images for accessibility, Bluesky's community values this highly
- Quote posts: Use quote posts for engagement, they perform well on the platform
- Optimal posting times: Still developing as the platform grows, experiment with your audience
- Concise content: With a 300-character limit, every word counts, make posts punchy and clear
- Be an early adopter, growing platforms reward consistent posters with higher visibility
Rate Limits
AT Protocol rate limits apply in addition to SocialRails rate limits:
- 1,667 posts per day (creates)
- 11,667 actions per hour (creates)
- Blob uploads: 1,000 per day
SocialRails handles these limits automatically and will retry failed posts.