Twitter/X Tweet Details Scraper · URL or ID
Pricing
from $0.55 / 1,000 tweet details
Twitter/X Tweet Details Scraper · URL or ID
Turn public X/Twitter post URLs or numeric tweet IDs into clean tweet, author, engagement, media, and entity records. Built for one-off checks and bounded batches up to 100 inputs.
Pricing
from $0.55 / 1,000 tweet details
Rating
0.0
(0)
Developer
Data Slayer
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
Turn public X/Twitter post URLs or numeric tweet IDs into clean tweet, author, engagement, media, and entity records—one unique post per dataset row.
Watch the demo
YouTube video coming soon.
What this Actor does
Use this Actor when you already know the posts you need and want their current public details without running a broad search. It is designed for one-off checks, spreadsheet enrichment, webhook follow-ups, and bounded batches of up to 100 inputs.
For every available public post, the default dataset receives one normalized row with:
- post ID, canonical URL, text, timestamp, language, and conversation ID;
- reply, quote, repost, and sensitive-content flags;
- likes, replies, reposts, quotes, bookmarks, and views when available;
- author ID, username, display name, verification state, and profile image;
- attached media metadata; and
- hashtags, mentions, and expanded URLs.
Thread and reply expansion is intentionally not included. Use a replies/comments workflow when you need the surrounding conversation.
Input
| Field | Type | Required | Default | Limits | Purpose |
|---|---|---|---|---|---|
tweetUrlsOrIds | array of strings | yes | — | 1–100 entries; each ≤300 characters | Numeric tweet IDs or public x.com / twitter.com status URLs. Duplicate IDs are processed once. |
maxInputs | integer | no | 100 | 1–100 | Hard cap on unique inputs processed in the run. |
Valid input:
{"tweetUrlsOrIds": ["https://x.com/NASA/status/1967659798526656877","1967659798526656877"],"maxInputs": 100}
Supported URL forms include x.com/<user>/status/<id>, twitter.com/<user>/status/<id>, and mobile.twitter.com/<user>/status/<id>. Other domains and non-status URLs are rejected before any lookup.
Output
Each available unique post creates one paid row in the default dataset.
| Field | Type | Nullable | Description |
|---|---|---|---|
tweetId | string | no | Stable numeric post ID and dataset identity. |
url | string | no | Canonical public post URL. |
text | string | yes | Public post text. |
createdAt | string | yes | Publication time as returned for the post. |
language | string | yes | Language code when available. |
conversationId | string | yes | Conversation root identifier when available. |
inReplyToTweetId | string | yes | Parent post ID for a reply. |
isReply, isQuote, isRetweet, sensitive | boolean | no | Post-type and sensitive-content flags. |
metrics | object | no | Nullable integer counts for likes, replies, reposts, quotes, bookmarks, and views. |
author | object | no | Nullable author ID, username, display name, verification state, and profile image URL. |
media | array | no | Media type, URL, preview URL, dimensions, and duration when available. |
entities | object | no | Hashtags, mentions, and expanded URLs. |
requestedInput | string | no | The first submitted value that resolved to this unique post. |
retrievedAt | string | no | UTC time when the row was normalized. |
Example:
{"tweetId": "1967659798526656877","url": "https://x.com/NASA/status/1967659798526656877","text": "A sample public post used to illustrate the output contract.","createdAt": "2026-09-15T14:30:00Z","language": "en","conversationId": "1967659798526656877","inReplyToTweetId": null,"isReply": false,"isQuote": false,"isRetweet": false,"sensitive": false,"metrics": {"likeCount": 125,"replyCount": 9,"retweetCount": 21,"quoteCount": 4,"bookmarkCount": 7,"viewCount": 18420},"author": {"userId": "11348282","username": "NASA","name": "NASA","verified": true,"profileImageUrl": "https://pbs.twimg.com/profile_images/example.jpg"},"media": [],"entities": {"hashtags": ["Space"], "mentions": [], "urls": []},"requestedInput": "https://x.com/NASA/status/1967659798526656877","retrievedAt": "2026-09-21T00:00:00.000Z"}
The example is illustrative and validates the proposed schema; it is not a live result claim.
Empty, unavailable, partial, and failed runs
Invalid input stops before lookup. Deleted, private, missing, or otherwise unavailable posts do not become dataset rows and are not charged as tweet details. Their safe per-input outcomes remain in the free RUN_SUMMARY key-value record.
The summary distinguishes succeeded, partial, empty, failed, charge_limit_reached, billing_uncertain, and cancelled. It reconciles delivered and charged tweet rows. If the billing limit prevents a dataset push, no delivered row is counted. If a storage or billing response leaves the write outcome uncertain, the Actor stops and marks the state billing_uncertain; it does not retry or claim delivery for the possibly completed row. A response whose tweet ID differs from the requested ID is rejected before delivery or charging.
Pricing
Pay per event. The Actor-start event is charged per GB of run memory, with a minimum of one event. The proposed 256 MB default therefore incurs one start event; choosing more than 1 GB can multiply it. A tweet-detail event is charged for each successfully delivered unique dataset row. Unavailable, invalid, failed, and duplicate inputs are not charged as tweet details.
| Plan | Actor start | Per tweet detail | 1 detail | 100 details |
|---|---|---|---|---|
| Free | $0.0025 | $0.00075 | $0.00325 | $0.07750 |
| Bronze | $0.0023 | $0.00065 | $0.00295 | $0.06730 |
| Silver | $0.0021 | $0.00060 | $0.00270 | $0.06210 |
| Gold | $0.0020 | $0.00055 | $0.00255 | $0.05700 |
| Platinum | $0.0020 | $0.00055 | $0.00255 | $0.05700 |
| Diamond | $0.0020 | $0.00055 | $0.00255 | $0.05700 |
At the proposed 256 MB default, the input cap makes the maximum customer event charge for a 100-result run explicit. Increasing run memory above 1 GB can add start-event units. Platform compute usage, if any, is shown separately by Apify.
Reliability and limits
- Transient rate-limit, server, and timeout failures use bounded retries and honor a short
Retry-Aftervalue when provided. - Requests are paced conservatively within a run. Coverage and freshness still depend on what is publicly available at lookup time.
- Duplicates are removed by tweet ID before lookup and again at delivery boundaries.
- No private posts, deleted posts, complete historical snapshots, or thread completeness are promised.
- Engagement counts can change after retrieval. Store
tweetIdas the stable join key andretrievedAtas the observation time.
Use from the API
After publication, call the Actor with your Apify token:
curl "https://api.apify.com/v2/acts/data-slayer~twitter-tweet-details/runs?token=<YOUR_APIFY_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"tweetUrlsOrIds":["1967659798526656877"],"maxInputs":100}'
The proposed slug is not live yet. This endpoint becomes valid only after an authorized release.
FAQ
How much does it cost to run this Actor? Pricing is listed in the Pricing section above, charged per row returned. You only pay for the rows the Actor actually produces, so a small test run costs cents.
Do I need cookies or a login? No. This Actor reads public data only - no cookies, no account, no browser automation.
Can I schedule it? Yes. Run it from the Apify API, on a schedule, or via a webhook, and export results as JSON, CSV or Excel.
What if I need a slightly different output? Open an issue on the Actor's Issues tab describing the shape you need.
Related actors
More Twitter actors from the same portfolio. Apify only auto-recommends actors in the same category, so here are the rest of ours: