7-day offer$199$9
X-Autopilot

X API trends: two endpoints that disagree on one number

The X API trends endpoints in 2026: volume is opt-in, the two paths name and type the same count differently, and one is capped at 200 app calls a day.

X-Autopilot Team··9 min read
On this page · 8 sections

The short version

  • ▸Trend volume is opt-in. Both endpoints return names only unless you pass the fields parameter, and the example response in X's own WOEID guide shows the stripped version without saying why.
  • ▸The same number has two names and two types across the namespace. Trends by WOEID returns tweet_count as an integer, personalized trends returns post_count as a string, and X's personalized-trends example shows tweet_count, which is not a valid field there.
  • ▸Trends bills $0.010 per request on the write table, so it is the one data type where deduplication does not apply. Polling the identical trend list every 12 seconds is charged every time.
  • ▸max_trends defaults to 20 and caps at 50 for the same $0.010, so the default leaves 30 trends unclaimed at no saving.
  • ▸Personalized trends is capped at 200 requests per 24 hours per app, app-wide rather than per user, and needs a Premium subscriber to authenticate. Past about 200 users it cannot serve your product once a day at any price.

Quick answer

X API trends is two endpoints, and they do not agree with each other. GET /2/trends/by/woeid/:id returns tweet_count as an integer. GET /2/users/personalized_trends returns post_count as a string. Both return names and no numbers unless you ask for the field, and X's documented example for each one demonstrates the wrong half of that. The bill is $0.010 per request either way, and trends is the only data type on the rate card that deduplication does not cover.

Last updated: November 2026

Three facts decide whether this namespace is usable: volume is opt-in, the price is per request rather than per result, and the personalized endpoint has a daily ceiling you cannot buy your way past.

Two endpoints, and a third page with nothing behind it

Trends on X (formerly Twitter) are the ranked topic lists in the Explore tab. How they get built on the product side is a separate piece on X trending topics. On the API side the surface is this small:

EndpointAuthCount parameterBilled
GET /2/trends/by/woeid/:idapp-only Bearer or user tokenmax_trends, default 20, max 50$0.010 per request
GET /2/users/personalized_trendsOAuth 2.0 user context onlynone at all$0.010 per request

X's documentation index lists a third reference page, "Get AI trend by ID", promising "a single AI-curated trend by its identifier, including metadata about the trend and the Posts driving it". Open it and there is a heading, that sentence, and nothing else. No path, no parameters, no response schema, no example. The live API description at version 2.174 contains no AI trends path either, and X's own rate-limit reference heads the section "Trends (2 endpoints)". The page is linked from both the X API v2 index and the Enterprise API index, so it is doubly advertised and entirely empty.

Worth noting what else is missing from the changelog. Trends by WOEID was announced on 12 December 2023. Personalized trends never was. Neither was an AI trends endpoint. One of the two live endpoints in the namespace arrived without any announcement at all, which is the same documentation pattern we hit tracing the X API rate limits for newer paths.

Volume is opt-in, and both examples get it wrong

Here is X's example request for trends by WOEID, verbatim:

curl "https://api.x.com/2/trends/by/woeid/1" \
  -H "Authorization: Bearer $BEARER_TOKEN"

And the example response printed directly beneath it:

{ "data": [ { "trend_name": "#AI" }, { "trend_name": "Breaking News" } ] }

Those two are consistent, and that is the problem. The response has no volume because the request did not ask for any. trend.fields accepts exactly two values, trend_name and tweet_count, and omitting the parameter gets you half the object. Nothing on the page says so. A developer copying the quickstart concludes the endpoint does not report volume.

What you want is this:

curl "https://api.x.com/2/trends/by/woeid/1?\
max_trends=50&trend.fields=trend_name,tweet_count" \
  -H "Authorization: Bearer $BEARER_TOKEN"

The personalized-trends page has the mirror-image bug. Its example response shows:

{ "data": [ { "trend_name": "#AI", "tweet_count": 125000 } ] }

tweet_count is not a valid field on that endpoint. The personalized_trend.fields enum holds category, post_count, trend_name and trending_since. So X's documented example for personalized trends advertises a field the schema does not have, while omitting the two fields that make the endpoint interesting: category, which buckets the trend, and trending_since, which tells you how old it is.

The same number, two names, two types

This is the detail that will break a client written against one endpoint and pointed at the other:

