X (Twitter) API for tweets, timelines and followers
Search tweets with the operators you already use on X, read any public timeline, and list who follows, retweets or quotes. Pay per tweet, starting with free credits.
request.ts
import { Bridgly } from "@bridgly/sdk";const client = new Bridgly({ apiKey: "bgly_YOUR_KEY" });const res = await client.x.search({ query: "from:OpenAI filter:links", sortOrder: "Latest", count: 10});if (res.type === "success") { console.log(res.data);}npm install @bridgly/sdk
All 11 X (Twitter) endpoints
Tweet search takes a raw query, so anything that works in the X search box works here: from:, to:, exact phrases, min_faves:, filter:links and the rest. Results can be ordered newest-first or by X’s own ranking, and limited to the last N hours.
Every tweet comes back with its reply, retweet, like, quote, bookmark and view counts, the language X detected, its hashtags, mentions, expanded links and media, and enough about the author to show it without a second call.
A profile lookup returns follower and following counts, tweet, like and media totals, verification type, bio links and the pinned tweet. From a user you can list their tweets, replies, media, followers and following. From a tweet you can list its reply thread, who retweeted it and who quoted it.
Search
Find tweets with advanced-search operators, or find accounts by name and bio.
POST/x/search
Tweets matching an advanced-search query, with text, author, media and engagement counts1 credit per resultDocs →
Request body
querystringrequired- Raw search query — supports all X advanced-search operators, e.g. "openai lang:en".
withinHoursnumber- Only return tweets newer than this many hours.
countinteger · 1–10 · default 10- Number of results to return (1–10). Defaults to 10.
sortOrderenum- Result ordering: "Latest" = chronological newest-first (default), "Top" = X's engagement ranking.
- Latest | Top
langstring- BCP-47 language filter e.g. "en", "ja" (maps to `lang:XX`).
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": [ { "id": "string", "url": "string", "text": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ], "authorId": "string", "authorHandle": "string", "authorName": "string", "authorUrl": "string", "authorIsVerified": true, "authorIsBlueVerified": true } ]}POST/x/search/users
Accounts matching a name or keyword, with bio and follower counts1 credit per resultDocs →
Request body
querystringrequired- Raw search query — supports all X advanced-search operators, e.g. "openai lang:en".
countinteger · 1–10 · default 10- Number of results to return (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "users": [ { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "websiteUrl": "string", "bioUrls": [ { "url": "string", "displayUrl": "string" } ], "followerCount": 0, "followingCount": 0, "fastFollowersCount": 0, "normalFollowersCount": 0, "tweetCount": 0, "likeCount": 0, "mediaCount": 0, "listedCount": 0, "creatorSubscriptionsCount": 0, "highlightedTweetsCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "isVerified": true, "isBlueVerified": true, "verifiedType": "string", "isIdentityVerified": true, "isProtected": true, "canDm": true, "professionalType": "string", "professionalId": "string", "professionalCategoryId": 0, "professionalCategoryName": "string", "affiliate": { "label": "string", "username": "string", "profileUrl": "string", "badgeUrl": "string" }, "tipJar": { "isEnabled": true, "bitcoinHandle": "string", "ethereumHandle": "string", "venmoHandle": "string", "venmoUrl": "string", "cashAppHandle": "string", "cashAppUrl": "string", "patreonHandle": "string", "patreonUrl": "string" }, "createdAt": "2026-01-15T09:30:00.000Z" } ], "nextCursor": "string" }}Profiles and timelines
One account’s profile and what it has been posting.
POST/x/get-user
Profile: bio, location, follower and following counts, tweet totals, verification and pinned tweet1 credit per requestDocs →
Request body
handlestringrequired- X handle / screen name, with or without the @, e.g. "elonmusk".
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "websiteUrl": "string", "bioUrls": [ { "url": "string", "displayUrl": "string" } ], "followerCount": 0, "followingCount": 0, "fastFollowersCount": 0, "normalFollowersCount": 0, "tweetCount": 0, "likeCount": 0, "mediaCount": 0, "listedCount": 0, "creatorSubscriptionsCount": 0, "highlightedTweetsCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "isVerified": true, "isBlueVerified": true, "verifiedType": "string", "isIdentityVerified": true, "isProtected": true, "canDm": true, "professionalType": "string", "professionalId": "string", "professionalCategoryId": 0, "professionalCategoryName": "string", "affiliate": { "label": "string", "username": "string", "profileUrl": "string", "badgeUrl": "string" }, "tipJar": { "isEnabled": true, "bitcoinHandle": "string", "ethereumHandle": "string", "venmoHandle": "string", "venmoUrl": "string", "cashAppHandle": "string", "cashAppUrl": "string", "patreonHandle": "string", "patreonUrl": "string" }, "createdAt": "2026-01-15T09:30:00.000Z" }}POST/x/get-user-tweets
An account’s tweets, newest first, with engagement counts1 credit per resultDocs →
Request body
userIdstringrequired- Numeric user ID (rest_id) whose tweets to list, e.g. "44196397".
countinteger · 1–10 · default 10- Number of tweets to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "tweets": [ { "id": "string", "url": "string", "text": "string", "author": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "followerCount": 0, "followingCount": 0, "tweetCount": 0, "mediaCount": 0, "likeCount": 0, "listedCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "isVerified": true, "isBlueVerified": true }, "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "retweetedTweetId": "string", "retweetedTweetUrl": "string", "retweetedTweetAuthorId": "string", "retweetedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ] } ], "nextCursor": "string" }}POST/x/get-user-replies
An account’s replies, with the tweet each one answers1 credit per resultDocs →
Request body
userIdstringrequired- Numeric user ID (rest_id) whose tweets to list, e.g. "44196397".
countinteger · 1–10 · default 10- Number of tweets to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "tweets": [ { "id": "string", "url": "string", "text": "string", "author": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "followerCount": 0, "followingCount": 0, "tweetCount": 0, "mediaCount": 0, "likeCount": 0, "listedCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "isVerified": true, "isBlueVerified": true }, "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "retweetedTweetId": "string", "retweetedTweetUrl": "string", "retweetedTweetAuthorId": "string", "retweetedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ] } ], "nextCursor": "string" }}POST/x/get-user-media
An account’s tweets that contain photos or video, with media URLs1 credit per resultDocs →
Request body
userIdstringrequired- Numeric user ID (rest_id) whose tweets to list, e.g. "44196397".
countinteger · 1–10 · default 10- Number of tweets to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "tweets": [ { "id": "string", "url": "string", "text": "string", "author": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "followerCount": 0, "followingCount": 0, "tweetCount": 0, "mediaCount": 0, "likeCount": 0, "listedCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "isVerified": true, "isBlueVerified": true }, "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "retweetedTweetId": "string", "retweetedTweetUrl": "string", "retweetedTweetAuthorId": "string", "retweetedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ] } ], "nextCursor": "string" }}Audience
Who follows an account, and who that account follows.
POST/x/get-followers
Followers of an account, each with bio, location and counts1 credit per resultDocs →
Request body
userIdstringrequired- Numeric user ID (rest_id) whose tweets to list, e.g. "44196397".
countinteger · 1–10 · default 10- Number of tweets to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "users": [ { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "websiteUrl": "string", "bioUrls": [ { "url": "string", "displayUrl": "string" } ], "followerCount": 0, "followingCount": 0, "fastFollowersCount": 0, "normalFollowersCount": 0, "tweetCount": 0, "likeCount": 0, "mediaCount": 0, "listedCount": 0, "creatorSubscriptionsCount": 0, "highlightedTweetsCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "isVerified": true, "isBlueVerified": true, "verifiedType": "string", "isIdentityVerified": true, "isProtected": true, "canDm": true, "professionalType": "string", "professionalId": "string", "professionalCategoryId": 0, "professionalCategoryName": "string", "affiliate": { "label": "string", "username": "string", "profileUrl": "string", "badgeUrl": "string" }, "tipJar": { "isEnabled": true, "bitcoinHandle": "string", "ethereumHandle": "string", "venmoHandle": "string", "venmoUrl": "string", "cashAppHandle": "string", "cashAppUrl": "string", "patreonHandle": "string", "patreonUrl": "string" }, "createdAt": "2026-01-15T09:30:00.000Z" } ], "nextCursor": "string" }}POST/x/get-following
Accounts an account follows, each with bio and counts1 credit per resultDocs →
Request body
userIdstringrequired- Numeric user ID (rest_id) whose tweets to list, e.g. "44196397".
countinteger · 1–10 · default 10- Number of tweets to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "users": [ { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "websiteUrl": "string", "bioUrls": [ { "url": "string", "displayUrl": "string" } ], "followerCount": 0, "followingCount": 0, "fastFollowersCount": 0, "normalFollowersCount": 0, "tweetCount": 0, "likeCount": 0, "mediaCount": 0, "listedCount": 0, "creatorSubscriptionsCount": 0, "highlightedTweetsCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "isVerified": true, "isBlueVerified": true, "verifiedType": "string", "isIdentityVerified": true, "isProtected": true, "canDm": true, "professionalType": "string", "professionalId": "string", "professionalCategoryId": 0, "professionalCategoryName": "string", "affiliate": { "label": "string", "username": "string", "profileUrl": "string", "badgeUrl": "string" }, "tipJar": { "isEnabled": true, "bitcoinHandle": "string", "ethereumHandle": "string", "venmoHandle": "string", "venmoUrl": "string", "cashAppHandle": "string", "cashAppUrl": "string", "patreonHandle": "string", "patreonUrl": "string" }, "createdAt": "2026-01-15T09:30:00.000Z" } ], "nextCursor": "string" }}Tweets and their reach
A tweet with its reply thread, and the accounts that spread it.
POST/x/get-tweet-detail
One tweet with full counts, media, links and its reply thread1 credit per requestDocs →
Request body
tweetIdstringrequired- Numeric ID of the focal tweet to expand, e.g. "1234567890".
cursorstring- Pagination cursor for loading more replies.
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "tweet": { "id": "string", "url": "string", "text": "string", "author": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "followerCount": 0, "followingCount": 0, "tweetCount": 0, "mediaCount": 0, "likeCount": 0, "listedCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "isVerified": true, "isBlueVerified": true }, "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "retweetedTweetId": "string", "retweetedTweetUrl": "string", "retweetedTweetAuthorId": "string", "retweetedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ] }, "replies": [ { "id": "string", "url": "string", "text": "string", "author": { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "followerCount": 0, "followingCount": 0, "tweetCount": 0, "mediaCount": 0, "likeCount": 0, "listedCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "isVerified": true, "isBlueVerified": true }, "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "retweetedTweetId": "string", "retweetedTweetUrl": "string", "retweetedTweetAuthorId": "string", "retweetedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ] } ] }}POST/x/get-tweet-retweeters
Accounts that retweeted a tweet, with their profiles1 credit per resultDocs →
Request body
countinteger · 1–10 · default 10- Number of retweeters to return per page (1–10). Defaults to 10.
cursorstring- Pagination cursor from a previous response's `nextCursor` to fetch the next page.
tweetIdstringrequired- Numeric ID of the tweet whose retweeters to list, e.g. "1234567890".
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": { "users": [ { "userId": "string", "username": "string", "profileUrl": "string", "displayName": "string", "bio": "string", "avatarUrl": "string", "bannerUrl": "string", "location": "string", "websiteUrl": "string", "bioUrls": [ { "url": "string", "displayUrl": "string" } ], "followerCount": 0, "followingCount": 0, "fastFollowersCount": 0, "normalFollowersCount": 0, "tweetCount": 0, "likeCount": 0, "mediaCount": 0, "listedCount": 0, "creatorSubscriptionsCount": 0, "highlightedTweetsCount": 0, "pinnedTweetId": "string", "pinnedTweetUrl": "string", "isVerified": true, "isBlueVerified": true, "verifiedType": "string", "isIdentityVerified": true, "isProtected": true, "canDm": true, "professionalType": "string", "professionalId": "string", "professionalCategoryId": 0, "professionalCategoryName": "string", "affiliate": { "label": "string", "username": "string", "profileUrl": "string", "badgeUrl": "string" }, "tipJar": { "isEnabled": true, "bitcoinHandle": "string", "ethereumHandle": "string", "venmoHandle": "string", "venmoUrl": "string", "cashAppHandle": "string", "cashAppUrl": "string", "patreonHandle": "string", "patreonUrl": "string" }, "createdAt": "2026-01-15T09:30:00.000Z" } ], "nextCursor": "string" }}POST/x/get-tweet-quotes
Quote tweets of a tweet, with text, author and counts1 credit per resultDocs →
Request body
tweetIdstringrequired- Numeric ID of the tweet whose quote tweets to list, e.g. "1234567890".
countinteger · 1–10 · default 10- Number of quote tweets to return (1–10). Defaults to 10.
sortOrderenum- Result ordering: "Latest" = chronological newest-first (default), "Top" = X's engagement ranking.
- Latest | Top
Response
200 OK · application/json
{ "timeMs": 1840, "creditsCost": 1, "data": [ { "id": "string", "url": "string", "text": "string", "createdAt": "2026-01-15T09:30:00.000Z", "createdAtEpochMs": 0, "source": "string", "conversationId": "string", "replyCount": 0, "retweetCount": 0, "likeCount": 0, "quoteCount": 0, "bookmarkCount": 0, "viewCount": 0, "replyToTweetId": "string", "replyToUserId": "string", "replyToUsername": "string", "replyToTweetUrl": "string", "isQuote": true, "quotedTweetId": "string", "quotedTweetUrl": "string", "quotedTweetAuthorId": "string", "quotedTweetAuthorUsername": "string", "lang": "string", "isSensitive": true, "hashtags": [ "string" ], "mentions": [ { "userId": "string", "username": "string", "displayName": "string", "profileUrl": "string" } ], "urls": [ { "shortUrl": "string", "expandedUrl": "string", "displayUrl": "string" } ], "media": [ { "type": "photo", "url": "string", "mediaKey": "string", "mediaId": "string", "width": 0, "height": 0, "expandedUrl": "string", "videoUrl": "string", "durationMs": 0 } ], "authorId": "string", "authorHandle": "string", "authorName": "string", "authorUrl": "string", "authorIsVerified": true, "authorIsBlueVerified": true } ]}Why not the official X (Twitter) API?
The official X API now bills per read: X’s pay-per-use pricing lists reading a post at $0.005. On Bridgly a tweet costs 1 credit, which is $0.002 on pay-as-you-go and as low as $0.001 with a volume package.
Less per tweet
At $0.005 per post read, 100,000 tweets cost $500 on the official API. The same 100,000 tweets cost 100,000 credits on Bridgly: $200, or $100 at volume.
No developer app setup
The official API needs a developer account, a project, an app and OAuth tokens before the first request. Bridgly needs one API key.
Search as you type it on X
Send the same query you would type in X’s search box, operators included. Results come back with author, media and engagement counts already attached.
Your first X (Twitter) call
Terminal
curl -X POST "https://api.bridgly.app/x/search" \ -H "Authorization: Bearer $BRIDGLY_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "from:OpenAI filter:links", "sortOrder": "Latest", "count": 10}'With Bridgly connected to your AI agent, ask:
Find the 10 latest tweets from @OpenAI that contain links and list what each one announces.
What people build with X (Twitter) data
Listen for mentions as they happen
Run a search for your product name with withinHours set to your polling interval, newest first, and you get only what was posted since the last run.
Feed an agent the current conversation
Search is a single call that returns text plus engagement counts, which makes it a clean tool for a model that needs to know what people are saying right now.
Vet creators and accounts
Compare an account’s follower count with the view and like counts on its recent tweets to see whether the audience is real.
Map who amplifies a post
List the retweeters and quote tweets of a launch announcement to find the accounts that carried it furthest.
What the X (Twitter) API does not do
- Protected accounts: the profile is returned with isProtected set, but their tweets and follower lists are not.
- Read-only. There are no endpoints to post, like, retweet, follow or send DMs.
- Tweet search and quote tweets return one page of up to 10 results. Narrow a search with operators or withinHours instead of paging.
- Lists, Spaces, Communities and DMs are not covered.
X (Twitter) API questions
Is this the official X API?
No. Bridgly is an independent service and is not affiliated with X Corp. It is an alternative for teams that want to read X data without setting up a developer app: you pay per tweet and can start with free credits.
Which search operators are supported?
The query is passed through as written, so the operators from X’s advanced search work: from:, to:, @mentions, #hashtags, exact phrases in quotes, OR, exclusions with a minus sign, min_faves:, min_retweets:, filter: and since:/until: dates. There is also a lang field as a shortcut for the language filter.
Do I need an X account or developer app?
No. You send a handle, a user ID, a tweet ID or a search query along with your Bridgly API key. There are no X credentials involved on your side.
How do I get a user ID from a handle?
Call the profile endpoint with the handle, with or without the @. The userId in the response is stable even if the account later changes its handle.
How much does it cost to pull 1,000 tweets?
Search and timelines cost 1 credit per tweet returned, so 1,000 tweets is 1,000 credits. What a credit costs in dollars depends on your pricing package, and goes as low as $1 per 1,000 credits at volume.
How do I page through followers or a timeline?
Timelines, follower lists, user search and retweeters return nextCursor. Send it back as cursor to get the next page of up to 10.
Your API key and credits work on every platform. See all platforms.
Common terms for X (Twitter) API access
- Twitter API
- X API
- Twitter API alternative
- Twitter scraper API
- Twitter search API
- Twitter followers API
- X API pricing alternative
- Tweet scraper
- Twitter API without developer account
- Twitter user timeline API
Start pulling X (Twitter) data
100 free credits, no card. Your first call takes a minute.