How Will You Use the Twitter (X) API or Twitter Data? Answering the Developer Sign-Up Question

By TwitterAPI.io Team•28 min read
Dark diagram of what happens to the answer to How will you use the X API. Top row: 1. console.x.com, sign in with an X account, accept the Developer Agreement and Policy, describe how you will use the API. 2. Policy checks: who you are plus what data, no resale or redistribution, no bulk follow or spam, no surveillance, no model training. Arrow labeled approved to 3. Credentials: API key and secret, Bearer token, OAuth client id, use case stays binding. 4. Pay-per-use: $0.005 per post read, $0.010 per user read, $0.015 per post made, 3M reads a month cap. A red arrow down from policy checks reads: deviate from the description, resell data, automate engagement: we may suspend or permanently revoke your access. Bottom row: Need data today? no application form, no X account for reads, one API key, arrow to twitterapi.io: GET /twitter/tweet/advanced_search, GET /twitter/user/last_tweets, 15 credits per tweet returned = $0.15 per 1,000 tweets, writes act as your own account through /twitter/user_login_v2.
The sign-up question feeds a policy review, and the description you give stays binding after approval. The lower path is for when you need public data before a review would finish. Diagram; prices from the docs.x.com rate card and the twitterapi.io pricing page.

Every X (formerly Twitter) developer account starts with the same free-text question. The older developer portal phrased it as "How will you use the Twitter API or Twitter data?" and later as a request to describe all of your use cases; the current getting-started guide on docs.x.com describes the step more plainly: at console.x.com you "Provide basic information about how you'll use the API", then when creating an app you "Provide a name, description, and use case for your app". Whatever the wording on the day you sign up, the answer is read against the X Developer Agreement and Policy, and this page is about writing one that passes and stays true.

Most pages ranking for this query are 2022-era walkthroughs with screenshots of a form that no longer looks like that, and none of them quotes the policy the answer is checked against or says what the approved account costs. So this page does three things the search results do not: it quotes the clauses from the live docs.x.com policy pages that decide applications and later suspensions, it gives six sample answers written to those clauses (academic research, a monitoring bot, an analytics dashboard, a login integration, a content tool, and a machine-learning dataset), and it prices what you land on afterwards against the alternative that needs no application at all.

It also carries one thing nobody else has: data. We pulled 547 public English posts in which developers mention the developer account, portal or access together with the X or Twitter API, plus the 200 most recent posts from @XDevelopers, and counted what they are about. The short version: in the last 12 months developers talk about price three times as often as about approval, and almost never about being rejected.

01 — Section

What the question is for, and what the current sign-up asks

The sign-up question is not a creative-writing exercise and it is not a technical screening. It exists because X licenses its content under a Developer Agreement and Policy, and the policy says the use case is what the license covers. The relevant passage from the X Developer Policy (docs.x.com/developer-terms/policy), under the heading "Set yourself up for success", reads: "We review all proposed uses of the X developer platform to verify policy compliance - so you're required to disclose (and update, as applicable) your planned use of the X API and X Content."

Two sentences later the policy adds the part most applicants miss: "Your use case description is binding on you, and any substantive deviation from it may constitute a violation of our rules and result in enforcement action." And in the same section: you "must notify us of any substantive modification to your use case and receive approval before you may begin using X Content for that new purpose." In other words, the answer you give is a contract term, not a one-time gate. An account approved for "an internal dashboard of our brand's mentions" that later starts auto-replying to those mentions has changed its use case without approval, and the policy's enforcement clause applies: "If we believe you are in violation of this Policy ... we may suspend or permanently revoke your access to the X API and X Content."

This is why the best answers are boring. A reviewer (human or automated) is matching your text against a list of restricted uses, so you want every element of the list to be answered before it is asked. Name who you are. Name the data. Say where it goes and where it is shown. Say explicitly that you will not resell or redistribute it, and whether any posting, following, liking or messaging is automated. If a sentence would make a reviewer ask "so who else sees this data?", answer it in the next sentence.

On the exact wording. We could not reach the live sign-up form itself this session (the legacy developer.x.com pages now return a payment-required status to fetches), so this page quotes only what docs.x.com publishes: the getting-access guide's "Provide basic information about how you'll use the API" and "Provide a name, description, and use case for your app". The phrase "How will you use the Twitter API or Twitter data?" is the question as the older portal put it, and it is the phrase people still search; the elements a good answer needs have not changed with the label.

What the current sign-up actually asks for. The getting-access guide at docs.x.com/x-api/getting-started/getting-access describes three steps, and they are worth reading as the shape of your answer.

Step 1, create a developer account. "Visit console.x.com and sign in with your X account" and "Review and accept the Developer Agreement and Policy." The sign-in means your developer identity is an X account; if that account is new, unverified, or has a history of rule violations, you have given the reviewer a reason to look harder before reading a word of your use case. Use a real account with a real profile.

