# X (Twitter) posting errors: what each code means and what to do

Canonical: https://status200uploads.com/platforms/x/errors

Checked on 26 October 2026.

An X post through Status 200 Uploads can be refused by us, by the X add-on's own limits, or by X itself. Our refusals carry a fixed code, such as plan_required or x_link_limit_reached, with a sentence saying what to do. X's own refusals arrive as x_rejected, with X's HTTP status in x_status and X's reason in the message. This page lists them all, with whether sending the same request again can work.

## How to read an error

Posting to X needs the X add-on, which works on any plan, Free included. It has its own meter: 200 X posts per billing month, up to 20 of them with a link. X posts do not use your plan's posts, and the add-on's limits do not touch your other networks.

Every refusal is JSON with error.code and error.message. On X, one code covers everything X itself refused: x_rejected. Read x_status for X's HTTP status and the message for X's reason; a 401, or a 403 about the kind of sign-in, means X no longer accepts the saved sign-in, and the message then says to reconnect.

A post that reached the X step gets a row in History, also when it is refused, so you can read the reason later. A post refused before the X step, such as one refused with plan_required, leaves no failed post behind.

## The X add-on

The add-on gives 200 X posts per billing month, at most 20 of them with a link. Its month runs from your billing date, not the calendar, and resets_at in the answer says when it renews.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 403 | `plan_required` | The account has no X add-on, so posts to X are not included. error.required is x_addon, and error.upgrade_url is where to add it. Nothing was sent. | Add the X add-on, then send the post again. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 429 | `x_limit_reached` | The add-on's 200 X posts for this billing month are used. | Wait until resets_at. Your other networks are not affected, and a second add-on would not add posts. | after_reset: Not before the time in resets_at. | API answer, History, AI app |
| 429 | `x_link_limit_reached` | The post has a link, and the add-on's 20 posts with a link for this billing month are used. error.detected_links lists the links found. | Remove the link and send the post again now, or wait until resets_at. | after_reset: Not before the time in resets_at. | API answer, History, AI app |

## When X answers

These codes come back from the X step, so the post shows in History as failed with the same message.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 403 | `x_rejected` | X refused the post. X's own status (400, 401, 403, 404, 409 or 422) is in x_status, its title in x_title, and its reason in the message. | When the message says to reconnect, reconnect X under Connections. Otherwise change what X names and publish it again. | never: No. The same request cannot work: change it first. | API answer, History |
| 503 | `x_unavailable` | X is not taking posts from Status 200 Uploads right now, for a reason that concerns our X app, such as X's rate limit, not your post. Nothing was posted. | Wait, then send the same request again. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, History |
| 500 | `platform_error` | The X step failed without a code of its own: an X server error, an answer we could not read, or a sign-in that expired and could not be renewed. The message says which. | Read the message. If it says to reconnect, reconnect X under Connections; otherwise send it once more with the same Idempotency-Key. | resend_once_with_key: Once, with the same Idempotency-Key. | API answer, History |

## Images and videos

An image or video is uploaded to X before the post is made. When that upload fails, the post is not made.

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 413 | `MEDIA_TOO_LARGE` | The file is larger than X takes through us. The answer names the limits in max_image_bytes and max_video_bytes. | Send a smaller file, or check the limits on the file limits page. | never: No. The same request cannot work: change it first. | API answer, History, AI app |
| 400 | `bad_request` | Uploading the file to X failed for another reason, such as a file that could not be downloaded from its address. The message says why. | Check that the file opens at its address, or upload it to your media library and post it by its mediaID. | never: No. The same request cannot work: change it first. | API answer, History |

## Codes any post can get

| HTTP | Code | Meaning | What to do | Send it again? | Where it shows |
| --- | --- | --- | --- | --- | --- |
| 401 | `unauthorized` | No API key, or a key that is not active. | Send Authorization: Bearer with an active rl_ key from the API page. | never: No. The same request cannot work: change it first. | API answer |
| 403 | `account_not_found` | The accountId is not one of your profiles. The answer lists yours. | Use a profile id or "@name" from the list. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 404 | `media_not_found` | The mediaID is not in your library: never imported, deleted, or removed after 7 days. | Import or upload the file again and use the new id. | never: No. The same request cannot work: change it first. | API answer, AI app |
| 409 | `media_processing` | The file is still importing. | Wait the Retry-After seconds and send the same request. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, AI app |
| 429 | `rate_limited` | Less than 20 seconds since your last post to the same network. | Wait the Retry-After seconds and send the same request. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer, AI app |
| 429 | `daily_limit_reached` | Your plan's posts for today are used up. | Post after resets_at, or move to a larger plan. | after_reset: Not before the time in resets_at. | API answer, AI app |
| 429 | `monthly_limit_reached` | The Free plan's posts for this month are used up. | Post after resets_at, or move to a paid plan. | after_reset: Not before the time in resets_at. | API answer, AI app |
| 422 | `idempotency_key_reused` | The Idempotency-Key was already used with another body. | Use a new key for a new post. | never: No. The same request cannot work: change it first. | API answer |
| 500 | `server_error` | Our side failed. | Send it once more with the same Idempotency-Key; without one, check History first. | resend_once_with_key: Once, with the same Idempotency-Key. | API answer, AI app |
| 502 | `upstream_unavailable` | The request never left. Nothing was posted. | Send the same request again after a short wait. | wait_and_resend: Yes: the same request after a wait (Retry-After, when the answer gives one). | API answer |

