Back to Blog

Twitter Scheduling API for Developers: Complete 2026 Guide

OpenTweet Team13 min read
Twitter Scheduling API for Developers: Complete 2026 Guide

Twitter Scheduling API for Developers: Complete 2026 Guide

If you need to schedule tweets from code -- for a bot, a SaaS integration, a content pipeline, or any kind of automation -- your first instinct is probably the official X API. That instinct will cost you. The X API v2 requires a Pro tier at $5,000/month just to get reliable posting access, and the Enterprise tier runs $42,000/month. For most indie developers, small teams, and startups, that is not a viable line item. The good news: third-party scheduling APIs give you full programmatic control over tweet creation, scheduling, threads, and publishing for a fraction of the cost, starting at $9/month. This guide covers the pricing landscape, compares your options, and walks through real API calls you can run today.


The X API Pricing Problem

Twitter's API -- now branded the X API -- has gone through several pricing overhauls since Elon Musk's acquisition. As of 2026, here is what each tier actually gives you for posting:

Tier Monthly Cost Post Limit Read Limit Scheduling Built-In Threads
Free $0 1,500 posts/mo (write-only) 0 reads No No
Basic $200/mo 3,000 posts/mo 10,000 reads/mo No Manual only
Pro $5,000/mo 300,000 posts/mo 1,000,000 reads/mo No Manual only
Enterprise $42,000/mo Custom Custom No Manual only

A few things stand out:

The Free tier is write-only with severe limits. You get 1,500 tweets per month and zero read access. You cannot retrieve your own timeline, check if a post was published, or read replies. For a bot that needs any feedback loop, this is a dead end.

The Basic tier is barely usable. At $200/month you get 3,000 posts and limited reads, but no built-in scheduling. You have to build your own scheduler -- a cron job, a queue, a database to track state. That is engineering time on top of the $200.

Pro is where real access begins, at $5,000/month. This is the tier most documentation and tutorials assume you are on. If you are an indie developer building a side project or a small SaaS, paying $60,000/year for tweet scheduling is absurd.

None of the tiers include scheduling. The X API lets you post a tweet right now. If you want to schedule tweets for the future, you have to build that infrastructure yourself: a task queue, a scheduler, retry logic, timezone handling, and a database to persist state. That is a non-trivial amount of code to write and maintain.

This is why third-party scheduling APIs exist.


Alternative Approach: Third-Party Scheduling APIs

Instead of wrestling with the X API directly, you can use a scheduling service that sits between your code and Twitter. The service handles:

  • OAuth and token management -- no dealing with OAuth 2.0 PKCE flows, token refresh, or credential storage
  • Rate limit management -- the service distributes load across its infrastructure
  • Scheduling infrastructure -- pass a future datetime and the service handles the rest
  • Retry logic -- if X's API returns a transient error, the service retries for you
  • Thread posting -- create multi-tweet threads in a single API call

From your side, you get a standard REST API with Bearer token authentication. You make an HTTP request, the tweet gets scheduled or published. That simplicity is the entire value proposition.


Comparing Twitter Scheduling APIs

Here is how the main options stack up for developers who need programmatic tweet scheduling:

OpenTweet API

  • Price: Included with Pro ($9/mo) and Advanced ($19/mo) plans
  • Auth: Bearer token (API key from dashboard)
  • Features: Full CRUD on posts, scheduling, immediate publishing, threads, batch scheduling (up to 50 posts per request), evergreen queue, media uploads
  • Rate limits: 60 requests/minute, 1,000/day
  • Best for: Developers who need a dedicated tweet scheduling API at the lowest cost

OpenTweet is purpose-built for Twitter scheduling. The API is the core product, not an afterthought bolted onto a social media dashboard. Full documentation is available on the scheduling API feature page.

Typefully API

  • Price: Included with paid plans (from $12.50/mo)
  • Auth: API key
  • Features: Create drafts, limited scheduling, primarily designed for their own editor
  • Limitations: The API is secondary to their web editor; not all features are exposed programmatically
  • Best for: Users already on Typefully who want light automation

