Skip to main content
All platforms

AT Protocol (Bluesky PDS)

Bluesky API Errors

AT Protocol errors you'll see when posting through the Bluesky PDS.

Bluesky's AT Protocol uses session-based auth (not OAuth) and grapheme-based length limits, so the error shapes look different from other platforms.

Authentication

3 errors in this category

invalid tokenHTTP 401Authentication

Bluesky session token is no longer valid.

Why it happens
Bluesky uses short-lived session tokens. Without a recent refresh, calls fail.
How to fix
Reconnect by creating a new session with the user's handle + app password.
How PostPeer handles it
PostPeer refreshes Bluesky sessions on each publish, so this should never surface in normal operation.
expiredHTTP 401Authentication

Session aged past its TTL.

Why it happens
No refresh call hit the session in time.
How to fix
Recreate the session.
unauthorizedHTTP 401Authentication

Bluesky rejected the auth header.

Why it happens
Token revoked, password rotated, or app password deleted.
How to fix
Have the user generate a new app password at bsky.app/settings/app-passwords and reconnect.

Rate limit

2 errors in this category

rate limitHTTP 429Rate limit

Bluesky throttled the request.

Why it happens
Burst of writes against the PDS.
How to fix
Wait a few minutes; spread out batch posting.
too many requestsHTTP 429Rate limit

Per-user or per-IP rate cap hit.

Why it happens
Sustained high request rate.
How to fix
Back off exponentially. PostPeer respects Bluesky's `RateLimit-Reset` header.

Moderation

2 errors in this category

blockedModeration

Bluesky moderation blocked the post.

Why it happens
AT Protocol moderation labellers flagged content as policy-violating.
How to fix
Review Bluesky's community guidelines and rewrite the post.
moderationModeration

Generic moderation rejection.

Why it happens
Content matched a moderation filter (spam, harassment, NSFW without label).
How to fix
If the post is legitimate NSFW, apply the appropriate self-label; otherwise rewrite.

Media

2 errors in this category

blob too largeMedia

Image exceeds Bluesky's 1MB blob cap.

Why it happens
AT Protocol enforces a strict 1MB per blob for images.
How to fix
Compress aggressively — Bluesky is unusually strict here. PostPeer compresses images down to 1MB automatically.
blob invalidMedia

Media file is corrupted or not a supported format.

Why it happens
Bluesky accepts JPG, PNG, and WebP for images.
How to fix
Re-export from the source.

Content

1 error in this category

text too longContent

Post text exceeds 300 graphemes.

Why it happens
Bluesky's 300-character limit is grapheme-based, not byte-based.
How to fix
Trim or chain posts in a thread. PostPeer's SDK exposes a grapheme counter so you can pre-validate.

Quick reference

All 10 Bluesky errors in one table — Ctrl/Cmd-F to find yours.

CodeWhat it means
invalid tokenBluesky session token is no longer valid.
expiredSession aged past its TTL.
unauthorizedBluesky rejected the auth header.
rate limitBluesky throttled the request.
too many requestsPer-user or per-IP rate cap hit.
blockedBluesky moderation blocked the post.
moderationGeneric moderation rejection.
blob too largeImage exceeds Bluesky's 1MB blob cap.
blob invalidMedia file is corrupted or not a supported format.
text too longPost text exceeds 300 graphemes.

Other platforms

Ready to Add Social Media to Your Product?

One API. Every platform. Start building with free credits.

Start Posting for FreeNo credit card required.
POST https://api.postpeer.dev/v1/posts
{ "platforms": ["twitter", "linkedin", "instagram], "content": "Hello world!" }
Published
5 platforms
TwitterLinkedInFacebook+2
All posts delivered
Scheduled
queue
12
Queued
847
Sent
Next: in 15 min
Platforms
connected
XIGFBLITT
One API, every platform