Overview

Connect X, capabilities, wallet billing rules, and known limits.

Schedule and automate X posts with text, images, videos, GIFs, threads, and quotes, plus engagement actions and normalized analytics. Everything runs through the X API v2 with OAuth 2.0.

Prepaid wallet required

X usage bills your Onepostly wallet at X list prices with no markup. An empty balance rejects requests with 402 INSUFFICIENT_WALLET. Top up in Dashboard → Settings → Billing.

PageTopics
PostsText, images, video, GIFs, threads, quotes. Schedule, remote delete
EngagementLikes, retweets, bookmarks, replies
AnalyticsMetrics for published posts

Quick Reference

PropertyValue
Character limit280 weighted units per segment, or 25,000 on a paid X subscription
Images per post4
GIFs per post1 (consumes all 4 image slots)
Videos per post1
Image formatsJPEG, PNG, WebP, GIF
Image max size5 MB (images), 15 MB (GIFs)
Video formatsMP4, MOV, WebM
Video max size512 MB
Post typesText, Image, Multi-image, Video, Thread
SchedulingYes, with IANA timezone
Editing published postsNo
Inbox (Comments)Yes
Inbox (DMs)No
AnalyticsYes

Before You Start

X applies a 280 weighted-unit limit per post by default. Latin characters and line breaks weigh 1, CJK characters and emoji weigh 2, and every URL counts as a flat 23 regardless of actual length. X sets the limit from the connected account's own subscription, so a paid tier raises that account to 25,000 weighted units — long-form posts and replies included. GET /v1/connections reports the tier as xSubscriptionType. If you are cross-posting from platforms with higher limits, shorten the text or the request is rejected before it reaches X.

Additional requirements:

  • X rejects duplicate posts. Identical or near-identical content fails, even slightly rephrased
  • Attach per-reply media with threadItems (1 to 25 replies under the root post with per-reply text and media)
  • A video cannot be combined with other media. One attachment per video post
  • GIFs send through mediaKind: "video" with a .gif URL. A GIF consumes the whole media budget
  • Every publish, reply, quote, like, bookmark, and delete bills the wallet at X list prices

Connect

Open Dashboard → Connections and connect X.
Complete the consent screen. Onepostly requests all scopes below in a single OAuth flow.
Grab the account id from the connections list:
const { connections: list } = await connections.listConnections();
const x = list.find((c) => c.platform === "x");
// x.id is your accountId

If a permitted action returns a permission error, reconnect X once to refresh the connection's scopes.

OAuth Scopes

ScopeWhat it enables
tweet.readRead posts for replies, retweeters, and analytics
tweet.writePublish, reply, quote, delete
users.readAccount identity (id, username, avatar, subscription tier)
media.writeUpload images, GIFs, and videos
like.read / like.writeLike and unlike posts
bookmark.read / bookmark.writeBookmark and remove bookmarks
offline.accessRefresh tokens for long-lived connections

Token Lifetime

TokenLifetimeBehavior
Access token~2 hoursRefreshed automatically by Onepostly
Refresh tokenRotated on every refreshAfter revocation or password change, reconnect the account

Billing Rules

  • Publishing, replying, quoting, liking, bookmarking, deleting, and analytics reads all debit the wallet
  • A thread costs the sum of its segments. Each segment bills separately
  • Deleting a thread bills per deleted tweet
  • Failed platform calls are refunded automatically
  • X_OUT_OF_CREDITS means the underlying X developer account has no credits left, not the Onepostly wallet. Contact support

Capabilities

ActionSupportedNotes
Text postYesMax 280 weighted units per segment, or 25,000 on a paid X subscription
Image / multi-imageYesUp to 4 images per post, 5 MB each
VideoYesOne video per post, up to 512 MB
GIFYesSend the GIF URL with mediaKind: "video", up to 15 MB
Thread (reply chain)YesRoot post plus 1 to 25 replies via threadItems with per-reply media
Media geo restrictionYesgeoRestriction allowlist (max 25). Media-only. Text-only tweets ignore it
QuoteYesOn create, or from a published post
ScheduleYesCancel any time before it publishes
Remote deleteYesDeletes the full thread when present
RepliesYesList, create, delete your own replies
Retweet / like / bookmarkYesCreate and remove
AnalyticsYesNormalized metrics
StoriesNoNot an X feature

What You Can't Do

These features are not available through Onepostly's X integration:

  • Stories
  • Polls
  • Paid partnership, AI-generated, or sensitive media labels
  • Editing published tweets
  • Sending or reading DMs
  • Replying settings (who can reply)

See Also