eric861129/skills_all-in-one/x-twitter-scraper

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

X API & Twitter scraper skill for AI coding agents. Builds integrations with the Xquik REST API, MCP server & webhooks: tweet search, user lookup, follower extraction, engagement metrics, giveaway contest draws, trending topics, account monitoring, reply/retweet/quote extraction, community & Space data, mutual follow checks, write actions (tweet, like, retweet, follow, DM, profile, media upload, communities), Telegram integrations. Works with Claude Code, Cursor, Codex, Copilot, Windsurf & 40+ agents.

Install

npx vskill@latest install eric861129/skills_all-in-one/x-twitter-scraper

SKILL.md

Xquik API Integration

Xquik is an X (Twitter) real-time data platform providing a REST API, HMAC webhooks, and an MCP server for AI agents. It covers account monitoring, bulk data extraction (20 tools), giveaway draws, tweet/user lookups, media downloads, follow checks, trending topics, write actions (tweet, like, retweet, follow, DM, profile, media upload, communities), and Telegram integrations.

Quick Reference

Base URLhttps://xquik.com/api/v1
Authx-api-key: xq_... header (64 hex chars after xq_ prefix)
MCP endpointhttps://xquik.com/mcp (StreamableHTTP, same API key)
Rate limits10 req/s sustained, 20 burst (API); 60 req/s sustained, 100 burst (general)
Pricing$20/month base (1 monitor included), $5/month per extra monitor
QuotaMonthly usage cap. 402 when exhausted. Enable extra usage from dashboard for overage (tiered spending limits: $5/$7/$10/$15/$25)
Docsdocs.xquik.com
HTTPS onlyPlain HTTP gets 301 redirect

Authentication

Every request requires an API key via the x-api-key header. Keys start with xq_ and are generated from the Xquik dashboard. The key is shown only once at creation; store it securely.

javascript
const API_KEY = "xq_YOUR_KEY_HERE";
const BASE = "https://xquik.com/api/v1";
const headers = { "x-api-key": API_KEY, "Content-Type": "application/json" };

For Python examples, see references/python-examples.md.

Choosing the Right Endpoint

GoalEndpointNotes
Get a single tweet by ID/URLGET /x/tweets/{id}Full metrics: likes, retweets, views, bookmarks, author info
Search tweets by keyword/hashtagGET /x/tweets/search?q=...Tweet info with optional engagement metrics (likeCount, retweetCount, replyCount)
Get a user profileGET /x/users/{username}Name, bio, follower/following counts, profile picture, location, created date, statuses count
Check follow relationshipGET /x/followers/check?source=A&target=BBoth directions
Get trending topicsGET /trends?woeid=1Regional trends by WOEID. Metered
Get radar (trending news)GET /radar?source=hacker_newsFree, 7 sources: Google Trends, Hacker News, Polymarket, TrustMRR, Wikipedia, GitHub, Reddit
Monitor an X accountPOST /monitorsTrack tweets, replies, quotes, retweets, follower changes
Update monitor event typesPATCH /monitors/{id}Change subscribed events or pause/resume
Poll for eventsGET /eventsCursor-paginated, filter by monitorId/eventType
Receive events in real timePOST /webhooksHMAC-signed delivery to your HTTPS endpoint
Update webhookPATCH /webhooks/{id}Change URL, event types, or pause/resume
Run a giveaway drawPOST /drawsPick random winners from tweet replies
Download tweet mediaPOST /x/media/downloadSingle (tweetInput) or bulk (tweetIds[], up to 50). Returns gallery URL. First download metered, cached free
Extract bulk dataPOST /extractions20 tool types, always estimate cost first
Check account/usageGET /accountPlan status, monitors, usage percent
Link your X identityPUT /account/x-identityRequired for own-account detection in style analysis
Analyze tweet stylePOST /stylesCache recent tweets for style reference
Save custom stylePUT /styles/{username}Save custom style from tweet texts (free)
Get cached styleGET /styles/{username}Retrieve previously cached tweet style
Compare stylesGET /styles/compare?username1=A&username2=BSide-by-side comparison of two cached styles
Get tweet performanceGET /styles/{username}/performanceLive engagement metrics for cached tweets
Save a tweet draftPOST /draftsStore drafts for later
List/manage draftsGET /drafts, DELETE /drafts/{id}Retrieve and delete saved drafts
Compose a tweetPOST /compose3-step workflow (compose, refine, score). Free, algorithm-backed
Connect an X accountPOST /x/accountsCredentials encrypted at rest. Required for write actions
List connected accountsGET /x/accountsFree
Re-authenticate accountPOST /x/accounts/{id}/reauthWhen session expires
Post a tweetPOST /x/tweetsFrom a connected account. Supports replies, media, note tweets, communities
Delete a tweetDELETE /x/tweets/{id}Must own the tweet via connected account
Like / Unlike a tweetPOST / DELETE /x/tweets/{id}/likeMetered
RetweetPOST /x/tweets/{id}/retweetMetered
Follow / Unfollow a userPOST / DELETE /x/users/{id}/followMetered
Send a DMPOST /x/dm/{userId}Text, media, reply to message
Update profilePATCH /x/profileName, bio, location, URL
Upload mediaPOST /x/mediaFormData. Returns media ID for tweet attachment
Community actionsPOST /x/communities, POST /x/communities/{id}/joinCreate, delete, join, leave
Create Telegram integrationPOST /integrationsReceive monitor events in Telegram. Free
Manage integrationsGET /integrations, PATCH /integrations/{id}List, update, delete, test, deliveries. Free

See references/mcp-tools.md for tool selection rules, common mistakes, and unsupported operations.