Buffer API

  • Price: Included with paid plans (from $6/mo per channel)
  • Auth: OAuth 2.0
  • Features: Multi-platform posting (Twitter, LinkedIn, Facebook, Instagram)
  • Limitations: Multi-platform focus means the Twitter-specific feature set is generic; no thread support via API
  • Best for: Teams posting the same content across multiple social platforms

Ayrshare API

  • Price: Pay-per-post model starting at $49/mo (includes 100 posts)
  • Auth: API key
  • Features: Multi-platform, analytics, hashtag suggestions
  • Limitations: Per-post pricing adds up fast; more expensive than flat-rate options for high-volume use
  • Best for: Agencies managing many client accounts across platforms

Building Your Own (X API Direct)

  • Price: $200-$5,000/mo for the X API, plus your engineering time
  • Auth: OAuth 2.0 with PKCE
  • Features: Full X API access, real-time streaming, advanced search
  • Limitations: You build and maintain all scheduling infrastructure yourself
  • Best for: Companies that need deep X platform integration (analytics, DMs, spaces) beyond just posting

For the rest of this guide, we will use OpenTweet's API for the examples. The concepts (REST endpoints, Bearer auth, JSON payloads) translate to any of the above.


Getting Started with OpenTweet's API

Step 1: Get Your API Key

Sign up at opentweet.io, connect your X account, and navigate to Settings -> API Keys. Generate a new key. You will see something like:

otwt_a1b2c3d4e5f6...

Store this securely. It will not be shown again.

Step 2: Understand the Base URL and Auth

All API requests go to:

https://opentweet.io/api/v1/

Authentication uses a Bearer token in the Authorization header:

Authorization: Bearer otwt_your_api_key_here

Every request must also include Content-Type: application/json for POST and PUT requests.

Step 3: Create and Schedule a Post

The most common operation. Send a POST request with the tweet text and an optional scheduled_date in ISO 8601 format:

curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer otwt_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Just deployed v2.0 of our API. 3x faster response times, new batch endpoints, and full thread support.",
    "scheduled_date": "2026-03-22T14:00:00Z"
  }'

Response (201 Created):

{
  "success": true,
  "count": 1,
  "posts": [
    {
      "id": "661f1a2b3c4d5e6f7a8b9c0d",
      "status": "scheduled",
      "text": "Just deployed v2.0 of our API...",
      "category": "General",
      "scheduled_date": "2026-03-22T14:00:00.000Z",
      "is_thread": false,
      "created_at": "2026-03-21T10:30:00.000Z"
    }
  ]
}

If you omit scheduled_date, the post is saved as a draft. If you want to publish immediately instead of scheduling, add "publish_now": true (without a scheduled_date):

curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer otwt_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "This goes live right now.",
    "publish_now": true
  }'

Step 4: Create a Thread

Pass is_thread: true and a thread_tweets array. The first element of thread_tweets is your first tweet, the second is the reply, and so on:

curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer otwt_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Here is what I learned building an API from scratch (thread):",
    "is_thread": true,
    "thread_tweets": [
      "Here is what I learned building an API from scratch (thread):",
      "1/ Start with the data model, not the endpoints. Every API design mistake I made traced back to a schema I rushed.",
      "2/ Rate limiting is not optional. Add it on day one. You will not go back and add it later.",
      "3/ Version your API from the start. /v1/ costs nothing and saves you from breaking changes."
    ],
    "scheduled_date": "2026-03-23T09:00:00Z"
  }'

Step 5: List Your Posts

Retrieve posts with optional filtering by status:

# Get all scheduled posts
curl https://opentweet.io/api/v1/posts?status=scheduled&limit=10 \
  -H "Authorization: Bearer otwt_your_api_key_here"

# Get posted (published) tweets
curl https://opentweet.io/api/v1/posts?status=posted&page=1&limit=20 \
  -H "Authorization: Bearer otwt_your_api_key_here"

Valid status values: scheduled, posted, draft, failed.

Step 6: Update a Post

Change the text, reschedule, or unschedule a post that has not been published yet:

curl -X PUT https://opentweet.io/api/v1/posts/661f1a2b3c4d5e6f7a8b9c0d \
  -H "Authorization: Bearer otwt_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Updated text for this scheduled tweet.",
    "scheduled_date": "2026-03-24T16:00:00Z"
  }'

