Use the TypeScript SDK when you want typed request parameters, response models, retries, and autocomplete for Xquik REST API workflows in Node.js, Bun, or server-side TypeScript. Use this page when you need a TypeScript service to search tweets, scrape tweets to JSON Lines, CSV, or XLSX, export follower or profile data, post media tweets, upload media, send DMs, monitor tweets, or hand X data to another system through SDK calls.Documentation Index
Fetch the complete documentation index at: https://docs.xquik.com/llms.txt
Use this file to discover all available pages before exploring further.
Install
Authenticate
Basic Example
Search tweets and write durable JSON Lines handoff rows:Workflow: Search Tweets to JSON Lines, CSV, or XLSX
This job is for Node.js, Bun, and queue workers that need searchable tweet data in a stable handoff format for queues, data lakes, analyst CSV files, or XLSX workbooks. It callsGET /x/tweets/search through client.x.tweets.search, uses the generated TweetSearchParams shape, and writes each returned tweet as one JSON object per line.
q
Maps to REST
q. Use it for the required X search query with keywords, handles, hashtags, or operators.limit
Maps to REST
limit. Use it for a bounded request from 1 to 200. Omit it for cursor loops.cursor
Maps to REST
cursor. Pass the opaque cursor from page.next_cursor to request the next page.sinceTime
Maps to REST
sinceTime. Use it as the ISO 8601 lower time bound.untilTime
Maps to REST
untilTime. Use it as the ISO 8601 upper time bound.queryType
Maps to REST
queryType. Use Latest for chronological results or Top for engagement-ranked results.Returned Data & Handoff
client.x.tweets.search returns PaginatedTweets:
page.tweets
JSON field
tweets. Contains tweet records with id, text, optional author, createdAt, likeCount, replyCount, retweetCount, quoteCount, bookmarkCount, viewCount, and isNoteTweet when available.page.has_next_page
TypeScript field
page.has_next_page. JSON field has_next_page. Tells your worker whether another page exists.page.next_cursor
JSON field
next_cursor. Store it with the job checkpoint and pass it back as cursor.page.tweets as JSON Lines to xquik-tweet-search.jsonl for queues and data lakes, transform the projected records into CSV for analysts, or produce XLSX from those rows when account teams need spreadsheets. Pass id, text, author.username, createdAt, and engagement counts into your CRM or enrichment pipeline.
Workflow: Tweet Replies to CSV, JSON, or XLSX
Use this workflow when a TypeScript worker needs every reply under one tweet as a saved extraction, paginated JSON handoff, or file export for moderation, support, research, CRM, or agent review. It callsPOST /extractions/estimate through client.extractions.estimateCost, creates the job with client.extractions.run, reads rows with client.extractions.retrieve, and downloads files with client.extractions.exportResults.
reply_extractor requires targetTweetId. client.extractions.retrieve returns results, hasMore, and nextCursor; store those values when you need resumable JSON pagination. client.extractions.exportResults supports csv, json, and xlsx for file handoff. Cost: 1 credit per reply extracted or returned.
Workflow: Post Media Tweets and DM Attachments
Use this workflow when a TypeScript worker, support queue, or agent service needs to post a media-backed tweet, reply with media, or send one uploaded media item in a DM. Tweet and reply media posts use public media URLs directly onclient.x.tweets.create. Send up to 4 image URLs or exactly 1 MP4 video URL up to 100 MB. Do not mix video with other media. Do not upload first when the media URL is already public.
tweetId responses. The REST API can also return 202 x_write_unconfirmed; treat that runtime value as pending, store writeActionId, and poll Get Write Action Status before sending another write.
reply_to_tweet_id:
media.mediaId as the only media_ids item:
client.x.tweets.create returns tweet.tweetId for confirmed posts or the pending write fields above when confirmation is still running. client.x.media.upload returns media.mediaId for DM attachments, and client.x.dm.send returns dm.messageId for support tickets, CRM records, queue jobs, or agent memory.
Each tweet or reply write costs 10 credits. Uploading media costs 10 credits, and sending the DM costs 10 credits. Do not pass uploaded media.mediaId values to client.x.tweets.create; that method uses media with public media URLs.
Useful endpoints:
- Search Tweets
- Create Extraction
- Get Extraction
- Export Extraction
- Get User
- Create Tweet
- Upload Media
- Send Direct Message
- Create Monitor
- Create Webhook
Error Handling
The SDK throws typed errors for API failures:400 Bad Request
Throws
BadRequestError.401 Unauthenticated
Throws
AuthenticationError.403 Permission Denied
Throws
PermissionDeniedError.404 Not Found
Throws
NotFoundError.422 Unprocessable Entity
Throws
UnprocessableEntityError.429 Rate Limited
Throws
RateLimitError.5xx Server Error
Throws
InternalServerError.maxRetries to tune retry behavior.
Cost, Limits & Retries
Tweet search costs 1 credit per tweet returned. If remaining credits cannot cover a boundedlimit request, the API can return fewer tweets; if 0 paid results are affordable, it returns 402 insufficient_credits. Read calls are rate-limited, and 429 responses include Retry-After.
The client retries connection errors, 408, 409, 429, and 5xx responses by default. Handle RateLimitError with backoff, and fix 400, 401, 403, 404, or 422 responses before retrying.
Pagination
Search and list endpoints return page objects. Checkhas_next_page and pass the generated cursor fields documented on each endpoint when you need another page.