Surfaces
Besides top posts, Jetfuel runs the Creator hub, Stories, News, the sports and live-events hub, onboarding and a few framework routes. Most of these payloads describe UI components rather than data with a clean model, so these helpers fetch and decode the page and leave you to read its strings, nodes and timelineTokens. Each one calls jetfuel.page(route) with a fixed route, and all of them accept the same opts as page.
Stories and news
jetfuel.stories(opts?)
The Stories browser (stories/home), a news hub split into categories such as Top Stories, For You, Politics, Sports and Technology.
const home = await client.jetfuel.stories();
home.strings.includes("Top Stories"); // truejetfuel.storiesRemote({ category }, opts?)
One Stories category feed (stories/storiesRemote). Pass a category, since Twitter returns an empty stub without one.
const sports = await client.jetfuel.storiesRemote({ category: "Sports" });jetfuel.newsArticle(id, opts?)
A news article page (news/article/id/<id>). The id comes from a Stories or News card.
const article = await client.jetfuel.newsArticle("1895256113429241856");Sports and live events
Twitter's sports and live-events hub, including fantasy leagues and brackets. Event ids come from timeline score cards. Sports Twitter hasn't moved to Jetfuel yet render an error_not_found placeholder.
jetfuel.sportHome(sport, opts?)
A sport's landing page (<sport>/home), such as f1, nba or nfl.
const f1 = await client.jetfuel.sportHome("f1");jetfuel.league(sport, opts?)
A sport's fantasy-league page (<sport>/league/home), such as nba, nfl, soccer or ncaamb.
await client.jetfuel.league("nba");jetfuel.game({ sport, id, noun?, home? }, opts?)
One game, race or match. The route differs per sport, so emusks picks it from this table. noun and home override it for other sports:
| Sport | Route shape |
|---|---|
nba, nfl | <sport>/game/home/id/<id> |
f1 | f1/race/home/id/<id> |
nhl | nhl/game/id/<id> |
soccer | soccer/match/id/<id> |
await client.jetfuel.game({ sport: "f1", id: "1895256113429241856" });
await client.jetfuel.game({ sport: "soccer", id: "..." });
await client.jetfuel.game({ sport: "ncaamb", id: "...", noun: "game", home: true });jetfuel.event(id, opts?)
The generic event screen (events/event?id=<id>). Event pages embed a Timeline: token, returned in timelineTokens, which you can resolve with GenericTimelineById like top posts does.
const ev = await client.jetfuel.event("1895256113429241856");
ev.timelineTokens; // ["VGltZWxpbmU6..."]jetfuel.brackets(opts?)
The March Madness bracket challenge (brackets/home). Twitter gates it behind the march_madness_brackets_enabled flag and renders error_not_found when it's off.
await client.jetfuel.brackets();jetfuel.bracketView(userId?, opts?)
A user's bracket (brackets/view/id/<userId>), or yours (brackets/view) without a user id.
await client.jetfuel.bracketView("44196397");Creator hub and onboarding
jetfuel.creatorsStudio(opts?)
The Creator hub home (creators/studio), with links to revenue sharing, subscriptions, inspiration and payouts. Twitter gates most sub-pages per account. Fetch them with page:
await client.jetfuel.page("creators/revenue_sharing");
await client.jetfuel.page("creators/subscriptionsv2/eligibility");
await client.jetfuel.page("creators/stripe_connect");jetfuel.onboardingTopics(opts?)
The onboarding "Pick your interests" catalog (onboarding/remotes/topics), with every topic and its select and deselect actions in nodes.
const topics = await client.jetfuel.onboardingTopics();
topics.nodes.filter((n) => n.type === "deselect_topic").map((n) => n.key);
// ["News", "Sports", "Business & Finance", ...]Framework
jetfuel.health(opts?)
The health check at jf.x.com/health, which is outside the jfapi data API. Returns the plain-text body.
await client.jetfuel.health(); // "I'm good, mom"ogImageUrl(tweetId) and mediaPreviewUrl(tweetId) are on the requests page.