ReelspanUpload guidesBluesky

Post to Bluesky automatically

Connect Bluesky once, then send videos, photos and text posts to it from code, a workflow or an AI agent. The same call can post to every other network at the same time.
1 min setup300 characters16:97 sections

01

Connect Bluesky

  1. In Bluesky, open Settings → Privacy and security → App passwords and create one.
  2. In the dashboard, pick Bluesky and enter your handle and that app password. Never your main password.

Posting for clients? Send them a connect link so they connect their own Bluesky account without a Reelspan login.

02

Get an API key

In the dashboard, open Developers → API keys and create one. Keep it in an environment variable such as REELSPAN_KEY; never in code you share.

03

Post with one request

Send the video as a file, or as a public URL like below. Add more platform[] fields to post the same thing everywhere at once.

curl
curl -X POST https://api.reelspan.com/v1/posts/video \
  -H "Authorization: Bearer $REELSPAN_KEY" \
  -F user=my-brand \
  -F "platform[]=bluesky" \
  -F "video=https://example.com/clip.mp4" \
  -F "title=Your post" \
  -F "bluesky_threadgate=…"
JavaScript (Node 18+)
const form = new FormData();
form.append('user', 'my-brand');
form.append('platform[]', 'bluesky');
form.append('video', 'https://example.com/clip.mp4');
form.append('title', 'Your post');

const res = await fetch('https://api.reelspan.com/v1/posts/video', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.REELSPAN_KEY}` },
  body: form,
});
console.log(await res.json());
Python
import os, requests

res = requests.post(
    "https://api.reelspan.com/v1/posts/video",
    headers={"Authorization": f"Bearer {os.environ['REELSPAN_KEY']}"},
    files=[
        ("user", (None, "my-brand")),
        ("platform[]", (None, "bluesky")),
        ("video", (None, "https://example.com/clip.mp4")),
        ("title", (None, "Your post")),
    ],
)
print(res.json())

bluesky_title sets the text for Bluesky only, when it should differ from the other networks’.

04

Bluesky options

bluesky_title
The post text; longer text becomes a thread.
bluesky_threadgate
Who may reply: nobody, or mention, following, followers.
bluesky_labels
Content warnings.
bluesky_compress
Compress a video over 100 MB so Bluesky takes it.
  • Longer text is split into a thread for you.
  • Videos over 100 MB can be compressed to fit.

Every field, with its limits: the docs.

05

Schedule it and check the result

  • Add scheduled_date (ISO 8601) and timezone to post later, or add_to_queue=true to take the next slot of your posting schedule.
  • The response has Bluesky’s status and the post’s link. For big files send async_upload=true and check GET /v1/posts/status?request_id=…, or get a signed webhook when it’s live.
  • If Bluesky refuses a post, the error says why in plain words, and you can retry just that network.

06

Without code

07

Ideas

  • Cross-post every X thread to Bluesky.
  • Post release notes from CI.

More on Bluesky: what you can post there. Other networks: all upload guides.

Questions?Talk to a person.Contact us