Skip to Content

Bluesky Upload API

This section details how to create posts (Text, Image, Video) on Bluesky using the API.

Base URL

https://api.multi-upload-tool.com/api/v1

Authentication

All requests require an API Token in the header: x-api-key: YOUR_API_TOKEN


Requirements

Bluesky Text Requirements

  • Character Limit: 300 characters (3000 UTF-8 bytes).
  • Rich Text: Mentions (@handle), links, and hashtags are automatically parsed.
  • Text is optional when posting with an image or video. It is only required for text-only posts.

Bluesky Image Requirements

  • Max Images: 4 per post.
  • Formats: JPG, PNG, WEBP.
  • Size: Max 1MB per image. Images exceeding this limit are automatically compressed and/or resized before upload.
  • Aspect Ratio: The API automatically handles aspect ratios to prevent cropping issues.

Automatic compression: Bluesky enforces a strict 1MB limit per image blob. If your image exceeds this, the API will automatically compress it (JPEG quality reduction, then resize if needed) to fit within the limit. No action is required on your side.

Bluesky Video Requirements

  • Formats: MP4, MOV, WebM, MPEG.
  • Duration: Max 3 minutes.
  • Size: Max 50MB (videos under 1 min), max 100MB (videos 1–3 min).
  • Daily limit: 25 videos or 10GB per day.

Create Post

Create a new post on Bluesky.

Endpoint

POST /upload

Content-Type

multipart/form-data

Parameters

Common Parameters

ParameterTypeRequiredDescription
accountIdstring/numberYesThe ID of the connected Bluesky account.
asyncbooleanNoDefault true. If false, waits for completion.

Bluesky Specific Parameters

ParameterTypeRequiredDescription
descriptionstringNo*The text content of the post. (*Required for text-only posts, optional when posting with media).
file / photofileNoImage or Video file. Use photo (array) for carousels (max 4).
bluesky_langsstringNoComma-separated language codes (e.g. en,fr) or array.
bluesky_labelsstringNoContent warnings. Values: sexual, nudity, porn, graphic-media, !no-unauthenticated.
scheduledDatestringNoSchedule the post for a future time (ISO 8601, e.g. 2025-12-25T10:00:00Z).

Examples

1. Text Post

curl -X POST https://api.multi-upload-tool.com/api/v1/upload \ -H "x-api-key: YOUR_KEY" \ -F "accountId=123" \ -F "description=Hello Bluesky! #api" \ -F "bluesky_langs=en"

2. Image Post with Content Warning

curl -X POST https://api.multi-upload-tool.com/api/v1/upload \ -H "x-api-key: YOUR_KEY" \ -F "accountId=123" \ -F "[email protected]" \ -F "description=Sensitive content here" \ -F "bluesky_labels=nudity"

3. Video Post

curl -X POST https://api.multi-upload-tool.com/api/v1/upload \ -H "x-api-key: YOUR_KEY" \ -F "accountId=123" \ -F "[email protected]" \ -F "description=My video post"

4. Scheduled Post

curl -X POST https://api.multi-upload-tool.com/api/v1/upload \ -H "x-api-key: YOUR_KEY" \ -F "accountId=123" \ -F "description=Scheduled post for tomorrow 🗓️" \ -F "scheduledDate=2025-12-25T10:00:00Z"
{ "success": true, "message": "Upload scheduled successfully", "data": { "uploadId": 789, "status": "scheduled", "scheduledFor": "2025-12-25T10:00:00.000Z" } }

Note: Bluesky does not have native scheduled posting in the AT Protocol. Scheduling is handled server-side: the post is queued and published automatically at the specified time.