Bluesky
Publishing to Bluesky with Cue
Connect your Bluesky account to schedule and publish posts through Cue.
Overview
Bluesky is a decentralized social network built on the AT Protocol. Cue integrates with the Bluesky API to publish content on your behalf.
Sign up for a Bluesky account at bsky.app.
Authentication
Bluesky uses app passwords for API authentication. App passwords let you grant limited access to third-party apps without sharing your main password.
Creating an App Password
- Go to bsky.app/settings/app-passwords
- Sign in if needed
- Click Add App Password
- Give it a name (e.g., "Cue")
- Copy the generated password (you'll need it in the next step)
Important: App passwords are shown only once. Store it securely or regenerate if lost.
Connecting Your Account
- Create an app password on Bluesky (see above)
- Go to Profiles in your Cue dashboard
- Click Connect Account on a profile
- Select Bluesky
- Enter your Bluesky handle (e.g.,
alice.bsky.social) - Enter the app password you created
- Click Connect
Cue validates your credentials and stores them securely for publishing posts.
Disconnecting
To disconnect your Bluesky account:
- Go to your profile and click Disconnect next to the Bluesky connection
- Optionally, revoke the app password in your Bluesky settings
Content Limits
Bluesky enforces the following limits on posts:
| Limit | Value |
|---|---|
| Characters | 300 (graphemes, not bytes) |
| Images | Up to 4 per post |
| Video | Not supported via API |
| File size | 1 MB per image |
Note: Bluesky counts graphemes (user-perceived characters), not bytes. Emoji, accented characters, and other Unicode characters count as 1 character.
Cue automatically validates your content length before publishing to prevent errors.
Publishing a Post
curl -X POST https://api.oncue.so/v1/posts \
-H "Authorization: Bearer cue_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"profileId": "prf_abc123",
"platforms": {
"sac_bluesky1": {
"items": [{ "content": "Hello from Cue!" }]
}
},
"publishNow": true
}'const response = await fetch("https://api.oncue.so/v1/posts", {
method: "POST",
headers: {
Authorization: "Bearer cue_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
profileId: "prf_abc123",
platforms: {
sac_bluesky1: {
items: [{ content: "Hello from Cue!" }]
}
},
publishNow: true,
}),
});Schedule for Later
curl -X POST https://api.oncue.so/v1/posts \
-H "Authorization: Bearer cue_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"profileId": "prf_abc123",
"platforms": {
"sac_bluesky1": {
"items": [{ "content": "Scheduled post content" }]
}
},
"scheduledAt": "2024-01-20T09:00:00-05:00"
}'const response = await fetch("https://api.oncue.so/v1/posts", {
method: "POST",
headers: {
Authorization: "Bearer cue_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
profileId: "prf_abc123",
platforms: {
sac_bluesky1: {
items: [{ content: "Scheduled post content" }]
}
},
scheduledAt: "2024-01-20T09:00:00-05:00",
}),
});Creating Threads
Create multi-post threads by including multiple items in the items array. Each item becomes a connected post in the thread.
Threads require a Growth plan or above.
curl -X POST https://api.oncue.so/v1/posts \
-H "Authorization: Bearer cue_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"profileId": "prf_abc123",
"platforms": {
"sac_bluesky1": {
"items": [
{ "content": "1/ A thread about decentralized social media..." },
{ "content": "2/ The AT Protocol enables true data portability..." },
{ "content": "3/ This means you own your social graph..." },
{ "content": "4/ The future of social is open and federated!" }
]
}
},
"publishNow": true
}'const response = await fetch("https://api.oncue.so/v1/posts", {
method: "POST",
headers: {
Authorization: "Bearer cue_sk_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
profileId: "prf_abc123",
platforms: {
sac_bluesky1: {
items: [
{ content: "1/ A thread about decentralized social media..." },
{ content: "2/ The AT Protocol enables true data portability..." },
{ content: "3/ This means you own your social graph..." },
{ content: "4/ The future of social is open and federated!" }
]
}
},
publishNow: true,
}),
});Each post in a thread must respect the 300 character limit.
Response
{
"data": {
"id": "pst_xyz789",
"profileId": "prf_abc123",
"content": "Hello from Cue!",
"status": "queued",
"scheduledAt": null,
"createdAt": "2024-01-15T10:00:00Z",
"updatedAt": "2024-01-15T10:00:00Z"
},
"message": "Post queued for publishing to 1 platform(s)"
}Error Handling
Bluesky API errors are translated into user-friendly messages:
| Error Code | Meaning | Solution |
|---|---|---|
401 | Invalid credentials | Check your handle and app password |
400 | Content exceeds 300 characters | Shorten your content |
429 | Rate limit exceeded | Wait and retry later |
| Network error | Cannot reach Bluesky API | Check your internet connection |
Common Issues
"Authentication failed" error
- Your handle or app password is incorrect
- Your app password may have been revoked
- Go to your profile and reconnect with valid credentials
"Content too long" error
- Your post exceeds 300 characters
- Remember: Emoji and Unicode count as 1 character
- Shorten your message or split into multiple posts
"Rate limited" error
- You're posting too frequently
- Wait a few minutes and try again
- Bluesky has generous rate limits for normal usage
"Session expired" error
- Your app password was revoked in Bluesky settings
- Create a new app password and reconnect your account
Best Practices
Content Guidelines
- Keep posts under 300 characters
- Use line breaks for readability
- Mention users with
@handle.bsky.social - Use hashtags without the
#symbol (Bluesky doesn't require it)
Security
- Use app passwords, never your main password - This is critical
- Create separate app passwords for each app
- Revoke app passwords for apps you no longer use
- Monitor your app passwords at bsky.app/settings/app-passwords
Performance
- App passwords don't expire - they're valid until revoked
- No token refresh needed (unlike Twitter)
- Sessions remain active indefinitely
Media
- Optimize images to stay under 1 MB
- Bluesky compresses images automatically
- Video support may come in future API updates
- GIFs are uploaded as images (static frames)
Troubleshooting
Connection Issues
"Invalid handle" error
- Include the full handle with domain (e.g.,
alice.bsky.social) - Don't include the
@symbol - Check spelling - handles are case-insensitive
"App password rejected" error
- App password was revoked in Bluesky settings
- Create a new app password and try again
- Make sure you're copying the full password without spaces
Publishing Issues
Posts not appearing on Bluesky
- Check if your post status is "published"
- Wait a few seconds - posts appear almost instantly
- Check your Bluesky profile to verify
- If failed, check the error message in Cue
Character count mismatch
- Bluesky counts graphemes, not bytes
- Emoji count as 1 character (even complex ones)
- Check the counter in Cue's post editor
Decentralization Features
Bluesky is built on the AT Protocol, a decentralized social networking protocol:
- Custom domains as handles - Use your own domain as your handle
- Portable identity - Move your account between providers
- Federation - Connect with other AT Protocol servers
These features don't affect publishing through Cue, but they make Bluesky unique among social platforms.