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.

bluesky-post.ts
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

Request — cURL
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'
Response — 200 OK
{
  "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

1

Create your account

Sign up for Upload-Post and grab your API key from the dashboard.

2

Connect Bluesky

Link your Bluesky account once — we handle the AT Protocol session for you.

3

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 Account

Prefer an AI agent? Use the Bluesky Claude Code skill or the Bluesky MCP server.