Error Handling & Retry

All errors return { "error": "error_code" }. Key error codes:

StatusCodeAction
400invalid_input, invalid_id, invalid_params, invalid_tweet_url, invalid_tweet_id, invalid_username, invalid_tool_type, invalid_format, missing_query, missing_params, webhook_inactive, no_mediaFix the request, do not retry
401unauthenticatedCheck API key
402no_subscription, subscription_inactive, usage_limit_reached, no_addon, extra_usage_disabled, extra_usage_requires_v2, frozen, overage_limit_reachedSubscribe, enable extra usage, or wait for quota reset
403monitor_limit_reached, api_key_limit_reachedDelete a monitor/key or add capacity
404not_found, user_not_found, tweet_not_found, style_not_found, draft_not_found, account_not_foundResource doesn't exist or belongs to another account
409monitor_already_exists, account_already_connected, already_memberResource already exists, use the existing one
422connection_failed, reauth_failedX credential verification failed. Check credentials
429x_api_rate_limitedRate limited. Retry with exponential backoff, respect Retry-After header
500internal_errorRetry with backoff
502stream_registration_failed, x_api_unavailable, x_api_unauthorized, x_write_failed, upstream_error, delivery_failedRetry with backoff

Retry only 429 and 5xx. Never retry 4xx (except 429). Max 3 retries with exponential backoff:

javascript
async function xquikFetch(path, options = {}) {
const baseDelay = 1000;
for (let attempt = 0; attempt <= 3; attempt++) {
const response = await fetch(`${BASE}${path}`, {
...options,
headers: { ...headers, ...options.headers },
});
if (response.ok) return response.json();
const retryable = response.status === 429 || response.status >= 500;
if (!retryable || attempt === 3) {
const error = await response.json();
throw new Error(`Xquik API ${response.status}: ${error.error}`);
}
const retryAfter = response.headers.get("Retry-After");
const delay = retryAfter
? parseInt(retryAfter, 10) * 1000
: baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
await new Promise((resolve) => setTimeout(resolve, delay));
}
}

Cursor Pagination

Events, draws, extractions, and extraction results use cursor-based pagination. When more results exist, the response includes hasMore: true and a nextCursor string. Pass nextCursor as the after query parameter.

javascript
async function fetchAllPages(path, dataKey) {
const results = [];
let cursor;
while (true) {
const params = new URLSearchParams({ limit: "100" });
if (cursor) params.set("after", cursor);
const data = await xquikFetch(`${path}?${params}`);
results.push(...data[dataKey]);
if (!data.hasMore) break;
cursor = data.nextCursor;
}
return results;
}

Cursors are opaque strings. Never decode or construct them manually.

Extraction Tools (20 Types)

Extractions run bulk data collection jobs. The complete workflow: estimate cost, create job, retrieve results, optionally export.

Tool Types and Required Parameters
Tool TypeRequired FieldDescription
reply_extractortargetTweetIdUsers who replied to a tweet
repost_extractortargetTweetIdUsers who retweeted a tweet
quote_extractortargetTweetIdUsers who quote-tweeted a tweet
thread_extractortargetTweetIdAll tweets in a thread
article_extractortargetTweetIdArticle content linked in a tweet
follower_explorertargetUsernameFollowers of an account
following_explorertargetUsernameAccounts followed by a user
verified_follower_explorertargetUsernameVerified followers of an account
mention_extractortargetUsernameTweets mentioning an account
post_extractortargetUsernamePosts from an account
community_extractortargetCommunityIdMembers of a community
community_moderator_explorertargetCommunityIdModerators of a community
community_post_extractortargetCommunityIdPosts from a community
community_searchtargetCommunityId + searchQuerySearch posts within a community
list_member_extractortargetListIdMembers of a list
list_post_extractortargetListIdPosts from a list
list_follower_explorertargetListIdFollowers of a list
space_explorertargetSpaceIdParticipants of a Space
people_searchsearchQuerySearch for users by keyword
tweet_search_extractorsearchQuerySearch and extract tweets by keyword or hashtag (bulk, up to 1,000)
Complete Extraction Workflow
javascript
// Step 1: Estimate cost before running (pass resultsLimit if you only need a sample)
const estimate = await xquikFetch("/extractions/estimate", {
method: "POST",
body: JSON.stringify({
toolType: "follower_explorer",
targetUsername: "elonmusk",
resultsLimit: 1000, // optional: limit to 1,000 results instead of all
}),
});
// Response: { allowed: true, estimatedResults: 195000000, usagePercent: 12, projectedPercent: 98 }
if (!estimate.allowed) {
console.log("Extraction would exceed monthly quota");
return;
}
// Step 2: Create extraction job (pass same resultsLimit to match estimate)
const job = await xquikFetch("/extractions", {
method: "POST",
body: JSON.stringify({
toolType: "follower_explorer",
targetUsername: "elonmusk",
resultsLimit: 1000,
}),
});
// Response: { id: "77777", toolType: "follower_explorer", status: "completed", totalResults: 195000 }
// Step 3: Poll until complete (large jobs may return status "running")
while (job.status === "pending" || job.status === "running") {
await new Promise((r) => setTimeout(r, 2000));
job = await xquikFetch(`/extractions/${job.id}`);
}
// Step 4: Retrieve paginated results (up to 1,000 per page)
let cursor;
const allResults = [];

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
1
7-day trend score
3

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 17 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/eric861129/skills_all-in-one/x-twitter-scraper/badge)](https://verified-skill.com/skills/eric861129/skills_all-in-one/x-twitter-scraper)

Something wrong with this skill or its page? Tell us.