Bluesky posting errors and fixes
A Bluesky failure is usually unauthorized (the session is no longer accepted), platform_rejected (Bluesky said 400 or 403) or platform_unavailable (rate limited). yeetpost renews the session from the stored app password on its own; if Bluesky refuses the app password itself, reconnect with a new one.
#Errors you can get posting
yeetpost answers with its own code and message. It does not hand back Bluesky's own text, so the second column is what yeetpost reads off Bluesky's answer. Every body is JSON with an error code and a message; platform_rejected, platform_unavailable and internal_server_error also carry a req_id. Inside a post item the same vocabulary shows up as { "code": ..., "message": ... }.
| yeetpost code | HTTP | What yeetpost reads | What it means | Fix |
|---|---|---|---|---|
unauthorized | 401 | A 401, or an error named ExpiredToken, InvalidToken or AuthMissing, on the post or on an image upload. Bluesky sends the expired-session case as a 400 with that name, so the name decides, not the status. | Bluesky no longer accepts the session. yeetpost logs in again with the stored app password before sending; if Bluesky refuses the app password itself (it was deleted or changed on Bluesky), the connection is marked reconnect_required. Any post that comes back unauthorized also marks its connection reconnect_required, on every platform. | Create a new app password in Bluesky under Settings, then App Passwords, and reconnect the account. Reconnect the account at app.yeetpost.com/app/connections. For a customer's connection, send them through POST /profiles/{profileId}/connect with the connectionId. |
platform_rejected | 422 | A 400 or 403 on the post. The message is "Bluesky rejected the post." On an image upload that is not a 401 the message is "Bluesky rejected the image." | Bluesky refused the content. yeetpost does not read the reason. | Change the text or the image and post again. Quote the req_id if the refusal looks wrong. |
platform_unavailable | 503 | A 429 on the post. The message is "Bluesky is rate limiting this account. Try again later." platform_status is 429. | Bluesky rate limited the account. Nothing was posted. | Nothing was posted. Wait a bit, then send it again with a new Idempotency-Key. |
internal_server_error | 500 | A 5xx on the post. The message is "Bluesky had trouble and may have published the post anyway. Check the account before trying again." Any other answer, or one yeetpost could not read, gets "An unexpected error occurred". | A 5xx on createRecord can come after the record was written, so unlike the other platforms this is not treated as safe to resend. | Check the account on the platform before sending again. GET /posts/{postId} shows how yeetpost recorded it. Quote the req_id if you report it. |
text_too_long | 400 | Nothing: yeetpost checks before it calls Bluesky. | "Bluesky allows 300 characters; the text is {count}." with a field (text, thread[n]) naming the part. A thread with one segment over the limit is refused whole, so it is never left half published. If AI polish rewrote the text, the polished text is checked at send time and the wording is "Text is too long (max 300 characters for Bluesky)." | Shorten the part the field names. |
media_unsupported | 400 | Nothing: yeetpost checks before it calls Bluesky. "Bluesky takes at most 4 images on a post." or "Image {mediaId} is too large for Bluesky (max 1 MB)." | More than 4 images, or one image over 1 MB. Only the Bluesky item fails. | Send up to 4 images of 1 MB or less, or drop Bluesky from connectionSlugs for this post. |
reconnect_required | 403 | Nothing: yeetpost has no stored login for this connection. | The message is "Bluesky's login is missing. Reconnect it to send again." | Reconnect the account at app.yeetpost.com/app/connections. For a customer's connection, send them through POST /profiles/{profileId}/connect with the connectionId. |
platform_unavailable | 503 | Nothing: yeetpost could not get ready to send. | The message is "Bluesky was busy or down, so nothing went out. Send it again." Nothing was posted. | Nothing was posted. Wait a bit, then send it again with a new Idempotency-Key. |
internal_server_error | 500 | Nothing readable: something threw after the send to the platform had started. The message is "An unexpected error occurred while sending." with a req_id. | The post may already be live on Bluesky. | Check the platform before sending again: a blind resend can post twice. GET /posts/{postId} shows how yeetpost recorded it. Quote the req_id if you report it. |
Codes that are not about one platform (invalid_request, invalid_connection, idempotency_key_conflict, the rate limit and the rest) are on Errors.
#Errors when connecting
Connecting happens on a screen, not through the posting endpoint. These are the answers it gives. A wrong entry leaves the connect link open for another try.
| Message | What it means | Fix |
|---|---|---|
| bluesky login failed (400) | Bluesky refused the handle and app password. Nothing is stored and the connect link stays open for another try. | Use an app password made under Settings, then App Passwords, never your account password. For your own server, check the service URL is https. |
| invalid bluesky service (400) | The service URL is not https, or resolves inside a private network. | Leave it empty for bsky.social, or give the https host of your PDS. |
#Reconnecting
reconnect_required and, inside a post item, unauthorized both mean the stored login is dead. Nothing in the request will fix it. Reconnect the account at https://app.yeetpost.com/app/connections. For a customer's connection under a profile, send them through POST /profiles/{profileId}/connect and pass the connectionId. GET /connections shows each connection's status: active, expiring or reconnect_required. The connection.reconnect_required webhook fires the moment yeetpost learns the login is dead.
#More
Last verified 2026-10-29