# X (Twitter) Post Tracker | $0.00015/Snapshot | Pay-Per-Result (`xquik/x-twitter-post-tracker`) Actor

Tweet analytics for X posts. Track views, likes, reposts, replies, quotes & bookmarks over time, from $0.00015 per delivered snapshot. It needs no X login. Rows add the change since the previous & first snapshot. World's fastest & cheapest X (Twitter) scraper service. Not affiliated with X Corp.

- **URL**: https://apify.com/xquik/x-twitter-post-tracker.md
- **Developed by:** [Xquik](https://apify.com/xquik) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.00015 / snapshots

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**English** ·
[Español](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.es.md)
·
[Türkçe](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.tr.md)
·
[简体中文](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.zh-CN.md)
·
[日本語](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.ja.md)
·
[한국어](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.ko.md)
·
[Deutsch](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.de.md)
·
[Français](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.fr.md)
·
[Italiano](https://github.com/Xquik-dev/x-twitter-scraper/blob/master/apify/x-twitter-post-tracker/README.it.md)

[![Framer connects Xquik MCP to coding agents](https://img.youtube.com/vi/4UOSpoOoC3Y/maxresdefault.jpg)](https://youtu.be/4UOSpoOoC3Y?t=367)\
[Watch how Framer uses Xquik scrapers](https://youtu.be/4UOSpoOoC3Y?t=367)
with Claude Code, Codex, Cursor & more, from 6:07.

Xquik is the world's fastest & cheapest X (Twitter) scraper service with the
most complete X data. Xquik's X (Twitter) Post Tracker records the public counts
of posts you pick. It needs no X cookies or login. Run it again later, & each
row shows what changed. Most other Apify Actors charge before filtering or
deduplicating. Xquik charges only for delivered, unique results.

Paste post URLs or Tweet IDs. Each run saves 1 snapshot row per post. A row
holds views, likes, reposts, replies, quotes & bookmarks at that moment. It also
holds the change since the previous snapshot & since the first one. You pay
**$0.00015 per delivered snapshot**, & Apify bills platform usage separately.

> Xquik is an independent third-party service. Not affiliated with X Corp.
> "Twitter" and "X" are trademarks of X Corp.

### Why use X (Twitter) Post Tracker?

- **Growth in every row.** Each snapshot holds the change since the last & first
  runs.
- **History without a database.** Pass an earlier run's dataset. The first
  snapshot carries forward from run to run.
- **Paste any post form.** Mix post URLs & Tweet IDs in 1 list.
- **Spreadsheet-ready exports.** Shape columns with `fields` & `flatten`. Export
  JSON, CSV, Excel, XML or RSS.

### What you get

#### Complete results

- Each answer holds the fullest data X has for it.

#### Accurate rows

- A post is called missing only when it's gone.
- Every ID in a row stays exact.
- Rows hold public data only.

#### Fresh data

- Reads keep working when X ships changes.

#### Speed

- A slow X answer doesn't hold up your request.
- Actors read many handles, posts & queries at once.
- Reads finish the moment their rows arrive.
- Stalled Actor calls recover on their own.

#### Fair billing

- Bad input costs nothing, since it's refused before any read.
- Actors charge only for delivered, unique, matching rows.
- A restarted run never charges twice.
- A spend cap becomes a row cap, & diagnostics still get written.
- Small runs end with a tip that cuts cost.

#### Reliability

- A one-off X failure doesn't fail your request.
- A deadline returns the rows already found, with diagnostics.
- Actors ride out short Xquik outages.
- Actor runs survive restarts without repeats.
- One bad row doesn't sink a batch.
- Stopped runs keep their rows & their report.
- A run that can't start still explains itself.
- Problems on X's side are fixed before they reach your reads.
- Support can see exactly what a request or run returned.

#### Built for agents

- Actors accept input written for other Actors.
- Every run says why it ended & whether to retry.

#### Rich data

- Each snapshot row holds every count's change since an earlier run.

#### Quality checks

- Every field X shows is served, left out on purpose or proven absent.
- Every read is checked live each hour.

### What data can X (Twitter) Post Tracker extract?

- Views, likes, reposts, replies, quotes & bookmarks of each post.
- The time of each snapshot, in `capturedAt`.
- The first snapshot of each post, with its time & counts.
- The previous snapshot, from the earlier run's dataset.
- The change in each count since the previous snapshot.
- The change in each count since the first snapshot.
- The post text, its date, its link & its author.
- Many posts in 1 run, delivered in input order.
- JSON, CSV, Excel, XML & RSS exports through Apify datasets.

### How to track X post metrics over time

New to Apify?
[Create a free account](https://console.apify.com/sign-up?fpr=xquik) first. The
free plan needs no credit card & gives $5 to spend each month. At $0.00015 per
snapshot, $5 pays for up to 33,000 snapshots before platform usage. Then come
back here & press Try for free.

1. Open Xquik's X (Twitter) Post Tracker in Apify Console.
2. Paste post URLs or Tweet IDs into `tweetIds`.
3. Leave `previousDatasetId` empty on the first run, then click Start.
4. On the next run, pick the first run's dataset in `previousDatasetId`.
5. Download the dataset as JSON, CSV or Excel, or use the Apify API.

You enter no X cookies, login or API key at any step.

### Input

`tweetIds` takes Tweet IDs & post URLs, in any mix.

```json
{
  "tweetIds": [
    "2102882545427714266",
    "https://x.com/OpenAI/status/2082577277246972300",
    "20"
  ],
  "maxItems": 1000
}
```

`startUrls` takes the same post URLs. Give each as a plain string or a
`{ "url": "..." }` object.

`previousDatasetId` names the dataset of an earlier run of this Actor. The form
lets you pick it from your datasets. The Actor only reads that dataset. Leave it
empty on the first run.

```json
{
  "tweetIds": ["2102882545427714266", "20"],
  "previousDatasetId": "<dataset ID of an earlier run>"
}
```

A post the input names twice gets 1 row. `maxItems` keeps the first posts of the
input. Small runs that go well skip `run-report` & save Apify usage. Turn on
`alwaysSaveRunRecords` to write it on every run.

### Run it on a schedule

Apify [schedules](https://docs.apify.com/platform/schedules) start the Actor on
a cron, such as every hour.

1. Run the Actor once with your posts & no `previousDatasetId`.
2. Create a schedule for the Actor in Apify Console.
3. Give the schedule the same `tweetIds` input.
4. Set `previousDatasetId` to the first run's dataset.

Each scheduled run then compares its counts with that dataset. To compare each
run with the one before, start runs with the Apify API. Pass the last run's
`defaultDatasetId` as `previousDatasetId`. The first snapshot still carries
forward, so `changeSinceFirst` keeps counting from day 1. A post missing from
the last run starts a new `firstSnapshot` in the next one.

If a run saves no snapshots, pass the dataset of the run before it.

### Output

Each post is 1 dataset row per run. A row starts with `postId`, `url`, `text`,
`createdAt` & `author`. Then come `capturedAt` & the 6 counts, `viewCount`,
`likeCount`, `retweetCount`, `replyCount`, `quoteCount` & `bookmarkCount`. Then
come `firstSnapshot`, `previousSnapshot`, `changeSincePrevious` &
`changeSinceFirst`. A count of 0 can mean X did not report it.

Examples use sample values. Results reflect live data. A second run's row looks
like this.

```json
{
  "postId": "2102882545427714266",
  "url": "https://x.com/NASA/status/2102882545427714266",
  "text": "Welcome to the Artemis Accords, Croatia",
  "createdAt": "Wed Sep 23 22:07:23 +0000 2026",
  "author": { "id": "11348282", "username": "NASA", "name": "NASA" },
  "capturedAt": "2026-10-28T09:00:00.000Z",
  "viewCount": 1291231,
  "likeCount": 9043,
  "retweetCount": 772,
  "replyCount": 207,
  "quoteCount": 100,
  "bookmarkCount": 661,
  "firstSnapshot": {
    "capturedAt": "2026-10-25T09:00:00.000Z",
    "viewCount": 500000,
    "likeCount": 5000,
    "retweetCount": 500,
    "replyCount": 150,
    "quoteCount": 50,
    "bookmarkCount": 400
  },
  "previousSnapshot": {
    "capturedAt": "2026-10-27T09:00:00.000Z",
    "viewCount": 1200000,
    "likeCount": 9000,
    "retweetCount": 770,
    "replyCount": 205,
    "quoteCount": 99,
    "bookmarkCount": 640
  },
  "changeSincePrevious": {
    "viewCount": 91231,
    "likeCount": 43,
    "retweetCount": 2,
    "replyCount": 2,
    "quoteCount": 1,
    "bookmarkCount": 21
  },
  "changeSinceFirst": {
    "viewCount": 791231,
    "likeCount": 4043,
    "retweetCount": 272,
    "replyCount": 57,
    "quoteCount": 50,
    "bookmarkCount": 261
  },
  "resultType": "snapshot",
  "sourceTarget": "2102882545427714266"
}
```

A row tells 3 cases apart.

| The row holds                    | It means                                      |
| -------------------------------- | --------------------------------------------- |
| `previousSnapshot: null`         | The earlier dataset has no row for this post. |
| `previousSnapshot` with counts   | The row compares with that snapshot.          |
| A `null` count in a change field | The earlier row lacks that count.             |

On a first run, `firstSnapshot` holds the row's own time & counts. Both change
fields are `null` until a later run.

### Output columns

8 inputs shape each row after the run reads it. They run no code & change no
price.

| Field               | What it does                                                |
| ------------------- | ----------------------------------------------------------- |
| `fields`            | Keep only these fields, in the order & spelling you write   |
| `omitFields`        | Drop these fields & keep the rest                           |
| `renameFields`      | Move a field to a column with a new name                    |
| `flatten`           | Turn each nested object into top-level columns              |
| `fillMissingFields` | Fill a kept field a row lacks with `null`. On by default    |
| `joinFields`        | Turn each of these lists into 1 text value                  |
| `joinSeparator`     | Text between joined items. The default is a comma & a space |
| `constantFields`    | Add a column with the same text on every row                |

- Use a dot for a field inside an object, such as `changeSinceFirst.viewCount`.
- Flatten `changeSincePrevious` to get 1 column per count.
- A wrong field name stops the run before it reads & charges nothing.
- The run ignores a map function or jq filter written for another Actor.

### How much does it cost to track X posts?

Every Apify plan costs $0.00015 per delivered snapshot. Apify bills your
platform usage separately.

For more volume, [pick an Apify plan](https://apify.com/pricing?fpr=xquik) with
more prepaid usage.

- One charge per delivered snapshot row. Diagnostics are free in `diagnostics`.
- No start fee & no fee for reading the earlier dataset.
- The run removes duplicate posts before billing.
- A post X does not have adds no row & no charge.
- A dataset the run cannot read stops the run & charges nothing.
- Apify maximum-total-charge settings cap delivered rows.

### Limits & recovery

Xquik's X (Twitter) Post Tracker reads many posts in 1 run. Delivered rows &
progress survive an Apify restart. The Actor adds no time limit of its own. It
respects any Apify timeout you set.

The run status counts the posts X has no match for. An earlier dataset can hold
up to 100,000 rows. A dataset the run cannot read stops it before any post read.
The status then says to pick an earlier run's dataset. Interrupted runs write a
free `partial` diagnostic. Read `nextAction` before you retry.

### Related Xquik Actors

Every Xquik Actor shares the same extraction engine, filter-first billing &
diagnostics. Pick the one that matches the data you need.

- [X Tweet Scraper](https://apify.com/xquik/x-tweet-scraper) scrapes tweets from
  searches, profile timelines, Lists & tweet IDs with 50+ filters & flat
  exports. Use it when you need tweet data without analysis. From $0.00015 per
  row.
- [X Profile Scraper](https://apify.com/xquik/x-profile-scraper) scrapes
  profiles plus their posts, replies, media & followers from handles, IDs or
  URLs. Use it when you start from accounts rather than searches. From $0.00015
  per row.
- [X Reply Scraper](https://apify.com/xquik/x-reply-scraper) scrapes replies,
  comments & whole conversations under posts with 25+ filters. Use it when you
  need the discussion beneath tweets. From $0.00015 per row.
- [X Engagement Scraper](https://apify.com/xquik/x-engagement-scraper) scrapes
  replies, quotes, retweeters & threads for post URLs or IDs in bulk. Use it
  when you measure who engaged with posts. From $0.00015 per row.
- [X Quote Tweets Scraper](https://apify.com/xquik/x-quote-tweets-scraper)
  scrapes the quote tweets of posts with text, media, counts, authors & 11
  filters. Use it when you study who quoted posts & what they said. From
  $0.00015 per tweet.
- [X Follower Scraper](https://apify.com/xquik/x-follower-scraper) scrapes
  followers, following, List members, subscribers & Community members as profile
  rows. Use it when you need audience or member lists. From $0.00015 per
  profile.
- [X User Search Scraper](https://apify.com/xquik/x-user-search-scraper)
  searches users by handle, bio & location with follower, verification, age &
  location filters. Use it when you build account lists from search. From
  $0.00015 per profile.
- [X Account Location Scraper](https://apify.com/xquik/x-account-location-scraper)
  checks where accounts are based with X's "Account based in" label, "connected
  via" & username changes. Use it when you vet where accounts are based. From
  $0.00015 per account.
- [X Email Scraper](https://apify.com/xquik/x-email-scraper) gets the emails,
  phones & links accounts publish on their profiles, from handles, followers or
  user searches. Use it when you need the emails profiles publish. From $0.00015
  per profile.
- [X List Scraper](https://apify.com/xquik/x-list-scraper) scrapes List posts,
  members & followers from List URLs or IDs. Use it when a curated List defines
  your sources. From $0.00015 per row.
- [X Community Scraper](https://apify.com/xquik/x-community-scraper) scrapes
  Community info, posts, searches, members & moderators. Use it when your
  sources are X Communities. From $0.00015 per row.
- [X Space Scraper](https://apify.com/xquik/x-space-scraper) finds Spaces by
  keyword & reads their titles, states, times, listener counts, hosts &
  speakers. It also reads broadcasts by URL or ID. Use it when you track live
  audio & video on X. From $0.00015 per Space or broadcast.
- [X Trends Scraper](https://apify.com/xquik/x-trends-scraper) scrapes real-time
  trends by location with rank, volume, query & WOEID. Use it when you track
  what is trending where. From $0.00015 per trend.
- [X Jobs Scraper](https://apify.com/xquik/x-job-scraper) scrapes X job listings
  by keyword, place, workplace, seniority & company, with salaries & apply
  links. Use it when you collect job openings posted on X. From $0.00015 per
  job.
- [X Article Scraper](https://apify.com/xquik/x-article-scraper) scrapes
  long-form X Articles as Markdown & text with covers, authors, dates & metrics.
  Use it when you need article bodies, not tweets. From $0.00015 per article.
- [X Media Downloader](https://apify.com/xquik/x-media-downloader) extracts or
  stores photos, videos & GIFs from posts or profiles with MP4 & metadata
  options. Use it when you need the media files themselves. From $0.00015 per
  media row.
- [X (Twitter) Brand Monitoring with AI Analysis](https://apify.com/xquik/x-twitter-brand-monitoring)
  tracks brand mentions with AI relevance, sentiment & customer-experience
  answers & compares runs. Use it when you watch a brand over time. From $0.0003
  per analyzed tweet.
- [X Tweet Sentiment Analysis with AI](https://apify.com/xquik/x-tweet-sentiment-analysis)
  labels attitude, intensity & sarcasm probability for every tweet with AI. Use
  it when you need general sentiment on any topic. From $0.0003 per analyzed
  tweet.
- [X (Twitter) Stock & Crypto AI Trading Signals](https://apify.com/xquik/x-twitter-stock-crypto-signals)
  labels bullish, bearish, neutral or mixed stance, content type, conviction &
  asset relevance with AI. Use it when you follow stocks, crypto or trading
  talk. From $0.0003 per analyzed tweet.
- [X (Twitter) News Monitor with AI Analysis](https://apify.com/xquik/x-twitter-news-monitor)
  labels news posts by format, source attribution & topic relevance with AI. Use
  it when you separate reporting from commentary. From $0.0003 per analyzed
  tweet.
- [X Tweet Classifier with AI Analysis](https://apify.com/xquik/x-twitter-tweet-classifier)
  answers your own category, score & yes/no questions for every tweet with AI.
  Use it when the preset analyses do not fit your labels. From $0.0003 per
  analyzed tweet.
- [X Tweet Viral Score Analyzer with AI](https://apify.com/xquik/x-tweet-viral-score-analyzer)
  estimates a Viral Score from 0 to 100 & a verdict for every tweet from 8 AI
  trait answers. Use it when you study why tweets spread or flop. From $0.0003
  per analyzed tweet.
- [X (Twitter) Monitor](https://apify.com/xquik/x-twitter-monitor) catches every
  new tweet, reply, quote, repost & profile change of accounts, usually in under
  a second after X shows it, plus keyword tweets & follows. Use it when you need
  alerts as soon as X shows a tweet. From $0.0045 per monitor-hour.

### FAQ

Answers to common questions, then where to get help.

#### Do I need X cookies, an API key or a login?

No. Xquik's X (Twitter) Post Tracker needs no X cookies, API key, login or
credentials.

#### Which dataset do I pick in `previousDatasetId`?

Pick the dataset of an earlier run of this Actor. Its newest row for each post
becomes `previousSnapshot`. Rows of other Actors & diagnostics are skipped.

#### Does the first snapshot survive many runs?

Yes. Each row carries `firstSnapshot`. Chain each run on the one before, & the
first snapshot stays the same.

#### Can I track a post someone deleted?

No. A post X does not have adds no row & no charge. The run status counts it.

#### Is it legal to track X posts?

Xquik's X (Twitter) Post Tracker requests public X fields. Results can contain
personal data. Confirm a lawful purpose & follow applicable privacy rules. Ask
qualified counsel when uncertain.

#### Can I use the API, schedules & integrations?

Yes. Use the Apify API or the Xquik REST API. The
[API tab](https://apify.com/xquik/x-twitter-post-tracker/api) has Python,
JavaScript & cURL examples. Apify
[schedules](https://docs.apify.com/platform/schedules) run Xquik's X Post
Tracker on a cron. Agents use
[Apify MCP](https://docs.apify.com/platform/integrations/mcp). Use `latest`
unless you need an older build.

#### Where do I get help?

Open an issue in the
[Issues tab](https://apify.com/xquik/x-twitter-post-tracker/issues) with the run
ID. Free diagnostics in the key-value store explain runs that need attention.

#### Can I get a custom solution?

Yes. Describe what you need in the
[Issues tab](https://apify.com/xquik/x-twitter-post-tracker/issues). Xquik also
offers a dashboard, a REST API, an MCP server & webhooks. Find Xquik's website
on its [Apify profile](https://apify.com/xquik).

# Changelog

This Actor's version history is a separate document: https://apify.com/xquik/x-twitter-post-tracker/changelog.md

# Actor input Schema

## `tweetIds` (type: `array`):

Numeric Tweet IDs or x.com post URLs. Each post gets 1 snapshot row per run.

## `startUrls` (type: `array`):

Public x.com or twitter.com post URLs. Use strings or {"url":"..."} objects. For example, \["https://x.com/OpenAI/status/2082577277246972300", {"url":"https://x.com/jack/status/20"}].

## `previousDatasetId` (type: `string`):

The dataset of this Actor's earlier run. Each row then adds the change since that run & since the post's first snapshot. Leave it empty on the first run.

## `maxItems` (type: `integer`):

Global cap on snapshot rows, 1 per post, kept in input order. The form starts at 1,000. A run can return 100,000 rows & more, so raise it for a long list.

## `maxConcurrency` (type: `integer`):

How many posts to read at once. The default is the fastest safe setting.

## `fields` (type: `array`):

Keep only these fields in each row. Pick names or type your own. Use a dot for a field inside an object, such as author.id. Columns arrive in the order & spelling you write. Every row keeps its id. Leave empty for every field. The price per row stays the same. A wrong name stops the run before it reads, at no charge. If names cannot be checked, the run reads on & lists unseen names last.

## `omitFields` (type: `array`):

Drop these fields & keep the rest. Every row keeps its id.

## `renameFields` (type: `array`):

Give a field a new column name. The key is the field. The value is the new name. A renamed field becomes a top-level column.

## `flatten` (type: `boolean`):

Turn each nested object into top-level columns, such as authorId. Lists stay lists. Use it for CSV & spreadsheets.

## `fillMissingFields` (type: `boolean`):

With Fields to keep, a field a row lacks arrives as null. Every row then has the same columns. Turn it off to leave such fields out.

## `joinFields` (type: `array`):

Turn each of these lists into 1 text value. Use it for CSV cells.

## `joinSeparator` (type: `string`):

Text between the items of a joined list.

## `constantFields` (type: `array`):

Add a column with the same text on every row. The key is the column name, such as campaign. The value is its text.

## `alwaysSaveRunRecords` (type: `boolean`):

Save run-report on every run. When off, small runs that go well skip it & cost less.

## Actor input object example

```json
{
  "tweetIds": [
    "2102882545427714266",
    "2082577277246972300",
    "20"
  ],
  "startUrls": [
    "https://x.com/OpenAI/status/2082577277246972300",
    {
      "url": "https://x.com/jack/status/20"
    }
  ],
  "maxItems": 1000,
  "maxConcurrency": 100,
  "flatten": false,
  "fillMissingFields": true,
  "joinSeparator": ", ",
  "alwaysSaveRunRecords": false
}
```

# Actor output Schema

## `results` (type: `string`):

Unique delivered rows. Filters and deduplication run before billing.

## `diagnostics` (type: `string`):

Free actionable diagnostics, written only when something needs attention. They cover partial, invalid, aborted & recovered runs. An empty run whose filters removed rows writes 1 too. A run that read every target & got no row back writes none. A partial diagnostic lists each stop cause in stopCauses. Real results remain in the dataset.

## `runReport` (type: `string`):

Outcome, completion reason, counts, duration, and privacy-safe anomalies. A run writes it when it hits a problem, is large or has Always save run records on. Small runs that go well skip it & state the outcome in their status.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tweetIds": [
        "2102882545427714266",
        "2082577277246972300",
        "20"
    ],
    "maxItems": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("xquik/x-twitter-post-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "tweetIds": [
        "2102882545427714266",
        "2082577277246972300",
        "20",
    ],
    "maxItems": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("xquik/x-twitter-post-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tweetIds": [
    "2102882545427714266",
    "2082577277246972300",
    "20"
  ],
  "maxItems": 1000
}' |
apify call xquik/x-twitter-post-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xquik/x-twitter-post-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Gog6xiw5gLbWj6hg2/builds/iAuj8yVEdH3sevyHs/openapi.json
