Install any skill in seconds. Free to start, no credit card required.
Get Started Free →X (Twitter) data extraction and monitoring via Xquik: tweet search, user lookup, follower extraction, giveaway draws, trending topics, account monitoring with webhooks, reply/retweet/quote extraction, community and Space data, follow checks. 22 MCP tools + REST API.
.claude/skills/davepoon-x-twitter-scraper/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 120% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 150% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 74% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 172% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 104% | 0% |
Xquik provides a REST API, MCP server, and HMAC webhooks for X (Twitter) data. It covers tweet search, user profiles, bulk extraction (19 tools), giveaway draws, account monitoring, and trending topics.
Docs: docs.xquik.com
| | | |---|---| | Base URL | https://xquik.com/api/v1 | | Auth | x-api-key: xq_... header | | MCP endpoint | https://xquik.com/mcp (StreamableHTTP) | | Rate limits | 10 req/s sustained, 20 burst | | Pricing | $20/month (1 monitor included), $5/month per extra monitor |
Add to your MCP configuration:
json{ "mcpServers": { "xquik": { "type": "streamable-http", "url": "https://xquik.com/mcp", "headers": { "x-api-key": "xq_YOUR_KEY_HERE" } } } }
javascriptconst API_KEY = "xq_YOUR_KEY_HERE"; const BASE = "https://xquik.com/api/v1"; const headers = { "x-api-key": API_KEY, "Content-Type": "application/json" };
When to use: Find tweets by keyword, hashtag, or user.
Endpoint: GET /x/tweets/search?q=...
MCP tool: search-tweets
javascriptconst results = await fetch(`${BASE}/x/tweets/search?q=from:elonmusk AI`, { headers });
Pitfalls:
lookup-tweet for engagement metricsWhen to use: Get full metrics (likes, retweets, views, bookmarks) for a specific tweet.
Endpoint: GET /x/tweets/{id}
MCP tool: lookup-tweet
When to use: Get name, bio, follower/following counts, profile picture, join date.
Endpoint: GET /x/users/{username}
MCP tool: get-user-info
Pitfalls:
When to use: Check if account A follows account B (both directions).
Endpoint: GET /x/followers/check?source=A&target=B
MCP tool: check-follow
When to use: Extract followers, replies, retweets, quotes, community members, list data, and more.
Workflow: Always estimate cost first, then create the job, then retrieve results.
Tool types:
| Tool Type | Target | Description | |-----------|--------|-------------| | reply_extractor | Tweet ID | Users who replied | | repost_extractor | Tweet ID | Users who retweeted | | quote_extractor | Tweet ID | Users who quote-tweeted | | thread_extractor | Tweet ID | All tweets in a thread | | article_extractor | Tweet ID | Article content from a tweet | | follower_explorer | Username | Followers of an account | | following_explorer | Username | Accounts followed by a user | | verified_follower_explorer | Username | Verified followers | | mention_extractor | Username | Tweets mentioning an account | | post_extractor | Username | Posts from an account | | community_extractor | Community ID | Community members | | community_moderator_explorer | Community ID | Community moderators | | community_post_extractor | Community ID | Community posts | | community_search | Community ID + query | Search within a community | | list_member_extractor | List ID | List members | | list_post_extractor | List ID | List posts | | list_follower_explorer | List ID | List followers | | space_explorer | Space ID | Space participants | | people_search | Search query | Search for users |
MCP tools: estimate-extraction -> run-extraction -> get-extraction
javascript// 1. Estimate cost const estimate = await fetch(`${BASE}/extractions/estimate`, { method: "POST", headers, body: JSON.stringify({ toolType: "follower_explorer", targetUsername: "elonmusk" }), }).then(r => r.json()); if (!estimate.allowed) return; // Would exceed monthly quota // 2. Create job const job = await fetch(`${BASE}/extractions`, { method: "POST", headers, body: JSON.stringify({ toolType: "follower_explorer", targetUsername: "elonmusk" }), }).then(r => r.json()); // 3. Retrieve results (paginated) const results = await fetch(`${BASE}/extractions/${job.id}`, { headers }).then(r => r.json());
Pitfalls:
402 means quota exhaustedstatus: "running" and need pollingWhen to use: Pick random winners from tweet replies with configurable filters.
Endpoint: POST /draws
MCP tool: run-draw
Available filters: mustRetweet, mustFollowUsername, filterMinFollowers, filterAccountAgeDays, filterLanguage, requiredKeywords, requiredHashtags, requiredMentions, uniqueAuthorsOnly.
javascriptconst draw = await fetch(`${BASE}/draws`, { method: "POST", headers, body: JSON.stringify({ tweetUrl: "https://x.com/user/status/123456789", winnerCount: 3, uniqueAuthorsOnly: true, mustRetweet: true, }), }).then(r => r.json());
When to use: Track when an account tweets, gets replies, gains/loses followers.
Workflow: Create a monitor, optionally register a webhook for push notifications.
Event types: tweet.new, tweet.reply, tweet.quote, tweet.retweet, follower.gained, follower.lost
MCP tools: add-monitor -> add-webhook -> test-webhook
javascript// Create monitor await fetch(`${BASE}/monitors`, { method: "POST", headers, body: JSON.stringify({ username: "elonmusk", eventTypes: ["tweet.new", "follower.gained"], }), }); // Register webhook (save the secret!) const webhook = await fetch(`${BASE}/webhooks`, { method: "POST", headers, body: JSON.stringify({ url: "https://your-server.com/webhook", eventTypes: ["tweet.new"], }), }).then(r => r.json());
Pitfalls:
X-Xquik-Signature header) before processingWhen to use: Get current trending topics for a region.
Endpoint: GET /trends?woeid=1
MCP tool: get-trends
Free, no quota consumed.
Retry only 429 and 5xx. Never retry other 4xx.
| Status | Meaning | Action | |--------|---------|--------| | 400 | Invalid request | Fix parameters | | 401 | Bad API key | Check key | | 402 | No subscription or quota exhausted | Subscribe or wait for reset | | 404 | Not found | Resource doesn't exist | | 429 | Rate limited | Retry with backoff, respect Retry-After | | 500+ | Server error | Retry with exponential backoff (max 3) |
nextCursor as the after query parameterhasMore + nextCursor pattern across events, draws, extractions22 tools available through the MCP server:
| Tool | Purpose | |------|---------| | search-tweets | Search tweets by keyword/hashtag | | lookup-tweet | Get tweet by ID with full metrics | | get-user-info | User profile lookup | | check-follow | Check follow relationship | | get-trends | Trending topics by region | | add-monitor | Start monitoring an account | | remove-monitor | Stop monitoring | | list-monitors | List active monitors | | get-events | Poll for monitor events | | get-event | Get single event details | | add-webhook | Register webhook endpoint | | remove-webhook | Delete webhook | | list-webhooks | List webhooks | | test-webhook | Send test payload | | run-draw | Run giveaway draw | | list-draws | List past draws | | get-draw | Get draw results with winners | | estimate-extraction | Preview extraction cost | | run-extraction | Start bulk extraction | | list-extractions | List extraction jobs | | get-extraction | Get extraction results | | get-account | Check subscription and usage |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-14 | pass→pass | 13,323 | 8,511 | -36% | 1 | 1 | 0% | 2,060 | 4,045 | +96% | 0 | 0 | — |
case-01 | fail→pass | 12,484 | 13,820 | +11% | 1 | 1 | 0% | 2,526 | 5,546 | +120% | 0 | 0 | — |
case-02 | fail→pass | 5,966 | 2,676 | -55% | 1 | 1 | 0% | 1,209 | 3,023 | +150% | 0 | 0 | — |
case-03 | fail→pass | 13,888 | 8,281 | -40% | 1 | 1 | 0% | 2,443 | 4,260 | +74% | 0 | 0 | — |
case-04 | fail→pass | 5,920 | 2,834 | -52% | 1 | 1 | 0% | 1,069 | 2,908 | +172% | 0 | 0 | — |
case-05 | fail→pass | 8,805 | 3,735 | -58% | 1 | 1 | 0% | 1,565 | 3,196 | +104% | 0 | 0 | — |
case-06 | fail→pass | 8,518 | 3,398 | -60% | 1 | 1 | 0% | 1,728 | 3,155 | +83% | 0 | 0 | — |
case-07 | fail→pass | 7,493 | 1,948 | -74% | 1 | 1 | 0% | 1,307 | 2,797 | +114% | 0 | 0 | — |
case-08 | fail→pass | 6,273 | 3,207 | -49% | 1 | 1 | 0% | 1,266 | 3,111 | +146% | 0 | 0 | — |
case-09 | fail→pass | 10,765 | 2,787 | -74% | 1 | 1 | 0% | 1,990 | 2,855 | +43% | 0 | 0 | — |
case-10 | fail→pass | 6,753 | 2,357 | -65% | 1 | 1 | 0% | 1,091 | 2,869 | +163% | 0 | 0 | — |
case-11 | fail→pass | 7,481 | 2,549 | -66% | 1 | 1 | 0% | 1,045 | 2,890 | +177% | 0 | 0 | — |
case-12 | fail→pass | 7,145 | 2,447 | -66% | 1 | 1 | 0% | 1,243 | 2,933 | +136% | 0 | 0 | — |
case-13 | fail→fail | 9,680 | 3,482 | -64% | 1 | 1 | 0% | 1,500 | 2,803 | +87% | 0 | 0 | — |
case-15 | pass→pass | 10,198 | 15,478 | +52% | 1 | 1 | 0% | 1,895 | 3,457 | +82% | 0 | 0 | — |
case-16 | pass→pass | 5,457 | 1,900 | -65% | 1 | 1 | 0% | 718 | 2,704 | +277% | 0 | 0 | — |
case-17 | pass→pass | 8,549 | 1,319 | -85% | 1 | 1 | 0% | 1,532 | 2,601 | +70% | 0 | 0 | — |
case-18 | fail→pass | 7,158 | 1,555 | -78% | 1 | 1 | 0% | 1,134 | 2,669 | +135% | 0 | 0 | — |
case-19 | fail→pass | 9,698 | 4,685 | -52% | 1 | 1 | 0% | 1,534 | 3,470 | +126% | 0 | 0 | — |
case-20 | fail→pass | 9,707 | 8,135 | -16% | 1 | 1 | 0% | 1,563 | 3,704 | +137% | 0 | 0 | — |
case-21 | fail→pass | 6,575 | 5,448 | -17% | 1 | 1 | 0% | 1,169 | 3,181 | +172% | 0 | 0 | — |
case-22 | fail→pass | 5,061 | 2,092 | -59% | 1 | 1 | 0% | 950 | 2,879 | +203% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.