Bluesky API Post Text, Images & Video with One REST Call
The Bluesky API without the AT Protocol boilerplate. Simple REST endpoints for text posts, images and video — with automatic threads past 300 characters, link preview cards, scheduling and cross-posting to X, LinkedIn, Threads, Reddit and more in the same request.
import { UploadPost } from 'upload-post';
const uploader = new UploadPost('your-api-key');
await uploader.uploadText({
title: 'Hello Bluesky 👋',
platforms: ['bluesky']
}); Bluesky API — Everything Included
A complete way to automate your Bluesky content
Text Posts & Auto-Threads
Publish a Bluesky post with one REST call. Text over 300 characters is automatically split into a natural-looking thread — whole paragraphs are grouped per post instead of cut at every line break.
Images & Native Video
Attach up to 4 images per post — alt text supported — or upload native video (up to 3 minutes, 100 MB, .mp4/.mov/.webm/.mpeg) through the same account.
Rich Link Preview Cards
Pass bluesky_link_url (or the generic link_url) and Bluesky renders a rich external embed with the page title, description and thumbnail — no manual card building.
Replies & First Comments
Reply to an existing post with reply_to_id (a post URL or AT-URI), and add a bluesky_first_comment that posts as a reply right after publishing.
Cross-post to 10+ Platforms
The same endpoint posts to Bluesky, X, LinkedIn, Threads, Facebook, Reddit and more at once — add platform[]=bluesky to a request you are already sending elsewhere.
Schedule & Queue
Set scheduled_date (ISO-8601, up to 365 days ahead) with an optional timezone, or use add_to_queue to drop the post into your next auto-publishing slot.
Post to Bluesky via API
One POST request to /api/upload_text — text, a link card, or cross-post to more platforms
curl -X POST https://api.upload-post.com/api/upload_text \
-H 'Authorization: Apikey your-api-key-here' \
-F 'user=my-profile' \
-F 'platform[]=bluesky' \
-F 'title=New post live on Bluesky!' \
-F 'bluesky_link_url=https://example.com/article' {
"success": true,
"results": {
"bluesky": {
"success": true,
"url": "https://bsky.app/profile/you.bsky.social/post/3k..."
}
},
"usage": { "count": 12, "limit": 100 }
}
Posting images? Use /api/upload_photos with photos[]. Posting video? Use /api/upload with the video field. Full reference in the
Upload Text API docs.
Pro tip: let long posts auto-thread
Bluesky caps each post at 300 characters, but you don't need to chunk anything yourself. Send the full
text in title and Upload-Post splits it into a natural-looking thread — whole
paragraphs are grouped into each post, and a paragraph is only split by line break or word when it can't fit.
Rule of thumb: write in short paragraphs and each one lands as a clean post in the thread — ideal for digests, changelogs and long-form updates pushed from automations.
Bluesky API Parameters
The most-used fields for posting to Bluesky
| Parameter | Type | Required | Description |
|---|---|---|---|
| platform[] | Array | Yes | Set to bluesky (combine with other platforms to cross-post in one request). |
| title / bluesky_title | String | Yes* | The post text (max 300 chars per post). bluesky_title overrides the global title for Bluesky only. Longer text auto-threads. |
| photos[] | File(s) | No | Up to 4 images per post on the /upload_photos endpoint. |
| video | File / URL | No | A video file or public URL on the /upload endpoint — up to 3 minutes and 100 MB. |
| bluesky_link_url / link_url | String | No | URL to render as a rich link preview card. The Bluesky-specific field overrides the generic link_url. |
| bluesky_first_comment / first_comment | String | No | Posted as a reply to your post right after publishing. |
| reply_to_id | String | No | Post URL or AT-URI to reply to. Creates a reply to that post. |
| scheduled_date | ISO-8601 | No | Future date/time to schedule the post (≤ 365 days ahead). Pair with timezone. |
* A text post needs title; media posts can omit it. See the complete parameter list in the
API documentation.
Start Posting to Bluesky in Minutes
Three steps to integrate the Bluesky API
Create your account
Sign up for Upload-Post and grab your API key from the dashboard.
Connect Bluesky
Link your Bluesky account once — we handle the AT Protocol session for you.
Post programmatically
POST your text to /api/upload_text with platform[]=bluesky — images go to /api/upload_photos, video to /api/upload. Done.
Bluesky API — FAQ
Common questions about posting to Bluesky programmatically
Does Bluesky have an API?
Yes. Bluesky is built on the open AT Protocol, which exposes an API for posting. Upload-Post wraps it in simple REST endpoints — POST /api/upload_text for text posts, /api/upload_photos for images and /api/upload for video. Send platform[]=bluesky and we handle the AT Protocol session, records and media upload for you.
Is the Bluesky API free?
You can start free with Upload-Post — no credit card required. Create an account, get an API key and connect your Bluesky account. Bluesky itself does not charge for posting via the AT Protocol; see the pricing page for Upload-Post plan limits.
Can I schedule Bluesky posts via API?
Yes. Add scheduled_date (ISO-8601, up to 365 days in the future) with an optional timezone to schedule a Bluesky post, or use add_to_queue to drop it into your next available auto-publishing slot. The API returns a job_id you can track with the Upload Status endpoint.
How do I post to Bluesky programmatically?
Send a multipart POST request to https://api.upload-post.com/api/upload_text with your API key in the Authorization header, user (your profile), platform[]=bluesky and title (the post text). For images use /api/upload_photos with photos[], and for video use /api/upload with the video field.
Can I post images and video to Bluesky, not just text?
Yes. Text is Bluesky’s main format, but the same integration supports up to 4 images per post via the photo endpoint (photos[]) and native video (up to 3 minutes, 100 MB) via the video endpoint — all through platform[]=bluesky on the connected account.
Does the API create Bluesky threads automatically?
Yes. Bluesky posts are capped at 300 characters. If your text is longer, Upload-Post automatically splits it into a natural-looking thread — it groups whole paragraphs into each post up to the 300-character limit, then splits by line break and by word only when a single paragraph is too long. You do not need to chunk the text yourself.
Do I need to write AT Protocol code?
No. Upload-Post handles the AT Protocol session, authentication and record creation behind one REST endpoint. You send plain form fields (text, images, a link_url, a reply_to_id) and we translate them into the right AT Protocol calls, so there is no XRPC or repo record handling to write yourself.
Can I add link previews and first comments on Bluesky?
Yes. Pass bluesky_link_url (or the generic link_url) to render a rich external preview card with the page title, description and thumbnail. Add bluesky_first_comment to post a reply right after publishing, and reply_to_id (a post URL or AT-URI) to publish your post as a reply to an existing one.
Ready to automate your Bluesky posts?
Start posting text, images and video to Bluesky programmatically today. No credit card required.
Create Free AccountPrefer an AI agent? Use the Bluesky Claude Code skill or the Bluesky MCP server.