X (TWITTER) API

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

[ ENDPOINTS ]

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/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 API? ]

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.

[ HOW TO USE IT ]

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
}'
[ USE CASES ]

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.

[ LIMITS ]

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.
[ FAQ ]

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.

[ SAME KEY, OTHER PLATFORMS ]

Your API key and credits work on every platform. See all platforms.

[ ALSO SEARCHED ]

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.

Start free with 100 credits →