Publora Bluesky
by @sergebulaev
Post or schedule content to Bluesky using the Publora API. Use this skill when the user wants to publish or schedule Bluesky posts via Publora.
clawhub install publora-blueskyπ About This Skill
name: publora-bluesky description: > Post or schedule content to Bluesky using the Publora API. Use this skill when the user wants to publish or schedule Bluesky posts via Publora.
Publora β Bluesky
Bluesky (AT Protocol) platform skill for the Publora API. For auth, core scheduling, media upload, and workspace/webhook docs, see the publora core skill.
Base URL: https://api.publora.com/api/v1
Header: x-publora-key: sk_YOUR_KEY
Platform ID format: bluesky-{did}
Where {did} is your Bluesky Decentralized Identifier (DID), assigned on connection.
Requirements
Platform Limits (API)
| Property | Limit | Notes | |----------|-------|-------| | Text | 300 characters | β οΈ Links count toward limit in Publora's validation | | Images | Up to 4 Γ ~976 KB | All formats accepted; Publora converts everything to JPEG before upload | | Image dimensions | Max 2000Γ2000 px | β | | Video | 3 min / 100 MB | MP4; email verification required | | Video (short) | <60s β 50 MB | Size tiers apply | | Text only | β Yes | β | | Daily video limit | 25 videos / 10 GB | β | | Rate limit | 3,000 req/5 min | β |
Common errors:
429 Too Many Requests β rate limit exceeded, wait and retryJOB_STATE_FAILED β check format (MP4) and size tierPost a Skeet (text post)
await fetch('https://api.publora.com/api/v1/create-post', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' },
body: JSON.stringify({
content: 'Building in public on Bluesky today! Links, hashtags, and mentions all auto-detected. #buildinpublic',
platforms: ['bluesky-did:plc:abc123']
})
});
Publora automatically detects hashtags, URLs, and @mentions and creates proper AT Protocol facets.
Schedule a Post
body: JSON.stringify({
content: 'Your Bluesky post here',
platforms: ['bluesky-did:plc:abc123'],
scheduledTime: '2026-03-20T11:00:00.000Z'
})
Post with Image
> β οΈ Bluesky has a strict 1 MB limit per image. Compress to 80β85% JPEG quality.
import requestsHEADERS = { 'Content-Type': 'application/json', 'x-publora-key': 'sk_YOUR_KEY' }
Step 1: Create post
post = requests.post('https://api.publora.com/api/v1/create-post', headers=HEADERS, json={
'content': 'Check out this photo! πΈ',
'platforms': ['bluesky-did:plc:abc123']
}).json()Step 2: Get upload URL (make sure image is <1 MB and JPEG/PNG/WebP)
upload = requests.post('https://api.publora.com/api/v1/get-upload-url', headers=HEADERS, json={
'postGroupId': post['postGroupId'],
'fileName': 'photo.jpg',
'contentType': 'image/jpeg',
'type': 'image'
}).json()Step 3: Upload
with open('photo_compressed.jpg', 'rb') as f:
requests.put(upload['uploadUrl'], headers={'Content-Type': 'image/jpeg'}, data=f)
Platform Quirks
content.length β so links DO consume your 300-char budget. Plan accordingly.altTexts silently ignored in API: The altTexts array in create-post is NOT currently processed β it will be silently ignored. Alt text is only available through the Publora dashboard.test-connection always fails for Bluesky: Known bug β the validator checks for accessToken but Bluesky uses password. Connection still works for posting; ignore this status.bluesky-did:plc:abc123xyz