x-developer 2.7.0 → 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 (68) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/README.de.md +13 -13
  5. package/README.es.md +13 -13
  6. package/README.fr.md +13 -13
  7. package/README.it.md +13 -13
  8. package/README.ja.md +2 -2
  9. package/README.ko.md +2 -2
  10. package/README.md +15 -15
  11. package/README.tr.md +15 -15
  12. package/README.zh-CN.md +13 -13
  13. package/commands/post.md +2 -2
  14. package/context7.json +1 -1
  15. package/openclaw.plugin.json +1 -1
  16. package/package.json +1 -1
  17. package/plugin.json +1 -1
  18. package/skills/x-twitter-scraper/SKILL.md +3 -3
  19. package/skills/x-twitter-scraper/metadata.json +1 -1
  20. package/skills/x-twitter-scraper/references/compare-faq.md +6 -6
  21. package/skills/x-twitter-scraper/references/extractions.md +4 -4
  22. package/skills/x-twitter-scraper/references/mcp.md +3 -3
  23. package/skills/x-twitter-scraper/references/monitors-webhooks.md +10 -10
  24. package/skills/x-twitter-scraper/references/reads.md +61 -60
  25. package/skills/x-twitter-scraper/references/writes.md +13 -11
  26. package/skills/xquik-mcp/SKILL.md +2 -2
  27. package/skills/xquik-mcp/references/mcp-setup.md +15 -15
  28. package/stub-server.mjs +1 -1
  29. package/task-guides/check-mutuals.md +3 -3
  30. package/task-guides/clean-followers.md +3 -3
  31. package/task-guides/export-tweets-csv.md +7 -7
  32. package/task-guides/extract-followers.md +5 -5
  33. package/task-guides/find-bangers.md +2 -2
  34. package/task-guides/find-influencers.md +2 -2
  35. package/task-guides/find-viral-tweets.md +8 -8
  36. package/task-guides/follow-unfollow.md +3 -3
  37. package/task-guides/for-you-feed.md +3 -3
  38. package/task-guides/going-viral.md +2 -2
  39. package/task-guides/grow-followers.md +4 -4
  40. package/task-guides/monitor-accounts.md +2 -2
  41. package/task-guides/optimize-tweets.md +3 -3
  42. package/task-guides/post-tweets.md +9 -9
  43. package/task-guides/run-giveaway.md +3 -3
  44. package/task-guides/search-tweets.md +7 -7
  45. package/task-guides/send-dms.md +4 -4
  46. package/task-guides/top-replies.md +5 -5
  47. package/task-guides/track-competitors.md +5 -5
  48. package/task-guides/track-hashtags.md +7 -7
  49. package/task-guides/track-mentions.md +6 -6
  50. package/task-guides/trending-news.md +2 -2
  51. package/task-guides/tweet-analytics.md +12 -12
  52. package/task-guides/tweet-ideas.md +2 -2
  53. package/task-guides/tweet-replies.md +5 -5
  54. package/task-guides/tweet-style.md +3 -3
  55. package/task-guides/tweet-webhooks.md +5 -5
  56. package/task-guides/update-x-profile.md +2 -2
  57. package/task-guides/user-tweets.md +9 -9
  58. package/task-guides/who-liked.md +3 -3
  59. package/task-guides/who-quoted.md +3 -3
  60. package/task-guides/who-retweeted.md +3 -3
  61. package/task-guides/write-threads.md +3 -3
  62. package/task-guides/write-tweets.md +5 -5
  63. package/task-guides/x-articles.md +3 -3
  64. package/task-guides/x-bookmarks.md +2 -2
  65. package/task-guides/x-communities.md +3 -3
  66. package/task-guides/x-lists.md +3 -3
  67. package/task-guides/x-spaces.md +3 -3
  68. package/task-guides/x-trends.md +6 -6
@@ -6,7 +6,7 @@ numeric strings.
6
6
 
7
7
  ## Request example
8
8
 
