Skip to main content
← Back to blog
by Engineering
rate-limitsscraping

Twitter Scraper API Without Harsh Rate Limits: A Developer Guide

The Rate Limit Problem

If you've ever built anything on the Twitter API, you've hit the wall. The dreaded 429 Too Many Requests response that kills your data pipeline, stalls your bot, and leaves you staring at a retry timer.

Here's what the official X API gives you in 2026:

PlanPriceRate LimitReads/Month
Free$01 req/15 min (some endpoints)~100 tweets (write-only tier)
Basic$200/mo15 req/15 min10,000 tweets
Pro$5,000/mo450 req/15 min1,000,000 tweets
Enterprise$42,000+/moCustomCustom

That Basic plan rate limit means one request per minute. If you're building a Twitter scraper API integration, a monitoring dashboard, or any tool that needs to pull data at scale, these limits are a dealbreaker.

Why Traditional Scraping Breaks

Many developers turn to direct scraping as a workaround. Build a headless browser, parse the HTML, extract the data. But Twitter has invested heavily in anti-scraping measures:

Login walls — Most data requires authentication
Dynamic rendering — Content loaded via JavaScript, not in initial HTML
Fingerprinting — Browser fingerprint detection blocks automated tools
IP bans — Aggressive rate limiting at the IP level
DOM changes — Class names and structure change frequently, breaking selectors

Maintaining a custom Twitter scraper API is a full-time job. Every time Twitter updates their frontend, your scraper breaks. Every time they tighten fingerprinting, you need new evasion techniques.

A Better Model: Credit-Based Access

XCROP takes a fundamentally different approach. Instead of rigid per-endpoint rate limits, we use a credit-based system where you pay for the data you consume, not the requests you make.

How Credits Work

Each API response costs credits based on the amount of data returned:

Data TypeCredit Cost
User profile18 per profile
Tweet / search result15 per result
Follower / following entry1 per result
Trending topics100 per call (flat)
Write operations100 per operation
Minimum per call10 credits

A Pro plan ($9.9/month) gives you 2,000,000 credits. That's roughly:

133,000 tweets from search or timeline endpoints (15 credits each)
111,000 user profiles (18 credits each)
10,000 trending topic requests
Or any combination

Rate Limits That Don't Strangle You

Instead of 15 requests per 15 minutes, XCROP rate limits are per-minute and much more generous:

XCROP PlanRate LimitMax Throughput
Starter (free)10 req/minup to 10,000 results/min
Basic ($4.9/mo)30 req/minup to 30,000 results/min
Pro ($9.9/mo)60 req/minup to 60,000 results/min
Pay-as-you-go30 req/minup to 30,000 results/min

Every plan returns up to 1,000 results per request — there's no per-tier cap on page size, so you paginate with a cursor to pull as much as you need. The only difference between plans is how many requests per minute you can fire.

Compare that to Twitter's Basic plan: 15 requests per 15 minutes with max 100 results = 100 results per minute. XCROP's Pro plan delivers orders of magnitude more throughput at a fraction of the cost.

High-Volume Data Collection in Practice

Let's walk through real scenarios where XCROP's model shines.

Scenario 1: Collecting a User's Full Tweet History

JAVASCRIPT
async function collectAllTweets(username) {
  const API_KEY = process.env.XCROP_API_KEY;
  const baseUrl = "https://xcrop.io/api/v2/users/" + username + "/tweets";
  let allTweets = [];
  let cursor = null;

  while (true) {
    const params = new URLSearchParams({ count: "50" });
    if (cursor) params.set("cursor", cursor);

    const res = await fetch(baseUrl + "?" + params.toString(), {
      headers: { "Authorization": "Bearer " + API_KEY }
    });

    const { data, meta } = await res.json();
    allTweets.push(...data);

    console.log("Fetched " + allTweets.length + " tweets so far...");

    if (!meta.has_next_page || !meta.next_cursor) break;
    cursor = meta.next_cursor;
  }

  return allTweets;
}

// On Pro plan: 100 results/req, 60 req/min
// = 6,000 tweets per minute
// A user with 10,000 tweets? Done in ~3.5 minutes
const tweets = await collectAllTweets("VitalikButerin");
console.log("Total: " + tweets.length + " tweets");

With the official Twitter API Basic plan, the same task would take over 100 minutes due to the 15 req/15 min limit — and you'd burn through your entire monthly quota.

Scenario 2: Batch User Lookup

Need to look up 500 users at once? The official API makes you do them one by one (or 100 per request on the Pro plan). XCROP's batch endpoint handles this efficiently:

