> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twexapi.io/llms.txt
> Use this file to discover all available pages before exploring further.

# TypeScript SDK

> Use the TwexAPI TypeScript SDK for tweet search, follower exports, DMs, media tweets, and Node.js X API automation.

Use the TypeScript SDK when you want typed request parameters, response models, retries, and autocomplete for TwexAPI REST workflows in Node.js, Bun, or server-side TypeScript.

| TypeScript task | SDK call                      | Save         |
| --------------- | ----------------------------- | ------------ |
| Search tweets   | `client.search.advanced`      | `nextCursor` |
| Read profile    | `client.users.getAbout`       | `screenName` |
| List followers  | `client.users.followers.list` | cursor       |

## Install

```bash theme={null}
npm install @twexapi-dev/x-api-scraper
```

Source: [twexapi-dev/x-api-scraper-typescript](https://github.com/twexapi-dev/x-api-scraper-typescript)

## Authenticate

```bash theme={null}
export X_API_SCRAPER_KEY="YOUR_API_KEY"
```

```ts theme={null}
import { XApiScraper } from "@twexapi-dev/x-api-scraper";

const client = new XApiScraper({
  bearerAuth: process.env.X_API_SCRAPER_KEY,
});
```

## Basic example

Search tweets and look up a profile:

```ts theme={null}
import { XApiScraper } from "@twexapi-dev/x-api-scraper";

const client = new XApiScraper({
  bearerAuth: process.env.X_API_SCRAPER_KEY,
});

const result = await client.search.advanced({
  searchTerms: ["from:elonmusk"],
  sortBy: "Latest",
  nextCursor: "",
});

const about = await client.users.getAbout({ screenName: "elonmusk" });

const followers = await client.users.followers.list({
  screenName: "elonmusk",
});
```

## Workflow: search tweets to JSON Lines

Paginate advanced search and write durable handoff rows:

```ts theme={null}
import { XApiScraper } from "@twexapi-dev/x-api-scraper";

const client = new XApiScraper({
  bearerAuth: process.env.X_API_SCRAPER_KEY,
});

const query = "from:elonmusk AI";
let cursor = "";
let pageIndex = 0;

while (true) {
  const page = await client.search.advanced({
    searchTerms: [query],
    sortBy: "Latest",
    nextCursor: cursor,
  });

  for (const tweet of page.tweets ?? []) {
    const row = {
      source: "twexapi.typescript.search",
      query,
      tweet_id: tweet.id,
      text: tweet.text,
      page_index: pageIndex,
      next_cursor: page.nextCursor ?? null,
    };
    process.stdout.write(`${JSON.stringify(row)}\n`);
  }

  if (!page.hasNextPage || !page.nextCursor) {
    break;
  }

  cursor = page.nextCursor;
  pageIndex += 1;
}
```

Store `tweet_id`, `next_cursor`, and `page_index` so a worker can resume from the last saved cursor.

## Workflow: post a tweet

Write actions need a Twitter cookie or `auth_token` on the request input:

```ts theme={null}
const tweet = await client.tweets.actions.create({
  tweetContent: "Hello from the TwexAPI TypeScript SDK.",
  cookie: process.env.TWITTER_COOKIE,
});
```

Use `--dry-run` in the [CLI](/sdks/cli) first when testing write payloads.

## Error handling

```ts theme={null}
import { XApiScraper } from "@twexapi-dev/x-api-scraper";
import * as errors from "@twexapi-dev/x-api-scraper/models/errors";

try {
  await client.search.advanced({
    searchTerms: ["from:elonmusk"],
    sortBy: "Latest",
    nextCursor: "",
  });
} catch (error) {
  if (error instanceof errors.XAPIScraperError) {
    console.error(error.statusCode, error.body);
  } else {
    throw error;
  }
}
```

The client retries connection errors with exponential backoff by default. Override per request with a `retries` option.

## Pi coding agent package

Install bundled TwexAPI Skills from npm:

```bash theme={null}
pi install npm:@twexapi-dev/x-api-scraper
```

## References

* [SDKs overview](/sdks)
* [Authentication](/authentication)
* [MCP Server](/mcp/overview)
* [Advanced Twitter Search](/api-reference/search-endpoints/advanced-twitter-search)
* [Source Repository](https://github.com/twexapi-dev/x-api-scraper-typescript)
