X posting errors and fixes
Most X failures are one of five codes: platform_rejected (X said 403), unauthorized (X said 401, reconnect), platform_unavailable (X rate limited or was down, nothing posted), reconnect_required (a new image permission is needed) and the 402 pair for the per-post fee.
#Errors you can get posting
yeetpost answers with its own code and message. It does not hand back X's own text, so the second column is what yeetpost reads off X'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 |
|---|---|---|---|---|
platform_rejected | 422 | A 403 on the tweet. yeetpost does not read X's reason, so every 403 gets the same message: "X: You are not permitted to perform this action." When the text is over 280 weighted characters it adds " Your message may be too long (character limit is 280 for users without X Premium)." | X refused the tweet. The 403 covers whatever reason X had, and yeetpost cannot tell them apart. | If the text is over 280 characters and the account has no X Premium, shorten it. Otherwise change the text and post again. Quote the req_id if the refusal looks wrong. |
unauthorized | 401 | A 401 on the tweet or on an image upload. | X no longer accepts the stored token. X tokens last 2 hours and renew with a single-use refresh token, so a refused renewal or a revoked grant ends here. yeetpost then marks the connection reconnect_required. Inside a post item the same code means the same thing. | Reconnect the account at app.yeetpost.com/app/connections. For a customer's connection, send them through POST /profiles/{profileId}/connect with the connectionId. |
reconnect_required | 403 | A 403 on an image upload whose body mentions "scope". The message is "Reconnect your X account to post images (a new permission is needed)." | The connection was made before images shipped, so its token can tweet but cannot upload. Text posts were never affected. | Reconnect the account once. After that images work. |
platform_rejected | 422 | A 400 or 403 on an image upload (other than the scope case). The message is "X rejected the image." | X refused the image. The whole post is refused: yeetpost does not send half a post. | Try a different image. Quote the req_id if it looks wrong. |
platform_unavailable | 503 | A 429 on the tweet or on an image upload. The message is "X is rate limiting this account, so nothing went out. Send it again later." platform_status is 429. | X rate limited the account. Nothing was posted. | Nothing was posted. Wait a bit, then send it again with a new Idempotency-Key. |
platform_unavailable | 503 | A 5xx, or a gateway answering html instead of json. The message is "X was busy or down, so nothing went out. Send it again in a bit." platform_status carries the status. | X, or something in front of it, was down. Nothing was posted. | Nothing was posted. Wait a bit, then send it again with a new Idempotency-Key. |
media_unsupported | 400 | Nothing: yeetpost checks before it calls X. "X takes at most 4 images on a post." or "Image {mediaId} is too large for X (max 5 MB)." | More than 4 images, or one image over 5 MB. Only the X item fails; other connections on the same request still go out. | Send up to 4 images of 5 MB or less, or drop X from connectionSlugs for this post. |
payment_method_required | 402 | Nothing: this is yeetpost's own check before X is called. | X bills a flat fee per post and the account has no payment method. | Add a payment method in Settings. See plans and X fees at /docs/pricing. |
spend_cap_reached | 402 | Nothing: this is yeetpost's own check before X is called. | The monthly X spend cap you set yourself is reached. | Raise the cap in Settings, or wait for the month to roll over. Posts to other platforms keep going out. |
internal_server_error | 500 | Any other X status, a request that failed or timed out, or an answer yeetpost could not read. The message is "An unexpected error occurred" with a req_id. | Whether the tweet went out is unknown. It may have. | 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. |
reconnect_required | 403 | Nothing: yeetpost has no stored login for this connection. | The message is "X'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 "X 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 X. | 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.
#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