PYTHON
import requests
import os

API_KEY = os.environ["XCROP_API_KEY"]
headers = {"Authorization": "Bearer " + API_KEY}

# 500 usernames to look up
usernames = ["elonmusk", "VitalikButerin", "caboronSBF", ...]  # 500 total

# XCROP batch endpoint — 100 per request, so 5 requests total
for i in range(0, len(usernames), 100):
    batch = usernames[i:i+100]
    response = requests.post(
        "https://xcrop.io/api/v2/users/batch",
        headers=headers,
        json={"usernames": batch}
    )

    users = response.json()["data"]
    for user in users:
        print(user["username"] + ": " + str(user["followers"]) + " followers")

# Total: 5 API calls, ~6,500 credits
# On Twitter API Basic: 500 individual calls = 500 minutes (8+ hours!)

Scenario 3: Real-Time Search Monitoring

Monitor a keyword continuously and collect every matching tweet:

JAVASCRIPT
async function monitorKeyword(keyword, intervalMs = 5000) {
  const API_KEY = process.env.XCROP_API_KEY;
  const seen = new Set();

  console.log("Monitoring: " + keyword);

  setInterval(async () => {
    const res = await fetch("https://xcrop.io/api/v2/search", {
      method: "POST",
      headers: {
        "Authorization": "Bearer " + API_KEY,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        query: keyword,
        sort: "latest",
        count: 20
      })
    });

    const { data } = await res.json();

    for (const tweet of data) {
      if (!seen.has(tweet.id)) {
        seen.add(tweet.id);
        console.log("[NEW] @" + tweet.author.username + ": " + tweet.text.slice(0, 80));
        // Process new tweet — store in DB, trigger alert, etc.
      }
    }
  }, intervalMs);
}

// Poll every 5 seconds = 12 req/min
// Well within Pro plan's 60 req/min limit
monitorKeyword("$BTC");

Try doing this with the Twitter API Basic plan at 1 request per minute. You'd miss most tweets.

Handling Pagination Efficiently

Every list endpoint in XCROP supports cursor-based pagination. Here's a reusable pattern:

PYTHON
import requests
import os

def paginate(url, params=None, max_pages=10):
    """Generic paginator for any XCROP list endpoint."""
    headers = {"Authorization": "Bearer " + os.environ["XCROP_API_KEY"]}
    all_data = []
    cursor = None

    for page in range(max_pages):
        req_params = dict(params or {})
        if cursor:
            req_params["cursor"] = cursor

        response = requests.get(url, headers=headers, params=req_params)
        result = response.json()

        if "data" in result:
            all_data.extend(result["data"])

        meta = result.get("meta", {})
        cursor = meta.get("next_cursor")

        if not meta.get("has_next_page") or not cursor:
            break

    return all_data

# Usage examples:
followers = paginate(
    "https://xcrop.io/api/v2/users/elonmusk/followers",
    params={"count": 50},
    max_pages=20
)

search_results = paginate(
    "https://xcrop.io/api/v2/search",
    params={"query": "crypto", "count": 50, "sort": "latest"},
    max_pages=5
)

Rate Limit Headers

XCROP includes rate limit information in every response (X-RateLimit-Credits-Remaining, X-RateLimit-Minute-Remaining, X-RateLimit-Minute-Limit) so you can pace requests before hitting a 429. The backoff and adaptive-throttling pattern is the same one used for X's own headers — see [Twitter/X API Rate Limits in 2026](/blog/twitter-api-rate-limits-2026) for the full walkthrough if you need it.

Choosing the Right Plan for High-Volume Use

Use CaseRecommended PlanWhy
Side project / prototypingStarter (free)5,000 credits to test the API
Single-user monitoring botPro ($9.9/mo)60 req/min, 2M credits
Multi-account analyticsPro + top-up packs60 req/min, additional credit packs available
Production data pipelinePro + Pay-as-you-go packs60 req/min plus never-expiring top-up credits for burst capacity

The Takeaway

Building a Twitter scraper API from scratch is fragile, expensive, and a constant maintenance burden. The official Twitter API's rate limits make high-volume data collection impractical at any price point below $5,000/month.

XCROP's credit-based model gives you predictable costs, generous rate limits, and clean endpoints that return complete data without the complexity of field selection or OAuth token management. If you need to scrape Twitter data at scale without rate limit headaches, it's the pragmatic choice.

Get started with 5,000 free credits at xcrop.io — no credit card required.