Trends by WOEIDPersonalized trends
Field nametweet_countpost_count
JSON typeintegerstring
Fields parametertrend.fieldspersonalized_trend.fields
Other fieldsnonecategory, trending_since

One namespace, one concept, and nothing shared. If you normalise trends from both sources into one table, the integer-versus-string split is a silent type coercion waiting to land, and the field name difference means a client reading tweet_count from the personalized response gets undefined rather than an error.

Naming also tells you roughly when each was built. tweet_count predates the rename of Tweets to Posts; post_count came after. X renamed the concept and shipped the second endpoint with the new vocabulary without touching the first.

Why the per-request price matters more than it looks

Trends sits on the write table of the pay-per-use rate card, at $0.010 per request. Three consequences follow, and all three are arithmetic rather than opinion.

max_trends is free money up to 50. The parameter defaults to 20 and caps at 50. The charge is per request, not per trend returned. So a default call pays $0.010 for 20 trends and a maxed call pays $0.010 for 50. There is no reason to ever send the default.

Deduplication does not apply. The rate card deduplicates billable resources inside a 24-hour UTC window: request the same Post twice today and you are charged once. That mechanism needs a resource to key on. A per-request charge has none, so every repeat poll of an unchanged trend list is a fresh $0.010. Trends is the one data type here where polling the identical payload bills every single time, which is the opposite of how the Posts side of X API pricing behaves.

It is twice the price of a Post read. A Post resource is $0.005. One trends request, which returns no Post text, no author and no engagement, is $0.010. At the 75-per-15-minutes app ceiling, continuous WOEID polling tops out around $72 a day per app.

And personalized trends does not get the owned-read discount. Owned Reads drop to $0.001 per resource when your app reads its owner's own data, and the qualifying list runs to twelve endpoints covering your Posts, mentions, likes, bookmarks, followers, following, blocks, mutes and lists. Personalized trends reads nothing but the authenticated user's own data. It is not on the list. It stays at $0.010, ten times the rate X charges for every other flavour of "your own stuff".

The 200-a-day cap is the real ceiling

Here is where personalized trends stops being a product feature.

LimitTrends by WOEIDPersonalized trends
Per app, 15 min75200
Per app, 24 hrsnot listed200
Per user, 15 minnot listed10
Per user, 24 hrsnot listed100

The per-app 200 per 24 hours is app-wide, not per user. Your entire application gets 200 personalized-trends calls a day across every account that has authorised it. Fifty users can be refreshed four times a day each. Two hundred users can be refreshed once. Beyond that, somebody goes without, and no amount of credit changes it, because the constraint is quota rather than money. The theoretical maximum you can spend on personalized trends is $2.00 a day.

Note too that the 200-per-15-minutes app figure is a decoy. Two hundred calls inside one window consumes the whole day's allowance, so the two app limits are the same number wearing different hats.

Then there is the subscription requirement. X's prerequisites for personalized trends list a Premium user subscription alongside the OAuth 2.0 PKCE tokens. The endpoint needs your user to be paying X, on top of the app-wide quota. Trends by WOEID asks for none of that and accepts a plain app-only Bearer token, which is why almost everything built on X trends is built on WOEIDs.

There is no way to discover a WOEID

WOEID is Yahoo's Where On Earth identifier, inherited from the v1.1 era. Version 1.1 shipped two helper endpoints for it, trends/available and trends/closest. Neither exists in v2. The 2.174 description has exactly two trends paths, and the woeid path parameter is a bare integer with no enum, no minimum and no maximum, so the API will accept any number you send it and will not tell you which numbers mean anything.

What X publishes is eight values:

LocationWOEID
Worldwide1
United States23424977
United Kingdom23424975
Japan23424856
New York2459115
Los Angeles2442047
London44418
Tokyo1118370

If your product needs Berlin, Lagos, São Paulo or any of the hundreds of other locations X has historically supported, the v2 API offers no route to the number and no route to the list. That is the single biggest practical gap in the namespace, and it is why so many "X trends API" pages you will find are selling a resolver rather than documenting one.

What to use instead, depending on what you wanted

If you wanted volume on a specific topic rather than a ranked list, the trends endpoints are the wrong tool. Recent counts give you a time series for an arbitrary query, which is both more precise and cheaper per unit of information than polling a top-50 list; the mechanics are in our notes on X API search. Counts: Recent is $0.005 per request against trends at $0.010.