Step 2, profile information. "Provide basic information about how you'll use the API." This is the free-text question of this page. There is no published minimum length in the current docs; the older portal asked for at least 250 characters, and the practical minimum is whatever it takes to cover the five elements below, which is usually 600 to 1,200 characters.

Step 3, create an app. "Provide a name, description, and use case for your app." The console then generates your credentials: API key and secret, a Bearer token, an access token and secret, and a client ID and secret for OAuth 2.0, depending on the authentication your use case needs. The app description is read against the same policy, and the policy's "Service authenticity" section applies to its name: you must "clearly identify your service so that people can understand its source and purpose", and you may not use "names, logos, or URLs that mask your service's identity ... or that falsely imply an affiliation with X". Do not call your app anything with "X", "Twitter" or "official" in it.

ElementWhat to writeWhy a reviewer wants it
Whoyour name or organization, role, country, and a URL if one existsidentity and accountability; matches the Agreement's accuracy expectations
What datathe endpoints in plain words: public posts by keyword search, one account's recent posts, your own account's data, user profilesscopes the license; each read class has its own price on the rate card
How it is used and displayedaggregates in a dashboard, a CSV for a paper, a feed inside your app, a reply from your own accountthe "display" question decides whether content leaves X's product
Who else sees it"stored on our servers, never shared or sold; only aggregate counts are published"redistribution is capped at IDs and 50,000 hydrated objects per recipient per day
Any automation"the app posts to our own account only", or "no posting, following or messaging"the spam and automation clauses are the most common suspension trigger
02 — Section

What the Developer Agreement and Policy actually require

These are the clauses a reviewer checks your answer against, quoted from the live pages. Each row names the behavior the clause rules out and what it means for your sentence.

TopicWhat the policy says (quoted)Where
Disclosure"you're required to disclose (and update, as applicable) your planned use of the X API and X Content"Developer Policy, "Set yourself up for success"
Binding use case"Your use case description is binding on you, and any substantive deviation from it may constitute a violation of our rules"Developer Policy, same section
Spam and automation"The use of the X API and developer products to create spam, or engage in any form of platform manipulation, is prohibited." "Never perform bulk, aggressive, or spammy actions, including bulk following"Developer Policy, "Spam, bots, and automation"
Automated replies and DMs"Always get explicit consent before sending people automated replies or Direct Messages"Developer Policy, same section
Redistributionyou may "only distribute Post IDs, Direct Message IDs, and/or User IDs"; no more than "1,500,000 Post IDs to any entity ... within any 30 day period" without written permissionDeveloper Policy, "Content redistribution"
Hydrated objects"up to 50,000 hydrated public Post Objects and/or User Objects per recipient, per day"Restricted use cases, "Redistribution of X Content"
Surveillanceno use "for surveillance purposes, or in any other way that would be inconsistent with our users' reasonable expectations of privacy"Restricted use cases
Sensitive inferenceno deriving or inferring "Health (including pregnancy)" or "Political affiliation or beliefs" about peopleRestricted use cases, "Sensitive information"
Off-X matching"associating X content ... with a person, household, device, browser, or other off-X identifier" is restrictedRestricted use cases, "Off-X matching"
Model training"X prohibits any use of the X APIs and/or X Content to fine-tune or train a foundation or frontier model with the exception of Grok"Restricted use cases, "AI Model Training"
One app per use caseyou may not "register multiple applications for a single use case, or substantially similar or overlapping use cases"Restricted use cases, "Multiple Applications"
Enforcement"we may suspend or permanently revoke your access to the X API and X Content"Developer Policy, enforcement

The Developer Agreement (docs.x.com/developer-terms/agreement) sits above the policy and is blunter. Section III.A forbids you to "sell, rent, lease, sublicense, distribute, redistribute, syndicate, create derivative works of" the licensed material except as expressly permitted; Section III.D says "You will not attempt to exceed or circumvent limitations on access, calls, and use of the X API"; Section VII.H lets X "suspend your use of and access to the Licensed Material immediately without notice" if it "reasonably believes" your use would cause damage; and Section VII.I lets X "terminate this Agreement for any reason at X's sole discretion". The account-level automation rules (what an automated account may post, how it must identify itself) live on the help center at help.x.com/en/rules-and-policies/x-automation; read them if your use case posts anything.

Two of those rows surprise people. The first is model training: the restricted-use-cases page prohibits using X content "to fine-tune or train a foundation or frontier model", so an answer that says "to train our LLM" is a rejection, while "to train a small sentiment classifier that is never released as a general-purpose model" is a different use case and should be described as such. The second is the "Measuring the X Service" restriction, which lists "Calculate aggregate X user metrics, such as the total number of active users or accounts" as prohibited; a research answer that promises platform-wide user counts is asking for a no.