To unschedule a post (move it back to draft), set scheduled_date to null.

Step 7: Delete a Post

curl -X DELETE https://opentweet.io/api/v1/posts/661f1a2b3c4d5e6f7a8b9c0d \
  -H "Authorization: Bearer otwt_your_api_key_here"

Step 8: Batch Schedule

If you have multiple drafts and want to schedule them all at once, use the batch endpoint. You can schedule up to 50 posts in a single request:

curl -X POST https://opentweet.io/api/v1/posts/batch-schedule \
  -H "Authorization: Bearer otwt_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "schedules": [
      { "post_id": "661f1a2b3c4d5e6f7a8b9c0d", "scheduled_date": "2026-03-22T09:00:00Z" },
      { "post_id": "661f1a2b3c4d5e6f7a8b9c0e", "scheduled_date": "2026-03-22T14:00:00Z" },
      { "post_id": "661f1a2b3c4d5e6f7a8b9c0f", "scheduled_date": "2026-03-23T09:00:00Z" }
    ]
  }'

This is particularly useful for content pipelines where you generate a week of tweets in one batch and then schedule them all in a single API call.


Advanced: MCP Server for AI Integration

If you use Claude Desktop or Claude Code, OpenTweet offers an MCP (Model Context Protocol) server that lets you schedule tweets through natural language conversation. Instead of writing curl commands, you tell Claude what you want:

"Schedule a tweet about our new feature launch for tomorrow at 9am"

Claude calls the OpenTweet MCP server behind the scenes, which hits the same REST API. This is especially powerful for developers who want AI-assisted content creation combined with programmatic scheduling.

The MCP server supports all the same operations as the REST API: creating posts, scheduling, publishing, threads, batch scheduling, and managing the evergreen queue.

Setup takes about two minutes. See the full guide at the Claude Extension page or the MCP server integration docs.


Building a Twitter Bot with the OpenTweet API

Let us walk through a concrete use case: a bot that automatically tweets when you publish a new GitHub release.

Architecture

  1. GitHub sends a webhook on each new release
  2. Your server receives the webhook, extracts the release info
  3. Your server formats a tweet and calls the OpenTweet API to schedule it

Implementation (Node.js)

const express = require('express');
const app = express();
app.use(express.json());

const OPENTWEET_API_KEY = process.env.OPENTWEET_API_KEY;
const OPENTWEET_BASE_URL = 'https://opentweet.io/api/v1';

app.post('/webhooks/github', async (req, res) => {
  const { action, release } = req.body;

  // Only handle published releases
  if (action !== 'published' || !release) {
    return res.sendStatus(200);
  }

  const tweet = formatReleaseTweet(release);

  try {
    const response = await fetch(`${OPENTWEET_BASE_URL}/posts`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${OPENTWEET_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        text: tweet,
        publish_now: true,
      }),
    });

    const data = await response.json();

    if (!response.ok) {
      console.error('OpenTweet API error:', data);
      return res.status(502).json({ error: 'Failed to post tweet' });
    }

    console.log('Tweet published:', data.posts[0].id);
    return res.json({ success: true, tweet_id: data.posts[0].id });
  } catch (err) {
    console.error('Request failed:', err);
    return res.status(500).json({ error: 'Internal error' });
  }
});

function formatReleaseTweet(release) {
  const name = release.name || release.tag_name;
  const url = release.html_url;
  const body = release.body || '';

  // Extract first line of release notes as summary
  const summary = body.split('\n')[0].slice(0, 120);

  let tweet = `${name} is out!\n\n${summary}`;
  if (url) tweet += `\n\n${url}`;

  // Ensure we stay under 280 characters
  if (tweet.length > 280) {
    tweet = tweet.slice(0, 277) + '...';
  }

  return tweet;
}

app.listen(3000, () => console.log('Webhook server running on :3000'));

This is roughly 50 lines of code. No OAuth token management, no scheduler, no database. You receive the webhook, format the tweet, call one endpoint, and you are done.

You could extend this pattern to tweet about new blog posts (RSS connector), CI/CD status, error alerts, or any event your system produces.


API Best Practices

Handle Rate Limits Gracefully

The OpenTweet API returns a 429 status code when you hit rate limits (60 requests/minute, 1,000/day). Always check for this:

