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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.de.md +13 -13
- package/README.es.md +13 -13
- package/README.fr.md +13 -13
- package/README.it.md +13 -13
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +15 -15
- package/README.tr.md +15 -15
- package/README.zh-CN.md +13 -13
- package/commands/post.md +2 -2
- package/context7.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/skills/x-twitter-scraper/SKILL.md +3 -3
- package/skills/x-twitter-scraper/metadata.json +1 -1
- package/skills/x-twitter-scraper/references/compare-faq.md +6 -6
- package/skills/x-twitter-scraper/references/extractions.md +4 -4
- package/skills/x-twitter-scraper/references/mcp.md +3 -3
- package/skills/x-twitter-scraper/references/monitors-webhooks.md +10 -10
- package/skills/x-twitter-scraper/references/reads.md +61 -60
- package/skills/x-twitter-scraper/references/writes.md +13 -11
- package/skills/xquik-mcp/SKILL.md +2 -2
- package/skills/xquik-mcp/references/mcp-setup.md +15 -15
- package/stub-server.mjs +1 -1
- package/task-guides/check-mutuals.md +3 -3
- package/task-guides/clean-followers.md +3 -3
- package/task-guides/export-tweets-csv.md +7 -7
- package/task-guides/extract-followers.md +5 -5
- package/task-guides/find-bangers.md +2 -2
- package/task-guides/find-influencers.md +2 -2
- package/task-guides/find-viral-tweets.md +8 -8
- package/task-guides/follow-unfollow.md +3 -3
- package/task-guides/for-you-feed.md +3 -3
- package/task-guides/going-viral.md +2 -2
- package/task-guides/grow-followers.md +4 -4
- package/task-guides/monitor-accounts.md +2 -2
- package/task-guides/optimize-tweets.md +3 -3
- package/task-guides/post-tweets.md +9 -9
- package/task-guides/run-giveaway.md +3 -3
- package/task-guides/search-tweets.md +7 -7
- package/task-guides/send-dms.md +4 -4
- package/task-guides/top-replies.md +5 -5
- package/task-guides/track-competitors.md +5 -5
- package/task-guides/track-hashtags.md +7 -7
- package/task-guides/track-mentions.md +6 -6
- package/task-guides/trending-news.md +2 -2
- package/task-guides/tweet-analytics.md +12 -12
- package/task-guides/tweet-ideas.md +2 -2
- package/task-guides/tweet-replies.md +5 -5
- package/task-guides/tweet-style.md +3 -3
- package/task-guides/tweet-webhooks.md +5 -5
- package/task-guides/update-x-profile.md +2 -2
- package/task-guides/user-tweets.md +9 -9
- package/task-guides/who-liked.md +3 -3
- package/task-guides/who-quoted.md +3 -3
- package/task-guides/who-retweeted.md +3 -3
- package/task-guides/write-threads.md +3 -3
- package/task-guides/write-tweets.md +5 -5
- package/task-guides/x-articles.md +3 -3
- package/task-guides/x-bookmarks.md +2 -2
- package/task-guides/x-communities.md +3 -3
- package/task-guides/x-lists.md +3 -3
- package/task-guides/x-spaces.md +3 -3
- 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
|
|
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
|
|
32
|
-
| `GET /x/tweets/{id}/hidden-replies` | Replies the author hid, oldest first
|
|
33
|
-
| `GET /x/tweets/{id}/retweeter-ids` | Reposter user IDs only
|
|
34
|
-
| `GET /x/tweets/{id}/retweeters/check` | `user` (required)
|
|
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
|
|
38
|
-
| `GET /x/tweets/{id}/embed` | Embed HTML
|
|
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
|
|
43
|
+
- Authors and targets use `fromUser`, `toUser`, `mentioning`, `verifiedOnly`,
|
|
44
44
|
`blueVerifiedOnly`
|
|
45
|
-
- Text
|
|
46
|
-
- Time
|
|
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
|
|
50
|
-
- Media
|
|
51
|
-
- Engagement
|
|
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
|
|
54
|
-
- Conversation
|
|
55
|
-
- Raw operators
|
|
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
|
|
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
|
|
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
|
|
79
|
-
| `GET /x/users/{id}/articles` | Posts on the Articles tab, newest first
|
|
80
|
-
| `GET /x/users/{id}/highlights` | Posts on the Highlights tab
|
|
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
|
|
85
|
-
| `GET /x/users/{id}/list-memberships` | Public Lists that include the user
|
|
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
|
-
|
|
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
|
|
100
|
-
| `GET /x/users/{id}/following-ids` | User IDs of the accounts the user follows
|
|
101
|
-
| `GET /x/users/{id}/similar` | Accounts X lists as similar
|
|
102
|
-
| `GET /x/users/{id}/affiliates` | Accounts an organization lists as affiliates
|
|
103
|
-
| `GET /x/users/{id}/subscriptions` | Creators the user subscribes to
|
|
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
|
|
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
|
|
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
|
|
121
|
-
| `GET /x/communities/topics` | Topics and subtopics X groups communities under
|
|
122
|
-
| `GET /x/communities/popular` | Top communities of a topic
|
|
123
|
-
| `GET /x/communities/suggested` | Communities X suggests to join
|
|
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
|
|
126
|
-
| `GET /x/communities/{id}/members/search` | Find members by name or username
|
|
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
|
|
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)
|
|
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
|
|
150
|
-
| `GET /radar` | Trending topics from curated sources
|
|
151
|
-
| `GET /x/search/autocomplete` | Suggestions for a partial query
|
|
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
|
|
154
|
-
| `GET /x/links/resolve` | `urls` (required)
|
|
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`.
|
|
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
|
|
206
|
-
- `texts
|
|
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
|
|
209
|
-
or together, with `sinceTime`, `untilTime`, `queryType`, `limit` (1 to
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
10
|
-
media & reply target. Ask for a missing one instead of
|
|
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
|
|
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
|
|
33
|
-
every `pollAfterMs` until `terminal` is true.
|
|
34
|
-
already starts with `/api/v1`, so prefix only
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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
|
|
34
|
-
| `execute` | `code
|
|
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
|
|
16
|
-
| Skill bundle version | `2.7.
|
|
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
|
-
-
|
|
28
|
-
-
|
|
29
|
-
- MCP registry card
|
|
30
|
-
-
|
|
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
|
|
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
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
metadata:
|
|
6
6
|
internal: true
|
|
7
7
|
author: Xquik
|
|
8
|
-
version: "2.7.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
56
|
+
4. Save the file. The response streams the raw bytes.
|
|
57
57
|
|
|
58
58
|
## Format choice
|
|
59
59
|
|
|
60
|
-
- CSV
|
|
61
|
-
- XLSX
|
|
62
|
-
- JSON
|
|
63
|
-
- Markdown, PDF, or TXT
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
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
|
|