Cue
Platforms

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

  1. Go to bsky.app/settings/app-passwords
  2. Sign in if needed
  3. Click Add App Password
  4. Give it a name (e.g., "Cue")
  5. 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

  1. Create an app password on Bluesky (see above)
  2. Go to Profiles in your Cue dashboard
  3. Click Connect Account on a profile
  4. Select Bluesky
  5. Enter your Bluesky handle (e.g., alice.bsky.social)
  6. Enter the app password you created
  7. Click Connect

Cue validates your credentials and stores them securely for publishing posts.

Disconnecting

To disconnect your Bluesky account:

  1. Go to your profile and click Disconnect next to the Bluesky connection
  2. Optionally, revoke the app password in your Bluesky settings

Content Limits

Bluesky enforces the following limits on posts:

LimitValue
Characters300 (graphemes, not bytes)
ImagesUp to 4 per post
VideoNot supported via API
File size1 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 CodeMeaningSolution
401Invalid credentialsCheck your handle and app password
400Content exceeds 300 charactersShorten your content
429Rate limit exceededWait and retry later
Network errorCannot reach Bluesky APICheck 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.

Further Reading

On this page