X Twitter Scraper
davila7/claude-code-templates
X API & Twitter scraper skill for AI coding agents. An agent skill from davila7/claude-code-templates.
X API & Twitter automation skill. An agent skill from LeoYeAI/openclaw-master-skills.
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraper --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/xquik-x-twitter .claude/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .claude/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitterType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraper --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/xquik-x-twitter .agents/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .agents/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraper --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/xquik-x-twitter .cursor/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .cursor/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/LeoYeAI/openclaw-master-skills.git --path skills/xquik-x-twitter--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraper --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/xquik-x-twitter .gemini/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .gemini/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraperInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/xquik-x-twitter .github/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .github/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install LeoYeAI/openclaw-master-skills x-twitter-scraper --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/xquik-x-twitter .opencode/skills/x-twitter-scraper && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "x-twitter-scraper" agent skill from https://github.com/LeoYeAI/openclaw-master-skills/tree/main/skills/xquik-x-twitter into .opencode/skills/x-twitter-scraper/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "x-twitter-scraper", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
x-twitter-scraperX API & Twitter automation skill. An agent skill from LeoYeAI/openclaw-master-skills.
X Twitter Scraper is an agent skill from LeoYeAI/openclaw-master-skills. X API & Twitter automation skill. Build integrations with the Xquik REST API, MCP server & webhooks: tweet search, user lookup, follower extraction, engagement metrics, giveaway draws, trending topics, account monitoring, reply/retweet/quote extraction, community & Space data, write actions (tweet, like, retweet, follow, DM, profile, media upload), Telegram integrations.
Its SKILL.md is about 7.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 10 other files, including reference files (for example `_meta.json`, `metadata.json` and `references/api-endpoints.md`).
It sits in Backend & APIs, covering Social media posts, Web scraping and Webhooks. It works with X (Twitter), Model Context Protocol, Telegram and Python. The repository describes itself as: 🧠 Curated collection of 1209+ best OpenClaw skills — weekly updated by MyClaw.ai. The licence is MIT.
Read from SKILL.md and the folder at commit e5199b5. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
xquik.comx.comAlso links to:
docs.xquik.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
API_KEYWEBHOOK_SECRETXQUIK_WEBHOOK_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
X Twitter Scraper loads about 7.1k tokens when it runs, and up to ~38k if it reads all its reference files. Until then it costs about 98 tokens; SKILL.md has 2,031 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from LeoYeAI/openclaw-master-skills at commit e5199b5, republished under its MIT licence (© LeoYeAI). 2,031 words, ~7,104 tokens.
.claude/skills/x-twitter-scraper/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.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.
| Base URL | https://xquik.com/api/v1 |
| Auth | x-api-key: xq_... header (64 hex chars after xq_ prefix) |
| MCP endpoint | https://xquik.com/mcp (StreamableHTTP, same API key) |
| Rate limits | 10 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 |
| Quota | Monthly usage cap. 402 when exhausted. Enable extra usage from dashboard for overage (tiered spending limits: $5/$7/$10/$15/$25) |
| Docs | docs.xquik.com |
| HTTPS only | Plain HTTP gets 301 redirect |
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.
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.
| Goal | Endpoint | Notes |
|---|---|---|
| Get a single tweet by ID/URL | GET /x/tweets/{id} | Full metrics: likes, retweets, views, bookmarks, author info |
| Search tweets by keyword/hashtag | GET /x/tweets/search?q=... | Tweet info with optional engagement metrics (likeCount, retweetCount, replyCount) |
| Get a user profile | GET /x/users/{username} | Name, bio, follower/following counts, profile picture, location, created date, statuses count |
| Check follow relationship | GET /x/followers/check?source=A&target=B | Both directions |
| Get trending topics | GET /trends?woeid=1 | Regional trends by WOEID. Metered |
| Get radar (trending news) | GET /radar?source=hacker_news | Free, 7 sources: Google Trends, Hacker News, Polymarket, TrustMRR, Wikipedia, GitHub, Reddit |
| Monitor an X account | POST /monitors | Track tweets, replies, quotes, retweets, follower changes |
| Update monitor event types | PATCH /monitors/{id} | Change subscribed events or pause/resume |
| Poll for events | GET /events | Cursor-paginated, filter by monitorId/eventType |
| Receive events in real time | POST /webhooks | HMAC-signed delivery to your HTTPS endpoint |
| Update webhook | PATCH /webhooks/{id} | Change URL, event types, or pause/resume |
| Run a giveaway draw | POST /draws | Pick random winners from tweet replies |
| Download tweet media | POST /x/media/download | Single (tweetInput) or bulk (tweetIds[], up to 50). Returns gallery URL. First download metered, cached free |
| Extract bulk data | POST /extractions | 20 tool types, always estimate cost first |
| Check account/usage | GET /account | Plan status, monitors, usage percent |
| Link your X identity | PUT /account/x-identity | Required for own-account detection in style analysis |
| Analyze tweet style | POST /styles | Cache recent tweets for style reference |
| Save custom style | PUT /styles/{username} | Save custom style from tweet texts (free) |
| Get cached style | GET /styles/{username} | Retrieve previously cached tweet style |
| Compare styles | GET /styles/compare?username1=A&username2=B | Side-by-side comparison of two cached styles |
| Get tweet performance | GET /styles/{username}/performance | Live engagement metrics for cached tweets |
| Save a tweet draft | POST /drafts | Store drafts for later |
| List/manage drafts | GET /drafts, DELETE /drafts/{id} | Retrieve and delete saved drafts |
| Compose a tweet | POST /compose | 3-step workflow (compose, refine, score). Free, algorithm-backed |
| Connect an X account | POST /x/accounts | Credentials encrypted at rest. Required for write actions |
| List connected accounts | GET /x/accounts | Free |
| Re-authenticate account | POST /x/accounts/{id}/reauth | When session expires |
| Post a tweet | POST /x/tweets | From a connected account. Supports replies, media, note tweets, communities |
| Delete a tweet | DELETE /x/tweets/{id} | Must own the tweet via connected account |
| Like / Unlike a tweet | POST / DELETE /x/tweets/{id}/like | Metered |
| Retweet | POST /x/tweets/{id}/retweet | Metered |
| Follow / Unfollow a user | POST / DELETE /x/users/{id}/follow | Metered |
| Send a DM | POST /x/dm/{userId} | Text, media, reply to message |
| Update profile | PATCH /x/profile | Name, bio, location, URL |
| Update avatar | PATCH /x/profile/avatar | FormData with image file (max 700 KB) |
| Update banner | PATCH /x/profile/banner | FormData with image file (max 2 MB) |
| Upload media | POST /x/media | FormData. Returns media ID for tweet attachment |
| Community actions | POST /x/communities, POST /x/communities/{id}/join | Create, delete, join, leave |
| Create Telegram integration | POST /integrations | Receive monitor events in Telegram. Free |
| Manage integrations | GET /integrations, PATCH /integrations/{id} | List, update, delete, test, deliveries. Free |
See references/mcp-tools.md for tool selection rules, common mistakes, and unsupported operations.
All errors return { "error": "error_code" }. Key error codes:
| Status | Code | Action |
|---|---|---|
| 400 | invalid_input, invalid_id, invalid_params, invalid_tweet_url, invalid_tweet_id, invalid_username, invalid_tool_type, invalid_format, invalid_json, missing_query, missing_params, webhook_inactive, no_media | Fix the request, do not retry |
| 401 | unauthenticated | Check API key |
| 402 | no_subscription, subscription_inactive, usage_limit_reached, no_addon, extra_usage_disabled, extra_usage_requires_v2, frozen, overage_limit_reached | Subscribe, enable extra usage, or wait for quota reset |
| 403 | monitor_limit_reached, api_key_limit_reached | Delete a monitor/key or add capacity |
| 404 | not_found, user_not_found, tweet_not_found, style_not_found, draft_not_found | Resource doesn't exist or belongs to another account |
| 409 | monitor_already_exists | Resource already exists, use the existing one |
| 422 | login_failed | X credential verification failed. Check credentials |
| 429 | x_api_rate_limited | Rate limited. Retry with exponential backoff, respect Retry-After header |
| 500 | internal_error | Retry with backoff |
| 502 | stream_registration_failed, x_api_unavailable, x_api_unauthorized, delivery_failed | Retry with backoff |
Retry only 429 and 5xx. Never retry 4xx (except 429). Max 3 retries with exponential backoff:
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));
}
}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.
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.
Extractions run bulk data collection jobs. The complete workflow: estimate cost, create job, retrieve results, optionally export.
| Tool Type | Required Field | Description |
|---|---|---|
reply_extractor | targetTweetId | Users who replied to a tweet |
repost_extractor | targetTweetId | Users who retweeted a tweet |
quote_extractor | targetTweetId | Users who quote-tweeted a tweet |
thread_extractor | targetTweetId | All tweets in a thread |
article_extractor | targetTweetId | Article content linked in a tweet |
follower_explorer | targetUsername | Followers of an account |
following_explorer | targetUsername | Accounts followed by a user |
verified_follower_explorer | targetUsername | Verified followers of an account |
mention_extractor | targetUsername | Tweets mentioning an account |
post_extractor | targetUsername | Posts from an account |
community_extractor | targetCommunityId | Members of a community |
community_moderator_explorer | targetCommunityId | Moderators of a community |
community_post_extractor | targetCommunityId | Posts from a community |
community_search | targetCommunityId + searchQuery | Search posts within a community |
list_member_extractor | targetListId | Members of a list |
list_post_extractor | targetListId | Posts from a list |
list_follower_explorer | targetListId | Followers of a list |
space_explorer | targetSpaceId | Participants of a Space |
people_search | searchQuery | Search for users by keyword |
tweet_search_extractor | searchQuery | Search and extract tweets by keyword or hashtag (bulk, up to 1,000) |
// 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 = [];
while (true) {
const path = `/extractions/${job.id}${cursor ? `?after=${cursor}` : ""}`;
const page = await xquikFetch(path);
allResults.push(...page.results);
// Each result: { xUserId, xUsername, xDisplayName, xFollowersCount, xVerified, xProfileImageUrl }
if (!page.hasMore) break;
cursor = page.nextCursor;
}
// Step 5: Export as CSV/XLSX/Markdown (50,000 row limit)
const exportUrl = `${BASE}/extractions/${job.id}/export?format=csv`;
const csvResponse = await fetch(exportUrl, { headers });
const csvData = await csvResponse.text();When building applications that combine multiple extraction tools (e.g., market research), run them sequentially and respect rate limits:
async function marketResearchPipeline(username) {
// 1. Get user profile
const user = await xquikFetch(`/x/users/${username}`);
// 2. Extract their recent posts
const postsJob = await xquikFetch("/extractions", {
method: "POST",
body: JSON.stringify({ toolType: "post_extractor", targetUsername: username }),
});
// 3. Search for related conversations
const tweets = await xquikFetch(`/x/tweets/search?q=from:${username}`);
// 4. For top tweets, extract replies for sentiment analysis
for (const tweet of tweets.tweets.slice(0, 5)) {
const estimate = await xquikFetch("/extractions/estimate", {
method: "POST",
body: JSON.stringify({ toolType: "reply_extractor", targetTweetId: tweet.id }),
});
if (estimate.allowed) {
const repliesJob = await xquikFetch("/extractions", {
method: "POST",
body: JSON.stringify({ toolType: "reply_extractor", targetTweetId: tweet.id }),
});
// Process replies...
}
}
// 5. Get trending topics for context
const trends = await xquikFetch("/trends?woeid=1");
return { user, posts: postsJob, tweets, trends };
}Run transparent, auditable giveaway draws from tweet replies with configurable filters.
POST /draws with a tweetUrl (required) and optional filters:
| Field | Type | Description |
|---|---|---|
tweetUrl | string | Required. Full tweet URL: https://x.com/user/status/ID |
winnerCount | number | Winners to select (default 1) |
backupCount | number | Backup winners to select |
uniqueAuthorsOnly | boolean | Count only one entry per author |
mustRetweet | boolean | Require participants to have retweeted |
mustFollowUsername | string | Username participants must follow |
filterMinFollowers | number | Minimum follower count |
filterAccountAgeDays | number | Minimum account age in days |
filterLanguage | string | Language code (e.g., "en") |
requiredKeywords | string[] | Words that must appear in the reply |
requiredHashtags | string[] | Hashtags that must appear (e.g., ["#giveaway"]) |
requiredMentions | string[] | Usernames that must be mentioned (e.g., ["@xquik"]) |
// Step 1: Create draw with filters
const draw = await xquikFetch("/draws", {
method: "POST",
body: JSON.stringify({
tweetUrl: "https://x.com/burakbayir/status/1893456789012345678",
winnerCount: 3,
backupCount: 2,
uniqueAuthorsOnly: true,
mustRetweet: true,
mustFollowUsername: "burakbayir",
filterMinFollowers: 50,
filterAccountAgeDays: 30,
filterLanguage: "en",
requiredHashtags: ["#giveaway"],
}),
});
// Response:
// {
// id: "42",
// tweetId: "1893456789012345678",
// tweetUrl: "https://x.com/burakbayir/status/1893456789012345678",
// tweetText: "Giveaway! RT + Follow to enter...",
// tweetAuthorUsername: "burakbayir",
// tweetLikeCount: 5200,
// tweetRetweetCount: 3100,
// tweetReplyCount: 890,
// tweetQuoteCount: 45,
// status: "completed",
// totalEntries: 890,
// validEntries: 312,
// createdAt: "2026-02-24T10:00:00.000Z",
// drawnAt: "2026-02-24T10:01:00.000Z"
// }
// Step 2: Get draw details with winners
const details = await xquikFetch(`/draws/${draw.id}`);
// details.winners: [
// { position: 1, authorUsername: "winner1", tweetId: "...", isBackup: false },
// { position: 2, authorUsername: "winner2", tweetId: "...", isBackup: false },
// { position: 3, authorUsername: "winner3", tweetId: "...", isBackup: false },
// { position: 4, authorUsername: "backup1", tweetId: "...", isBackup: true },
// { position: 5, authorUsername: "backup2", tweetId: "...", isBackup: true },
// ]
// Step 3: Export results
const exportUrl = `${BASE}/draws/${draw.id}/export?format=csv`;Webhooks deliver events to your HTTPS endpoint with HMAC-SHA256 signatures. Each delivery is a POST with X-Xquik-Signature header and JSON body containing eventType, username, and data.
import express from "express";
import { createHmac, timingSafeEqual, createHash } from "node:crypto";
const WEBHOOK_SECRET = process.env.XQUIK_WEBHOOK_SECRET;
const processedHashes = new Set(); // Use Redis/DB in production
function verifySignature(payload, signature, secret) {
const expected = "sha256=" + createHmac("sha256", secret).update(payload).digest("hex");
return timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
const app = express();
app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
const signature = req.headers["x-xquik-signature"];
const payload = req.body.toString();
// 1. Verify HMAC signature (constant-time comparison)
if (!signature || !verifySignature(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send("Invalid signature");
}
// 2. Deduplicate (retries can deliver the same event twice)
const payloadHash = createHash("sha256").update(payload).digest("hex");
if (processedHashes.has(payloadHash)) {
return res.status(200).send("Already processed");
}
processedHashes.add(payloadHash);
// 3. Parse and route by event type
const event = JSON.parse(payload);
// event.eventType: "tweet.new" | "tweet.reply" | "tweet.quote" | "tweet.retweet" | "follower.gained" | "follower.lost"
// event.username: monitored account username
// event.data: tweet data ({ tweetId, text, metrics }) or follower data ({ followerId, followerUsername, followerName, followerFollowersCount, followerVerified })
// 4. Respond within 10 seconds (process async if slow)
res.status(200).send("OK");
});
app.listen(3000);For Flask (Python) webhook handler, see references/python-examples.md.
Webhook security rules:
200 within 10 seconds; queue slow processing for asyncCheck delivery status via GET /webhooks/{id}/deliveries to monitor successful and failed attempts.
Complete end-to-end: create monitor, register webhook, handle events.
// 1. Create monitor
const monitor = await xquikFetch("/monitors", {
method: "POST",
body: JSON.stringify({
username: "elonmusk",
eventTypes: ["tweet.new", "tweet.reply", "tweet.quote", "follower.gained"],
}),
});
// Response: { id: "7", username: "elonmusk", xUserId: "44196397", eventTypes: [...], createdAt: "..." }
// 2. Register webhook
const webhook = await xquikFetch("/webhooks", {
method: "POST",
body: JSON.stringify({
url: "https://your-server.com/webhook",
eventTypes: ["tweet.new", "tweet.reply"],
}),
});
// IMPORTANT: Save webhook.secret. It is shown only once!
// 3. Poll events (alternative to webhooks)
const events = await xquikFetch("/events?monitorId=7&limit=50");
// Response: { events: [...], hasMore: false }Event types: tweet.new, tweet.quote, tweet.reply, tweet.retweet, follower.gained, follower.lost.
The MCP server at https://xquik.com/mcp uses a code-execution sandbox model with 2 tools (explore + xquik). The agent writes async JavaScript arrow functions that run in a sandboxed environment with auth injected automatically. StreamableHTTP transport. API key auth (x-api-key header) for CLI/IDE clients; OAuth 2.1 for web clients (Claude.ai, ChatGPT Developer Mode). Supported platforms: Claude.ai, Claude Desktop, Claude Code, ChatGPT (Custom GPT, Agents SDK, Developer Mode), Codex CLI, Cursor, VS Code, Windsurf, OpenCode.
Legacy v1 server at https://xquik.com/mcp/v1 exposes 18 discrete tools with traditional input schemas. All new integrations should use the default v2 server at /mcp.
The server also registers 5 guided workflow prompts: compose-tweet, compose-trending-tweet, compose-radar-tweet, analyze-account, run-giveaway. Use prompts/list and prompts/get in compatible clients.
For setup configs per platform, read references/mcp-setup.md. For the complete v1 tool reference with input/output schemas, annotations, and selection rules, read references/mcp-tools.md.
| MCP Server (v2) | REST API | |
|---|---|---|
| Best for | AI agents, IDE integrations | Custom apps, scripts, backend services |
| Model | 2 tools (explore + xquik) with code-execution sandbox | 76 individual endpoints |
| Categories | 9: account, composition, extraction, integrations, media, monitoring, twitter, x-accounts, x-write | Same |
| User profile | Full (via xquik tool calling REST endpoints) | Full profile |
| Search results | Full (via xquik tool) | Includes optional engagement metrics |
| Webhook/monitor update | Full PATCH via xquik tool | PATCH endpoints |
| Write actions | Full via xquik tool (tweet, like, follow, DM, etc.) | POST/DELETE endpoints |
| File export | Not available | CSV, XLSX, Markdown |
| Unique to REST | - | API key management, file export (CSV/XLSX/MD), account locale update |
Use the REST API GET /x/users/{username} for the complete user profile with verified, location, createdAt, and statusesCount fields.
Common multi-step tool sequences:
monitors (action=add) -> webhooks (action=add) -> webhooks (action=test)get-account (check budget) -> draws (action=run)get-account (check subscription) -> extractions (action=estimate) -> extractions (action=run) -> extractions (action=get, results)lookup-tweet (metrics) -> extractions (action=run) with thread_extractor (full thread)get-user-info (profile) -> search-tweets from:username (recent tweets) -> lookup-tweet (metrics on specific tweet)compose-tweet (step=compose) -> AI asks follow-ups -> compose-tweet (step=refine) -> AI drafts tweet -> compose-tweet (step=score) -> iteratestyles (action=analyze, fetch & cache tweets) -> styles (action=get, reference) -> compose-tweet with styleUsernamestyles (action=analyze) for both accounts -> styles (action=compare)styles (action=analyze, cache tweets) -> styles (action=analyze-performance, live metrics)compose-tweet -> drafts (action=save) -> drafts (action=list) -> drafts (action=get/delete)download-media (returns permanent hosted URLs)get-radar (7 sources, free) -> compose-tweet with trending topicsubscribe (returns Stripe URL)POST /x/tweets with account + text (optionally attach media via POST /x/media first)POST /x/tweets/{id}/like, POST /x/tweets/{id}/retweet, POST /x/users/{id}/followPOST /integrations (type=telegram, chatId, eventTypes) -> POST /integrations/{id}/test. Integration event types: tweet.new, tweet.quote, tweet.reply, tweet.retweet, draw.completed, extraction.completed, extraction.failedPATCH /x/profile/avatar or PATCH /x/profile/banner with FormData image file402 usage_limit_reached when included allowance exhausted (or 402 overage_limit_reached if extra usage is active and spending limit reached)GET /account returns usagePercent (0-100)2026-02-24T10:30:00.000Z{ "error": "error_code" }nextCursor as the after query parameter, never decodecsv, xlsx, md via GET /extractions/{id}/export?format=csv or GET /draws/{id}/export?format=csv&type=winnersFor additional detail beyond this guide:
references/mcp-tools.md: All 18 legacy v1 MCP tools with input/output schemas, annotations, selection rules, workflow patterns, common mistakes, and unsupported operationsreferences/api-endpoints.md: All REST API endpoints with methods, paths, parameters, and response shapesreferences/python-examples.md: Python equivalents of all JavaScript examples (retry, extraction, draw, webhook)references/webhooks.md: Extended webhook examples, local testing with ngrok, delivery status monitoringreferences/mcp-setup.md: MCP server configuration for 10 IDEs and AI agent platformsreferences/extractions.md: Extraction tool details, export columnsreferences/types.md: TypeScript type definitions for all REST API and MCP output objects© LeoYeAI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 9 other files (references) in skills/xquik-x-twitter of LeoYeAI/openclaw-master-skills.
Open the folder on GitHubat commit e5199b5
X Twitter Scraper next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| X Twitter Scraper this skillLeoYeAI/openclaw-master-skills | 2.2k | — | ~7.1k | Automated safety check: Pass | MIT | |
| X Twitter Scraperdavila7/claude-code-templates | 32k | — | ~1.8k | Automated safety check: Pass | MIT | |
| X Twitter Scrapersickn33/agentic-awesome-skills | 47k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| X Twitter Scrapergithub/awesome-copilot | 40k | — | ~2.2k | Automated safety check: Pass | MIT | |
| X Twitter Scraperdavepoon/buildwithclaude | 3.6k | — | ~2.2k | Automated safety check: Pass | MIT | |
| X Twitter ScraperXquik-dev/x-twitter-scraper | 210 | 1 repos | ~2.6k | Automated safety check: Pass | MIT |
davila7/claude-code-templates
X API & Twitter scraper skill for AI coding agents. An agent skill from davila7/claude-code-templates.
sickn33/agentic-awesome-skills
Use Xquik for X data workflows: tweet search, user lookup, follower export, media downloads, monitors, webhooks, REST API, MCP, SDK setup, and approval-gated account actions.
github/awesome-copilot
Build GitHub Copilot workflows with Xquik X API SDKs, REST endpoints, hosted Apify Actor runs, MCP tools, TweetClaw OpenClaw plugin installs, signed webhooks, tweet search, user lookup, follower…
davepoon/buildwithclaude
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…
Xquik-dev/x-twitter-scraper
Use Xquik to fetch X (Twitter) data or act through a connected account: search, profiles, followers, replies, threads, timelines, media downloads, bulk exports, trends, monitors, signed webhooks…
davila7/claude-code-templates
A skill your agent uses when the user wants to integrate with the X (Twitter) API via Xquik to search tweets, look up user profiles, extract followers, run giveaway draws, monitor accounts, or…
LeoYeAI/openclaw-master-skills
Manages pipelines on a DevOps quality and efficiency platform through its OpenAPI: list workspaces and templates, create, update, run and cancel pipelines, and read run records.
LeoYeAI/openclaw-master-skills
Patches OpenClaw's Feishu extension so an edited document triggers an isolated agent session that reads the doc and replies inline, turning it into a live chat space.
LeoYeAI/openclaw-master-skills
Multi-context memory management system for OpenClaw agents with group-isolated storage, global shared memory, workspace organization, and group-specific skills isolation.
LeoYeAI/openclaw-master-skills
Runs a brand's AI-search visibility work end to end: diagnosing how AI platforms represent it, repositioning it, producing AI-optimized content and monitoring ongoing mentions.
LeoYeAI/openclaw-master-skills
Installs and authenticates the gws CLI, then automates Gmail, Drive, Sheets, Calendar, Docs, Chat and Tasks with ready-made recipes, persona bundles and security audits.
LeoYeAI/openclaw-master-skills
Runs four advisor roles, a fitness coach, nutritionist, data analyst and TCM practitioner, to build a health profile and track workouts, diet and wellness over time.
Categories
X API & Twitter automation skill. An agent skill from LeoYeAI/openclaw-master-skills. X Twitter Scraper is an agent skill from LeoYeAI/openclaw-master-skills. X API & Twitter automation skill.
X Twitter Scraper fits situations like: tasks that involve Social media posts; tasks that involve Web scraping; tasks that involve Webhooks.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a claude-code`. Or copy the skill folder (skills/xquik-x-twitter in LeoYeAI/openclaw-master-skills) into .claude/skills/x-twitter-scraper in your project. Claude Code loads it when a task matches its description.
Run `npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a codex`. Or copy the skill folder (skills/xquik-x-twitter in LeoYeAI/openclaw-master-skills) into .agents/skills/x-twitter-scraper in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LeoYeAI/openclaw-master-skills --skill x-twitter-scraper -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/x-twitter-scraper, .gemini/skills/x-twitter-scraper, .github/skills/x-twitter-scraper and .opencode/skills/x-twitter-scraper in your project.
Going by SKILL.md and its folder, X Twitter Scraper needs credentials named API_KEY, WEBHOOK_SECRET and XQUIK_WEBHOOK_SECRET. Our summary lists: Python 3; A credential in XQUIK_API_KEY; A credential in API_KEY.
SKILL.md names 3 domains. In commands or code: xquik.com and x.com; the agent is likely to contact these when it follows the instructions. As links in the text: docs.xquik.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
X Twitter Scraper is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.1k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 31k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with X Twitter Scraper: X Twitter Scraper (davila7/claude-code-templates, 32k stars), X Twitter Scraper (sickn33/agentic-awesome-skills, 47k stars), X Twitter Scraper (github/awesome-copilot, 40k stars) and X Twitter Scraper (davepoon/buildwithclaude, 3.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
LeoYeAI (a GitHub user) maintains it in LeoYeAI/openclaw-master-skills, which has 2,160 GitHub stars. The repository holds 1,235 skills in this directory. The repository was last updated on July 20, 2026.
Source: LeoYeAI/openclaw-master-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.