# Post and schedule to X (Twitter)

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

Checked on 26 October 2026.

Status 200 Uploads posts to X for you: text on its own, a post with one image or up to 4 images, or one with a video, now or at a scheduled time. X needs the X add-on, which works on any plan and gives 200 X posts per billing month. Post from the dashboard, the REST API, Python, n8n or an AI app such as Claude; you sign in on X itself, and we post through our own X app.

## Quick facts

- **What you can post:** Text only, text with one image, text with up to 4 images, or text with one video.
- **The X add-on:** X needs the X add-on: $9 a month on any plan, Free included, for 200 X posts per billing month, at most 20 of them with a link. X posts do not count toward the plan's own posts. [Pricing](https://status200uploads.com/pricing)
- **Largest video:** 5 GB per file. [File limits of every network](https://status200uploads.com/docs/file-limits)
- **Largest image:** 5 MB per image.
- **Text:** Up to 280 characters, counted the way X counts them: every link counts as 23, an emoji as 2.
- **Scheduling:** Schedule a post up to 365 days ahead, or send it now.
- **How it connects:** You sign in on X itself (OAuth), so we never see your X password.
- **Your own X developer account:** Not needed: posts go out through our X app, so you never pay for or apply for X API access yourself.

## What you can post

### Text posts

A post of words only, up to 280 as X counts them. A post with a link counts toward the 20 link posts of the add-on's month; a post without one does not.

### A post with an image

Text with one image of up to 5 MB. A larger image is refused before X is called, so nothing half-sent is left on your timeline.

### A post with several images

Text with 2 to 4 images in one post, X's own limit, each of up to 5 MB.

### A post with a video

Text with one video, up to 5 GB per file; X itself takes larger files, and we stop at the largest file we store.

## Settings

| Setting | Dashboard | REST field | AI connector option | What it does |
| --- | --- | --- | --- | --- |
| Who can reply | Who Can Reply | x.whoCanReply | who_can_reply | Everyone, the accounts you follow, the accounts you mention, your subscribers, or verified accounts. |

## Automatic changes

- `unknown_field`: A field we do not read is not used, and the answer says so (with the field name we think you meant, when there is one). The post still goes out.
- `field_not_used`: A field we read but could not use for this post (for example another network's block, or a setting that does not apply to this kind of post) is named in the answer. The post still goes out.
- `options_outside_post`: An option sent next to "post" instead of inside it is not used, and the answer says where it belongs.
- `media_url_not_kept`: A scheduled post that names its media by web address fetches the file when it goes out, and we keep no copy: the answer reminds you the file must still be there then.
- `posts_close_together`: The answer warns when another X post of the account is scheduled within 20 seconds: leave at least a minute between them.
- `caption_over_limit`: In a dry run or a scheduled post, a caption longer than X allows is flagged. We send it as it is; X may refuse it or cut it short.
- `moved_to_next_day`: When the daily limit of the profile is reached while a scheduled post is going out, the networks that did not fit move to the next day as a scheduled post of their own, and the post read back says so.
- `queued_for_next_day`: On a plan with a daily limit, a post over the day's limit is queued for the next day instead of failing (answer 202), and the answer gives the time.

## Your way to post

### From the dashboard

1. Add the X add-on on the Pricing page, then connect X under Connections by signing in on X.
2. In Schedule, write the post (the counter counts links and emoji the way X does) and add an image or a video if you want one.
3. Pick X and post now or pick a time.

[Connect X](https://status200uploads.com/connections)

### From the REST API

A text post to X, safe to send twice (POST /api/v2/posts)

```bash
curl -i -X POST 'https://status200uploads.com/api/v2/posts' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer rl_your_api_key' \
  -H 'Idempotency-Key: 8e03978e-40d5-43e8-bc93-6894a57f9324' \
  -d '{"post": {"accountId": "@yourprofile", "platform": "x", "content": {"text": "Hello"}}}'
# The same command again: the same answer, with "Idempotent-Replayed: true", and one post.
```

[Full page](https://status200uploads.com/integrations/rest-api)

### From Python

A post with an image, replies limited to people you follow

```python
from status200uploads import Status200, Status200Error

s200 = Status200()  # STATUS200_API_KEY

post = {
    "accountId": "@yourprofile",
    "platform": "x",
    "content": {"text": "New photos from the shoot are up", "mediaID": ["YOUR_IMAGE_ID"]},
    "x": {"whoCanReply": "following"},
}
try:
    result = s200.publish(post, wait=True)
    print(result.final.get("permalink") if result.final else result.code)
except Status200Error as error:
    print(error.code, error.message)  # e.g. plan_required without the X add-on
```

[Full page](https://status200uploads.com/integrations/python)

### From n8n

1. Put an HTTP Request node after the step that writes the text: POST https://status200uploads.com/api/v2/posts.
2. Set Authorization to Bearer rl_your_key and Content-Type to application/json; an Idempotency-Key of {{ $json.id }}-x keeps a retry from posting the same text twice, which X would refuse as a duplicate anyway.
3. Use the body below and check the length in an earlier node if your text can run past what X allows.

The HTTP Request body

```json
{
  "post": {
    "accountId": "@yourprofile",
    "platform": "x",
    "content": { "text": "{{ $json.text }}" },
    "x": { "whoCanReply": "everyone" }
  }
}
```

[Full page](https://status200uploads.com/integrations/n8n)

### From an AI app

Prompt: "Post on X: "Our summer sale starts today", and only let people I follow reply."

The app checks the post with status200_validate_post, which counts the text the way X does, then sends it with status200_publish_post and who_can_reply set to following. Without the X add-on the answer says so and names the next step, and nothing is sent.

[Full page](https://status200uploads.com/integrations/mcp)

## Errors

| HTTP | Code | Meaning | Fix |
| --- | --- | --- | --- |
| 403 | plan_required | The account has no X add-on. Nothing was sent. | Add the X add-on on the Pricing page, then send the post again. |
| 429 | x_limit_reached | The add-on's 200 X posts for this billing month are used. | Wait for the next billing month. Your other networks are not affected, and a second add-on would not add posts. |
| 429 | x_link_limit_reached | The 20 posts with a link for this billing month are used. | Remove the link and send the post again, or wait for the next billing month. |
| 403 | x_rejected | X refused the post itself, for example as a duplicate of a recent one. X's reason is in the message. | Change the text; X does not take the same post twice in a row. |
| 401 | x_rejected | X no longer accepts the saved sign-in. | Reconnect X under Connections and send it again. |
| 503 | x_unavailable | X could not be reached, so nothing was posted. | Wait a moment and send it again. |
| 413 | MEDIA_TOO_LARGE | The file is larger than X takes through us. | Images up to 5 MB, videos up to 5 GB. |

## Questions

### Do I need the X add-on to post to X?

Yes. Every X post needs the X add-on. It works on any plan, Free included, and gives 200 X posts per billing month, at most 20 of them with a link. X posts do not count toward your plan's own posts.

### Can I post to X through an API?

Yes. With the X add-on, send a POST to https://status200uploads.com/api/v2/posts with platform x, as in the example on this page. You need no X developer account of your own.

### How does X count the characters of a post?

X allows 280, and counts every link as 23 characters however long it is, and an emoji as 2. The dashboard counter and a dry run count the same way, so you see a post that is too long before it is sent.

### What happens when the add-on's X posts are used up?

Further X posts are refused with x_limit_reached until the add-on renews, and the message gives the renewal date. Your posts to other networks go on as before, and a second add-on would not add X posts.

### Why did X refuse my post as a duplicate?

X does not accept the same text twice in a row from one account. The answer is x_rejected with X's own status and reason; change the wording and post again. Send an Idempotency-Key so that a retry of the same request returns the first answer instead.

### Can I choose who can reply to my X posts?

Yes. Set Who Can Reply in the dashboard, x.whoCanReply in the API or who_can_reply in the AI connector: everyone, the accounts you follow, the accounts you mention, your subscribers or verified accounts.

### Can I schedule X posts?

Yes, up to 365 days ahead, from the dashboard or with post.scheduledFor in the API request. Leave at least a minute between two X posts of the same account: the answer warns when two are due within 20 seconds.

## More on X

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

## Related

- [LinkedIn](https://status200uploads.com/platforms/linkedin)
- [Threads](https://status200uploads.com/platforms/threads)
- [Facebook](https://status200uploads.com/platforms/facebook)
- [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)
- [Claude](https://status200uploads.com/integrations/claude)
- [The X add-on on the pricing page](https://status200uploads.com/pricing)
- [File limits of every network](https://status200uploads.com/docs/file-limits)
- [Safe retries](https://status200uploads.com/docs/api#safe-retries)
