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.
Files changed (161) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +2 -27
  3. package/.codex-plugin/plugin.json +4 -28
  4. package/README.de.md +505 -0
  5. package/README.es.md +504 -0
  6. package/README.fr.md +507 -0
  7. package/README.it.md +499 -0
  8. package/README.ja.md +493 -0
  9. package/README.ko.md +494 -0
  10. package/README.md +486 -123
  11. package/README.tr.md +502 -0
  12. package/README.zh-CN.md +484 -0
  13. package/assets/logo-400.png +0 -0
  14. package/commands/post.md +3 -3
  15. package/commands/search.md +1 -1
  16. package/commands/trending.md +1 -1
  17. package/commands/user.md +1 -1
  18. package/context7.json +6 -12
  19. package/docker-mcp-registry/xquik/readme.md +1 -0
  20. package/docker-mcp-registry/xquik/server.yaml +23 -0
  21. package/docker-mcp-registry/xquik/tools.json +1 -0
  22. package/glama.json +4 -0
  23. package/mcp.json +9 -0
  24. package/openclaw.plugin.json +2 -2
  25. package/package.json +24 -20
  26. package/plugin.json +22 -0
  27. package/registry.json +60 -0
  28. package/server.json +2 -2
  29. package/skills/x-twitter-scraper/LICENSE +21 -0
  30. package/skills/x-twitter-scraper/SKILL.md +175 -457
  31. package/skills/x-twitter-scraper/metadata.json +19 -9
  32. package/skills/x-twitter-scraper/references/compare-faq.md +101 -0
  33. package/skills/x-twitter-scraper/references/extractions.md +65 -290
  34. package/skills/x-twitter-scraper/references/mcp.md +24 -0
  35. package/skills/x-twitter-scraper/references/monitors-webhooks.md +167 -0
  36. package/skills/x-twitter-scraper/references/reads.md +416 -0
  37. package/skills/x-twitter-scraper/references/writes.md +111 -0
  38. package/skills/xquik-mcp/SKILL.md +75 -0
  39. package/skills/xquik-mcp/references/mcp-setup.md +255 -0
  40. package/skills/xquik-social-research/SKILL.md +61 -74
  41. package/skills.sh.json +6 -68
  42. package/start.sh +2 -2
  43. package/stub-server.mjs +37 -86
  44. package/task-guides/check-mutuals.md +3 -3
  45. package/task-guides/clean-followers.md +4 -4
  46. package/task-guides/export-tweets-csv.md +7 -7
  47. package/task-guides/extract-followers.md +10 -10
  48. package/task-guides/find-bangers.md +2 -2
  49. package/task-guides/find-influencers.md +4 -4
  50. package/task-guides/find-viral-tweets.md +9 -9
  51. package/task-guides/follow-unfollow.md +5 -5
  52. package/task-guides/for-you-feed.md +4 -4
  53. package/task-guides/going-viral.md +6 -6
  54. package/task-guides/grow-followers.md +4 -4
  55. package/task-guides/monitor-accounts.md +5 -5
  56. package/task-guides/optimize-tweets.md +3 -3
  57. package/task-guides/post-tweets.md +13 -13
  58. package/task-guides/run-giveaway.md +5 -5
  59. package/task-guides/search-tweets.md +7 -7
  60. package/task-guides/send-dms.md +11 -11
  61. package/task-guides/top-replies.md +7 -7
  62. package/task-guides/track-competitors.md +10 -10
  63. package/task-guides/track-hashtags.md +11 -11
  64. package/task-guides/track-mentions.md +7 -7
  65. package/task-guides/trending-news.md +4 -4
  66. package/task-guides/tweet-analytics.md +12 -12
  67. package/task-guides/tweet-ideas.md +2 -2
  68. package/task-guides/tweet-replies.md +8 -8
  69. package/task-guides/tweet-style.md +4 -4
  70. package/task-guides/tweet-webhooks.md +7 -7
  71. package/task-guides/update-x-profile.md +5 -5
  72. package/task-guides/user-tweets.md +10 -10
  73. package/task-guides/who-liked.md +4 -4
  74. package/task-guides/who-quoted.md +4 -4
  75. package/task-guides/who-retweeted.md +4 -4
  76. package/task-guides/write-threads.md +6 -6
  77. package/task-guides/write-tweets.md +8 -8
  78. package/task-guides/x-articles.md +3 -3
  79. package/task-guides/x-bookmarks.md +4 -4
  80. package/task-guides/x-communities.md +4 -4
  81. package/task-guides/x-lists.md +4 -4
  82. package/task-guides/x-spaces.md +4 -4
  83. package/task-guides/x-trends.md +6 -6
  84. package/x-twitter-scraper.json +10 -0
  85. package/CHANGELOG.md +0 -94
  86. package/scripts/check-reproducible.mjs +0 -48
  87. package/scripts/check-versions.mjs +0 -24
  88. package/scripts/release-guard/content-policy.mjs +0 -410
  89. package/scripts/release-guard/context.mjs +0 -61
  90. package/scripts/release-guard/frontmatter.mjs +0 -151
  91. package/scripts/release-guard/policy-checks.mjs +0 -134
  92. package/scripts/release-guard/policy.mjs +0 -226
  93. package/scripts/release-guard/repository-checks.mjs +0 -256
  94. package/skills/x-twitter-scraper/references/api-endpoints-api-keys.md +0 -14
  95. package/skills/x-twitter-scraper/references/api-endpoints-compose.md +0 -33
  96. package/skills/x-twitter-scraper/references/api-endpoints-credits.md +0 -11
  97. package/skills/x-twitter-scraper/references/api-endpoints-drafts.md +0 -105
  98. package/skills/x-twitter-scraper/references/api-endpoints-draws.md +0 -101
  99. package/skills/x-twitter-scraper/references/api-endpoints-error-codes.md +0 -67
  100. package/skills/x-twitter-scraper/references/api-endpoints-events.md +0 -50
  101. package/skills/x-twitter-scraper/references/api-endpoints-extractions.md +0 -113
  102. package/skills/x-twitter-scraper/references/api-endpoints-monitors.md +0 -111
  103. package/skills/x-twitter-scraper/references/api-endpoints-radar.md +0 -50
  104. package/skills/x-twitter-scraper/references/api-endpoints-support.md +0 -53
  105. package/skills/x-twitter-scraper/references/api-endpoints-trends.md +0 -48
  106. package/skills/x-twitter-scraper/references/api-endpoints-tweet-style-cache.md +0 -186
  107. package/skills/x-twitter-scraper/references/api-endpoints-webhooks.md +0 -120
  108. package/skills/x-twitter-scraper/references/api-endpoints-x-accounts.md +0 -54
  109. package/skills/x-twitter-scraper/references/api-endpoints-x-api.md +0 -267
  110. package/skills/x-twitter-scraper/references/api-endpoints-x-media.md +0 -50
  111. package/skills/x-twitter-scraper/references/api-endpoints-x-write.md +0 -270
  112. package/skills/x-twitter-scraper/references/api-endpoints.md +0 -30
  113. package/skills/x-twitter-scraper/references/automate-twitter-giveaways.md +0 -130
  114. package/skills/x-twitter-scraper/references/best-x-api-alternative.md +0 -198
  115. package/skills/x-twitter-scraper/references/compare-twitter-apis.md +0 -151
  116. package/skills/x-twitter-scraper/references/draws.md +0 -57
  117. package/skills/x-twitter-scraper/references/export-twitter-followers.md +0 -127
  118. package/skills/x-twitter-scraper/references/extract-x-community-data.md +0 -121
  119. package/skills/x-twitter-scraper/references/mcp-setup.md +0 -331
  120. package/skills/x-twitter-scraper/references/mcp-tools.md +0 -183
  121. package/skills/x-twitter-scraper/references/monitor-twitter-webhooks.md +0 -121
  122. package/skills/x-twitter-scraper/references/python-examples.md +0 -201
  123. package/skills/x-twitter-scraper/references/reliable-twitter-data-api-2026.md +0 -239
  124. package/skills/x-twitter-scraper/references/scrape-export-twitter-data.md +0 -173
  125. package/skills/x-twitter-scraper/references/security.md +0 -111
  126. package/skills/x-twitter-scraper/references/track-twitter-keywords-mentions.md +0 -148
  127. package/skills/x-twitter-scraper/references/twitter-api-alternative-faq.md +0 -128
  128. package/skills/x-twitter-scraper/references/twitter-api-without-x-account.md +0 -110
  129. package/skills/x-twitter-scraper/references/twitter-data-pipeline.md +0 -136
  130. package/skills/x-twitter-scraper/references/twitter-scraper-api-guide.md +0 -229
  131. package/skills/x-twitter-scraper/references/types-account-identity.md +0 -9
  132. package/skills/x-twitter-scraper/references/types-account.md +0 -26
  133. package/skills/x-twitter-scraper/references/types-api-keys.md +0 -22
  134. package/skills/x-twitter-scraper/references/types-bookmarks-and-timeline.md +0 -46
  135. package/skills/x-twitter-scraper/references/types-credits.md +0 -11
  136. package/skills/x-twitter-scraper/references/types-download-media.md +0 -22
  137. package/skills/x-twitter-scraper/references/types-draws.md +0 -60
  138. package/skills/x-twitter-scraper/references/types-error.md +0 -29
  139. package/skills/x-twitter-scraper/references/types-events.md +0 -23
  140. package/skills/x-twitter-scraper/references/types-extractions.md +0 -136
  141. package/skills/x-twitter-scraper/references/types-mcp-output-schemas.md +0 -13
  142. package/skills/x-twitter-scraper/references/types-monitors.md +0 -49
  143. package/skills/x-twitter-scraper/references/types-radar.md +0 -47
  144. package/skills/x-twitter-scraper/references/types-request-bodies.md +0 -30
  145. package/skills/x-twitter-scraper/references/types-rest-api-vs-mcp-field-naming.md +0 -11
  146. package/skills/x-twitter-scraper/references/types-support.md +0 -46
  147. package/skills/x-twitter-scraper/references/types-trends.md +0 -21
  148. package/skills/x-twitter-scraper/references/types-tweet-drafts.md +0 -20
  149. package/skills/x-twitter-scraper/references/types-tweet-style-cache.md +0 -50
  150. package/skills/x-twitter-scraper/references/types-user-activity.md +0 -35
  151. package/skills/x-twitter-scraper/references/types-webhooks.md +0 -46
  152. package/skills/x-twitter-scraper/references/types-x-accounts.md +0 -16
  153. package/skills/x-twitter-scraper/references/types-x-api.md +0 -144
  154. package/skills/x-twitter-scraper/references/types-x-articles.md +0 -36
  155. package/skills/x-twitter-scraper/references/types-x-write.md +0 -78
  156. package/skills/x-twitter-scraper/references/types.md +0 -31
  157. package/skills/x-twitter-scraper/references/usage.md +0 -50
  158. package/skills/x-twitter-scraper/references/webhooks.md +0 -321
  159. package/skills/x-twitter-scraper/references/workflows.md +0 -215
  160. package/skills/x-twitter-scraper/skill-card.md +0 -84
  161. 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)