## X's own errors

When X refuses a post with a 4xx, the answer is x_rejected with X's status in x_status and X's reason in the message. X's 429 is the exception: it is about our X app's limits, so it reaches you as 503 x_unavailable. An X server error reaches you as platform_error. The statuses below are X's; what they mean comes from X's developer documentation, read on 15 October 2026.

### 400

As the post is sent. X's words: "Invalid JSON, malformed query, missing required parameters". The first of X's listed reasons is passed on in the message. [X14] Read X's reason in the message, change the post and publish it again.

### 401

As the post is sent. X's words: "Invalid or missing authentication credentials". The sign-in we hold for the account is no longer accepted. [X14] Reconnect X under Connections, then publish the post again.

### 403

As the post is sent. X's words: "Valid auth but no permission for this resource or action". X's post reference also uses it for a video that is too long for the account: "This user is not allowed to post a video longer than 20 minutes." [X14, X1] Read X's reason in the message. For the video length, shorten the video.

### 429

As the post is sent. X's words: "Rate limit or usage cap exceeded". X allows 100 posts per user in 15 minutes for the posting endpoint, and also limits each app per day. [X14, X13] Through Status 200 Uploads this arrives as 503 x_unavailable: wait, then send the same request again.

### 500

As the post is sent. X's words: "Wait and retry; check status page". [X14] Send it again once, with the same Idempotency-Key, after a short wait.

### 503

As the post is sent. X's words: "X is overloaded; wait and retry". [X14] Wait, then send it again once, with the same Idempotency-Key.

## Questions

### What does plan_required mean on an X post?

Posting to X needs the X add-on, and the account has none. The add-on works on any plan, Free included, and gives 200 X posts per billing month, up to 20 with a link. Add it on the Pricing page, then send the post again; nothing was sent.

### What is the difference between x_limit_reached and x_link_limit_reached?

x_limit_reached means all 200 X posts of the add-on's billing month are used: wait until resets_at. x_link_limit_reached means the post has a link and the 20 link posts are used: remove the link and send it again now, or wait until resets_at.

### Would a second X add-on give me more X posts?

No. A second add-on does not add posts, so the answer to x_limit_reached never offers one. The add-on renews on its billing date, which resets_at gives, and your other networks keep posting meanwhile.

### What does x_rejected mean?

X itself refused the post. The answer keeps X's HTTP status in x_status and X's reason in the message, and the post shows in History as failed. When the message says to reconnect, reconnect X under Connections; otherwise change what X names.

### Why does an X post fail with x_unavailable?

X answered that it is not taking posts from our X app right now, for example because of its rate limit. That concerns our app rather than your post, so we answer 503 x_unavailable instead of passing X's answer on. Nothing was posted. Wait, then send the same request again.

### What does a 403 from X mean?

X says the sign-in is valid but has no permission for the action. X's post reference also uses it for a video longer than the account may post: "This user is not allowed to post a video longer than 20 minutes."

## More on X

- [X](https://status200uploads.com/platforms/x)
- [X API guide](https://status200uploads.com/platforms/x/api-guide)

## Related

- [LinkedIn](https://status200uploads.com/platforms/linkedin)
- [Threads](https://status200uploads.com/platforms/threads)
- [REST API](https://status200uploads.com/integrations/rest-api)
- [Python](https://status200uploads.com/integrations/python)
- [n8n](https://status200uploads.com/integrations/n8n)
- [AI agents (MCP)](https://status200uploads.com/integrations/mcp)
- [The X add-on on the pricing page](https://status200uploads.com/pricing)
- [Every error code in the API reference](https://status200uploads.com/docs/api)
- [File limits of every network](https://status200uploads.com/docs/file-limits)

## Sources

Sources read on 15 October 2026.

- X1. [X API: Create Post](https://docs.x.com/x-api/posts/create-post)
- X13. [X API: Rate limits](https://docs.x.com/x-api/fundamentals/rate-limits)
- X14. [X API: Response codes and errors](https://docs.x.com/x-api/fundamentals/response-codes-and-errors)