9
- Send reads through the Python `get_json` helper from [Retries](#retries):
9
+ Send reads through the Python `get_json` helper from [Retries](#retries).
10
10
 
11
11
  ```python
12
12
  page = get_json(
@@ -24,35 +24,35 @@ page = get_json(
24
24
  | `GET /x/tweets?ids=` | Up to 100 comma-separated tweet IDs |
25
25
  | `GET /x/tweets/{id}/replies` | `pageSize` (1 to 300), `sort` (`relevance`, `latest`, `oldest`, `likes`), `excludeOriginalAuthor`, `includeOriginalPost`, `hasMediaOnly`, `scope`, `cursor` |
26
26
  | `GET /x/tweets/{id}/quotes` | `pageSize` (1 to 300), `sinceTime`, `untilTime`, `includeReplies`, `cursor` |
27
- | `GET /x/tweets/{id}/thread` | Visible posts in the conversation thread, from any author: `pageSize` (1 to 100), `cursor` |
27
+ | `GET /x/tweets/{id}/thread` | Visible posts in the conversation thread, from any author. Takes `pageSize` (1 to 100), `cursor` |
28
28
  | `GET /x/tweets/{id}/retweeters` | `pageSize` (1 to 200), profile filters, `cursor` |
29
29
  | `GET /x/tweets/{id}/favoriters` | `pageSize` (1 to 200), profile filters, `cursor` |
30
30
  | `GET /x/articles/{tweetId}` | Full X Article content |
31
- | `GET /x/tweets/top` | X's top tweets: `metric` (`likes` default, `replies`, `quotes`, `bookmarks`, `shares`, `views`), `window` (`day` default, `week`, `month`), `country` or `language`, `pageSize` (1 to 100), `cursor`. The list ends at 100 |
32
- | `GET /x/tweets/{id}/hidden-replies` | Replies the author hid, oldest first: `pageSize` (1 to 100), tweet filters, `cursor` |
33
- | `GET /x/tweets/{id}/retweeter-ids` | Reposter user IDs only: `pageSize` (1 to 200), `cursor` |
34
- | `GET /x/tweets/{id}/retweeters/check` | `user` (required): ID, username, or profile URL. Returns `isRetweeted`, `retweetedAt`, and `complete` |
31
+ | `GET /x/tweets/top` | X's top tweets. Takes `metric` (`likes` default, `replies`, `quotes`, `bookmarks`, `shares`, `views`), `window` (`day` default, `week`, `month`), `country` or `language`, `pageSize` (1 to 100), `cursor`. The list ends at 100 |
32
+ | `GET /x/tweets/{id}/hidden-replies` | Replies the author hid, oldest first. Takes `pageSize` (1 to 100), tweet filters, `cursor` |
33
+ | `GET /x/tweets/{id}/retweeter-ids` | Reposter user IDs only. Takes `pageSize` (1 to 200), `cursor` |
34
+ | `GET /x/tweets/{id}/retweeters/check` | `user` (required) takes an ID, username, or profile URL. Returns `isRetweeted`, `retweetedAt`, and `complete` |
35
35
  | `GET /x/tweets/{id}/insights` | Engagements per hour, per view, and per follower of the author |
36
36
  | `GET /x/tweets/{id}/translation` | `language` (required), such as `en` or `pt-br`. Returns X's own translation |
37
- | `GET /x/tweets/{id}/subtitles` | Caption tracks of the tweet's videos: language, timed cues, and full text |
38
- | `GET /x/tweets/{id}/embed` | Embed HTML: `theme` (`light` or `dark`), `hideMedia`, `hideThread`, `omitScript` |
37
+ | `GET /x/tweets/{id}/subtitles` | Caption tracks of the tweet's videos, with language, timed cues, and full text |
38
+ | `GET /x/tweets/{id}/embed` | Embed HTML. Takes `theme` (`light` or `dark`), `hideMedia`, `hideThread`, `omitScript` |
39
39
 
40
40
  Search, replies, quotes, thread, and user timelines accept the same tweet
41
- filters as named query parameters. Send only the ones the user asked for:
41
+ filters as named query parameters. Send only the ones the user asked for.
42
42
 
43
- - Authors and targets: `fromUser`, `toUser`, `mentioning`, `verifiedOnly`,
43
+ - Authors and targets use `fromUser`, `toUser`, `mentioning`, `verifiedOnly`,
44
44
  `blueVerifiedOnly`
45
- - Text: `exactPhrase`, `anyWords`, `excludeWords`, `hashtags`, `cashtags`, `url`
46
- - Time: `sinceDate` and `untilDate` (`YYYY-MM-DD`), `sinceTime` (ISO,
45
+ - Text uses `exactPhrase`, `anyWords`, `excludeWords`, `hashtags`, `cashtags`, `url`
46
+ - Time uses `sinceDate` and `untilDate` (`YYYY-MM-DD`), `sinceTime` (ISO,
47
47
  inclusive) and `untilTime` (ISO, exclusive, so end 2023 with
48
48
  `2024-01-01T00:00:00Z`), `withinTime` (such as `7d`)
49
- - Language: `language` (such as `en`)
50
- - Media: `mediaType` (`images`, `videos`, `gifs`, `media`, `links`, `none`)
51
- - Engagement: `minLikes`, `minRetweets`, `minReplies`, `minQuotes`,
49
+ - Language uses `language` (such as `en`)
50
+ - Media uses `mediaType` (`images`, `videos`, `gifs`, `media`, `links`, `none`)
51
+ - Engagement uses `minLikes`, `minRetweets`, `minReplies`, `minQuotes`,
52
52
  `minViews`, `minBookmarks`, `maxFaves`, `maxRetweets`, `maxReplies`
53
- - Post types: `replies`, `retweets`, `quotes`, each `include`, `exclude`, or `only`
54
- - Conversation: `conversationId`, `inReplyToTweetId`, `quotesOfTweetId`
55
- - Raw operators: `advancedQuery` for a known X search operator string, on search only
53
+ - Post types use `replies`, `retweets`, `quotes`, each `include`, `exclude`, or `only`
54
+ - Conversation uses `conversationId`, `inReplyToTweetId`, `quotesOfTweetId`
55
+ - Raw operators use `advancedQuery` for a known X search operator string, on search only
56
56
 
57
57
  Tweet responses hold `tweets`, `has_next_page`, and `next_cursor`. Each tweet
58
58
  has `id`, `text`, `createdAt`, `lang`, `likeCount`, `retweetCount`,
@@ -67,24 +67,24 @@ username or numeric ID.
67
67
 
68
68
  | Route | Key parameters |
69
69
  | --- | --- |
70
- | `GET /x/users/{id}` | Profile: `followers`, `following`, `description` (bio), `verified`, `isVerified`, `isBlueVerified`, `verifiedType`, `statusesCount`, `location`, `createdAt` |
70
+ | `GET /x/users/{id}` | Profile with `followers`, `following`, `description` (bio), `verified`, `isVerified`, `isBlueVerified`, `verifiedType`, `statusesCount`, `location`, `createdAt` |
71
71
  | `GET /x/users/search` | `q` (required), `pageSize` (1 to 100), profile filters, `cursor` |
72
72
  | `GET /x/users/batch` | `ids` (comma-separated user IDs), profile filters |
73
73
  | `GET /x/users/{id}/tweets` | `pageSize` (1 to 300, default 20), `sinceTime`, `untilTime`, `includeReplies` (default `false`), tweet filters, `cursor` |
74
- | `GET /x/users/{id}/replies` | With Replies timeline: `pageSize` (1 to 300), `sinceTime`, `untilTime`, tweet filters, `cursor` |
74
+ | `GET /x/users/{id}/replies` | With Replies timeline. Takes `pageSize` (1 to 300), `sinceTime`, `untilTime`, tweet filters, `cursor` |
75
75
  | `GET /x/users/{id}/media` | `pageSize` (1 to 100), tweet filters, `cursor` |
76
76
  | `GET /x/users/{id}/mentions` | `pageSize` (1 to 100), `sinceTime`, `untilTime`, tweet filters, `cursor` |
77
77
  | `GET /x/users/{id}/likes` | `pageSize` (1 to 100), tweet filters, `cursor`. Needs a connected X account for the owner's likes |
78
- | `GET /x/users/batch/tweets` | Newest posts of up to 20 users: `ids` or `usernames` (comma-separated, send 1 of the 2), `pageSize` (1 to 20) |
79
- | `GET /x/users/{id}/articles` | Posts on the Articles tab, newest first: `pageSize` (1 to 100), tweet filters, `cursor`. Read the full text with `GET /x/articles/{tweetId}` |
80
- | `GET /x/users/{id}/highlights` | Posts on the Highlights tab: `pageSize` (1 to 100), tweet filters, `cursor` |
78
+ | `GET /x/users/batch/tweets` | Newest posts of up to 20 users. Takes `ids` or `usernames` (comma-separated, send 1 of the 2), `pageSize` (1 to 20) |
79
+ | `GET /x/users/{id}/articles` | Posts on the Articles tab, newest first. Takes `pageSize` (1 to 100), tweet filters, `cursor`. Read the full text with `GET /x/articles/{tweetId}` |
80
+ | `GET /x/users/{id}/highlights` | Posts on the Highlights tab. Takes `pageSize` (1 to 100), tweet filters, `cursor` |
81
81
  | `GET /x/users/{id}/insights` | Engagement rate, averages per post, and posting rate, from the last 20 posts |
82
82
  | `GET /x/users/{id}/translation` | `language` (required). Returns X's own translation of the bio |
83
83
  | `GET /x/users/{id}/live` | Whether the user broadcasts live video now, with the latest broadcast |
84
- | `GET /x/users/{id}/lists` | Public Lists the user created: `pageSize` (1 to 100), `cursor` |
85
- | `GET /x/users/{id}/list-memberships` | Public Lists that include the user: `pageSize` (1 to 100), `cursor` |
84
+ | `GET /x/users/{id}/lists` | Public Lists the user created. Takes `pageSize` (1 to 100), `cursor` |
85
+ | `GET /x/users/{id}/list-memberships` | Public Lists that include the user. Takes `pageSize` (1 to 100), `cursor` |
86
86
 
87
- Verification: `isBlueVerified` means X shows the blue badge. `isVerified` and
87
+ For verification, `isBlueVerified` means X shows the blue badge. `isVerified` and
88
88
  `verified` mean X marks the profile as verified. `verifiedType` names the kind,
89
89
  such as `Business`. Report only the values the response returns.
90
90
 
@@ -96,13 +96,13 @@ such as `Business`. Report only the values the response returns.
96
96
  | `GET /x/users/{id}/following` | Same as followers |
97
97
  | `GET /x/users/{id}/verified-followers` | Same as followers |
98
98
  | `GET /x/followers/check` | `source` and `target` usernames. Returns `isFollowing` and `isFollowedBy` |
99
- | `GET /x/users/{id}/follower-ids` | Follower user IDs only, newest first: `pageSize` (1 to 5,000), `cursor` |
100
- | `GET /x/users/{id}/following-ids` | User IDs of the accounts the user follows: `pageSize` (1 to 5,000), `cursor` |
101
- | `GET /x/users/{id}/similar` | Accounts X lists as similar: `pageSize` (1 to 200), profile filters, `cursor` |
102
- | `GET /x/users/{id}/affiliates` | Accounts an organization lists as affiliates: `pageSize` (1 to 200), profile filters, `cursor` |
103
- | `GET /x/users/{id}/subscriptions` | Creators the user subscribes to: `pageSize` (1 to 200), profile filters, `cursor` |
99
+ | `GET /x/users/{id}/follower-ids` | Follower user IDs only, newest first. Takes `pageSize` (1 to 5,000), `cursor` |
100
+ | `GET /x/users/{id}/following-ids` | User IDs of the accounts the user follows. Takes `pageSize` (1 to 5,000), `cursor` |
101
+ | `GET /x/users/{id}/similar` | Accounts X lists as similar. Takes `pageSize` (1 to 200), profile filters, `cursor` |
102
+ | `GET /x/users/{id}/affiliates` | Accounts an organization lists as affiliates. Takes `pageSize` (1 to 200), profile filters, `cursor` |
103
+ | `GET /x/users/{id}/subscriptions` | Creators the user subscribes to. Takes `pageSize` (1 to 200), profile filters, `cursor` |
104
104
 
105
- Profile filters, applied before billing: `minFollowers`, `maxFollowers`,
105
+ Profile filters, applied before billing, are `minFollowers`, `maxFollowers`,
106
106
  `minFollowing`, `maxFollowing`, `minStatuses`, `maxStatuses`,
107
107
  `minAccountAgeDays`, `verifiedOnly`, `hasWebsite`, `hasLocation`,
108
108
  `bioContains` (any comma-separated term, ignoring case), `locationContains`,
@@ -114,24 +114,24 @@ extraction for a complete follower list.
114
114
 
115
115
  | Route | Notes |
116
116
  | --- | --- |
117
- | `GET /x/lists/search` | Find public Lists: `q` (required), `pageSize` (1 to 100), `cursor` |
117
+ | `GET /x/lists/search` | Find public Lists with `q` (required), `pageSize` (1 to 100), `cursor` |
118
118
  | `GET /x/lists/{id}` | Name, description, counts, and owner. Takes a List ID or a URL-encoded List URL |
119
119
  | `GET /x/lists/{id}/members`, `/followers`, `/tweets` | List ID |
120
- | `GET /x/communities/find` | Find communities by keyword: `q` (required), `pageSize` (1 to 100), `cursor` |
121
- | `GET /x/communities/topics` | Topics and subtopics X groups communities under: `limit` |
122
- | `GET /x/communities/popular` | Top communities of a topic: `topicId` or `topic`, `pageSize` (1 to 100), `cursor` |
123
- | `GET /x/communities/suggested` | Communities X suggests to join: `limit` |
120
+ | `GET /x/communities/find` | Find communities by keyword with `q` (required), `pageSize` (1 to 100), `cursor` |
121
+ | `GET /x/communities/topics` | Topics and subtopics X groups communities under. Takes `limit` |
122
+ | `GET /x/communities/popular` | Top communities of a topic. Takes `topicId` or `topic`, `pageSize` (1 to 100), `cursor` |
123
+ | `GET /x/communities/suggested` | Communities X suggests to join. Takes `limit` |
124
124
  | `GET /x/communities/{id}/info`, `/members`, `/moderators`, `/tweets` | Community ID |
125
- | `GET /x/communities/{id}/media` | Posts with photos or videos on the Media tab, newest first: `pageSize` (1 to 100), tweet filters, `cursor` |
126
- | `GET /x/communities/{id}/members/search` | Find members by name or username: `q` (required) |
125
+ | `GET /x/communities/{id}/media` | Posts with photos or videos on the Media tab, newest first. Takes `pageSize` (1 to 100), tweet filters, `cursor` |
126
+ | `GET /x/communities/{id}/members/search` | Find members by name or username with `q` (required) |
127
127
  | `GET /x/communities/search` | Search posts inside a community |
128
- | `GET /x/communities/tweets` | Search posts in 1 community with `communityId`, or in every community without it: `q` (required), `queryType`, `pageSize` (1 to 100), tweet filters, `cursor` |
128
+ | `GET /x/communities/tweets` | Search posts in 1 community with `communityId`, or in every community without it. Takes `q` (required), `queryType`, `pageSize` (1 to 100), tweet filters, `cursor` |
129
129
 
130
130
  ## Spaces, broadcasts, and jobs
131
131
 
132
132
  | Route | Notes |
133
133
  | --- | --- |
134
- | `GET /x/spaces/search` | `q` (required): words, hashtags, or operators such as `from:solana`. `queryType`, `pageSize` (1 to 100), `cursor` |
134
+ | `GET /x/spaces/search` | `q` (required) takes words, hashtags, or operators such as `from:solana`. `queryType`, `pageSize` (1 to 100), `cursor` |
135
135
  | `GET /x/spaces/{id}` | Title, state, times, audience, host, and speakers. Takes a Space ID or a URL-encoded Space URL |
136
136
  | `GET /x/spaces/{id}/replay` | HLS playback URL of an ended Space. A live or scheduled Space answers `409` |
137
137
  | `GET /x/broadcasts/{id}` | Title, state, times, watch counts, and host of a live video broadcast |
@@ -146,15 +146,16 @@ Use the `space_explorer` extraction for a Space's participants.
146
146
  | Route | Notes |
147
147
  | --- | --- |
148
148
  | `GET /x/trends` | Pick the place by `woeid` (default 1, worldwide), `country`, or `location`. `count` (1 to 50, default 30) |
149
- | `GET /x/trends/locations` | Places X offers trends for: `country`, `placeType`, `q`, `limit`. Pass a location's `woeid` to `/x/trends` |
150
- | `GET /radar` | Trending topics from curated sources: `category`, `region`, `hours`, `limit` |
151
- | `GET /x/search/autocomplete` | Suggestions for a partial query: `q` (required), `types` (comma-separated `users`, `topics`, `hashtags`, `cashtags`), `limit` (1 to 100, default 20) |
149
+ | `GET /x/trends/locations` | Places X offers trends for. Takes `country`, `placeType`, `q`, `limit`. Pass a location's `woeid` to `/x/trends` |
150
+ | `GET /radar` | Trending topics from curated sources. Takes `category`, `region`, `hours`, `limit` |
151
+ | `GET /x/search/autocomplete` | Suggestions for a partial query. Takes `q` (required), `types` (comma-separated `users`, `topics`, `hashtags`, `cashtags`), `limit` (1 to 100, default 20) |
152
152
  | `GET /x/places/search` | `q` (required), `limit`. Pass a place `id` as `place` to tweet search |
153
- | `GET /x/hashflags` | Custom emoji X shows after hashtags: `q`, `activeOnly` (default `true`), `limit` |
154
- | `GET /x/links/resolve` | `urls` (required): 1 to 100 `https://t.co/` links, comma-separated. Returns each `resolvedUrl` |
153
+ | `GET /x/hashflags` | Custom emoji X shows after hashtags. Takes `q`, `activeOnly` (default `true`), `limit` |
154
+ | `GET /x/links/resolve` | `urls` (required) takes 1 to 100 `https://t.co/` links, comma-separated. Returns each `resolvedUrl` |
155
155
 
156
156
  A trends request bills 1 credit, however many trends it returns. `woeid` wins
157
- when a request also names a `country` or `location`. Common WOEIDs:
157
+ when a request also names a `country` or `location`. The table lists common
158
+ WOEIDs.
158
159
 
159
160
  | Region | WOEID | Region | WOEID |
160
161
  | --- | --- | --- | --- |
@@ -200,16 +201,16 @@ JSON body with `POST`. Each analyzed post bills 2 credits, read included.
200
201
  | `POST /x/analysis/viral-score` | 8 wording traits, `viralScore` from 0 to 100 & `viralVerdict` |
201
202
  | `POST /x/analysis/classify` | 1 to 8 questions you write in `analysis.questions` |
202
203
 
203
- Send exactly 1 source:
204
+ Send exactly 1 source.
204
205
 
205
- - `tweetIds`: up to 100 post IDs or URLs.
206
- - `texts`: up to 100 texts of the user's, such as drafts. Nothing is read
206
+ - `tweetIds` takes up to 100 post IDs or URLs.
207
+ - `texts` takes up to 100 texts of the user's, such as drafts. Nothing is read
207
208
  from X.
208
- - A search: `query`, `username`, `listId`, `quotesOf`, or `repliesTo`, alone
209
- or together, with `sinceTime`, `untilTime`, `queryType`, `limit` (1 to 100,
210
- default 20), and `cursor`.
209
+ - A search takes `query`, `username`, `listId`, `quotesOf`, or `repliesTo`,
210
+ alone or together, with `sinceTime`, `untilTime`, `queryType`, `limit` (1 to
211
+ 100, default 20), and `cursor`.
211
212
 
212
- `analysis` is optional: `targets` (names with `aliases`), `context`,
213
+ `analysis` is optional. It takes `targets` (names with `aliases`), `context`,
213
214
  `questions`, or a `preset`. Question IDs and category names are lower case
214
215
  with underscores.
215
216
 
@@ -236,9 +237,9 @@ They do not verify claims or give investment advice.
236
237
 
237
238
  ## Private reads
238
239
 
239
- These need a connected X account:
240
+ These need a connected X account.
240
241
 
241
- - `GET /x/dm/{userId}/history?account=<connected handle>`: `userId` is the
242
+ - In `GET /x/dm/{userId}/history?account=<connected handle>`, `userId` is the
242
243
  other person's numeric ID. Resolve it with `GET /x/users/{username}`. It
243
244
  bills 1 credit per returned message and has no page size, so the last page
244
245
  can go past a message target. Give the cost per message, not a hard cap.
@@ -250,16 +251,16 @@ These need a connected X account:
250
251
 
251
252
  - Follow `next_cursor` while `has_next_page` is true. Stop at the user's bound.
252
253
  Never build or decode a cursor.
253
- - `409 coverage_cursor_unavailable`: wait the exact `Retry-After` seconds,
254
+ - On `409 coverage_cursor_unavailable`, wait the exact `Retry-After` seconds,
254
255
  then retry the same cursor. The helper below does this.
255
- - `410 coverage_cursor_gone` or `400 invalid_coverage_cursor`: restart once
256
+ - On `410 coverage_cursor_gone` or `400 invalid_coverage_cursor`, restart once
256
257
  without a cursor and deduplicate by ID. The paging loop below catches
257
258
  `XquikError` from the helper and restarts with the remaining budget.
258
259
  - Generated paging code keeps one result budget across the entire run. Count
259
260
  every returned row before deduplication, including refetched rows after a
260
261
  restart. Lower later page sizes to the remaining budget. Persist IDs
261
262
  already appended across cron runs. An empty page can still have a cursor.
262
- - `429`, `5xx`, and failed connections: retry as [Retries](#retries) shows.
263
+ - On `429`, `5xx`, and failed connections, retry as [Retries](#retries) shows.
263
264
 
264
265
  ## Retries
265
266
 
@@ -378,7 +379,7 @@ def get_json(path, params=None, budget_s=300):
378
379
  A paging loop on that helper. It restarts once on a gone or invalid cursor.
379
380
  It counts every returned tweet toward the user's number, refetched ones
380
381
  included, so the bill never passes that cap. Load `seen_ids` from earlier
381
- output, and make `append_row` save each row before it returns:
382
+ output, and make `append_row` save each row before it returns.
382
383
 
383
384
  ```python
384
385
  def append_search_tweets(q, cap, seen_ids, append_row):
@@ -6,8 +6,9 @@ account ID. `GET /x/accounts` lists connected accounts.
6
6
 
7
7
  ## Preview, confirm, send
8
8
 
9
- - Resolve every field before a preview: account, target ID, exact text,
10
- media & reply target. Ask for a missing one instead of guessing.
9
+ - Resolve every field before a preview. That means the account, target ID,
10
+ exact text, media & reply target. Ask for a missing one instead of
11
+ guessing.
11
12
  - The preview shows the method, full URL, headers, JSON body, cost & effect.
12
13
  An effect reads like "a new post appears on @my_brand for its followers".
13
14
  - A text post or reply costs 30 credits, plus 2 per started MB of media.
@@ -27,14 +28,15 @@ account ID. `GET /x/accounts` lists connected accounts.
27
28
  Every write returns an action record with `status`, `terminal`,
28
29
  `safeToRetry`, `statusUrl`, and `pollAfterMs`.
29
30
 
30
- - `200`: the action is terminal. Check `status`, because `failed` and
31
+ - `200` means the action is terminal. Check `status`, because `failed` and
31
32
  `expired` are terminal too. A new post's ID is in `tweetId` and `result.id`.
32
- - `202`: accepted. Poll `statusUrl`, which is `GET /x/write-actions/{id}`,
33
- every `pollAfterMs` until `terminal` is true. `statusUrl` is a path that
34
- already starts with `/api/v1`, so prefix only `https://xquik.com`.
35
- - Timeout or lost response: do not send a new request, because the first one
36
- may have gone through. Retry the identical request with the same
37
- `Idempotency-Key`; Xquik returns the original action instead of acting
33
+ - `202` means the action is accepted. Poll `statusUrl`, which is
34
+ `GET /x/write-actions/{id}`, every `pollAfterMs` until `terminal` is true.
35
+ `statusUrl` is a path that already starts with `/api/v1`, so prefix only
36
+ `https://xquik.com`.
37
+ - After a timeout or lost response, do not send a new request, because the
38
+ first one may have gone through. Retry the identical request with the same
39
+ `Idempotency-Key`, and Xquik returns the original action instead of acting
38
40
  twice. Or poll the action if you have its `statusUrl`.
39
41
  - Start a new attempt with a new key only when a terminal record has
40
42
  `safeToRetry: true`, and only after the user agrees.
@@ -95,8 +97,8 @@ an `Idempotency-Key`.
95
97
  }
96
98
  ```
97
99
 
98
- Other fields: `backupCount`, `mustRetweet`, `mustFollowUsername`, `filterAccountAgeDays`,
99
- `filterLanguage`, `requiredHashtags`, `requiredKeywords`, `requiredMentions`.
100
+ Other fields are `backupCount`, `mustRetweet`, `mustFollowUsername`, `filterAccountAgeDays`,
101
+ `filterLanguage`, `requiredHashtags`, `requiredKeywords`, and `requiredMentions`.
100
102
  Read the result with `GET /draws/{id}` and export it with
101
103
  `GET /draws/{id}/export?format=csv`.
102
104
 
@@ -30,8 +30,8 @@ license: MIT
30
30
  | Tool | Input | Output | Cost |
31
31
  | --- | --- | --- | --- |
32
32
  | `docs` | `query`, up to 500 characters | Matching public documentation | Free |
33
- | `search` | `code`: an async arrow function over `spec.paths` | The paths, methods & contract fields it returns | Free, no network call |
34
- | `execute` | `code`: an async arrow function that calls `xquik.request({ path, method, query, body })` | `{ success, status, result, errors, messages }` per request | The called route's price |
33
+ | `search` | `code`, an async arrow function over `spec.paths` | The paths, methods & contract fields it returns | Free, no network call |
34
+ | `execute` | `code`, an async arrow function that calls `xquik.request({ path, method, query, body })` | `{ success, status, result, errors, messages }` per request | The called route's price |
35
35
 
36
36
  - `path` works with or without `/api/v1`.
37
37
  - `execute` adds authentication & an `Idempotency-Key` to writes. It retries
@@ -12,8 +12,8 @@ An API key grants its documented access until revoked.
12
12
  |---------|-------|
13
13
  | Protocol | Streamable HTTP |
14
14
  | Endpoint | `https://xquik.com/mcp` |
15
- | Authentication | OAuth 2.1 discovery; API key fallback |
16
- | Skill bundle version | `2.7.0` |
15
+ | Authentication | OAuth 2.1 discovery, with API key fallback |
16
+ | Skill bundle version | `2.7.1` |
17
17
 
18
18
  Current clients negotiate MCP `2026-07-28` through `server/discover`.
19
19
  Use a current MCP SDK. It adds request `_meta` and protocol headers.
@@ -22,12 +22,12 @@ Discovery and tool catalogs include private 5-minute cache hints.
22
22
  Reuse cached metadata only with the same authorization context.
23
23
  Stateless 2025-era clients remain compatible at the same endpoint.
24
24
 
25
- Xquik publishes these discovery documents:
25
+ Xquik publishes these discovery documents.
26
26
 
27
- - Protected resource metadata: `https://xquik.com/.well-known/oauth-protected-resource/mcp`
28
- - Authorization server metadata: `https://xquik.com/.well-known/oauth-authorization-server`
29
- - MCP registry card: `https://xquik.com/.well-known/mcp/server-card.json`
30
- - Authentication guide: `https://xquik.com/auth.md`
27
+ - The protected resource metadata is at `https://xquik.com/.well-known/oauth-protected-resource/mcp`
28
+ - The authorization server metadata is at `https://xquik.com/.well-known/oauth-authorization-server`
29
+ - The MCP registry card is at `https://xquik.com/.well-known/mcp/server-card.json`
30
+ - The authentication guide is at `https://xquik.com/auth.md`
31
31
 
32
32
  Xquik supports Client ID Metadata Documents and Dynamic Client Registration.
33
33
  Let each client use its documented registration flow. Both
@@ -83,7 +83,7 @@ Check your plan & workspace controls before setup.
83
83
 
84
84
  ### Codex CLI
85
85
 
86
- Use a current Codex CLI release. Run:
86
+ Use a current Codex CLI release. Run these commands.
87
87
 
88
88
  ```bash
89
89
  codex mcp add xquik --url https://xquik.com/mcp
@@ -104,7 +104,7 @@ below only when OAuth shows the issuer error.
104
104
 
105
105
  ### API-key fallback for older Codex releases
106
106
 
107
- In Codex Settings, follow [API key fallback](#api-key-fallback) & add:
107
+ In Codex Settings, follow [API key fallback](#api-key-fallback) & add this block.
108
108
 
109
109
  ```toml
110
110
  [mcp_servers.xquik]
@@ -142,7 +142,7 @@ def build_xquik_server(api_key: str) -> MCPServerStreamableHttp:
142
142
 
143
143
  ### Cursor
144
144
 
145
- Add to `~/.cursor/mcp.json` or `.cursor/mcp.json`:
145
+ Add this to `~/.cursor/mcp.json` or `.cursor/mcp.json`.
146
146
 
147
147
  ```json
148
148
  {
@@ -159,7 +159,7 @@ Cursor starts OAuth after the server returns `401`. You can also run
159
159
 
160
160
  ### VS Code
161
161
 
162
- Add to `.vscode/mcp.json` or use **MCP: Open User Configuration**:
162
+ Add this to `.vscode/mcp.json` or run the `MCP: Open User Configuration` command.
163
163
 
164
164
  ```json
165
165
  {
@@ -176,7 +176,7 @@ Start the server from the MCP view and follow the OAuth prompt.
176
176
 
177
177
  ### Windsurf
178
178
 
179
- Add to `~/.codeium/windsurf/mcp_config.json`:
179
+ Add this to `~/.codeium/windsurf/mcp_config.json`.
180
180
 
181
181
  ```json
182
182
  {
@@ -194,7 +194,7 @@ disable MCP or restrict servers to an allowlist.
194
194
 
195
195
  ### OpenCode
196
196
 
197
- Add to `opencode.json`:
197
+ Add this to `opencode.json`.
198
198
 
199
199
  ```json
200
200
  {
@@ -207,7 +207,7 @@ Add to `opencode.json`:
207
207
  }
208
208
  ```
209
209
 
210
- Then run:
210
+ Then run these commands.
211
211
 
212
212
  ```bash
213
213
  opencode mcp auth xquik
@@ -216,7 +216,7 @@ opencode mcp list
216
216
 
217
217
  ### Gemini CLI
218
218
 
219
- Add the remote server:
219
+ Add the remote server.
220
220
 
221
221
  ```bash
222
222
  gemini mcp add --transport http xquik https://xquik.com/mcp
package/stub-server.mjs CHANGED
@@ -12,7 +12,7 @@ import { pathToFileURL } from "node:url";
12
12
 
13
13
  const SERVER_INFO = {
14
14
  name: "xquik",
15
- version: "2.7.0",
15
+ version: "2.7.1",
16
16
  };
17
17
 
18
18
  const CAPABILITIES = {
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -37,12 +37,12 @@ Find mutual follows and followers-you-know between X accounts.
37
37
  | GET /x/users/{id}/followers-you-know | Mutual followers the acting account sees | Read tier |
38
38
  | GET /x/followers/check?source=<a>&target=<b> | Does A follow B? | Read tier |
39
39
 
40
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
40
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
41
41
 
42
42
  ## Compare the accounts
43
43
 
44
44
  1. Ask for two handles.
45
- 2. For A vs B mutual check: `GET /x/followers/check?source=<a>&target=<b>` and reverse. `source` and `target` may be handles or numeric IDs.
45
+ 2. For an A vs B mutual check, call `GET /x/followers/check?source=<a>&target=<b>` and reverse. `source` and `target` may be handles or numeric IDs.
46
46
  3. To find followers shared by A and B, resolve B with `GET /x/users/{id}`. The lookup accepts a username. Then call `GET /x/users/{id}/followers-you-know` through a connected account.
47
47
  4. Present as a small list with bios.
48
48
 
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -36,7 +36,7 @@ Identify likely bots or inactive followers. The API only reports candidates. The
36
36
  |---|---|---|
37
37
  | POST /extractions with toolType=follower_explorer | Full follower list | Per-row |
38
38
 
39
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
39
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
40
40
 
41
41
  ## Example requests
42
42
 
@@ -51,7 +51,7 @@ Poll `GET /extractions/{id}` until `status: "completed"`, then `GET /extractions
51
51
  ## Review the followers
52
52
 
53
53
  1. Get confirmation for the usage, then extract the full follower list.
54
- 2. Flag likely ghosts:
54
+ 2. Flag likely ghosts.
55
55
  - Flag accounts that match the declared count and age thresholds.
56
56
  - Flag missing avatars and copied or empty bios for review.
57
57
  3. Show the user a flagged shortlist.
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -39,7 +39,7 @@ Download completed extractions or draw entrant lists in spreadsheet-friendly for
39
39
  | GET /extractions/{id}/export?format=xlsx | Excel workbook | Read tier |
40
40
  | GET /draws/{id}/export?format=csv | Giveaway entrants/winners | Read tier |
41
41
 
42
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
42
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
43
43
 
44
44
  ## Example requests
45
45
 
@@ -53,14 +53,14 @@ GET /extractions/{id}/export?format=csv
53
53
  1. Start with a completed extraction or draw. Use the matching guide to create one.
54
54
  2. Poll `/extractions/{id}` until `status: "completed"`.
55
55
  3. Hit the export endpoint with the desired format.
56
- 4. Save the file; the response streams the raw bytes.
56
+ 4. Save the file. The response streams the raw bytes.
57
57
 
58
58
  ## Format choice
59
59
 
60
- - CSV: broad compatibility, Excel/Sheets open directly
61
- - XLSX: preserves types, multiple sheets per extraction
62
- - JSON: structured data for scripts or databases
63
- - Markdown, PDF, or TXT: human-readable reports
60
+ - CSV has broad compatibility, and Excel/Sheets open it directly
61
+ - XLSX preserves types, with multiple sheets per extraction
62
+ - JSON gives structured data for scripts or databases
63
+ - Markdown, PDF, or TXT give human-readable reports
64
64
 
65
65
  ## Export filters
66
66
 
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -38,18 +38,18 @@ Export followers from any visible X account. Filter verified profiles or set a m
38
38
  | POST /extractions with toolType=verified_follower_explorer | Verified followers only | Per-row |
39
39
  | POST /extractions/estimate | Preview usage before running | Included |
40
40
 
41
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
41
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
42
42
 
43
43
  ## Example requests
44
44
 
45
- Estimate usage first:
45
+ Estimate usage first.
46
46
 
47
47
  ```
48
48
  POST /extractions/estimate
49
49
  { "toolType": "follower_explorer", "targetUsername": "handle" }
50
50
  ```
51
51
 
52
- Then create the extraction:
52
+ Then create the extraction.
53
53
 
54
54
  ```
55
55
  POST /extractions
@@ -59,7 +59,7 @@ POST /extractions
59
59
 
60
60
  Send `toolType`, not `tool`. Send a bare handle without `@` in `targetUsername`. Use `verified_follower_explorer` for verified profiles only.
61
61
 
62
- Each result row: `{ username, name, bio, followers_count, following_count, verified, created_at }`.
62
+ Each result row is `{ username, name, bio, followers_count, following_count, verified, created_at }`.
63
63
 
64
64
  ## Export the followers
65
65
 
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -38,7 +38,7 @@ Find tweets that outperformed their author's usual engagement by a wide margin.
38
38
  | GET /x/users/{id}/tweets | Paginated recent tweets for an author | Read tier |
39
39
  | GET /x/tweets/search?q=from:@user+min_faves:X&queryType=Top | Author posts above a like floor | Read tier |
40
40
 
41
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
41
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
42
42
 
43
43
  ## Find the outliers
44
44
 
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -38,7 +38,7 @@ Find active X accounts in a niche by bio/handle search with follower and activit
38
38
  | POST /extractions/estimate | Preview usage before running | Included |
39
39
  | GET /x/users/{id} | Profile snapshot for shortlisted accounts | Read tier |
40
40
 
41
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
41
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
42
42
 
43
43
  ## Example requests
44
44
 
@@ -5,7 +5,7 @@ license: MIT
5
5
  metadata:
6
6
  internal: true
7
7
  author: Xquik
8
- version: "2.7.0"
8
+ version: "2.7.1"
9
9
  openclaw:
10
10
  requires:
11
11
  env:
@@ -37,7 +37,7 @@ Show the highest-engagement tweets for a topic, user, or hashtag. Read-only.
37
37
  | GET /x/tweets/search | Search with engagement filters | Read tier |
38
38
  | POST /extractions with toolType=tweet_search_extractor | Bulk viral tweet extraction | Per-row |
39
39
 
40
- Base URL: `https://xquik.com/api/v1`. Auth: `x-api-key: xq_...` header.
40
+ The base URL is `https://xquik.com/api/v1`. Authenticate with the `x-api-key: xq_...` header.
41
41
 
42
42
  ## Example requests
43
43
 
@@ -48,7 +48,7 @@ GET /x/tweets/search?q=<q+min_faves:1000+min_retweets:100>&queryType=Top
48
48
 
49
49
  Send the URL-encoded query in `q`. Set `queryType` to `Latest` or `Top`. The route also accepts `cursor`, `sinceTime`, `untilTime`, and `limit`. Put engagement floors inside `q`.
50
50
 
51
- Useful operators inside `q`:
51
+ These operators are useful inside `q`.
52
52
  - `min_faves:1000` sets the minimum for this search.
53
53
  - `min_retweets:100`
54
54
  - `-is:retweet` excludes reposts.
@@ -65,11 +65,11 @@ Useful operators inside `q`:
65
65
 
66
66
  ## What counts as viral
67
67
 
68
- A rough guide:
69
- - Niche topic: 500+ likes
70
- - Tech/business: 1k+ likes
71
- - Broad audience: 10k+ likes
72
- - Breakout: 100k+ likes
68
+ Use this rough guide.
69
+ - 500+ likes for a niche topic
70
+ - 1k+ likes for tech/business
71
+ - 10k+ likes for a broad audience
72
+ - 100k+ likes for a breakout
73
73
 
74
74
  ## Protect tweet data
75
75