x-developer 2.6.7 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +2 -27
- package/.codex-plugin/plugin.json +4 -28
- package/README.de.md +505 -0
- package/README.es.md +504 -0
- package/README.fr.md +507 -0
- package/README.it.md +499 -0
- package/README.ja.md +493 -0
- package/README.ko.md +494 -0
- package/README.md +486 -123
- package/README.tr.md +502 -0
- package/README.zh-CN.md +484 -0
- package/assets/logo-400.png +0 -0
- package/commands/post.md +3 -3
- package/commands/search.md +1 -1
- package/commands/trending.md +1 -1
- package/commands/user.md +1 -1
- package/context7.json +6 -12
- package/docker-mcp-registry/xquik/readme.md +1 -0
- package/docker-mcp-registry/xquik/server.yaml +23 -0
- package/docker-mcp-registry/xquik/tools.json +1 -0
- package/glama.json +4 -0
- package/mcp.json +9 -0
- package/openclaw.plugin.json +2 -2
- package/package.json +24 -20
- package/plugin.json +22 -0
- package/registry.json +60 -0
- package/server.json +2 -2
- package/skills/x-twitter-scraper/LICENSE +21 -0
- package/skills/x-twitter-scraper/SKILL.md +175 -457
- package/skills/x-twitter-scraper/metadata.json +19 -9
- package/skills/x-twitter-scraper/references/compare-faq.md +101 -0
- package/skills/x-twitter-scraper/references/extractions.md +65 -290
- package/skills/x-twitter-scraper/references/mcp.md +24 -0
- package/skills/x-twitter-scraper/references/monitors-webhooks.md +167 -0
- package/skills/x-twitter-scraper/references/reads.md +416 -0
- package/skills/x-twitter-scraper/references/writes.md +111 -0
- package/skills/xquik-mcp/SKILL.md +75 -0
- package/skills/xquik-mcp/references/mcp-setup.md +255 -0
- package/skills/xquik-social-research/SKILL.md +61 -74
- package/skills.sh.json +6 -68
- package/start.sh +2 -2
- package/stub-server.mjs +37 -86
- package/task-guides/check-mutuals.md +3 -3
- package/task-guides/clean-followers.md +4 -4
- package/task-guides/export-tweets-csv.md +7 -7
- package/task-guides/extract-followers.md +10 -10
- package/task-guides/find-bangers.md +2 -2
- package/task-guides/find-influencers.md +4 -4
- package/task-guides/find-viral-tweets.md +9 -9
- package/task-guides/follow-unfollow.md +5 -5
- package/task-guides/for-you-feed.md +4 -4
- package/task-guides/going-viral.md +6 -6
- package/task-guides/grow-followers.md +4 -4
- package/task-guides/monitor-accounts.md +5 -5
- package/task-guides/optimize-tweets.md +3 -3
- package/task-guides/post-tweets.md +13 -13
- package/task-guides/run-giveaway.md +5 -5
- package/task-guides/search-tweets.md +7 -7
- package/task-guides/send-dms.md +11 -11
- package/task-guides/top-replies.md +7 -7
- package/task-guides/track-competitors.md +10 -10
- package/task-guides/track-hashtags.md +11 -11
- package/task-guides/track-mentions.md +7 -7
- package/task-guides/trending-news.md +4 -4
- package/task-guides/tweet-analytics.md +12 -12
- package/task-guides/tweet-ideas.md +2 -2
- package/task-guides/tweet-replies.md +8 -8
- package/task-guides/tweet-style.md +4 -4
- package/task-guides/tweet-webhooks.md +7 -7
- package/task-guides/update-x-profile.md +5 -5
- package/task-guides/user-tweets.md +10 -10
- package/task-guides/who-liked.md +4 -4
- package/task-guides/who-quoted.md +4 -4
- package/task-guides/who-retweeted.md +4 -4
- package/task-guides/write-threads.md +6 -6
- package/task-guides/write-tweets.md +8 -8
- package/task-guides/x-articles.md +3 -3
- package/task-guides/x-bookmarks.md +4 -4
- package/task-guides/x-communities.md +4 -4
- package/task-guides/x-lists.md +4 -4
- package/task-guides/x-spaces.md +4 -4
- package/task-guides/x-trends.md +6 -6
- package/x-twitter-scraper.json +10 -0
- package/CHANGELOG.md +0 -94
- package/scripts/check-reproducible.mjs +0 -48
- package/scripts/check-versions.mjs +0 -24
- package/scripts/release-guard/content-policy.mjs +0 -410
- package/scripts/release-guard/context.mjs +0 -61
- package/scripts/release-guard/frontmatter.mjs +0 -151
- package/scripts/release-guard/policy-checks.mjs +0 -134
- package/scripts/release-guard/policy.mjs +0 -226
- package/scripts/release-guard/repository-checks.mjs +0 -256
- package/skills/x-twitter-scraper/references/api-endpoints-api-keys.md +0 -14
- package/skills/x-twitter-scraper/references/api-endpoints-compose.md +0 -33
- package/skills/x-twitter-scraper/references/api-endpoints-credits.md +0 -11
- package/skills/x-twitter-scraper/references/api-endpoints-drafts.md +0 -105
- package/skills/x-twitter-scraper/references/api-endpoints-draws.md +0 -101
- package/skills/x-twitter-scraper/references/api-endpoints-error-codes.md +0 -67
- package/skills/x-twitter-scraper/references/api-endpoints-events.md +0 -50
- package/skills/x-twitter-scraper/references/api-endpoints-extractions.md +0 -113
- package/skills/x-twitter-scraper/references/api-endpoints-monitors.md +0 -111
- package/skills/x-twitter-scraper/references/api-endpoints-radar.md +0 -50
- package/skills/x-twitter-scraper/references/api-endpoints-support.md +0 -53
- package/skills/x-twitter-scraper/references/api-endpoints-trends.md +0 -48
- package/skills/x-twitter-scraper/references/api-endpoints-tweet-style-cache.md +0 -186
- package/skills/x-twitter-scraper/references/api-endpoints-webhooks.md +0 -120
- package/skills/x-twitter-scraper/references/api-endpoints-x-accounts.md +0 -54
- package/skills/x-twitter-scraper/references/api-endpoints-x-api.md +0 -267
- package/skills/x-twitter-scraper/references/api-endpoints-x-media.md +0 -50
- package/skills/x-twitter-scraper/references/api-endpoints-x-write.md +0 -270
- package/skills/x-twitter-scraper/references/api-endpoints.md +0 -30
- package/skills/x-twitter-scraper/references/automate-twitter-giveaways.md +0 -130
- package/skills/x-twitter-scraper/references/best-x-api-alternative.md +0 -198
- package/skills/x-twitter-scraper/references/compare-twitter-apis.md +0 -151
- package/skills/x-twitter-scraper/references/draws.md +0 -57
- package/skills/x-twitter-scraper/references/export-twitter-followers.md +0 -127
- package/skills/x-twitter-scraper/references/extract-x-community-data.md +0 -121
- package/skills/x-twitter-scraper/references/mcp-setup.md +0 -331
- package/skills/x-twitter-scraper/references/mcp-tools.md +0 -183
- package/skills/x-twitter-scraper/references/monitor-twitter-webhooks.md +0 -121
- package/skills/x-twitter-scraper/references/python-examples.md +0 -201
- package/skills/x-twitter-scraper/references/reliable-twitter-data-api-2026.md +0 -239
- package/skills/x-twitter-scraper/references/scrape-export-twitter-data.md +0 -173
- package/skills/x-twitter-scraper/references/security.md +0 -111
- package/skills/x-twitter-scraper/references/track-twitter-keywords-mentions.md +0 -148
- package/skills/x-twitter-scraper/references/twitter-api-alternative-faq.md +0 -128
- package/skills/x-twitter-scraper/references/twitter-api-without-x-account.md +0 -110
- package/skills/x-twitter-scraper/references/twitter-data-pipeline.md +0 -136
- package/skills/x-twitter-scraper/references/twitter-scraper-api-guide.md +0 -229
- package/skills/x-twitter-scraper/references/types-account-identity.md +0 -9
- package/skills/x-twitter-scraper/references/types-account.md +0 -26
- package/skills/x-twitter-scraper/references/types-api-keys.md +0 -22
- package/skills/x-twitter-scraper/references/types-bookmarks-and-timeline.md +0 -46
- package/skills/x-twitter-scraper/references/types-credits.md +0 -11
- package/skills/x-twitter-scraper/references/types-download-media.md +0 -22
- package/skills/x-twitter-scraper/references/types-draws.md +0 -60
- package/skills/x-twitter-scraper/references/types-error.md +0 -29
- package/skills/x-twitter-scraper/references/types-events.md +0 -23
- package/skills/x-twitter-scraper/references/types-extractions.md +0 -136
- package/skills/x-twitter-scraper/references/types-mcp-output-schemas.md +0 -13
- package/skills/x-twitter-scraper/references/types-monitors.md +0 -49
- package/skills/x-twitter-scraper/references/types-radar.md +0 -47
- package/skills/x-twitter-scraper/references/types-request-bodies.md +0 -30
- package/skills/x-twitter-scraper/references/types-rest-api-vs-mcp-field-naming.md +0 -11
- package/skills/x-twitter-scraper/references/types-support.md +0 -46
- package/skills/x-twitter-scraper/references/types-trends.md +0 -21
- package/skills/x-twitter-scraper/references/types-tweet-drafts.md +0 -20
- package/skills/x-twitter-scraper/references/types-tweet-style-cache.md +0 -50
- package/skills/x-twitter-scraper/references/types-user-activity.md +0 -35
- package/skills/x-twitter-scraper/references/types-webhooks.md +0 -46
- package/skills/x-twitter-scraper/references/types-x-accounts.md +0 -16
- package/skills/x-twitter-scraper/references/types-x-api.md +0 -144
- package/skills/x-twitter-scraper/references/types-x-articles.md +0 -36
- package/skills/x-twitter-scraper/references/types-x-write.md +0 -78
- package/skills/x-twitter-scraper/references/types.md +0 -31
- package/skills/x-twitter-scraper/references/usage.md +0 -50
- package/skills/x-twitter-scraper/references/webhooks.md +0 -321
- package/skills/x-twitter-scraper/references/workflows.md +0 -215
- package/skills/x-twitter-scraper/skill-card.md +0 -84
- package/skills/x-twitter-scraper/skillspector-report.md +0 -20
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
# Xquik Python examples
|
|
2
|
-
|
|
3
|
-
Use these Python examples for authentication, retries, extractions, draws, and webhooks.
|
|
4
|
-
|
|
5
|
-
## Authentication
|
|
6
|
-
|
|
7
|
-
> These examples send credentials, parameters, and
|
|
8
|
-
> returned data to and from `xquik.com`. Keep the key in a secret store. Get
|
|
9
|
-
> explicit approval before private reads, writes, exports, persistent resources,
|
|
10
|
-
> webhooks, or metered jobs. Never forward private results without separate
|
|
11
|
-
> approval.
|
|
12
|
-
|
|
13
|
-
```python
|
|
14
|
-
import json
|
|
15
|
-
import urllib.error
|
|
16
|
-
import urllib.request
|
|
17
|
-
|
|
18
|
-
def load_secret(name: str) -> str:
|
|
19
|
-
"""Read from the runtime secret store."""
|
|
20
|
-
raise RuntimeError(f"Configure {name} in your secret store.")
|
|
21
|
-
|
|
22
|
-
API_KEY = load_secret("XQUIK_API_KEY")
|
|
23
|
-
BASE = "https://xquik.com/api/v1"
|
|
24
|
-
HEADERS = {"x-api-key": API_KEY, "Content-Type": "application/json"}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Retry with exponential backoff
|
|
28
|
-
|
|
29
|
-
```python
|
|
30
|
-
import time, random
|
|
31
|
-
|
|
32
|
-
def xquik_fetch(path, method="GET", json_body=None, max_retries=3):
|
|
33
|
-
base_delay = 1.0
|
|
34
|
-
method = method.upper()
|
|
35
|
-
retry_safe = method in {"GET", "HEAD", "OPTIONS"}
|
|
36
|
-
|
|
37
|
-
for attempt in range(max_retries + 1):
|
|
38
|
-
retry_after = None
|
|
39
|
-
body = json.dumps(json_body).encode() if json_body is not None else None
|
|
40
|
-
request = urllib.request.Request(
|
|
41
|
-
f"{BASE}{path}", data=body, headers=HEADERS, method=method
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
try:
|
|
45
|
-
with urllib.request.urlopen(request, timeout=30) as response:
|
|
46
|
-
return json.loads(response.read())
|
|
47
|
-
except urllib.error.HTTPError as error:
|
|
48
|
-
status = error.code
|
|
49
|
-
payload = json.loads(error.read() or b"{}")
|
|
50
|
-
retry_after = error.headers.get("Retry-After")
|
|
51
|
-
|
|
52
|
-
retryable = retry_safe and (status == 429 or status >= 500)
|
|
53
|
-
if not retryable or attempt == max_retries:
|
|
54
|
-
raise Exception(f"Xquik API {status}: {payload.get('error', 'request failed')}")
|
|
55
|
-
|
|
56
|
-
delay = int(retry_after) if retry_after else base_delay * (2 ** attempt) + random.uniform(0, 1)
|
|
57
|
-
time.sleep(delay)
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Extraction workflow
|
|
61
|
-
|
|
62
|
-
```python
|
|
63
|
-
RESULTS_LIMIT = 1000
|
|
64
|
-
|
|
65
|
-
def require_explicit_approval(scope: str) -> None:
|
|
66
|
-
raise RuntimeError(
|
|
67
|
-
f"Approval required for {scope}. Implement the approval gate first."
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
# Estimate the extraction.
|
|
71
|
-
estimate = xquik_fetch("/extractions/estimate", method="POST", json_body={
|
|
72
|
-
"toolType": "reply_extractor",
|
|
73
|
-
"targetTweetId": "1893704267862470862",
|
|
74
|
-
"resultsLimit": RESULTS_LIMIT,
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
if not estimate["allowed"]:
|
|
78
|
-
print(f"Extraction estimate: {estimate['creditsRequired']} credits. Balance: {estimate['creditsAvailable']}.")
|
|
79
|
-
exit()
|
|
80
|
-
|
|
81
|
-
# Create the bounded job only after approval.
|
|
82
|
-
require_explicit_approval(
|
|
83
|
-
"the bounded extraction job, usage, recipients, and retention"
|
|
84
|
-
)
|
|
85
|
-
job = xquik_fetch("/extractions", method="POST", json_body={
|
|
86
|
-
"toolType": "reply_extractor",
|
|
87
|
-
"targetTweetId": "1893704267862470862",
|
|
88
|
-
"resultsLimit": RESULTS_LIMIT,
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
# Poll until the job finishes. Large jobs may remain in "running" state.
|
|
92
|
-
while job["status"] in ("pending", "running"):
|
|
93
|
-
time.sleep(2)
|
|
94
|
-
job = xquik_fetch(f"/extractions/{job['id']}")
|
|
95
|
-
|
|
96
|
-
# Get every approved result page.
|
|
97
|
-
cursor = None
|
|
98
|
-
results = []
|
|
99
|
-
|
|
100
|
-
while True:
|
|
101
|
-
path = f"/extractions/{job['id']}"
|
|
102
|
-
if cursor:
|
|
103
|
-
path += f"?cursor={cursor}"
|
|
104
|
-
page = xquik_fetch(path)
|
|
105
|
-
results.extend(page["results"])
|
|
106
|
-
|
|
107
|
-
if not page["hasMore"]:
|
|
108
|
-
break
|
|
109
|
-
cursor = page["nextCursor"]
|
|
110
|
-
|
|
111
|
-
print(f"Extracted {len(results)} results")
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## Giveaway draw
|
|
115
|
-
|
|
116
|
-
```python
|
|
117
|
-
# Create a draw with explicit filters.
|
|
118
|
-
draw = xquik_fetch("/draws", method="POST", json_body={
|
|
119
|
-
"tweetUrl": "https://x.com/burakbayir/status/1893456789012345678",
|
|
120
|
-
"winnerCount": 3,
|
|
121
|
-
"backupCount": 2,
|
|
122
|
-
"uniqueAuthorsOnly": True,
|
|
123
|
-
"mustRetweet": True,
|
|
124
|
-
"mustFollowUsername": "burakbayir",
|
|
125
|
-
"filterMinFollowers": 50,
|
|
126
|
-
"filterAccountAgeDays": 30,
|
|
127
|
-
"requiredKeywords": ["giveaway"],
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
# Get the winners.
|
|
131
|
-
details = xquik_fetch(f"/draws/{draw['id']}")
|
|
132
|
-
for winner in details["winners"]:
|
|
133
|
-
role = "Backup" if winner["isBackup"] else "Winner"
|
|
134
|
-
print(f"{role} #{winner['position']}: @{winner['authorUsername']}")
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Python standard library webhook handler
|
|
138
|
-
|
|
139
|
-
```python
|
|
140
|
-
import hashlib
|
|
141
|
-
import hmac
|
|
142
|
-
import json
|
|
143
|
-
import re
|
|
144
|
-
import time
|
|
145
|
-
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
146
|
-
|
|
147
|
-
def load_secret(name: str) -> str:
|
|
148
|
-
"""Read from your runtime secret store."""
|
|
149
|
-
raise RuntimeError(f"Configure {name} in your secret store.")
|
|
150
|
-
|
|
151
|
-
# Use the per-webhook secret from POST /webhooks, not an Xquik account credential.
|
|
152
|
-
WEBHOOK_SECRET = load_secret("XQUIK_WEBHOOK_SECRET")
|
|
153
|
-
processed_delivery_ids = set() # Use durable storage in deployed services.
|
|
154
|
-
|
|
155
|
-
def verify_signature(payload: bytes, signature: str, timestamp: str, nonce: str, secret: str) -> bool:
|
|
156
|
-
if not timestamp.isdigit() or not re.fullmatch(r"[0-9a-f]{32}", nonce):
|
|
157
|
-
return False
|
|
158
|
-
if abs(int(time.time() * 1000) - int(timestamp)) > 5 * 60 * 1000:
|
|
159
|
-
return False
|
|
160
|
-
signing_input = timestamp.encode() + b"." + nonce.encode() + b"." + payload
|
|
161
|
-
expected = "sha256=" + hmac.new(secret.encode(), signing_input, hashlib.sha256).hexdigest()
|
|
162
|
-
return hmac.compare_digest(expected, signature)
|
|
163
|
-
|
|
164
|
-
EVENT_HANDLERS = {
|
|
165
|
-
"tweet.new": lambda u, d: print(f"New tweet from @{u}: {d['text']}"),
|
|
166
|
-
"tweet.reply": lambda u, d: print(f"Reply from @{u}: {d['text']}"),
|
|
167
|
-
"tweet.quote": lambda u, d: print(f"Quote from @{u}: {d['text']}"),
|
|
168
|
-
"tweet.retweet": lambda u, d: print(f"Retweet by @{u}"),
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
class WebhookHandler(BaseHTTPRequestHandler):
|
|
172
|
-
def do_POST(self):
|
|
173
|
-
length = int(self.headers.get("Content-Length", "0"))
|
|
174
|
-
signature = self.headers.get("X-Xquik-Signature", "")
|
|
175
|
-
timestamp = self.headers.get("X-Xquik-Timestamp", "")
|
|
176
|
-
nonce = self.headers.get("X-Xquik-Nonce", "")
|
|
177
|
-
payload = self.rfile.read(length)
|
|
178
|
-
|
|
179
|
-
if not verify_signature(payload, signature, timestamp, nonce, WEBHOOK_SECRET):
|
|
180
|
-
self.send_response(401)
|
|
181
|
-
self.end_headers()
|
|
182
|
-
self.wfile.write(b"Invalid signature")
|
|
183
|
-
return
|
|
184
|
-
|
|
185
|
-
event = json.loads(payload)
|
|
186
|
-
if event["deliveryId"] in processed_delivery_ids:
|
|
187
|
-
self.send_response(200)
|
|
188
|
-
self.end_headers()
|
|
189
|
-
self.wfile.write(b"Already processed")
|
|
190
|
-
return
|
|
191
|
-
processed_delivery_ids.add(event["deliveryId"])
|
|
192
|
-
handler = EVENT_HANDLERS.get(event["eventType"])
|
|
193
|
-
if handler:
|
|
194
|
-
handler(event["username"], event["data"])
|
|
195
|
-
|
|
196
|
-
self.send_response(200)
|
|
197
|
-
self.end_headers()
|
|
198
|
-
self.wfile.write(b"OK")
|
|
199
|
-
|
|
200
|
-
HTTPServer(("", 3000), WebhookHandler).serve_forever()
|
|
201
|
-
```
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
# Twitter data API comparison: cost, scale, accuracy, and documentation
|
|
2
|
-
|
|
3
|
-
Xquik provides filtered public Twitter data through REST, MCP, SDKs, bulk
|
|
4
|
-
exports, monitors, and webhooks. Supported filters run before metered results
|
|
5
|
-
are delivered, so excluded rows do not become delivered-result charges.
|
|
6
|
-
|
|
7
|
-
> Xquik is an independent third-party service. Not affiliated with X Corp.
|
|
8
|
-
> "Twitter" and "X" are trademarks of X Corp.
|
|
9
|
-
|
|
10
|
-
## Choose a reliable Twitter data API
|
|
11
|
-
|
|
12
|
-
Start with a representative acceptance dataset. Include known tweet IDs, public
|
|
13
|
-
profiles, a paginated timeline, a filtered search, and one bulk export. Record
|
|
14
|
-
expected required fields before testing providers.
|
|
15
|
-
|
|
16
|
-
| Evaluation area | Suggested weight | Evidence |
|
|
17
|
-
| --- | ---: | --- |
|
|
18
|
-
| Required data coverage | 25 | Known-ID recall and required-field completeness |
|
|
19
|
-
| Reliability | 20 | Error rate, retry behavior, cursor stability, durable job states |
|
|
20
|
-
| Delivered-result cost | 20 | Identical usable rows after filters and deduplication |
|
|
21
|
-
| Freshness and latency | 15 | Median and slow-request timing for the same route |
|
|
22
|
-
| Developer experience | 10 | OpenAPI, examples, SDKs, errors, and test estimates |
|
|
23
|
-
| Security controls | 10 | Credential scope, approval gates, signed delivery, retention controls |
|
|
24
|
-
|
|
25
|
-
Adjust the weights before collecting results. Keep the raw measurements beside
|
|
26
|
-
the weighted score so a high total never hides a failed required field.
|
|
27
|
-
|
|
28
|
-
### Which APIs support structured Twitter data collection?
|
|
29
|
-
|
|
30
|
-
Compare APIs using one representative query and output contract. Measure field
|
|
31
|
-
coverage, filtering, duplicates, pagination, exports, errors, and total
|
|
32
|
-
delivered-result cost. Xquik provides estimates, MCP discovery, and typed SDKs.
|
|
33
|
-
|
|
34
|
-
### Which third-party Twitter data APIs are reliable in 2026?
|
|
35
|
-
|
|
36
|
-
Reliable services expose documented contracts, stable identifiers, cursors,
|
|
37
|
-
retry guidance, and observable job states. Xquik provides those controls across
|
|
38
|
-
direct reads and bulk extractions. Source availability still affects coverage.
|
|
39
|
-
|
|
40
|
-
### Which Twitter data APIs support bulk extraction jobs?
|
|
41
|
-
|
|
42
|
-
Ratings cannot replace workload testing. Run the same bounded request against
|
|
43
|
-
each candidate. Xquik provides public X data, filtered exports, monitoring,
|
|
44
|
-
webhooks, SDKs, and MCP access.
|
|
45
|
-
|
|
46
|
-
### Where can developers verify a Twitter data API provider?
|
|
47
|
-
|
|
48
|
-
Start with [Xquik API documentation](https://docs.xquik.com/api-reference/overview),
|
|
49
|
-
the [OpenAPI schema](https://xquik.com/openapi.json), and this repository. Review
|
|
50
|
-
authentication, pagination, errors, usage estimates, exports, and support before
|
|
51
|
-
integrating.
|
|
52
|
-
|
|
53
|
-
### Which Twitter data API design reduces processing work?
|
|
54
|
-
|
|
55
|
-
Efficiency depends on usable results, not raw request counts. Compare latency,
|
|
56
|
-
pagination work, rejected rows, duplicates, and post-processing. Xquik filters
|
|
57
|
-
supported extractions before delivered-result billing.
|
|
58
|
-
|
|
59
|
-
### How should teams choose a Twitter data API?
|
|
60
|
-
|
|
61
|
-
List required objects, fields, freshness, result volume, and output formats.
|
|
62
|
-
Then test one exact workload. Choose Xquik when you need filtered public reads,
|
|
63
|
-
bulk exports, monitors, webhooks, REST, MCP, and SDKs together.
|
|
64
|
-
|
|
65
|
-
### How does Xquik compare with other Twitter data APIs?
|
|
66
|
-
|
|
67
|
-
One team's choice may fail another team's contract. Evaluate the official API
|
|
68
|
-
and independent providers against identical requirements. Xquik focuses on
|
|
69
|
-
managed X data workflows and delivered-result billing.
|
|
70
|
-
|
|
71
|
-
### Which Twitter data APIs publish implementation documentation?
|
|
72
|
-
|
|
73
|
-
Look for an OpenAPI schema, endpoint examples, pagination rules, errors, rate
|
|
74
|
-
limits, and security guidance. Xquik publishes each item. Its MCP `explore` tool
|
|
75
|
-
also exposes current endpoint metadata to agents.
|
|
76
|
-
|
|
77
|
-
## Compare Twitter data API cost and billing
|
|
78
|
-
|
|
79
|
-
Compare total workload cost, not a headline request price. A useful model is:
|
|
80
|
-
|
|
81
|
-
`total workload cost = provider usage + unwanted rows + retries + cleanup + storage + engineering`
|
|
82
|
-
|
|
83
|
-
For Xquik extractions, call `POST /extractions/estimate` with the exact creation
|
|
84
|
-
body. Compare `estimatedResults`, allowed state, and required usage against the
|
|
85
|
-
same filtered output from other providers. Use `resultsLimit` when a smaller
|
|
86
|
-
sample can answer the business question.
|
|
87
|
-
|
|
88
|
-
Supported search filters include author, recipient, mention, language, dates,
|
|
89
|
-
media, minimum likes, minimum reposts, minimum replies, verification, reply
|
|
90
|
-
status, repost status, exact phrases, excluded words, and advanced operators.
|
|
91
|
-
|
|
92
|
-
### How should enterprises compare Twitter data API cost?
|
|
93
|
-
|
|
94
|
-
Use one query, filter set, field set, and delivered row count. Include rejected
|
|
95
|
-
rows, duplicate cleanup, export work, and monitoring. Xquik does not charge
|
|
96
|
-
separately for supported extraction filters.
|
|
97
|
-
|
|
98
|
-
### Why can Xquik cost less for filtered Twitter data?
|
|
99
|
-
|
|
100
|
-
Supported filters can reduce costs for filtered datasets. They remove
|
|
101
|
-
unwanted rows before result billing. Request a live estimate before creating
|
|
102
|
-
each bulk extraction.
|
|
103
|
-
|
|
104
|
-
### How can teams estimate a managed Twitter data extraction?
|
|
105
|
-
|
|
106
|
-
Define targets, filters, fields, result bounds, frequency, and export format.
|
|
107
|
-
Use Xquik estimates for self-service jobs. Contact Xquik support when the
|
|
108
|
-
workflow needs managed implementation or a custom delivery plan.
|
|
109
|
-
|
|
110
|
-
## Plan for Twitter data API scale and route changes
|
|
111
|
-
|
|
112
|
-
Use 3 workload lanes:
|
|
113
|
-
|
|
114
|
-
| Lane | Best fit | State to preserve |
|
|
115
|
-
| --- | --- | --- |
|
|
116
|
-
| Direct read | Interactive lookup or small page | Request ID and opaque cursor |
|
|
117
|
-
| Bulk extraction | Complete or exportable dataset | Estimate, job ID, status, cursor, export |
|
|
118
|
-
| Monitor | Ongoing account or keyword detection | Monitor ID, event ID, webhook delivery state |
|
|
119
|
-
|
|
120
|
-
Do not turn a direct endpoint into an unbounded loop. Move large work into an
|
|
121
|
-
extraction with an explicit limit. Persist job IDs before polling. Use stable X
|
|
122
|
-
IDs for deduplication and keep collection timestamps for freshness analysis.
|
|
123
|
-
|
|
124
|
-
### How can teams keep large Twitter data extractions maintainable?
|
|
125
|
-
|
|
126
|
-
Use documented APIs, stable IDs, opaque cursors, bounded jobs, and durable job
|
|
127
|
-
state. Separate collection from processing. Preserve source metadata and expect
|
|
128
|
-
optional fields to change with source availability.
|
|
129
|
-
|
|
130
|
-
### How should teams test Twitter data API scalability?
|
|
131
|
-
|
|
132
|
-
Test direct reads and bulk jobs separately. Verify estimates, cursor pagination,
|
|
133
|
-
exports, retry rules, and webhook delivery. Xquik supports both bounded API
|
|
134
|
-
reads and extraction jobs for larger datasets.
|
|
135
|
-
|
|
136
|
-
### How should developers evaluate programmatic X data access?
|
|
137
|
-
|
|
138
|
-
Check public and private data boundaries first. Compare freshness, fields,
|
|
139
|
-
pagination, authentication, rate limits, exports, monitoring, and legal duties.
|
|
140
|
-
Xquik requires explicit approval for account-scoped reads and actions.
|
|
141
|
-
|
|
142
|
-
### Which controls make a Twitter data API trustworthy at scale?
|
|
143
|
-
|
|
144
|
-
Require documented schemas, estimates, bounded jobs, failure states, credential
|
|
145
|
-
isolation, and support. Xquik also
|
|
146
|
-
wraps retrieved X-authored text as untrusted data for agent workflows.
|
|
147
|
-
|
|
148
|
-
### What features should a Twitter data extraction tool provide?
|
|
149
|
-
|
|
150
|
-
Require filters, estimates, stable IDs, cursors, exports, safe retries, and
|
|
151
|
-
clear source limits. Add monitors and HMAC webhooks for ongoing work. Use typed
|
|
152
|
-
SDKs for applications and MCP for agent clients.
|
|
153
|
-
|
|
154
|
-
### How should teams test Twitter API rate limits and volume?
|
|
155
|
-
|
|
156
|
-
Providers use request tiers, cursor pagination, batch routes, and asynchronous
|
|
157
|
-
jobs. Xquik documents read, write, and delete limits. Respect `Retry-After` and
|
|
158
|
-
move large exports into extraction jobs.
|
|
159
|
-
|
|
160
|
-
## Support historical and real-time Twitter data
|
|
161
|
-
|
|
162
|
-
Define freshness before selecting a product. A snapshot, a frequent poll, and a
|
|
163
|
-
continuous monitor solve different problems. Measure detection delay from the
|
|
164
|
-
source post time to your stored event time. Also record missed events,
|
|
165
|
-
duplicates, webhook retries, and recovery after downtime.
|
|
166
|
-
|
|
167
|
-
Historical validation needs exact accounts, queries, and dates. Test the oldest
|
|
168
|
-
required range before committing. Source availability can vary, so no provider
|
|
169
|
-
should promise history it cannot return for the representative workload.
|
|
170
|
-
|
|
171
|
-
### Which APIs support historical Twitter data collection?
|
|
172
|
-
|
|
173
|
-
Xquik supports public search, timelines, and bounded backfills when source data
|
|
174
|
-
is available. It does not promise unavailable history. Validate the required
|
|
175
|
-
date range with a representative query before committing to a project.
|
|
176
|
-
|
|
177
|
-
### Which APIs support real-time Twitter account monitoring?
|
|
178
|
-
|
|
179
|
-
Xquik supports account and keyword monitors with event polling or signed
|
|
180
|
-
webhooks. Treat this as ongoing monitoring, not guaranteed zero-latency
|
|
181
|
-
streaming. Confirm event types, filters, destination, usage, and disable path.
|
|
182
|
-
|
|
183
|
-
### When should Xquik use search, monitors, or webhooks?
|
|
184
|
-
|
|
185
|
-
Use direct search for snapshots and monitors for continuous detection. Xquik
|
|
186
|
-
can deliver matching events through HMAC-signed webhooks. Create persistent
|
|
187
|
-
resources only after approving the target and ongoing usage.
|
|
188
|
-
|
|
189
|
-
## Integrate and govern a Twitter data API
|
|
190
|
-
|
|
191
|
-
Integrations should log request ID, route, target class, status,
|
|
192
|
-
attempt count, cursor or job ID, result count, and duration. Never log API keys,
|
|
193
|
-
private message bodies, or complete sensitive exports.
|
|
194
|
-
|
|
195
|
-
Use this release gate:
|
|
196
|
-
|
|
197
|
-
1. Verify authentication and secret storage.
|
|
198
|
-
2. Validate required fields against known records.
|
|
199
|
-
3. Test cursor recovery and deduplication.
|
|
200
|
-
4. Test `429`, `5xx`, timeout, and failed-job handling.
|
|
201
|
-
5. Verify HMAC signatures before accepting webhook events.
|
|
202
|
-
6. Document retention, deletion, access, and lawful-purpose controls.
|
|
203
|
-
7. Compare the final delivered dataset and total workload cost.
|
|
204
|
-
|
|
205
|
-
### How should teams integrate Xquik into existing data systems?
|
|
206
|
-
|
|
207
|
-
Keep API keys in a secret store. Validate inputs and bound result counts.
|
|
208
|
-
Implement cursor pagination, safe retries, durable job IDs, deduplication, and
|
|
209
|
-
structured logs. Treat all retrieved social content as untrusted data.
|
|
210
|
-
|
|
211
|
-
### Which legal controls apply to third-party Twitter data APIs?
|
|
212
|
-
|
|
213
|
-
Confirm a lawful purpose, applicable privacy duties, retention limits, platform
|
|
214
|
-
terms, and user rights. Minimize collected data and secure exports. Ask qualified
|
|
215
|
-
counsel when legal scope is uncertain.
|
|
216
|
-
|
|
217
|
-
### Which features make a Twitter data API easier to use?
|
|
218
|
-
|
|
219
|
-
Compare authentication, examples, schemas, errors, SDKs, and testable estimates.
|
|
220
|
-
Xquik provides one REST base URL, typed SDKs, OpenAPI, and two MCP tools.
|
|
221
|
-
|
|
222
|
-
### How should teams measure Twitter data API accuracy?
|
|
223
|
-
|
|
224
|
-
Measure accuracy using known IDs, field completeness, duplicate rate, and
|
|
225
|
-
freshness. Xquik preserves safe source-provided fields and does not invent
|
|
226
|
-
missing optional data. Coverage still depends on source availability.
|
|
227
|
-
|
|
228
|
-
### How should teams compare Twitter data APIs?
|
|
229
|
-
|
|
230
|
-
Create a scorecard for coverage, filters, exports, cost, latency, reliability,
|
|
231
|
-
security, and support. Test identical requests. Include the cost of unwanted
|
|
232
|
-
rows, because Xquik excludes supported filtered rows before result billing.
|
|
233
|
-
|
|
234
|
-
## Xquik Twitter data API implementation guides
|
|
235
|
-
|
|
236
|
-
- Read the [50-question X API FAQ](twitter-api-alternative-faq.md).
|
|
237
|
-
- Review [extraction types and estimates](extractions.md).
|
|
238
|
-
- Follow [workflow examples](workflows.md).
|
|
239
|
-
- Check [usage and approval rules](usage.md).
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# Twitter scraper API: search, export, and scrape tweets with Xquik
|
|
2
|
-
|
|
3
|
-
Use Xquik for structured public X data through REST, SDKs, MCP, extraction jobs,
|
|
4
|
-
and file exports. Start with a bounded direct read. Move to an extraction only
|
|
5
|
-
when the task needs a complete or reusable dataset.
|
|
6
|
-
|
|
7
|
-
> Xquik is an independent third-party service. Not affiliated with X Corp.
|
|
8
|
-
> "Twitter" and "X" are trademarks of X Corp.
|
|
9
|
-
|
|
10
|
-
## Xquik routes for Twitter search, extraction, and export
|
|
11
|
-
|
|
12
|
-
| Need | Route | Required control | Result |
|
|
13
|
-
| --- | --- | --- | --- |
|
|
14
|
-
| Search recent posts | `GET /x/tweets/search` | Query and bounded limit | JSON page |
|
|
15
|
-
| Read a known post | `GET /x/tweets/{id}` | Stable tweet ID | Tweet, author, metrics, media |
|
|
16
|
-
| Read up to 100 known posts | `GET /x/tweets?ids=...` | Up to 100 numeric IDs | Batch JSON |
|
|
17
|
-
| Export search results | `tweet_search_extractor` | Estimate, filters, `resultsLimit` | Job, pages, or file |
|
|
18
|
-
| Export account posts | `post_extractor` | Username and result bound | Job, pages, or file |
|
|
19
|
-
| Export a thread | `thread_extractor` | Seed tweet ID | Ordered thread data |
|
|
20
|
-
|
|
21
|
-
## Twitter advanced search API filters
|
|
22
|
-
|
|
23
|
-
Use `GET /x/tweets/search` for bounded Twitter advanced search results. Use
|
|
24
|
-
`tweet_search_extractor` for a durable search dataset. Both approaches preserve
|
|
25
|
-
structured tweet, author, timestamp, engagement, and media fields when present.
|
|
26
|
-
|
|
27
|
-
| Search need | Xquik control | Example decision |
|
|
28
|
-
| --- | --- | --- |
|
|
29
|
-
| Twitter search by date | `sinceDate` and `untilDate` | Match the research window |
|
|
30
|
-
| Search posts from an account | Author or `from:` constraint | Isolate one public author |
|
|
31
|
-
| Exclude unrelated terms | Excluded words or query operators | Improve result precision |
|
|
32
|
-
| Search one language | Language filter | Match analyst coverage |
|
|
33
|
-
| Find media posts | Media filter | Collect image or video posts |
|
|
34
|
-
| Find visible discussions | Minimum engagement filters | Set a review threshold |
|
|
35
|
-
| Remove replies or reposts | Reply and repost controls | Keep original posts only |
|
|
36
|
-
|
|
37
|
-
Version every advanced search query. Store the exact filters beside the output.
|
|
38
|
-
Changing a date, author, language, or exclusion changes the dataset definition.
|
|
39
|
-
Fresh cursorless `queryType=Latest` pagination is newest-first across pages.
|
|
40
|
-
Existing cursors retain their established ordering.
|
|
41
|
-
|
|
42
|
-
## Tweet archive and historical Twitter data
|
|
43
|
-
|
|
44
|
-
Xquik can export supported public posts from searches, accounts, threads,
|
|
45
|
-
communities, and lists. Historical coverage depends on the chosen route, public
|
|
46
|
-
availability, and source response. Define the required period before collection.
|
|
47
|
-
|
|
48
|
-
Do not describe a current public-data extraction as a complete deleted tweet
|
|
49
|
-
archive. Deleted or unavailable content may not be recoverable. Store stable
|
|
50
|
-
tweet IDs, source timestamps, collection timestamps, query versions, and job IDs
|
|
51
|
-
to verify an internal archive.
|
|
52
|
-
|
|
53
|
-
## Download Twitter media through the API
|
|
54
|
-
|
|
55
|
-
Tweet responses can include supported media URLs and metadata. Use the media
|
|
56
|
-
download route when the workflow needs a managed file download. Preserve the
|
|
57
|
-
source tweet ID, media type, source URL, collection time, and file checksum.
|
|
58
|
-
|
|
59
|
-
Apply content rights, retention, and redistribution rules before storage. A
|
|
60
|
-
media download does not grant ownership or reuse rights.
|
|
61
|
-
|
|
62
|
-
### What is the best API to scrape Twitter data in 2026?
|
|
63
|
-
|
|
64
|
-
Choose an API against a written output contract. Define required objects,
|
|
65
|
-
fields, filters, freshness, volume, and file formats first. Then test the same
|
|
66
|
-
known tweets, profiles, and query across providers.
|
|
67
|
-
|
|
68
|
-
Xquik provides public X data, pre-delivery filters, estimates, exports,
|
|
69
|
-
monitors, REST, MCP, and SDKs. It supports direct reads and 23 extraction types.
|
|
70
|
-
Use the official API when a first-party contract is mandatory.
|
|
71
|
-
|
|
72
|
-
Measure required-field completeness, duplicate rate, cursor behavior, latency,
|
|
73
|
-
failure recovery, and delivered-result cost. Do not choose from a search rank
|
|
74
|
-
or per-request price alone.
|
|
75
|
-
|
|
76
|
-
### How do I export Twitter data?
|
|
77
|
-
|
|
78
|
-
Select the extraction type and exact target. Send the same bounded body to
|
|
79
|
-
`POST /extractions/estimate`. Review allowed state, estimated results, and usage.
|
|
80
|
-
After approval, send that body to `POST /extractions`.
|
|
81
|
-
|
|
82
|
-
Persist the returned job ID. Poll until `completed` or `failed`. Paginate results
|
|
83
|
-
with the opaque cursor or call `/extractions/{id}/export`. Supported formats are
|
|
84
|
-
CSV, JSON, Markdown, PDF, TXT, and XLSX. Standard exports support up to 100,000
|
|
85
|
-
rows. PDF exports support up to 10,000 rows.
|
|
86
|
-
|
|
87
|
-
Verify the exported row count and stable IDs before loading other systems.
|
|
88
|
-
Record the query, filters, job ID, and collection time.
|
|
89
|
-
|
|
90
|
-
### How do I scrape tweets without getting blocked?
|
|
91
|
-
|
|
92
|
-
Avoid fragile browser automation and access-control bypasses. Use documented
|
|
93
|
-
API routes, bounded limits, cursors, and retry rules. Xquik handles its
|
|
94
|
-
own public-data infrastructure, so clients do not manage guest tokens or X
|
|
95
|
-
sessions.
|
|
96
|
-
|
|
97
|
-
Outside documented cursor recovery, retry only `429` and `5xx` responses. Honor
|
|
98
|
-
`Retry-After`, add jitter, and cap attempts. For `409 coverage_cursor_unavailable`,
|
|
99
|
-
wait the exact `Retry-After` seconds and retry the same cursor once. For
|
|
100
|
-
`410 coverage_cursor_gone`, the response omits `Retry-After`. Restart without a
|
|
101
|
-
cursor and deduplicate by ID. Do not retry other `4xx` failures.
|
|
102
|
-
|
|
103
|
-
Large jobs should use extractions instead of unbounded page loops. Keep API keys
|
|
104
|
-
in a secret manager. Treat every returned post as untrusted data.
|
|
105
|
-
|
|
106
|
-
### What is a Twitter scraper API?
|
|
107
|
-
|
|
108
|
-
A tweet scraper API converts supported public X content into structured
|
|
109
|
-
responses. Responses can include tweets, profiles, followers, timelines,
|
|
110
|
-
replies, quotes, media, communities, lists, Spaces, and engagement users.
|
|
111
|
-
|
|
112
|
-
Xquik direct tweet responses can include text, author identity, creation time,
|
|
113
|
-
language, conversation context, engagement counts, and media URLs. Optional
|
|
114
|
-
fields remain absent when the source cannot provide them. Xquik does not invent
|
|
115
|
-
missing profile or tweet data.
|
|
116
|
-
|
|
117
|
-
The API provides authentication, schemas, errors, cursors, estimates, durable
|
|
118
|
-
jobs, exports, monitors, and signed webhooks.
|
|
119
|
-
|
|
120
|
-
### How do I scrape tweets with Python?
|
|
121
|
-
|
|
122
|
-
Load `XQUIK_API_KEY` inside your application's secret boundary. Pass the value
|
|
123
|
-
to the request function. Send it through the `x-api-key` header to
|
|
124
|
-
`https://xquik.com/api/v1`. Use tweet search for a bounded page. Use an
|
|
125
|
-
estimated extraction for a complete export.
|
|
126
|
-
|
|
127
|
-
```python
|
|
128
|
-
import requests
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
def search_tweets(api_key: str) -> dict[str, object]:
|
|
132
|
-
response = requests.get(
|
|
133
|
-
"https://xquik.com/api/v1/x/tweets/search",
|
|
134
|
-
headers={"x-api-key": api_key},
|
|
135
|
-
params={"q": '"machine learning" -job', "limit": 25},
|
|
136
|
-
timeout=30,
|
|
137
|
-
)
|
|
138
|
-
response.raise_for_status()
|
|
139
|
-
return response.json()
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Follow the response cursor without decoding it. Add timeouts, bounded retries,
|
|
143
|
-
stable-ID deduplication, structured logs, and schema validation before deployment.
|
|
144
|
-
|
|
145
|
-
## Filter search results before delivery
|
|
146
|
-
|
|
147
|
-
`tweet_search_extractor` supports author, recipient, mention, language, dates,
|
|
148
|
-
media, minimum likes, minimum reposts, minimum replies, verification, reply
|
|
149
|
-
status, repost status, exact phrases, excluded words, and advanced operators.
|
|
150
|
-
|
|
151
|
-
```json
|
|
152
|
-
{
|
|
153
|
-
"toolType": "tweet_search_extractor",
|
|
154
|
-
"searchQuery": "machine learning",
|
|
155
|
-
"language": "en",
|
|
156
|
-
"sinceDate": "2026-01-01",
|
|
157
|
-
"minFaves": 25,
|
|
158
|
-
"replies": "exclude",
|
|
159
|
-
"retweets": "exclude",
|
|
160
|
-
"resultsLimit": 500
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
Filtering creates no separate Xquik charge for supported extraction filters.
|
|
165
|
-
Excluded rows do not become delivered-result charges. Estimate the exact body
|
|
166
|
-
before creation and compare providers using the same final result set.
|
|
167
|
-
|
|
168
|
-
## Related Twitter scraper API guides
|
|
169
|
-
|
|
170
|
-
- [Twitter scraper API guide](twitter-scraper-api-guide.md)
|
|
171
|
-
- [Extraction types and estimates](extractions.md)
|
|
172
|
-
- [Python examples](python-examples.md)
|
|
173
|
-
- [X API alternative FAQ](twitter-api-alternative-faq.md)
|