Move from Apify Twitter Scrapers to Weir: Inputs and Fields
Apify Twitter scraper to Weir migration: Tweet Scraper V2 inputs mapped to Weir fields, output names side by side, a real before and after, and costs.
Tarun Khatri
Published · Updated · 7 min read
To move an Apify Twitter scraper to Weir, map the actor's inputs to one search call and read the posts from the response.
This guide is for anyone running Tweet Scraper V2 by apidojo, or a similar actor, from a script, Make or Zapier. You want X (Twitter) posts priced per result, with no run queue. You get an input map, a field map, a real before and after, and a cutover checklist. We run Weir.
The actor input {"searchTerms": ["from:NASA Artemis"], "sort": "Latest"} becomes:
curl -X POST https://api.weirapp.io/v1/x/search \
-H "Authorization: Bearer $WEIR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "Artemis", "fromUsers": ["NASA"], "sort": "latest", "limit": 20}'
Why people move off Apify Twitter scrapers
Tweet Scraper V2 costs $0.40 per 1,000 tweets, checked on 30 October 2026. Its public pricing history shows $0.10 at launch in November 2023 and $0.30 from March 2024.
Its README adds rules a per-call API doesn't have. At least 50 tweets per query, one run at a time, no single posts or replies, and no repeated queries at short intervals.
Apify's API docs say a synchronous run past 300 seconds returns a 408. An unnamed dataset expires after 7 days. Weir vs Apify covers where Apify still wins: other sites and no-code exports.
Step 1: Map the actor inputs to Weir fields
Every actor input has a Weir field or endpoint, except location. Names come from the actor's input schema and our OpenAPI file.
| Apify input | Weir | Difference |
|---|---|---|
searchTerms |
query |
X operators pass through |
twitterHandles, author |
fromUsers, or GET /v1/x/users/{user}/posts |
Up to 10 handles |
inReplyTo, mentioning |
toUsers, mentions |
Arrays |
startUrls, conversationIds |
One endpoint per URL kind; /posts/{id}/thread |
Post, profile, search, List |
maxItems |
limit and cursor |
About 20 a page |
sort Top, Latest |
sort: top or latest |
No "Latest + Top" |
tweetLanguage, start, end |
language, since, until |
Instants, not days |
minimumFavorites, minimumRetweets, minimumReplies |
minLikes, minReposts, minReplies |
X's own floors |
onlyImage, onlyVideo, onlyQuote and onlyTwitterBlue become X operators in query. We ran filter:images and filter:blue_verified on 30 October, and both returned posts. Location inputs have no match: X's location operators returned nothing in our tests. The customMapFunction input moves into your code.
Step 2: Map the output fields
Weir uses X's own field names, so most counts keep theirs. The actor's names below come from its README's output example.
| Actor output | Weir response | Note |
|---|---|---|
id, url, text |
Same names | Full text |
createdAt as Fri Nov 24 17:49:36 +0000 2023 |
createdAt in ISO 8601 |
Re-parse dates |
likeCount, retweetCount, replyCount, quoteCount, bookmarkCount |
Same names | Plus viewCount |
author.userName, author.followers |
author.username, author.followersCount |
following: profile call |
author.isVerified, author.isBlueVerified, author.profilePicture |
author.verified, author.profileImageUrl |
One flag |
isRetweet, isQuote, quoteId |
retweetedPost, quotedPost |
Objects or null |
isReply |
inReplyToId, conversationId |
Ids, not booleans |
twitterUrl, card, place, source |
Not returned | media, entities instead |
A repost on Weir carries likeCount: 0 and its real counts inside retweetedPost. Add -filter:nativeretweets to query to drop reposts. Keep id a string.
Step 3: Swap the token, the dataset and the rate limit
From Apify's API reference and Weir's docs, 30 October 2026:
- Auth. Apify:
Authorization: Bearer <token>or?token=. Weir: the Bearer header only. - Paging. Apify: a dataset read with
offsetandlimit, billed as storage reads. Weir:meta.nextCursor, sent back unchanged untilnull, with a page cap. - Rate limits. Apify: 60 requests a second per resource, and one actor run at a time. Weir: 30 requests a minute on the free tier, a search counting as 2, and
Retry-Afteron a429. - Spend caps. Apify:
maxItemsor a charge limit per run. Weir: billed per result, failed calls free, and402when out of credits, not retryable.
Step 4: Replace the run with one call, before and after
Before, shortened from the actor's API tab: a run finishes, then you read its dataset.
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("apidojo/tweet-scraper").call(run_input={
"searchTerms": ["from:NASA Artemis"], "sort": "Latest", "maxItems": 50,
})
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["createdAt"], item["likeCount"], item["id"])
After, standard library only, so it runs in an agent sandbox without pip:
import json, os, urllib.request
body = {"query": "Artemis", "fromUsers": ["NASA"], "sort": "latest", "limit": 5}
req = urllib.request.Request(
"https://api.weirapp.io/v1/x/search",
data=json.dumps(body).encode(),
headers={"Authorization": f"Bearer {os.environ['WEIR_API_KEY']}",
"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=60) as r:
page, charged = json.load(r), r.headers["x-credits-charged"]
for post in page["data"]:
print(post["createdAt"][:10], post["likeCount"], post["id"])
print("credits:", charged, "| more:", page["meta"]["nextCursor"] is not None)
We ran it on 30 October 2026. It printed five posts and credits: 6. The free GET /v1/usage showed balance go from 4,723 to 4,717:
2026-10-30 0 2116227124495532095
2026-10-30 0 2116179573977305309
2026-10-29 0 2115685371140792533
2026-10-23 8020 2113776971603689874
2026-10-23 0 2113763713463496930
credits: 6 | more: True
Four of the five were reposts, hence the zeros. The original, trimmed:
{
"id": "2113776971603689874",
"text": "We are not slowing down. 🚀\n\nOur Artemis III mission will send four astronauts ...",
"createdAt": "2026-10-23T23:37:56.000Z",
"author": { "username": "NASA", "verified": true, "followersCount": 92299314 },
"likeCount": 8020,
"viewCount": 1379977,
"retweetedPost": null
}
For every page, use the cursor loop in how to get tweets with Python.
Step 5: Replace the actor schedule with a monitor and a webhook
An Apify schedule re-runs the whole actor, billed per tweet each time. A Weir monitor keeps only what is new and bills 1 credit plus the new posts.
Create the webhook first, then a monitor that names it, as Twitter webhooks shows:
curl -X POST https://api.weirapp.io/v1/monitors \
-H "Authorization: Bearer $WEIR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Artemis", "target": {"kind": "search", "query": "Artemis", "sources": ["x"]},
"schedule": "daily", "webhookId": "<id from POST /v1/webhooks>"}'
Each delivery is signed with HMAC-SHA256 and carries up to 25 new posts in Weir's field names. A run reads one page, so a busy query needs hourly.
The free tier allows one monitor, one webhook and daily or weekly runs. The $5 tier allows 10 monitors and hourly runs. From Make or Zapier, catch the delivery with a webhook trigger. See our Make guide and Zapier guide.
What 10,000 search results cost on each side
Prices checked 30 October 2026 on the actor's pricing tab, Apify's and X's pricing pages, and our X API price index:
- X API: 10,000 post reads at $0.005 is $50, per X API pricing 2026.
- Apify: 10,000 tweets at $0.0004 is $4.00, platform usage included; a script needs the $19 Starter plan, which includes $19 of usage.
- Weir: 500 calls of about 20 posts is 10,500 credits: $2.10 at the $5 pack's $0.20 per 1,000 credits, or $1.10 after the free 5,000.
Packs run from $0.20 down to $0.10 per 1,000 X posts. See pricing. TwitterAPI.io lists $0.15 per 1,000 as of the same date, below both, and can post.
What does not move: Weir's limits
- Other sites, proxies and browsers. Apify's store covers any website; Weir reads X and Reddit only.
- Stored datasets and exports. No dataset, CSV or Excel button: your code writes the file.
- The scheduling console. Apify schedules take cron down to 10 seconds; Weir monitors run hourly, daily or weekly, hourly on paid tiers only.
- Logged-in or private views. Weir reads public data only: no protected accounts, bookmarks, DMs or posting.
- Big batches. The README says one query can return 100,000+ tweets; on Weir that is 5,000 calls.
Weir is not licensed by X, so access can change. X's terms apply on any route, and this isn't legal advice.
Cutover checklist
Run both sides for a day before you stop the actor:
- Get a keySign up, copy a key, set WEIR_API_KEY. No card.
- Rewrite the input and the fieldssearchTerms into query, handles into fromUsers, userName into username.
- Replace the runFollow meta.nextCursor until null, with a page cap.
- Replace the scheduleCreate a webhook, then a monitor that points at it.
- Compare for a dayMatch ids and counts against the last dataset, then stop the actor.
FAQ
Can I keep my Apify Twitter scraper input and only change the URL?
No. The actor takes one JSON input with arrays such as searchTerms. Weir's search takes one query a call, with its own field names and lowercase sort values. Step 1's table is the whole rename.
Does Weir return the same fields as Tweet Scraper V2?
Mostly. id, url, text and the engagement counts keep their names. author.userName becomes author.username, dates become ISO 8601, and isRetweet becomes a retweetedPost object. Weir adds viewCount, media and entities.
How do I replace an Apify schedule for a Twitter scraper?
Create a webhook with POST /v1/webhooks, then a monitor with POST /v1/monitors that names it. Weir runs the search on a schedule, keeps only new posts, and signs each delivery. Hourly runs need a paid tier, from $5.
Sources
All checked 30 October 2026.
- Tweet Scraper V2 store page, pricing tab and Python example: https://apify.com/apidojo/tweet-scraper, https://apify.com/apidojo/tweet-scraper/pricing and https://apify.com/apidojo/tweet-scraper/api/python
- Tweet Scraper V2 public metadata, pricing history and input schema: https://api.apify.com/v2/acts/apidojo~tweet-scraper
- Apify pricing and pay per event: https://apify.com/pricing and https://docs.apify.com/platform/actors/running/actors-in-store
- Apify API: https://docs.apify.com/api/v2/act-run-sync-get-dataset-items-post, https://docs.apify.com/api/v2/dataset-items-get and https://docs.apify.com/api/v2
- Apify docs, schedules, dataset retention, Make and Zapier: https://docs.apify.com/platform/schedules, https://docs.apify.com/platform/storage/dataset, https://docs.apify.com/platform/integrations/make and https://docs.apify.com/platform/integrations/zapier
- X API pricing: https://docs.x.com/x-api/getting-started/pricing
- TwitterAPI.io pricing and posting endpoint: https://twitterapi.io/pricing and https://docs.twitterapi.io/api-reference/endpoint/create_tweet_v2
- Weir docs: https://docs.weirapp.io/reference/x/searchX, https://docs.weirapp.io/billing, https://docs.weirapp.io/monitors and https://docs.weirapp.io/pagination
- Our Weir API calls, 30 October 2026