03 — Section

Six sample answers, written to the current form

Each sample below covers the five elements (who, what data, how it is used and displayed, whether anything is resold or redistributed, whether anything is automated) and is written to be true for a real project of that kind. Replace the specifics; do not copy the shape and invent the facts, because the description is binding and a reviewer can compare it with what your app later does. Lengths are 600 to 1,000 characters each, which is what the elements need.

1. Academic research (public-posts dataset). "I am a PhD candidate in communication studies at [University], supervised by [Name]. I will use the search endpoints to collect public posts in English and Spanish that contain a fixed list of about 40 keywords related to municipal water policy, roughly 20,000 posts over six months, together with the public author profile fields (follower count, account creation date). The posts are stored on a university server with access limited to the research team. Analysis is topic modeling and descriptive statistics; the paper and any public dataset will contain aggregate results and post IDs only, never post text, consistent with the Content redistribution rules. I will not infer health, political affiliation or other sensitive attributes about individuals. The application does not post, like, follow or message anyone; it is read-only. Nothing is sold or shared with third parties." (Our academic research guide covers the sampling side.)

2. Monitoring and alerts bot (your own account posts). "I am an individual developer in Germany. The app watches the public posts of 12 named organization accounts (city transport authorities) with the user timeline endpoint, checked every five minutes, and when a post matches the words 'delay', 'closure' or 'canceled' the app posts a one-line summary with a link to the original post from my own account @[handle], which is labeled as automated in its profile. It posts only to my own account, at most once per matched post and never more than 20 times a day. It never replies to, follows, likes or messages other users, and it never posts the same text to more than one account. Data is held in memory for de-duplication and discarded after 24 hours; nothing is stored long term, redistributed or sold."

3. Analytics dashboard for a company's own accounts. "[Company], a 30-person software company in Canada; I am its marketing engineer. The app reads our own three accounts' posts, their public metrics (likes, reposts, replies, impressions) and the public profiles of accounts that mention us, with user-context authentication for our accounts. The data populates an internal dashboard (charts of engagement per post, follower growth, reply volume) visible to our marketing team of four. We display aggregate numbers only; individual replies are shown inside the dashboard as links to the posts on X, not stored as text beyond 30 days. No content is exported to customers or third parties, no posting or engagement is automated, and the dashboard is not sold or offered to other companies."

4. App integration and login (OAuth 2.0 user context). "[Company] builds a note-taking app with about 8,000 users. We will offer 'Sign in with X' through OAuth 2.0 with PKCE, requesting only the users.read and tweet.read scopes, to let a user save a public post into their own notebook when they paste its link. For each saved post we fetch that single post by ID and store its text and author handle in the user's private notebook, which only that user can see. We do not search, stream, aggregate or display posts outside the saving user's own notebook, we never post, like, follow or message on a user's behalf, and we never share or sell any X content. Users can disconnect X at any time, which deletes stored tokens." (Setup details are in our OAuth 2.0 user-context guide.)