if (response.status === 429) {
  const data = await response.json();
  console.log(`Rate limited. Remaining posts today: ${data.remaining}`);
  // Back off and retry after a delay
}

For batch operations, prefer the batch-schedule endpoint over individual POST calls. One batch request counts as one API call regardless of how many posts it schedules.

Schedule in the User's Timezone

All scheduled_date values must be in ISO 8601 format. The API expects UTC, so convert from the user's local timezone before sending:

// User wants to post at 9:00 AM EST (UTC-5)
const userTime = '2026-03-22T09:00:00';
const userTimezone = 'America/New_York';

// Convert to UTC
const utcDate = new Date(
  new Date(userTime).toLocaleString('en-US', { timeZone: userTimezone })
);
// Use the ISO string for the API
const scheduledDate = new Date(userTime + '-05:00').toISOString();

Implement Idempotency

If your system might send duplicate requests (e.g., a webhook fires twice), check for existing posts before creating:

// Before creating, check if we already posted about this release
const existing = await fetch(
  `${OPENTWEET_BASE_URL}/posts?status=scheduled&limit=100`,
  { headers: { Authorization: `Bearer ${OPENTWEET_API_KEY}` } }
);
const { posts } = await existing.json();
const alreadyExists = posts.some(p => p.text.includes(release.tag_name));

if (alreadyExists) {
  console.log('Tweet for this release already exists, skipping');
  return;
}

Use Categories for Organization

Every post accepts an optional category field (defaults to "General"). Use it to tag posts by source or type so you can filter them later:

{
  "text": "New blog post: How to structure a REST API",
  "category": "Blog",
  "scheduled_date": "2026-03-22T14:00:00Z"
}

Handle Errors Properly

The API uses standard HTTP status codes. Here are the ones you should handle:

Status Meaning Action
400 Bad request (validation error) Check your payload; the details field will explain what is wrong
401 Invalid API key Verify your key is correct and active
403 Subscription required or X not connected Check your plan status or connect your X account
404 Post not found The post ID does not exist or belongs to another user
429 Rate limit exceeded Back off and retry; check the remaining field
502 X API error during publish The post was created but X rejected it; check details

Frequently Asked Questions

What are the API rate limits?

The OpenTweet API allows 60 requests per minute and 1,000 requests per day. Batch endpoints (like batch-schedule) count as a single request regardless of how many posts they contain. For most automation use cases, these limits are more than sufficient.

Do I need my own X API keys?

No. That is the entire point. OpenTweet handles the X API connection through OAuth when you connect your X account in the dashboard. Your code only interacts with the OpenTweet REST API using your OpenTweet API key. You never touch OAuth tokens, consumer keys, or access secrets.

How much does it cost compared to the X API?

OpenTweet's Pro plan is $9/month and includes full API access. The Advanced plan is $19/month with higher limits and additional features like the evergreen queue. Compare that to the X API's Basic tier at $200/month (limited posting, no scheduling), or Pro at $5,000/month. For a developer who just needs to schedule and publish tweets, the cost difference is roughly 50-500x.

Can I create threads via the API?

Yes. Set is_thread to true and pass a thread_tweets array with each tweet in the thread. The API handles posting them as a connected thread on X. Each tweet in the array can be up to 280 characters.

Is there a sandbox or test mode?

You can create posts without a scheduled_date to save them as drafts. Drafts are not published to X and can be inspected, updated, or deleted via the API. This effectively serves as a test mode -- create drafts to verify your integration works, then switch to scheduling or immediate publishing when you are ready.


Start Building

If you are spending $200+/month on the X API just to schedule tweets from your code, or if you have been putting off building a Twitter integration because of the cost, a third-party scheduling API is the practical solution. You get a clean REST interface, the service handles the X API complexity, and you pay a fraction of what direct access costs.

Get your API key free -- the trial includes API access so you can test the full integration before committing to a plan.

For full endpoint documentation and more code examples, visit the Twitter Scheduling API feature page.

Start Scheduling Your X Posts Today

Join hundreds of creators using OpenTweet to stay consistent, save time, and grow their audience.

7-day free trial
Only $11.99/mo
Cancel anytime