X (Twitter): posting rules and settings
What a X (Twitter) channel accepts in Postemi: media, limits, required fields, and the fields of the settings object for the API.
Basics
xPost types
The same channel accepts more than one kind of post, and each kind has different requirements. The table shows what you need for each.
| Type | Media | Notes |
|---|---|---|
| Text | none | The most common. Only the text counts toward the character limit. |
| Image | up to 4 images | The four images appear in one post, as a grid. |
| Video | 1 video | You cannot attach an image with a video. |
| Thread | each part has its own | The remaining items in the value array are attached as replies to the first. |
Rules
- You write a thread as extra parts of the post: the first part is the post, the rest attach as replies below it.
- The character limit depends on the account type, so the editor shows the value unlocked for the connected account.
- Postemi does not send links to X, because X charges for every post with a link. Links (https://…, www.…, postemi.com/pricing and the like) are removed from the post and every thread part when it is saved, and the API response lists them in the notices field. To share a link, post it directly on X.
Settings fields
These fields go into the post's settings object, alongside the __type field. In the UI, you fill in the same ones in the channel's settings section.
| Field | Type | Required | What it does |
|---|---|---|---|
| who_can_reply_post | "everyone" | "following" | "mentionedUsers" | "subscribers" | "verified" | yes | Who can reply to the post. These are the values the X API offers; X has no "followers" or "followers of followers" option. |
| community | string | no | The full URL of an X Community, in the form https://x.com/i/communities/<number>. Leave it empty to post to your own timeline. |
| made_with_ai | boolean | no | Marks the post as made with AI. |
| paid_partnership | boolean | no | Marks the post as a paid partnership. |
| active_thread_finisher | boolean | no | Thread finisher: when true, Postemi publishes the thread_finisher text as the LAST post of the thread (after every thread part, or as a reply to the post when there is no thread). The same character limit applies and it gets no links. The channel remembers it: it stays on for the next posts until you switch it off. |
| thread_finisher | string | no | The text of the thread finisher. Write it without a link, Postemi sends no links to X. |
Allowed values
The fields below only accept these values. Any other value returns a 400, and the response names the field.
who_can_reply_post
| Value | Meaning |
|---|---|
| everyone | Anyone can reply. |
| following | Only people you follow. |
| mentionedUsers | Only people mentioned in the post. |
| subscribers | Only your subscribers. |
| verified | Only verified accounts. |
Examples
Each example is one item in the POST /public/v1/posts request's posts array. The envelope around it is always this:
{
"type": "schedule",
"date": "2026-09-15T09:00:00.000Z",
"shortLink": false,
"posts": [ /* the item below */ ]
}Text post
{
"integration": { "id": "<x-channel>" },
"value": [{ "content": "<p>We shipped a new feature today.</p>", "image": [] }],
"settings": { "__type": "x", "who_can_reply_post": "everyone" }
}Post with two images
The path values come from the media upload. An arbitrary URL from the internet will not work.
{
"integration": { "id": "<x-channel>" },
"value": [{
"content": "<p>Two images in one post.</p>",
"image": [
{ "id": "<media-1>", "path": "https://uploads.posty.hu/one.png" },
{ "id": "<media-2>", "path": "https://uploads.posty.hu/two.png" }
]
}],
"settings": { "__type": "x", "who_can_reply_post": "everyone" }
}Thread, with a two-minute delay
The first item is the post, the rest are attached as replies below it. delay is in minutes.
{
"integration": { "id": "<x-channel>" },
"value": [
{ "content": "<p>1/3 Let's start with a short thread.</p>", "image": [] },
{ "content": "<p>2/3 The second part.</p>", "image": [], "delay": 2 },
{ "content": "<p>3/3 And the wrap-up.</p>", "image": [], "delay": 2 }
],
"settings": { "__type": "x", "who_can_reply_post": "everyone" }
}Post to a community
The community field expects the full URL of the X community.
{
"integration": { "id": "<x-channel>" },
"value": [{ "content": "<p>A question for the community.</p>", "image": [] }],
"settings": {
"__type": "x",
"who_can_reply_post": "everyone",
"community": "https://x.com/i/communities/1493446837214187523"
}
}The channel ID comes from the channel list, and the path values for images and videos from media upload. The exact schema for the connected account comes from the settings schema endpoint. From the command line, the same thing is the --settings flag. See the CLI examples.