Bluesky API Guide
Publish text posts, image posts, video posts, and threads to Bluesky (the AT Protocol network). PostEverywhere handles the AT Protocol session, rich-text facets, link cards, and media attachments through a single call. For a general overview of all supported platforms, see the Introduction.
Connecting a Bluesky Account
Bluesky uses an app password, not OAuth. In your PostEverywhere dashboard, go to Accounts → Connect Bluesky and enter:
- Your handle (e.g.
yourname.bsky.social, or a custom domain handle) - An app password created at bsky.app → Settings → App Passwords (format
xxxx-xxxx-xxxx-xxxx)
Use an app password — never your main account password. You can revoke it from Bluesky at any time without affecting your login.
Supported Content Types
| Content Type | Media Required | Description |
|---|---|---|
| Text post | None | Plain text post, up to 300 characters. |
| Image post | Image(s) | Post with up to 4 attached images. |
| Video post | Video (MP4) | Post with a single video attachment. |
| Thread | None / media | A chain of connected posts (each up to 300 characters). |
Bluesky is short-form: posts are capped at 300 characters. Links, @mentions, and #hashtags in your text are detected automatically and turned into rich-text facets — you don't need to format them. When your text contains a URL, Bluesky renders an external link preview card automatically.
Requirements & Limits
| Requirement | Limit |
|---|---|
| Post text length | 300 characters (Unicode grapheme-aware) |
| Images per post | Up to 4 |
| Image formats | JPEG, PNG, WebP, GIF |
| Image handling | Automatically recompressed to ≤ 1 MB per image if needed |
| Video format | MP4 (H.264) |
| Video max file size | 100 MB |
| Video duration | Up to 3 minutes |
| Links | Auto-detected; rendered as a preview card |
| Mentions / hashtags | Auto-detected from @handle / #tag in text |
Example: Create a Post
Schedule a Bluesky Text Post
curl -X POST https://app.posteverywhere.ai/api/v1/posts \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Cross-posting from PostEverywhere — links like https://posteverywhere.ai and #hashtags are detected automatically.",
"account_ids": [2295],
"scheduled_for": "2026-06-01T12:00:00Z",
"timezone": "UTC"
}'
Schedule a Bluesky Post with Images
Upload your images first (see Upload Media), then attach the returned IDs:
curl -X POST https://app.posteverywhere.ai/api/v1/posts \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Four shots from launch day 🦋",
"account_ids": [2295],
"media_ids": [
"11111111-1111-1111-1111-111111111111",
"22222222-2222-2222-2222-222222222222",
"33333333-3333-3333-3333-333333333333",
"44444444-4444-4444-4444-444444444444"
]
}'
Post a Thread
Use thread_posts to publish a connected chain. Each entry becomes a reply to the one before it:
curl -X POST https://app.posteverywhere.ai/api/v1/posts \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "A short thread on why we built a unified posting API 🧵",
"account_ids": [2295],
"thread_posts": [
"1/ Managing 9 platforms by hand does not scale.",
"2/ One API call fans out to all of them, with per-platform overrides.",
"3/ Bluesky was the latest to join. Try it: https://posteverywhere.ai"
]
}'
Tips
- Keep it under 300 characters. Bluesky counts by Unicode grapheme, so emoji and combined characters count as one. If you need more room, use a thread.
- Don't pre-shorten links or build markdown. Bluesky link cards and
@mention/#hashtagfacets are generated automatically from the raw text — paste the URL or handle directly. - Images are recompressed for you. Bluesky caps each uploaded blob at ~1 MB; PostEverywhere downsizes large images automatically so you can send full-resolution files.
Frequently Asked Questions
How do I connect a Bluesky account?
Bluesky uses an app password rather than OAuth. Create one at bsky.app → Settings → App Passwords, then add your handle and that app password under Accounts → Connect Bluesky in the PostEverywhere dashboard.
What is the character limit for Bluesky posts?
300 characters, counted by Unicode grapheme. Emoji and combined characters count as a single character. For longer content, split it across a thread using thread_posts.
Can I attach images or video to a Bluesky post?
Yes. Upload your media and pass the returned UUIDs in media_ids. Bluesky supports up to 4 images (JPEG, PNG, WebP, GIF) or a single MP4 video up to 100 MB and 3 minutes. Large images are automatically recompressed to fit Bluesky's per-blob size limit.
Do links and mentions need special formatting?
No. Include the raw URL, @handle, or #hashtag in your content and PostEverywhere generates the correct AT Protocol rich-text facets and link preview card automatically.
Related Platforms
- X (Twitter) — similar short-form text and threading model
- Threads — short-form conversational posts by Meta
- LinkedIn — longer-form posts with PDF/document support