5. Content tool (scheduling and publishing for the user's own accounts). "[Company] offers a drafting and scheduling tool for small businesses. A user connects their own X account with OAuth 2.0 (tweet.write, tweet.read, users.read, offline.access) and the app publishes the posts they wrote at the time they chose, to their own account only, with media they uploaded. The app never generates and posts content without a human writing and approving it, never posts identical content across several accounts, never follows, likes, replies or sends direct messages automatically, and never buys or sells engagement. We read a user's own recent posts to show them their performance; no other accounts' data is collected. Nothing is redistributed or sold."

6. Machine-learning dataset (a classifier, not a foundation model). "I am a machine-learning engineer at [Company], which builds customer-support software. We will collect about 50,000 public English posts that mention a list of 200 consumer brands, using the search endpoints over three months, to train a small text classifier that labels a post as a complaint, a question or praise. The classifier is used only inside our product to route posts about a customer's own brand to the right support queue; the model is task-specific and is not a foundation or frontier model, and no X content is used to fine-tune or train any general-purpose model, in line with the AI Model Training restriction. Raw posts are kept for 90 days on our servers and then deleted; only the model weights remain. We do not redistribute posts or user data, do not infer sensitive attributes, and do not automate any posting or engagement."

What the six have in common: a specific count or cadence (20,000 posts, every five minutes, 12 accounts), a named display surface (a paper, my own account, an internal dashboard, the user's own notebook), an explicit negative for redistribution, and an explicit negative or a tightly bounded positive for automation. Vagueness is what gets a follow-up email; a specific description a reviewer can check is what gets approved.

04 — Section

What gets applications rejected and accounts suspended

Rejections and suspensions come from the same list of clauses; the difference is whether the reviewer saw the problem in your text or found it later in your traffic. These are the patterns the policy pages single out, with the clause each one hits.

Pattern in an answer or in trafficClause it violatesFix in the answer
"We provide X data to our clients", "a data feed", "a dataset for sale"Content redistribution: only IDs, 1,500,000 Post IDs per 30 days; Agreement III.A: no sell, sublicense, syndicatesay what your customers see: aggregates, or links back to X, never raw posts; or apply as Enterprise
Growth tools: auto-follow, follow-back, mass unfollow, auto-like, engagement pods"Never perform bulk, aggressive, or spammy actions, including bulk following"; "any form of platform manipulation"these are not describable in a passing way; drop the feature
Auto-replies to people who mention a keyword, cold DMs"Always get explicit consent before sending people automated replies or Direct Messages"reply only to users who opted in (for example by messaging you first), and say so
Same content posted from several accounts"Never post identical or substantially similar content across multiple accounts"one account per voice; state that the app posts to the user's own account only
An app called "X Analytics Official" or using X's logoService authenticity: no names or URLs that "falsely imply an affiliation with X"a neutral product name
"Monitor individuals' location and activity for our investigations client""surveillance purposes" and "reasonable expectations of privacy"not a use case the policy allows
"Train our LLM on tweets""fine-tune or train a foundation or frontier model with the exception of Grok" is prohibiteddescribe a task-specific model, or do not collect X content for training
Two apps, two accounts, one project"register multiple applications for a single use case" is prohibitedone app; one account
A vague answer ("explore the API", "learn")Disclosure: "required to disclose ... your planned use"write the five elements even for a hobby project: "a personal script that saves my own bookmarks to a CSV"

Three more facts shape expectations. First, the Agreement's Section VII.I lets X "terminate this Agreement for any reason at X's sole discretion", so a clean answer lowers your risk but is not a guarantee. Second, the Agreement's rate-limit clause (III.D) treats working around limits as a violation on its own, independent of what you do with the data. Third, the reviewer's reference point is your written description: if the project pivots, the policy requires you to "notify us of any substantive modification to your use case and receive approval" first, which is cheaper than explaining a suspension afterwards.

On wait times: the current docs.x.com guide does not publish a review period, and we did not find one on the policy pages, so we do not state one. In the public posts we sampled (next section), approval mentions outnumber rejection mentions roughly five to one, but those are people who chose to post about it, not a measured approval rate.

05 — Section

After approval: the tiers and prices you land on

Approval gets you credentials, not data; data is billed. The pricing page at docs.x.com/x-api/getting-started/pricing describes a pay-per-usage model ("No subscriptions -pay only for what you use", "Purchase credits upfront. Deducted as you use the API") with per-resource prices and a cap: "3 million Post reads per monthly billing cycle", above which "If you need higher volume, upgrade to an Enterprise plan". Credits come with two incentives: "$20 in free X API credits when you save your first eligible payment card" and a first auto-recharge matched "up to $50". Resources are "deduplicated within a 24-hour UTC day window", so reading the same post twice in a day is billed once.

OperationOfficial X API (pay-per-usage, docs.x.com)twitterapi.io (no application)
Read a post$0.005 per post = $5 per 1,00015 credits per tweet returned = $0.15 per 1,000 tweets (about 33x less)
Read a user profile$0.010 per user18 credits per profile = $0.18 per 1,000
Read a follower or following$0.010 per user1 to 3 credits per user returned
Create a post$0.015 per request; $0.200 with a URL$0.002 per call through your own account's login session (see below)
Monthly ceiling3 million post reads, then Enterprisenone published; rate limit 0.2 requests/s before the first payment, 20 after, 50 on Scale, 500 on Business
Entrydeveloper account, use-case review, card on file ($20 credits, match up to $50)API key from the dashboard; $1 in free credits for new accounts that pass the bot check, one per person or network, expiring after 31 days

The ratio people care about is the first row: $5 per 1,000 post reads on the official rate card against $0.15 per 1,000 tweets returned on twitterapi.io, about 33x. Below the headline the two models differ in shape. The official card prices every resource you touch and dedupes within a day; twitterapi.io bills per tweet returned with a minimum of 15 credits per request ($0.00015), so a search that returns nothing costs the minimum and a full 20-tweet page costs $0.003, and purchased credits never expire. Monthly plans with bonus credits (Starter $29 to Business $1,499) are on the pricing page; the full cost breakdown works through typical workloads on both cards.

What the official account gives you that no third-party API does: user-context OAuth, so your users can sign in with X and act as themselves; official write endpoints on their behalf; and a license that explicitly covers displaying X content inside your product. If your use case is number 4 or 5 above (login, or publishing on behalf of your users), you need the developer account, and the sample answers are how you get it. If your use case is 1, 2, 3 or 6, reading public data, the next section is the shortcut.

06 — Section

What developers say in public about applying: 547 posts, counted

We wanted to know what the application experience actually looks like from the outside, so we searched X itself. Using /twitter/tweet/advanced_search with queryType=Latest and four query variants built from the phrases "developer account", "developer portal", "developer access" and "developer application" combined with "x api" or "twitter api" (English, reposts excluded), we collected 547 unique public posts from 493 authors in 46 requests, collected in 2026. The queries ran dry, so the sample reaches back across years; 153 posts are from the last 12 months and 133 from this year. We then counted keyword buckets, defined in the study's analyze.py, over each post's text. A post can match several buckets, and the buckets are a rough classifier of what people chose to post, not a measurement of X's approval rate.

Bucket (keywords, abridged)Last 12 months (153 posts)Whole sample (547 posts)
Price, cost or credits (price, pay, cost, credits, $, free tier, per month)62.1% (95)30.5% (167)
How-to question or help request (how do, ?, help, can't, error, stuck)48.4% (74)39.7% (217)
Suspension, ban or lock (suspend, banned, revoked, locked, restricted)22.2% (34)11.3% (62)
Approval or getting access (approved, approval, got access, granted)12.4% (19)9.9% (54)
The words "use case"3.3% (5)1.8% (10)
Rejection or denial (rejected, denied, declined, not approved)2.6% (4)2.4% (13)
None of the outcome or price buckets31.4% (48)57.6% (315)

Price dominates the recent conversation. 62.1% of the last 12 months' posts mention price, credits or paying, double the whole-sample share (30.5%), which tracks the move to a paid, pay-per-usage API. Rejection is rare in public. 4 of 153 recent posts mention a rejection or denial, against 19 that mention approval or getting access; across the whole sample the ratio of rejection mentions to approval mentions is 0.24. Suspensions are the bigger worry. 22.2% of recent posts mention a suspension, ban, lock or restriction, nearly nine times the rejection share, which is consistent with the policy's shape: the use case is checked lightly at the door and enforced in traffic. Half of it is people asking for help. 48.4% of recent posts contain a question or a help phrase, and only 3.3% use the words "use case" at all, which says the hard part for most developers is not the essay but what happens after it.

The sample's other properties: 30.3% of posts are replies, 35.5% carry at least one link, 34.0% carry media, the median post has 4 likes, 2.6% have zero engagement of any kind, and 23 posts (4.2%) have 100 or more likes. Over the last 52 weeks the volume is 2.9 posts a week on average (median 2, peak 12, 9 weeks with none), so this is a small, steady conversation rather than a flood, and the recent share of it is overwhelmingly about money.

Horizontal grouped bar chart of the share of public posts about the X developer account matching six keyword buckets, last 12 months (153 posts) versus whole sample (547 posts). Price, cost or credits 62.1% versus 30.5%. How-to question or help request 48.4% versus 39.7%. Suspension, ban or lock 22.2% versus 11.3%. Approval or getting access 12.4% versus 9.9%. The words use case 3.3% versus 1.8%. Rejection or denial 2.6% versus 2.4%. Footer: keyword buckets are a rough classifier of public posts, not X's approval rate.
Share of public English posts about the X developer account, portal or access that match each keyword bucket, last 12 months vs the whole 547-post sample, collected in 2026. A post can match several buckets; the buckets classify what people posted, not X's decisions.
07 — Section

What @XDevelopers itself talks about

For the other side of the conversation we pulled the 200 most recent posts from @XDevelopers, X's official developer account, with /twitter/user/last_tweets (10 pages, replies excluded by default, collected in 2026). Because the account posts in bursts, 200 posts span 1,610 days: 113 of them are from 2022, then 12, 20, 32 and 23 in the following years. We counted four keyword buckets over the text.

Topic (keywords, abridged)Posts of 200Share
New endpoint, release or update (endpoint, launch, introducing, now available, release, beta, update)8241.0%
Sign-up, access or developer console (sign up, developer portal, developer account, console, apply, getting started, access)2914.5%
Pricing or credits (price, credits, pay-per, billing, free, $)157.5%
Policy, terms or rules (policy, agreement, terms, rules, compliance, enforcement)10.5%
None of the four10351.5%

The asymmetry is the finding. The account that approves your use case has, in its last 200 posts, mentioned policy, terms or rules exactly once, while 41% of its posts announce or update endpoints and 14.5% talk about sign-up, access or the console. Developers, meanwhile, spend 62% of their recent posts on price and 22% on suspensions. If you want to know what the rules are, the policy pages quoted above are the source; the announcement feed will not tell you. 17.5% of the @XDevelopers posts are quotes of other posts and 0.5% reposts; none are replies, because the default timeline call excludes them.

Horizontal bar chart of the share of @XDevelopers' 200 most recent posts matching four keyword buckets. New endpoint, release or update 41.0%, 82 of 200. Sign-up, access or developer console 14.5%, 29 of 200. Pricing or credits 7.5%, 15 of 200. Policy, terms or rules 0.5%, 1 of 200. Subtitle: 52% match none of the four buckets.
Share of @XDevelopers' 200 most recent posts (an organization account, 1,610 days of posting) that match each keyword bucket, collected in 2026. One post in 200 mentions policy or terms.
08 — Section

Need the data today? The path with no application

If your use case is reading public posts and profiles (research, monitoring, a dashboard, a dataset), you do not have to write the essay or wait for a review. twitterapi.io serves the same public data through plain REST endpoints with one API key sent in an X-API-Key header: no developer account, no use-case description, and no X account of your own for reads. You pay only for the data returned: 15 credits per tweet returned, so $0.15 per 1,000 tweets, with a 15-credit minimum per request ($0.00015 for a search that returns nothing); profiles are 18 credits each; $1 is 100,000 credits and purchased credits never expire. New accounts that pass the automatic bot check get $1 in free credits (one per person or network; others get $0.10), expiring after 31 days, and the rate limit is 0.2 requests a second until the first payment and 20 after it.

What it maps to. The academic answer above (keyword search for public posts) is /twitter/tweet/advanced_search with the same operators X's search uses (lang:en, since:, until:, from:, -filter:retweets), 20 tweets a page, following next_cursor while has_next_page is true. The monitoring bot's "12 organization accounts, every five minutes" is /twitter/user/last_tweets per account, or one advanced_search with from:a OR from:b since_time:<unix> so an idle check returns nothing and costs the minimum (every 5 minutes for a month is 8,640 checks, $1.30). The dashboard's "who mentions us" is /twitter/user/mentions; profile fields come from /twitter/user/info, which returns followers, following, statusesCount, createdAt, isBlueVerified and so on. The full endpoint list is in the X API docs explainer and the reference at docs.twitterapi.io; the free-tier question is answered there too.

What it is not, honestly. twitterapi.io is not an OAuth provider: there is no "Sign in with X" for your users and no acting on their behalf, so use cases 4 and 5 above still need the official developer account. Writes exist, but they act as your own account: one call to /twitter/user_login_v2 (10,000 credits, $0.10, with a residential proxy you supply and ideally a totp_secret) returns login_cookies, and each post, delete, like, repost, follow, unfollow or message is then 200 credits ($0.002) per call through endpoints such as /twitter/create_tweet_v2. Every write runs as that account, so X can rate-limit, lock or suspend it; keep a human pace, expect the session to need a fresh login now and then, and note that calls are billed per HTTP 200 response, not per visible outcome. The same automation rules you would promise to follow in the application apply to what you post this way, because they are X's account rules, not developer-account rules.

When the official route is still right. You need user-context OAuth, you are building a product whose license story has to be clean for a procurement team, or your monthly volume is Enterprise-scale with a contract to match. In those cases write the answer with the six samples as a template. For everything that is "read public data and analyze it", the script below is the whole onboarding.

bash
# No application form: one key from the twitterapi.io dashboard, sent as X-API-Key.
# 1. Sanity-check a public account (18 credits = $0.00018)
curl -s -H "X-API-Key: $TWITTERAPI_IO_API_KEY" \
  "https://api.twitterapi.io/twitter/user/info?userName=XDevelopers" | python3 -m json.tool | head -30

# 2. One page of public posts about the developer account (up to 20 tweets = at most $0.003)
curl -s -G -H "X-API-Key: $TWITTERAPI_IO_API_KEY" \
  --data-urlencode 'query=("developer account" OR "developer portal") ("x api" OR "twitter api") lang:en -filter:retweets' \
  --data-urlencode 'queryType=Latest' \
  "https://api.twitterapi.io/twitter/tweet/advanced_search" | python3 -c "import json,sys; d=json.load(sys.stdin); print(len(d['tweets']), 'tweets; has_next_page =', d['has_next_page'])"
09 — Section

How we collected this

Question: what do developers say in public about applying for X developer access, and what does X's own developer account talk about? Specifically: among recent English posts that name the developer account, portal, access or application together with the X or Twitter API, what share mention rejection or denial, approval, suspension, price, or ask for help (keyword buckets); how many posts a week there are; what share are replies or carry links; and, for @XDevelopers' most recent 200 posts, what share mention pricing, policy, sign-up or new endpoints.

Query and accounts: four /twitter/tweet/advanced_search variants with queryType=Latest built from ("developer account" OR "developer portal" OR "developer access" OR "developer application") combined with ("x api" OR "twitter api") or (x OR twitter) api, lang:en -filter:retweets, one variant each with filter:links and -filter:links, plus a variant adding ("use case" OR approved OR rejected OR denied OR suspended); and /twitter/user/last_tweets for @XDevelopers, 10 pages.

Window and sample: the most recent matching posts at collection time, collected in 2026. The search variants ran out of results, so the 547 unique posts (from 493 authors) span 4,341 days; 153 are from the last 12 months and that subset is the headline. 56 requests in total (46 search pages, 10 timeline pages), 971 tweets returned, about $0.15 in API reads. The whole study, including the collection and analysis scripts, is reproducible with the analyze.py and charts.py kept alongside it.

Method: regular-expression keyword buckets over each post's lower-cased text (the exact patterns are printed by analyze.py and listed, abridged, in the tables above); a post may match several buckets. Replies from isReply, links from entities.urls, media from extendedEntities.media, engagement from likeCount, retweetCount, replyCount and quoteCount. Weekly volume is the count of posts per ISO week over the 52 weeks before the newest post.

What the sample cannot show: it is not X's approval or rejection rate. It counts what people chose to post publicly in English, matched by keywords; a post saying "finally approved after being rejected twice" lands in both buckets, sarcasm is invisible to a regex, and people who were approved quietly or rejected quietly do not appear at all. The queries exclude non-English posts and reposts, and "Latest" ordering plus exhausted queries mean the older years are thin and unrepresentative. The @XDevelopers count covers its last 200 posts, more than half of which are from one year, and replies were excluded by the default call. None of this measures review wait times, which we therefore do not state.

Aggregates only. The search results come from private individuals, so their raw pages were kept outside the repository and deleted after analysis; sample.json holds one de-identified row per post (bucket flags, reply, link and media flags, a like-count band and an ISO week) with no ID, URL, text, author or handle. @XDevelopers is an organization account and its raw pages are kept gzip-compressed with the study. No individual is named or quoted, and no customer of ours is referenced.

python
"""public_posts_about_a_topic.py - the 'read public data' use case with no developer application.

    pip install requests
    export TWITTERAPI_IO_API_KEY=...   # one key from the twitterapi.io dashboard; no X account needed for reads
    python public_posts_about_a_topic.py

Cost: 15 credits per tweet returned ($0.15 per 1,000 tweets), minimum 15 credits per request, so a
full 20-tweet page is $0.003 and an empty page $0.00015. Profiles are 18 credits each.
"""
import csv
import os
import time
from collections import Counter
from datetime import datetime

import requests

BASE = "https://api.twitterapi.io"
HEADERS = {"X-API-Key": os.environ["TWITTERAPI_IO_API_KEY"]}
QUERY = '("developer account" OR "developer portal") ("x api" OR "twitter api") lang:en -filter:retweets'
MAX_PAGES = 10          # 10 pages = up to 200 tweets = at most $0.03


def parse_created(s):
    # createdAt looks like "Thu Oct 16 12:34:56 +0000 2026", not ISO 8601
    return datetime.strptime(s, "%a %b %d %H:%M:%S %z %Y")


def user_info(handle):
    """Profile fields: followers, following, statusesCount, createdAt, isBlueVerified ... (18 credits)."""
    r = requests.get(f"{BASE}/twitter/user/info", headers=HEADERS, params={"userName": handle}, timeout=30)
    r.raise_for_status()
    body = r.json()
    if body.get("status") == "error":        # unknown handle: HTTP 200 with status "error", data null
        raise LookupError(body.get("msg"))
    return body["data"]


def search(query, max_pages=MAX_PAGES, query_type="Latest"):
    """Follow next_cursor while has_next_page is true; tweets[] is top-level on this endpoint."""
    tweets, cursor = [], None
    for _ in range(max_pages):
        params = {"query": query, "queryType": query_type}
        if cursor:
            params["cursor"] = cursor
        r = requests.get(f"{BASE}/twitter/tweet/advanced_search", headers=HEADERS, params=params, timeout=30)
        if r.status_code == 429:               # 0.2 requests/s before the first payment, 20 after
            time.sleep(5)
            continue
        r.raise_for_status()
        body = r.json()
        page = body.get("tweets") or []
        tweets.extend(page)
        if not page or not body.get("has_next_page") or not body.get("next_cursor"):
            break
        cursor = body["next_cursor"]
    return tweets


if __name__ == "__main__":
    org = user_info("XDevelopers")
    print(f"@{org['userName']}: {org['followers']:,} followers, {org['statusesCount']:,} posts, created {org['createdAt']}")

    tweets = search(QUERY)
    print(f"{len(tweets)} tweets, about ${len(tweets) * 15 / 100000:.4f} in reads")

    # The analysis your use-case answer would describe: counts by week, reply share, link share.
    by_week = Counter(parse_created(t["createdAt"]).strftime("%G-W%V") for t in tweets)
    replies = sum(1 for t in tweets if t.get("isReply"))
    with_link = sum(1 for t in tweets if (t.get("entities") or {}).get("urls"))
    print(f"replies: {replies / max(1, len(tweets)):.1%}   with a link: {with_link / max(1, len(tweets)):.1%}")
    for week, n in sorted(by_week.items())[-8:]:
        print(f"  {week}: {n}")

    # Keep what a 'public dataset' answer promises to keep: IDs and aggregates, not text.
    with open("post_ids.csv", "w", newline="") as f:
        w = csv.writer(f)
        w.writerow(["id", "createdAt", "likeCount", "retweetCount", "replyCount", "isReply", "lang"])
        for t in tweets:
            w.writerow([t["id"], t["createdAt"], t.get("likeCount", 0), t.get("retweetCount", 0),
                        t.get("replyCount", 0), bool(t.get("isReply")), t.get("lang")])
    print("wrote post_ids.csv")
10 — Questions

Questions readers ask

What should I write for "How will you use the Twitter API or Twitter data"?

Five things, plainly: who you are (person or organization, with a URL if you have one); which data you will read or write (public posts by keyword, one account's posts, your own account's data, user profiles); what your software does with it and where results are shown (a dashboard, a paper, your own account, inside your app); that you will not resell or redistribute X content beyond IDs; and whether anything is automated (posting to your own account only, or no posting, following, liking or messaging at all). The X Developer Policy makes this description binding, so write what you will actually do.

Is there a minimum length for the use-case description?

The current docs.x.com getting-access guide does not publish one; it describes the step as providing basic information about how you will use the API, then a name, description and use case for your app. The older portal asked for at least 250 characters. Covering the five elements above usually takes 600 to 1,200 characters, which is also roughly the length of the six sample answers on this page.

Why do X developer applications get rejected?

The policy pages point at a fixed list: redistributing or selling X content (only Post IDs, Direct Message IDs and User IDs may be distributed, up to 1,500,000 Post IDs per 30 days), bulk or aggressive automation such as bulk following, automated replies or DMs without explicit consent, posting the same content across several accounts, surveillance or inferring sensitive attributes, training a foundation or frontier model on X content, registering several apps for one use case, names or logos that imply an affiliation with X, and vague answers that do not disclose the planned use. In our 547-post public sample, only 2.6% of the last 12 months' posts mentioned a rejection, against 12.4% mentioning approval; suspensions were mentioned far more often (22.2%).

How long does X developer account approval take?

X does not publish a review period on the docs.x.com getting-started or policy pages we checked this session, so we do not state one. The getting-access guide describes signing in at console.x.com, accepting the Developer Agreement and Policy, providing information about your use, creating an app and receiving credentials from the console; if your use case needs a closer look you may be asked follow-up questions. If you need public data before a review finishes, twitterapi.io needs no application.

Can my use case change after approval?

Yes, but you must tell X first. The Developer Policy says your use case description is binding and that you must notify X of any substantive modification to your use case and receive approval before using X content for the new purpose. Changing quietly, for example from an internal dashboard to automated replies, is what the policy calls a substantive deviation, and the enforcement clause allows X to suspend or permanently revoke access.

What does the X API cost once I am approved?

The docs.x.com pricing page lists pay-per-usage prices: $0.005 per post read, $0.010 per user read, $0.010 per follower or following read, $0.001 per like read, $0.015 per post created ($0.200 when it contains a URL), with a cap of 3 million post reads per monthly billing cycle before an Enterprise plan is required. You get $20 in credits when you save a first eligible card and a match of up to $50 on the first auto-recharge. For comparison, twitterapi.io bills 15 credits per tweet returned, $0.15 per 1,000 tweets, about 33x less per 1,000 than $5 per 1,000 on the official card.

Can I use the Twitter API without a developer account?

Not the official one: every official endpoint needs credentials from console.x.com, which means the developer account and the use-case description. For reading public posts and profiles you can use twitterapi.io instead, which needs only an API key in an X-API-Key header, no application and no X account for reads; endpoints include /twitter/tweet/advanced_search, /twitter/user/last_tweets and /twitter/user/info. It does not provide Sign in with X or act on your users' behalf; writes act as your own account through a /twitter/user_login_v2 session at $0.002 per action, and X can rate-limit, lock or suspend that account.

Can I say I will train a machine-learning model on tweets?

Be precise about which kind. The restricted-use-cases page on docs.x.com prohibits using the X APIs or X content to fine-tune or train a foundation or frontier model, with the exception of Grok. A task-specific classifier used inside your own product (complaint vs question vs praise, for instance) is a different use case; describe it as such, state that no X content is used to train a general-purpose model, say how long raw posts are kept, and confirm nothing is redistributed.

11 — Further reading

Continue

Sources & further reading
More from this series
Build it

Stop reading. Start building.

Starter credits cover real testing on real data. Google sign-in, no card, no application queue.

Get an API key