X (Twitter) Upload Guide
Post text updates, images and videos to X (formerly Twitter) using the IndReelForge API.
Supported Content Types
| Type | Endpoint | Notes |
|---|---|---|
| Text post | POST /api/upload_text | Over 280 characters is posted automatically as a thread of replies |
| Video | POST /api/upload | MP4, up to 512 MB |
| Image (single or multi) | POST /api/upload_photos | Up to 4 images |
Pricing & Limits
Every plan, including Free, includes 1 free X (Twitter) post per calendar month (resets on the 1st, IST). For more, add the X (Twitter) posting add-on: ₹299/month or ₹2,499/year (+18% GST), which includes 300 X posts per month (annual subscribers also get 300 per month). It can be attached to any plan, including Free — buy it from Dashboard → Billing → X add-on.
- One successful publish of an upload to X = 1 post. An auto-threaded long text counts as 1.
- Failed publishes don't count.
- Team members post against the workspace owner's allowance.
- The limit is enforced when you create the upload and again at publish time, so scheduled and queued X posts that exceed the allowance fail on X (other platforms in the same upload still publish).
Check your allowance
GET https://api.indreelforge.com/api/x-allowance
Works with an API key or a dashboard session.
curl https://api.indreelforge.com/api/x-allowance \
-H 'Authorization: Apikey YOUR_KEY'
{
"month": "2026-10",
"used": 1,
"free_limit": 1,
"addon_active": false,
"addon_limit": 0,
"limit": 1,
"remaining": 0,
"resets_at": "2026-10-31T18:30:00.000Z",
"addon": null
}
addon is null without the add-on, otherwise { id, status, billing_cycle, current_period_end, cancel_at_period_end }.
Over-allowance errors (HTTP 402)
When an upload targets X and no X posts remain this month, the request is rejected with HTTP 402:
{
"error": "You have used your free X post for this month. Add the X add-on (₹299/mo, 300 posts) to keep posting to X.",
"message": "You have used your free X post for this month. Add the X add-on (₹299/mo, 300 posts) to keep posting to X.",
"error_code": "X_ADDON_REQUIRED",
"code": "X_ADDON_REQUIRED",
"platform": "x",
"upgrade_url": "/dashboard/billing#x-addon",
"x_allowance": { "month": "2026-10", "used": 1, "limit": 1, "remaining": 0 }
}
| Status | error_code | Meaning | Fix |
|---|---|---|---|
402 | X_ADDON_REQUIRED | The free X post for this month is used and there's no X add-on | Add the X add-on at /dashboard/billing#x-addon, or wait for the 1st |
402 | X_MONTHLY_LIMIT_REACHED | All 300 X posts included in the X add-on are used this month | Wait for the allowance to reset on the 1st |
For scheduled or queued posts, the same codes appear in platform_errors.x on the upload when it's published.
Video Requirements
| Requirement | Value |
|---|---|
| Format | MP4 (H.264 + AAC) |
| Max duration | 2 minutes 20 seconds |
| Max file size | 512 MB |
| Recommended resolution | 1280×720 or 1920×1080 |
| Aspect ratio | 1:2.39 to 2.39:1 |
Post a Text Update
curl -X POST https://api.indreelforge.com/api/upload_text \
-H 'Authorization: Apikey YOUR_KEY' \
-F 'user=my-brand' \
-F 'title=We just hit 10,000 users! 🎉 #milestone' \
-F 'platform[]=x'
Post a Video
curl -X POST https://api.indreelforge.com/api/upload \
-H 'Authorization: Apikey YOUR_KEY' \
-F 'user=my-brand' \
-F 'title=New product demo — watch till the end' \
-F 'platform[]=x' \
-F 'video_url=https://your-cdn.com/demo.mp4'
X-Specific Fields
| Field | Description |
|---|---|
title | Tweet text (or thread opener) |
x_title / x_description | Override the text used for X only |
reply_to_id | Numeric Tweet ID to reply to. For an auto-threaded long text, only the first tweet replies to it. (x_reply_to is accepted as a legacy alias.) |
direct_message_deep_link | https:// link that adds a "Message" button to the tweet (x_direct_message_deep_link is accepted as a legacy alias) |
Caption Length
- Text-only posts (
/api/upload_text) longer than 280 characters are split at word boundaries into a thread of replies. No text is lost. - Posts with media (video or images) are a single tweet, so the caption can be at most 280 characters. The caption is
title+ a blank line +description(orx_title/x_descriptionwhen you set them). If it's longer, the upload is rejected with400anderror_code: "X_CAPTION_TOO_LONG"(the response includeslimitandlength). Shorten the caption, or set a shorterx_titlejust for X.
Post to X + LinkedIn Simultaneously
curl -X POST https://api.indreelforge.com/api/upload_text \
-H 'Authorization: Apikey YOUR_KEY' \
-F 'user=my-brand' \
-F 'title=Excited to share our latest research!' \
-F 'platform[]=x' \
-F 'platform[]=linkedin'
One API call, two platforms.
Connect X
- Dashboard → Profiles → select your profile
- Click Connect next to X
- Authorise via the X OAuth popup
- Return — status shows Connected
X requires Elevated API access for video uploads. Basic text posts work with standard access. If video uploads fail with a permissions error, check your X Developer App settings.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
duplicate_content | Identical tweet recently posted | X blocks duplicate tweets; vary the text |
video_too_long | Over 2 min 20 sec | Trim the video |
rate_limit | Too many posts in a short window | Add delays between posts |
media_upload_failed | File not H.264+AAC | Re-encode the video |
X_ADDON_REQUIRED (HTTP 402) | Free X post for this month already used | Add the X add-on (₹299/mo, 300 posts) at Billing → X add-on |
X_MONTHLY_LIMIT_REACHED (HTTP 402) | X add-on's 300 posts used this month | Wait for the reset on the 1st (IST) |