# PostEverywhere Bluesky API Guide > Bluesky posting API: publish and schedule text, images, video, and threads to the AT Protocol network via REST. **Source:** https://posteverywhere.ai/docs/platforms/bluesky **Section:** Platforms **API reference:** https://posteverywhere.ai/docs/api/reference --- Publish text posts, image posts, video posts, and threads to [Bluesky](https://bsky.app) (the AT Protocol network). PostEverywhere handles the AT Protocol session, rich-text facets, and [media attachments](/docs/api/init-media-upload) through a single call. For a general overview of all supported platforms, see the [Introduction](/docs). ## Connect your Bluesky account to PostEverywhere 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](https://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. ## What you can post to Bluesky | 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. URLs become clickable link facets; PostEverywhere does not currently attach an external link-preview card. ## Bluesky limits: characters, media and video | Requirement | Limit | |-------------|-------| | Post text length | 300 characters (Unicode grapheme-aware) | | Images per post | Up to 4 | | Image formats | JPEG, PNG, WebP (GIF and HEIC are accepted but re-encoded as a static JPEG) | | Image handling | Automatically recompressed to ≤ 2 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 and made clickable (no preview card is attached) | | Mentions / hashtags | Auto-detected from `@handle` / `#tag` in text | ## Publish to Bluesky: a working request ### Schedule a Bluesky Text Post ```bash 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](/docs/api/init-media-upload)), then attach the returned IDs: ```bash 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: ```bash 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 every social platform by hand does not scale.", "2/ One API call fans out to all of them, with per-platform overrides.", "3/ Bluesky is one of them. Try it: https://posteverywhere.ai" ] }' ``` ## Getting better results on Bluesky - **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.** Link, `@mention` and `#hashtag` facets are generated automatically from the raw text: paste the URL or handle directly. - **Images are recompressed for you.** Each uploaded image blob is capped at 2 MB; PostEverywhere downsizes large images automatically so you can send full-resolution files. ## Common questions about posting to Bluesky ### How do I connect a Bluesky account? Bluesky uses an app password rather than OAuth. Create one at [bsky.app → Settings → App Passwords](https://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](/docs/api/init-media-upload) and pass the returned UUIDs in `media_ids`. Bluesky supports up to 4 images (JPEG, PNG or WebP; GIFs are converted to a static JPEG) 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 automatically (links are clickable; no preview card is attached). ### Can I edit a Bluesky post after it's published? No. The AT Protocol does not expose a post-edit operation: Bluesky's official model is delete-and-repost. `PATCH /v1/posts/:id` only accepts posts in `scheduled` or `draft` status. To change a published Bluesky post, delete it (in the Bluesky app or via repository tooling) and recreate it from PostEverywhere. ## Other platforms you can publish to - **[X (Twitter)](/docs/platforms/x-twitter)**: similar short-form text and threading model - **[Threads](/docs/platforms/threads)**: short-form conversational posts by Meta - **[LinkedIn](/docs/platforms/linkedin)**: longer-form posts with PDF/document support ## Related Bluesky and API reference pages - [API Reference: Create Post](/docs/api/create-post) - [Upload Media](/docs/api/init-media-upload) - [Quick Start Guide](/docs/quick-start) **Related:** [Bluesky media requirements](/docs/media-requirements) · [connecting a Bluesky account](/docs/connecting-accounts) · [testing posts safely](/docs/testing) · [how to post to Bluesky programmatically](/blog/post-to-bluesky-api) · [the PostEverywhere social media API](/social-media-api) · [the Discord guide](/docs/platforms/discord)