If you wanted trends to decide what to post about, the honest read is that a ranked list of 50 strings with a volume number is a weak input. It tells you what is loud, not what your audience responds to, and by the time a term is in a national top 50 the reply slots on the big Posts are gone. X-Autopilot works the other end of that problem, running on your own Mac in your own browser session so there is no shared cloud IP pool in the path. That is a smaller detection surface than a hosted scheduler, not a risk-free one, and automating engagement through a browser sits in a gray area under X's rules rather than being something X sanctions. The trends endpoints are fully sanctioned. They just answer a narrower question than their name suggests.

Frequently asked

Answers indexed by Google + AI assistants.

What are the X API trends endpoints?+

Two. GET /2/trends/by/woeid/:id returns trending topics for one location and accepts an app-only Bearer token, and GET /2/users/personalized_trends returns trends for the authenticated user and requires OAuth 2.0 user context with the users.read and tweet.read scopes plus, per X's prerequisites, a Premium user subscription. X's rate-limit reference confirms the count in its heading, 'Trends (2 endpoints)'. A third documentation page titled 'Get AI trend by ID' exists but contains no endpoint path, no parameters and no schema, and no matching path exists in the live API description at version 2.174.

Why does the X API trends response have no volume?+

Because you did not ask for it. On the WOEID endpoint the trend.fields parameter accepts exactly two values, trend_name and tweet_count, and omitting the parameter returns names alone. The example request in X's WOEID guide omits it, and the example response beside it accordingly shows only trend_name. Pass trend.fields=trend_name,tweet_count to get numbers. On personalized trends the parameter is personalized_trend.fields and the four values are category, post_count, trend_name and trending_since.

How much does the X API trends endpoint cost?+

$0.010 per request. Trends sits on the write table of the pay-per-use rate card, which is charged per request rather than per resource returned, so max_trends=50 costs exactly the same as max_trends=1. It is also the reason trends escapes deduplication: the rate card deduplicates billable resources within a 24-hour UTC window, but a per-request charge has no resource to deduplicate, so each repeat poll is a fresh $0.010.

What is the rate limit on personalized trends?+

200 requests per 24 hours and 200 per 15 minutes at the app level, and 100 per 24 hours with 10 per 15 minutes per user. The app-level daily figure is the one that constrains a product, because it is shared across every user of your app rather than granted per user. The 15-minute app figure is effectively decorative, since 200 calls in one window exhausts the entire day. Trends by WOEID is far looser at 75 requests per 15 minutes per app with no per-user limit listed.

Where can I get a list of valid WOEIDs for the X API?+

Not from the X API v2. There is no trends/available or trends/closest path in the 2.174 description, and the woeid path parameter is a bare integer with no enum, no minimum and no maximum, so the API will not tell you which values it accepts. The WOEID guide publishes eight: 1 for Worldwide, 23424977 for the United States, 23424975 for the United Kingdom, 23424856 for Japan, 2459115 for New York, 2442047 for Los Angeles, 44418 for London and 1118370 for Tokyo. Anything else is a guess against an unpublished list.

Does personalized trends qualify for Owned Read pricing?+

No, and it is the clearest gap on the rate card. Owned Reads drop to $0.001 per resource when an app reads its owner's own data, and the qualifying list covers your Posts, mentions, likes, bookmarks, followers, following, blocks, mutes and four kinds of list. Personalized trends reads nothing except the authenticated user's own data and is not on that list, so it stays at $0.010 per request, ten times the owned-read rate.

Sources
Related searches
x api trendsx api trends by woeid/2/users/personalized_trendsx api trend.fields tweet_countx api trends pricingmax_trends x apitwitter trends api v2x api personalized trends rate limitx api pricingx api rate limitsx trending topicsx api searchx api v2 endpointspay per use api creditswoeid list
DY
Deepak YadavBuilding X-Autopilot

Product designer and indie hacker. Runs the agent on his own X account every day and writes up what the data shows, including when it's inconvenient.

Follow on X →
Try X-Autopilot.
7-day offer: $199 $9 once. No subscription, no monthly bill. Real Chrome on your Mac.
See pricing▶
Free PDF · the X Growth Playbook

The exact playbook we use to grow on X

The bio that converts, the daily reply loop, the posting cadence, and the tool stack, in one no-fluff PDF. Drop your email and it's yours.

No spam. Unsubscribe anytime.

Free tools

Try it yourself.

All free X tools →
Keep reading

Related posts.