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
| Parameter | Type | Required | Description |
|---|---|---|---|
accountId | string/number | Yes | The ID of the connected Bluesky account. |
async | boolean | No | Default true. If false, waits for completion. |
Bluesky Specific Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
description | string | No* | The text content of the post. (*Required for text-only posts, optional when posting with media). |
file / photo | file | No | Image or Video file. Use photo (array) for carousels (max 4). |
bluesky_langs | string | No | Comma-separated language codes (e.g. en,fr) or array. |
bluesky_labels | string | No | Content warnings. Values: sexual, nudity, porn, graphic-media, !no-unauthenticated. |
scheduledDate | string | No | Schedule 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.