twitterapi-io-mcp 1.0.10 → 1.0.11

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/README.md CHANGED
@@ -91,6 +91,7 @@ Troubleshooting:
91
91
  - `claude: command not found` → install Claude Code / the `claude` CLI first
92
92
  - `npx` fails or shows syntax errors → upgrade Node.js to `>=18.18.0`
93
93
  - Corporate networks → ensure npm can reach the registry (or configure your proxy/registry)
94
+ - Quick preflight: `node -v` and `claude --version` should both work before running `claude mcp add`
94
95
 
95
96
  ## Available Tools
96
97
 
@@ -113,7 +114,6 @@ Note: resources are optional. The canonical guide fetch is `get_twitterapi_guide
113
114
  | `twitterapi://guides/pricing` | Pricing guide |
114
115
  | `twitterapi://guides/qps-limits` | QPS limits and rate limiting |
115
116
  | `twitterapi://guides/filter-rules` | Tweet filter rules syntax |
116
- | `twitterapi://guides/changelog` | API changelog |
117
117
  | `twitterapi://guides/introduction` | Introduction to TwitterAPI.io |
118
118
  | `twitterapi://guides/authentication` | Authentication guide |
119
119
  | `twitterapi://endpoints/list` | Full endpoint listing |
@@ -145,14 +145,30 @@ Then fetch details using the returned `name`:
145
145
  { "tool": "get_twitterapi_endpoint", "arguments": { "endpoint_name": "tweet_advanced_search" } }
146
146
  ```
147
147
 
148
+ Ambiguity handling (if multiple endpoints are close in score):
149
+
150
+ ```json
151
+ { "tool": "search_twitterapi_docs", "arguments": { "query": "advanced search GET /twitter/tweet/advanced_search", "max_results": 10 } }
152
+ ```
153
+
154
+ Then pick the top `type: "endpoint"` result and call `get_twitterapi_endpoint` with its `name`.
155
+
156
+ Routing tips (dynamic refinement):
157
+ - If a result includes `next`, you can directly call `next.tool` with `next.arguments`.
158
+ - If you get only `page`/`blog` results, route to `get_twitterapi_guide` or `get_twitterapi_url` instead of `get_twitterapi_endpoint`.
159
+
148
160
  ### Changelogs via `get_twitterapi_guide` (Q7)
149
161
 
150
162
  ```json
151
163
  { "tool": "get_twitterapi_guide", "arguments": { "guide_name": "changelog" } }
152
164
  ```
153
165
 
166
+ Do **not** use `resources/read` for this question; the canonical tool is `get_twitterapi_guide`.
167
+
154
168
  ### Tweets Lookup endpoint details (Q9)
155
169
 
170
+ Tweets Lookup maps to `endpoint_name: "get_tweet_by_ids"`.
171
+
156
172
  ```json
157
173
  { "tool": "get_twitterapi_endpoint", "arguments": { "endpoint_name": "get_tweet_by_ids" } }
158
174
  ```
package/data/docs.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "meta": {
3
3
  "source": "https://twitterapi.io + https://docs.twitterapi.io",
4
- "scraped_at": "2025-12-26T01:08:51.383Z",
4
+ "scraped_at": "2025-12-27T12:27:11.434Z",
5
5
  "version": "2.2",
6
6
  "total_endpoints": 54,
7
7
  "total_pages": 19,
@@ -36,7 +36,7 @@
36
36
  "add_user_to_monitor_tweet": {
37
37
  "name": "add_user_to_monitor_tweet",
38
38
  "url": "https://docs.twitterapi.io/api-reference/endpoint/add_user_to_monitor_tweet",
39
- "scraped_at": "2025-12-26T01:09:05.737Z",
39
+ "scraped_at": "2025-12-27T12:27:25.937Z",
40
40
  "type": "endpoint",
41
41
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
42
42
  "description": "Add a user to monitor real-time tweets.Monitor tweets from specified accounts, including directly sent tweets, quoted tweets, reply tweets, and retweeted tweets. Please ref:https://twitterapi.io/twitter-stream",
@@ -53,7 +53,7 @@
53
53
  "add_webhook_rule": {
54
54
  "name": "add_webhook_rule",
55
55
  "url": "https://docs.twitterapi.io/api-reference/endpoint/add_webhook_rule",
56
- "scraped_at": "2025-12-26T01:09:06.056Z",
56
+ "scraped_at": "2025-12-27T12:27:26.320Z",
57
57
  "type": "endpoint",
58
58
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
59
59
  "description": "Add a tweet filter rule. Default rule is not activated.You must call update_rule to activate the rule.",
@@ -70,7 +70,7 @@
70
70
  "batch_get_user_by_userids": {
71
71
  "name": "batch_get_user_by_userids",
72
72
  "url": "https://docs.twitterapi.io/api-reference/endpoint/batch_get_user_by_userids",
73
- "scraped_at": "2025-12-26T01:09:06.379Z",
73
+ "scraped_at": "2025-12-27T12:27:26.664Z",
74
74
  "type": "endpoint",
75
75
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
76
76
  "description": "Batch get user info by user ids. Pricing:\n\n- Single user request: 18 credits per user\n- Bulk request (100+ users): 10 credits per user\n\nNote: For cost optimization, we recommend batching requests when fetching multiple user profiles.",
@@ -87,7 +87,7 @@
87
87
  "check_follow_relationship": {
88
88
  "name": "check_follow_relationship",
89
89
  "url": "https://docs.twitterapi.io/api-reference/endpoint/check_follow_relationship",
90
- "scraped_at": "2025-12-26T01:09:06.703Z",
90
+ "scraped_at": "2025-12-27T12:27:26.961Z",
91
91
  "type": "endpoint",
92
92
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
93
93
  "description": "Check if the user is following/followed by the target user. Trial operation price: 100 credits per call.",
@@ -104,7 +104,7 @@
104
104
  "create_community_v2": {
105
105
  "name": "create_community_v2",
106
106
  "url": "https://docs.twitterapi.io/api-reference/endpoint/create_community_v2",
107
- "scraped_at": "2025-12-26T01:09:07.043Z",
107
+ "scraped_at": "2025-12-27T12:27:27.363Z",
108
108
  "type": "endpoint",
109
109
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
110
110
  "description": "Create a community.You must set the login_cookies.You can get the login_cookies from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -121,7 +121,7 @@
121
121
  "create_tweet": {
122
122
  "name": "create_tweet",
123
123
  "url": "https://docs.twitterapi.io/api-reference/endpoint/create_tweet",
124
- "scraped_at": "2025-12-26T01:09:07.359Z",
124
+ "scraped_at": "2025-12-27T12:27:27.741Z",
125
125
  "type": "endpoint",
126
126
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
127
127
  "description": "Create a tweet.Need to login first.Trial operation price: $0.001 per call.",
@@ -138,7 +138,7 @@
138
138
  "create_tweet_v2": {
139
139
  "name": "create_tweet_v2",
140
140
  "url": "https://docs.twitterapi.io/api-reference/endpoint/create_tweet_v2",
141
- "scraped_at": "2025-12-26T01:09:07.666Z",
141
+ "scraped_at": "2025-12-27T12:27:28.087Z",
142
142
  "type": "endpoint",
143
143
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
144
144
  "description": "Create a tweet.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -155,7 +155,7 @@
155
155
  "delete_community_v2": {
156
156
  "name": "delete_community_v2",
157
157
  "url": "https://docs.twitterapi.io/api-reference/endpoint/delete_community_v2",
158
- "scraped_at": "2025-12-26T01:09:08.234Z",
158
+ "scraped_at": "2025-12-27T12:27:28.453Z",
159
159
  "type": "endpoint",
160
160
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
161
161
  "description": "Delete a community.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -172,7 +172,7 @@
172
172
  "delete_tweet_v2": {
173
173
  "name": "delete_tweet_v2",
174
174
  "url": "https://docs.twitterapi.io/api-reference/endpoint/delete_tweet_v2",
175
- "scraped_at": "2025-12-26T01:09:08.576Z",
175
+ "scraped_at": "2025-12-27T12:27:28.817Z",
176
176
  "type": "endpoint",
177
177
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
178
178
  "description": "Delete a tweet.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -189,7 +189,7 @@
189
189
  "delete_webhook_rule": {
190
190
  "name": "delete_webhook_rule",
191
191
  "url": "https://docs.twitterapi.io/api-reference/endpoint/delete_webhook_rule",
192
- "scraped_at": "2025-12-26T01:09:09.168Z",
192
+ "scraped_at": "2025-12-27T12:27:29.188Z",
193
193
  "type": "endpoint",
194
194
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
195
195
  "description": "Delete a tweet filter rule. You must set all parameters.",
@@ -206,7 +206,7 @@
206
206
  "follow_user_v2": {
207
207
  "name": "follow_user_v2",
208
208
  "url": "https://docs.twitterapi.io/api-reference/endpoint/follow_user_v2",
209
- "scraped_at": "2025-12-26T01:09:09.496Z",
209
+ "scraped_at": "2025-12-27T12:27:29.553Z",
210
210
  "type": "endpoint",
211
211
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
212
212
  "description": "Follow a user.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -223,7 +223,7 @@
223
223
  "get_all_community_tweets": {
224
224
  "name": "get_all_community_tweets",
225
225
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_all_community_tweets",
226
- "scraped_at": "2025-12-26T01:09:09.807Z",
226
+ "scraped_at": "2025-12-27T12:27:29.927Z",
227
227
  "type": "endpoint",
228
228
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
229
229
  "description": "get tweets from all communities,each page returns up to 20 tweets. Use cursor for pagination.",
@@ -240,7 +240,7 @@
240
240
  "get_article": {
241
241
  "name": "get_article",
242
242
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_article",
243
- "scraped_at": "2025-12-26T01:09:10.463Z",
243
+ "scraped_at": "2025-12-27T12:27:30.331Z",
244
244
  "type": "endpoint",
245
245
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
246
246
  "description": "get article by tweet id. cost 100 credit per article",
@@ -257,7 +257,7 @@
257
257
  "get_community_by_id": {
258
258
  "name": "get_community_by_id",
259
259
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_community_by_id",
260
- "scraped_at": "2025-12-26T01:09:10.798Z",
260
+ "scraped_at": "2025-12-27T12:27:30.705Z",
261
261
  "type": "endpoint",
262
262
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
263
263
  "description": "Get community info by community id. Price: 20 credits per call. Note: This API is a bit slow, we are still optimizing it.",
@@ -274,7 +274,7 @@
274
274
  "get_community_members": {
275
275
  "name": "get_community_members",
276
276
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_community_members",
277
- "scraped_at": "2025-12-26T01:09:11.117Z",
277
+ "scraped_at": "2025-12-27T12:27:31.066Z",
278
278
  "type": "endpoint",
279
279
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
280
280
  "description": "Get members of a community. Page size is 20.",
@@ -291,7 +291,7 @@
291
291
  "get_community_moderators": {
292
292
  "name": "get_community_moderators",
293
293
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_community_moderators",
294
- "scraped_at": "2025-12-26T01:09:11.699Z",
294
+ "scraped_at": "2025-12-27T12:27:31.460Z",
295
295
  "type": "endpoint",
296
296
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
297
297
  "description": "Get moderators of a community. Page size is 20.",
@@ -308,7 +308,7 @@
308
308
  "get_community_tweets": {
309
309
  "name": "get_community_tweets",
310
310
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_community_tweets",
311
- "scraped_at": "2025-12-26T01:09:12.026Z",
311
+ "scraped_at": "2025-12-27T12:27:31.827Z",
312
312
  "type": "endpoint",
313
313
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
314
314
  "description": "Get tweets of a community. Page size is 20. Order by creation time desc. ",
@@ -325,7 +325,7 @@
325
325
  "get_dm_history_by_user_id": {
326
326
  "name": "get_dm_history_by_user_id",
327
327
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_dm_history_by_user_id",
328
- "scraped_at": "2025-12-26T01:09:13.552Z",
328
+ "scraped_at": "2025-12-27T12:27:32.217Z",
329
329
  "type": "endpoint",
330
330
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
331
331
  "description": "Get the direct message history with a user.",
@@ -342,7 +342,7 @@
342
342
  "get_list_followers": {
343
343
  "name": "get_list_followers",
344
344
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_list_followers",
345
- "scraped_at": "2025-12-26T01:09:13.963Z",
345
+ "scraped_at": "2025-12-27T12:27:32.562Z",
346
346
  "type": "endpoint",
347
347
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
348
348
  "description": "Get followers of a list. Page size is 20.",
@@ -359,7 +359,7 @@
359
359
  "get_list_members": {
360
360
  "name": "get_list_members",
361
361
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_list_members",
362
- "scraped_at": "2025-12-26T01:09:14.384Z",
362
+ "scraped_at": "2025-12-27T12:27:32.942Z",
363
363
  "type": "endpoint",
364
364
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
365
365
  "description": "Get members of a list. Page size is 20.",
@@ -376,7 +376,7 @@
376
376
  "get_my_info": {
377
377
  "name": "get_my_info",
378
378
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_my_info",
379
- "scraped_at": "2025-12-26T01:09:14.727Z",
379
+ "scraped_at": "2025-12-27T12:27:33.596Z",
380
380
  "type": "endpoint",
381
381
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
382
382
  "description": "Get my info",
@@ -393,7 +393,7 @@
393
393
  "get_space_detail": {
394
394
  "name": "get_space_detail",
395
395
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_space_detail",
396
- "scraped_at": "2025-12-26T01:09:15.366Z",
396
+ "scraped_at": "2025-12-27T12:27:33.964Z",
397
397
  "type": "endpoint",
398
398
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
399
399
  "description": "Get spaces detail by space id",
@@ -410,7 +410,7 @@
410
410
  "get_trends": {
411
411
  "name": "get_trends",
412
412
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_trends",
413
- "scraped_at": "2025-12-26T01:09:15.718Z",
413
+ "scraped_at": "2025-12-27T12:27:34.333Z",
414
414
  "type": "endpoint",
415
415
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
416
416
  "description": "Get trends by woeid",
@@ -427,7 +427,7 @@
427
427
  "get_tweet_by_ids": {
428
428
  "name": "get_tweet_by_ids",
429
429
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_tweet_by_ids",
430
- "scraped_at": "2025-12-26T01:09:16.090Z",
430
+ "scraped_at": "2025-12-27T12:27:34.736Z",
431
431
  "type": "endpoint",
432
432
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
433
433
  "description": "get tweet by tweet ids",
@@ -444,7 +444,7 @@
444
444
  "get_tweet_quote": {
445
445
  "name": "get_tweet_quote",
446
446
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_tweet_quote",
447
- "scraped_at": "2025-12-26T01:09:16.454Z",
447
+ "scraped_at": "2025-12-27T12:27:35.111Z",
448
448
  "type": "endpoint",
449
449
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
450
450
  "description": "get tweet quotes by tweet id.Each page returns exactly 20 quotes. Use cursor for pagination. Order by quote time desc",
@@ -461,7 +461,7 @@
461
461
  "get_tweet_reply": {
462
462
  "name": "get_tweet_reply",
463
463
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_tweet_reply",
464
- "scraped_at": "2025-12-26T01:09:16.827Z",
464
+ "scraped_at": "2025-12-27T12:27:35.508Z",
465
465
  "type": "endpoint",
466
466
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
467
467
  "description": "get tweet replies by tweet id.Each page returns up to 20 replies(Sometimes less than 20,because we will filter out ads or other not tweets). Use cursor for pagination. Order by reply time desc",
@@ -478,7 +478,7 @@
478
478
  "get_tweet_retweeter": {
479
479
  "name": "get_tweet_retweeter",
480
480
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_tweet_retweeter",
481
- "scraped_at": "2025-12-26T01:09:17.208Z",
481
+ "scraped_at": "2025-12-27T12:27:35.896Z",
482
482
  "type": "endpoint",
483
483
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
484
484
  "description": "get tweet retweeters by tweet id.Each page returns about 100 retweeters. Use cursor for pagination. Order by retweet time desc",
@@ -495,7 +495,7 @@
495
495
  "get_tweet_thread_context": {
496
496
  "name": "get_tweet_thread_context",
497
497
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_tweet_thread_context",
498
- "scraped_at": "2025-12-26T01:09:17.570Z",
498
+ "scraped_at": "2025-12-27T12:27:36.264Z",
499
499
  "type": "endpoint",
500
500
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
501
501
  "description": "Get the thread context of a tweet.Suppose a tweet thread consists of t1, t2 (replying to t1), t3 (replying to t2), and t4, t5, t6 (all replying to t3). If we provide an API where you input t3 and receive t1, t2, t3, t4, t5, t6.Pagination is supported.The pagination size cannot be set (due to Twitter's limitations), and the data returned per page is not fixed.",
@@ -512,7 +512,7 @@
512
512
  "get_user_about": {
513
513
  "name": "get_user_about",
514
514
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_about",
515
- "scraped_at": "2025-12-26T01:09:17.924Z",
515
+ "scraped_at": "2025-12-27T12:27:36.628Z",
516
516
  "type": "endpoint",
517
517
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
518
518
  "description": "Get user profile about by screen name",
@@ -529,7 +529,7 @@
529
529
  "get_user_by_username": {
530
530
  "name": "get_user_by_username",
531
531
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_by_username",
532
- "scraped_at": "2025-12-26T01:09:18.288Z",
532
+ "scraped_at": "2025-12-27T12:27:36.970Z",
533
533
  "type": "endpoint",
534
534
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
535
535
  "description": "Get user info by screen name",
@@ -546,7 +546,7 @@
546
546
  "get_user_followers": {
547
547
  "name": "get_user_followers",
548
548
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_followers",
549
- "scraped_at": "2025-12-26T01:09:18.640Z",
549
+ "scraped_at": "2025-12-27T12:27:37.347Z",
550
550
  "type": "endpoint",
551
551
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
552
552
  "description": "Get user followers in reverse chronological order (newest first). Returns exactly 200 followers per page, sorted by follow date. Most recent followers appear on the first page. Use cursor for pagination through the complete followers list.",
@@ -563,7 +563,7 @@
563
563
  "get_user_followings": {
564
564
  "name": "get_user_followings",
565
565
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_followings",
566
- "scraped_at": "2025-12-26T01:09:18.991Z",
566
+ "scraped_at": "2025-12-27T12:27:37.736Z",
567
567
  "type": "endpoint",
568
568
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
569
569
  "description": "Get user followings. Each page returns exactly 200 followings. Use cursor for pagination.Sorted by follow date. Most recent followings appear on the first page. ",
@@ -580,7 +580,7 @@
580
580
  "get_user_last_tweets": {
581
581
  "name": "get_user_last_tweets",
582
582
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_last_tweets",
583
- "scraped_at": "2025-12-26T01:09:19.357Z",
583
+ "scraped_at": "2025-12-27T12:27:38.088Z",
584
584
  "type": "endpoint",
585
585
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
586
586
  "description": "Retrieve tweets by user name.Sort by created_at. Results are paginated, with each page returning up to 20 tweets.If you only need to fetch the latest tweets from a single user very frequently, do not use this API—it will cost you a lot. Instead, please refer to https://twitterapi.io/blog/how-to-monitor-twitter-accounts-for-new-tweets-in-real-time. If you have more than 20 Twitter accounts requiring real-time tweet updates, use https://twitterapi.io/twitter-stream which is the most cost-effective solution.",
@@ -597,7 +597,7 @@
597
597
  "get_user_mention": {
598
598
  "name": "get_user_mention",
599
599
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_mention",
600
- "scraped_at": "2025-12-26T01:09:19.709Z",
600
+ "scraped_at": "2025-12-27T12:27:38.447Z",
601
601
  "type": "endpoint",
602
602
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
603
603
  "description": "get tweet mentions by user screen name.Each page returns exactly 20 mentions. Use cursor for pagination. Order by mention time desc",
@@ -614,7 +614,7 @@
614
614
  "get_user_verified_followers": {
615
615
  "name": "get_user_verified_followers",
616
616
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_user_verified_followers",
617
- "scraped_at": "2025-12-26T01:09:20.221Z",
617
+ "scraped_at": "2025-12-27T12:27:38.780Z",
618
618
  "type": "endpoint",
619
619
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
620
620
  "description": "Get user verified followers in reverse chronological order (newest first). Returns exactly 20 verified followers per page, sorted by follow date. Most recent followers appear on the first page. Use cursor for pagination through the complete followers list.$0.3 per 1000 followers",
@@ -631,7 +631,7 @@
631
631
  "get_webhook_rules": {
632
632
  "name": "get_webhook_rules",
633
633
  "url": "https://docs.twitterapi.io/api-reference/endpoint/get_webhook_rules",
634
- "scraped_at": "2025-12-26T01:09:20.558Z",
634
+ "scraped_at": "2025-12-27T12:27:39.117Z",
635
635
  "type": "endpoint",
636
636
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
637
637
  "description": "Get all tweet filter rules.Rule can be used in webhook and websocket.You can also modify the rule in our web page.",
@@ -648,7 +648,7 @@
648
648
  "join_community_v2": {
649
649
  "name": "join_community_v2",
650
650
  "url": "https://docs.twitterapi.io/api-reference/endpoint/join_community_v2",
651
- "scraped_at": "2025-12-26T01:09:21.472Z",
651
+ "scraped_at": "2025-12-27T12:27:39.475Z",
652
652
  "type": "endpoint",
653
653
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
654
654
  "description": "Join a community.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -665,7 +665,7 @@
665
665
  "leave_community_v2": {
666
666
  "name": "leave_community_v2",
667
667
  "url": "https://docs.twitterapi.io/api-reference/endpoint/leave_community_v2",
668
- "scraped_at": "2025-12-26T01:09:21.831Z",
668
+ "scraped_at": "2025-12-27T12:27:39.843Z",
669
669
  "type": "endpoint",
670
670
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
671
671
  "description": "Leave a community.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -682,7 +682,7 @@
682
682
  "like_tweet": {
683
683
  "name": "like_tweet",
684
684
  "url": "https://docs.twitterapi.io/api-reference/endpoint/like_tweet",
685
- "scraped_at": "2025-12-26T01:09:22.159Z",
685
+ "scraped_at": "2025-12-27T12:27:40.274Z",
686
686
  "type": "endpoint",
687
687
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
688
688
  "description": "Like a tweet.Need to login first. Trial operation price: $0.001 per call.",
@@ -699,7 +699,7 @@
699
699
  "like_tweet_v2": {
700
700
  "name": "like_tweet_v2",
701
701
  "url": "https://docs.twitterapi.io/api-reference/endpoint/like_tweet_v2",
702
- "scraped_at": "2025-12-26T01:09:22.531Z",
702
+ "scraped_at": "2025-12-27T12:27:40.669Z",
703
703
  "type": "endpoint",
704
704
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
705
705
  "description": "Like a tweet.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -716,7 +716,7 @@
716
716
  "login_by_2fa": {
717
717
  "name": "login_by_2fa",
718
718
  "url": "https://docs.twitterapi.io/api-reference/endpoint/login_by_2fa",
719
- "scraped_at": "2025-12-26T01:09:23.000Z",
719
+ "scraped_at": "2025-12-27T12:27:41.047Z",
720
720
  "type": "endpoint",
721
721
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
722
722
  "description": "Deprecated soon. Please use login V2 instead, as it is more stable.Login Step 2: by 2fa code.Trial operation price: $0.003 per call. ",
@@ -733,7 +733,7 @@
733
733
  "login_by_email_or_username": {
734
734
  "name": "login_by_email_or_username",
735
735
  "url": "https://docs.twitterapi.io/api-reference/endpoint/login_by_email_or_username",
736
- "scraped_at": "2025-12-26T01:09:23.584Z",
736
+ "scraped_at": "2025-12-27T12:27:41.391Z",
737
737
  "type": "endpoint",
738
738
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
739
739
  "description": "Login Step 1: by email or username.Recommend to use email.Trial operation price: $0.003 per call. Please read the guide: https://twitterapi.io/blog/twitter-login-and-post-api-guide",
@@ -750,7 +750,7 @@
750
750
  "remove_user_to_monitor_tweet": {
751
751
  "name": "remove_user_to_monitor_tweet",
752
752
  "url": "https://docs.twitterapi.io/api-reference/endpoint/remove_user_to_monitor_tweet",
753
- "scraped_at": "2025-12-26T01:09:24.309Z",
753
+ "scraped_at": "2025-12-27T12:27:41.772Z",
754
754
  "type": "endpoint",
755
755
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
756
756
  "description": "Remove a user from monitor real-time tweets.Please ref:https://twitterapi.io/twitter-stream",
@@ -767,7 +767,7 @@
767
767
  "retweet_tweet": {
768
768
  "name": "retweet_tweet",
769
769
  "url": "https://docs.twitterapi.io/api-reference/endpoint/retweet_tweet",
770
- "scraped_at": "2025-12-26T01:09:24.782Z",
770
+ "scraped_at": "2025-12-27T12:27:42.113Z",
771
771
  "type": "endpoint",
772
772
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
773
773
  "description": "Retweet a tweet.Need to login first. Trial operation price: $0.001 per call.",
@@ -784,7 +784,7 @@
784
784
  "retweet_tweet_v2": {
785
785
  "name": "retweet_tweet_v2",
786
786
  "url": "https://docs.twitterapi.io/api-reference/endpoint/retweet_tweet_v2",
787
- "scraped_at": "2025-12-26T01:09:25.115Z",
787
+ "scraped_at": "2025-12-27T12:27:42.526Z",
788
788
  "type": "endpoint",
789
789
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
790
790
  "description": "Retweet a tweet.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -802,7 +802,7 @@
802
802
  "search_user": {
803
803
  "name": "search_user",
804
804
  "url": "https://docs.twitterapi.io/api-reference/endpoint/search_user",
805
- "scraped_at": "2025-12-26T01:09:25.465Z",
805
+ "scraped_at": "2025-12-27T12:27:42.864Z",
806
806
  "type": "endpoint",
807
807
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
808
808
  "description": "Search user by keyword",
@@ -819,7 +819,7 @@
819
819
  "send_dm_v2": {
820
820
  "name": "send_dm_v2",
821
821
  "url": "https://docs.twitterapi.io/api-reference/endpoint/send_dm_v2",
822
- "scraped_at": "2025-12-26T01:09:25.827Z",
822
+ "scraped_at": "2025-12-27T12:27:43.210Z",
823
823
  "type": "endpoint",
824
824
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
825
825
  "description": "Send a direct message to a user.You must set the login_cookie..You can get the login_cookie from /twitter/user_login_v2.You can only send DMs to those who have enabled DMs. Sometimes it may fail, so be prepared to retry.Trial operation price: $0.003 per call. ",
@@ -836,7 +836,7 @@
836
836
  "tweet_advanced_search": {
837
837
  "name": "tweet_advanced_search",
838
838
  "url": "https://docs.twitterapi.io/api-reference/endpoint/tweet_advanced_search",
839
- "scraped_at": "2025-12-26T01:09:26.189Z",
839
+ "scraped_at": "2025-12-27T12:27:43.572Z",
840
840
  "type": "endpoint",
841
841
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
842
842
  "description": "Advanced search for tweets.Each page returns up to 20 replies(Sometimes less than 20,because we will filter out ads or other not tweets). Use cursor for pagination.",
@@ -853,7 +853,7 @@
853
853
  "unfollow_user_v2": {
854
854
  "name": "unfollow_user_v2",
855
855
  "url": "https://docs.twitterapi.io/api-reference/endpoint/unfollow_user_v2",
856
- "scraped_at": "2025-12-26T01:09:26.522Z",
856
+ "scraped_at": "2025-12-27T12:27:43.921Z",
857
857
  "type": "endpoint",
858
858
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
859
859
  "description": "Unfollow a user.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -870,7 +870,7 @@
870
870
  "unlike_tweet_v2": {
871
871
  "name": "unlike_tweet_v2",
872
872
  "url": "https://docs.twitterapi.io/api-reference/endpoint/unlike_tweet_v2",
873
- "scraped_at": "2025-12-26T01:09:27.231Z",
873
+ "scraped_at": "2025-12-27T12:27:44.288Z",
874
874
  "type": "endpoint",
875
875
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
876
876
  "description": "Unlike a tweet.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.002 per call. ",
@@ -887,7 +887,7 @@
887
887
  "update_webhook_rule": {
888
888
  "name": "update_webhook_rule",
889
889
  "url": "https://docs.twitterapi.io/api-reference/endpoint/update_webhook_rule",
890
- "scraped_at": "2025-12-26T01:09:27.641Z",
890
+ "scraped_at": "2025-12-27T12:27:44.627Z",
891
891
  "type": "endpoint",
892
892
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
893
893
  "description": "Update a tweet filter rule. You must set all parameters.",
@@ -904,7 +904,7 @@
904
904
  "upload_media_v2": {
905
905
  "name": "upload_media_v2",
906
906
  "url": "https://docs.twitterapi.io/api-reference/endpoint/upload_media_v2",
907
- "scraped_at": "2025-12-26T01:09:27.988Z",
907
+ "scraped_at": "2025-12-27T12:27:45.012Z",
908
908
  "type": "endpoint",
909
909
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
910
910
  "description": "Upload media to twitter.You must set the login_cookie.You can get the login_cookie from /twitter/user_login_v2.Trial operation price: $0.003 per call. ",
@@ -921,7 +921,7 @@
921
921
  "upload_tweet_image": {
922
922
  "name": "upload_tweet_image",
923
923
  "url": "https://docs.twitterapi.io/api-reference/endpoint/upload_tweet_image",
924
- "scraped_at": "2025-12-26T01:09:28.522Z",
924
+ "scraped_at": "2025-12-27T12:27:45.365Z",
925
925
  "type": "endpoint",
926
926
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
927
927
  "description": "upload image to twitter.Need to login first. Trial operation price: $0.001 per call.",
@@ -938,7 +938,7 @@
938
938
  "user_login_v2": {
939
939
  "name": "user_login_v2",
940
940
  "url": "https://docs.twitterapi.io/api-reference/endpoint/user_login_v2",
941
- "scraped_at": "2025-12-26T01:09:28.865Z",
941
+ "scraped_at": "2025-12-27T12:27:45.765Z",
942
942
  "type": "endpoint",
943
943
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
944
944
  "description": "Log in directly using your email, username, password, and 2FA secret key. And obtain the Login_cookie, to post tweets, etc. Please note that the Login_cookie obtained through login_v2 can only be used for APIs with the \"v2\" suffix, such as create_tweet_v2. Trial operation price: $0.003 per call. ",
@@ -956,7 +956,7 @@
956
956
  "pages": {
957
957
  "acceptable_use": {
958
958
  "name": "acceptable_use",
959
- "scraped_at": "2025-12-26T01:08:51.505Z",
959
+ "scraped_at": "2025-12-27T12:27:11.529Z",
960
960
  "type": "page",
961
961
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
962
962
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -1077,7 +1077,7 @@
1077
1077
  },
1078
1078
  "affiliate_program": {
1079
1079
  "name": "affiliate_program",
1080
- "scraped_at": "2025-12-26T01:08:51.853Z",
1080
+ "scraped_at": "2025-12-27T12:27:11.848Z",
1081
1081
  "type": "page",
1082
1082
  "title": "TwitterAPI.io Affiliate Program - Earn Up to 12% Recurring Commissions",
1083
1083
  "description": "Join the TwitterAPI.io Affiliate Program and earn up to 12% monthly recurring commissions by referring customers to our affordable Twitter data API.",
@@ -1228,7 +1228,7 @@
1228
1228
  },
1229
1229
  "blog_index": {
1230
1230
  "name": "blog_index",
1231
- "scraped_at": "2025-12-26T01:08:52.155Z",
1231
+ "scraped_at": "2025-12-27T12:27:12.155Z",
1232
1232
  "type": "page",
1233
1233
  "title": "TwitterAPI.io Blog: Insights on Twitter Data and Social Media Analytics",
1234
1234
  "description": "Explore our blog for in-depth articles on Twitter data analysis, social media trends, and how to leverage TwitterAPI.io for your business intelligence needs.",
@@ -1344,7 +1344,7 @@
1344
1344
  },
1345
1345
  "changelog": {
1346
1346
  "name": "changelog",
1347
- "scraped_at": "2025-12-26T01:08:52.488Z",
1347
+ "scraped_at": "2025-12-27T12:27:12.473Z",
1348
1348
  "type": "page",
1349
1349
  "title": "Changelog | TwitterAPI.io - Latest Updates and New Features",
1350
1350
  "description": "Stay up-to-date with the latest features and improvements to TwitterAPI.io. View our changelog for detailed information about new endpoints, performance improvements, and more.",
@@ -1541,7 +1541,7 @@
1541
1541
  },
1542
1542
  "contact": {
1543
1543
  "name": "contact",
1544
- "scraped_at": "2025-12-26T01:08:52.772Z",
1544
+ "scraped_at": "2025-12-27T12:27:12.758Z",
1545
1545
  "type": "page",
1546
1546
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
1547
1547
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -1607,7 +1607,7 @@
1607
1607
  },
1608
1608
  "dashboard": {
1609
1609
  "name": "dashboard",
1610
- "scraped_at": "2025-12-26T01:08:53.064Z",
1610
+ "scraped_at": "2025-12-27T12:27:13.030Z",
1611
1611
  "type": "page",
1612
1612
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
1613
1613
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -1648,7 +1648,7 @@
1648
1648
  },
1649
1649
  "home": {
1650
1650
  "name": "home",
1651
- "scraped_at": "2025-12-26T01:08:53.687Z",
1651
+ "scraped_at": "2025-12-27T12:27:13.606Z",
1652
1652
  "type": "page",
1653
1653
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
1654
1654
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -1745,7 +1745,7 @@
1745
1745
  },
1746
1746
  "payment": {
1747
1747
  "name": "payment",
1748
- "scraped_at": "2025-12-26T01:08:54.014Z",
1748
+ "scraped_at": "2025-12-27T12:27:13.906Z",
1749
1749
  "type": "page",
1750
1750
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
1751
1751
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -1880,7 +1880,7 @@
1880
1880
  },
1881
1881
  "pricing": {
1882
1882
  "name": "pricing",
1883
- "scraped_at": "2025-12-26T01:08:54.293Z",
1883
+ "scraped_at": "2025-12-27T12:27:14.177Z",
1884
1884
  "type": "page",
1885
1885
  "title": "Pricing - TwitterAPI.io",
1886
1886
  "description": "Simple and transparent pricing for Twitter data API access. Pay as you go with no minimum spend required.",
@@ -1946,7 +1946,7 @@
1946
1946
  },
1947
1947
  "privacy": {
1948
1948
  "name": "privacy",
1949
- "scraped_at": "2025-12-26T01:08:54.573Z",
1949
+ "scraped_at": "2025-12-27T12:27:14.484Z",
1950
1950
  "type": "page",
1951
1951
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
1952
1952
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2101,7 +2101,7 @@
2101
2101
  },
2102
2102
  "qps_limits": {
2103
2103
  "name": "qps_limits",
2104
- "scraped_at": "2025-12-26T01:08:54.919Z",
2104
+ "scraped_at": "2025-12-27T12:27:14.764Z",
2105
2105
  "type": "page",
2106
2106
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2107
2107
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2161,7 +2161,7 @@
2161
2161
  },
2162
2162
  "readme": {
2163
2163
  "name": "readme",
2164
- "scraped_at": "2025-12-26T01:08:55.256Z",
2164
+ "scraped_at": "2025-12-27T12:27:15.113Z",
2165
2165
  "type": "page",
2166
2166
  "title": "TwitterAPI.io - Enterprise-Grade Twitter Data API | No Auth Required",
2167
2167
  "description": "Access Twitter data without authentication. 96% cheaper than alternatives with high performance, 1000+ QPS, and enterprise reliability. Real-time data for developers, researchers, and businesses.",
@@ -2310,7 +2310,7 @@
2310
2310
  },
2311
2311
  "terms": {
2312
2312
  "name": "terms",
2313
- "scraped_at": "2025-12-26T01:08:55.613Z",
2313
+ "scraped_at": "2025-12-27T12:27:15.468Z",
2314
2314
  "type": "page",
2315
2315
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2316
2316
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2460,7 +2460,7 @@
2460
2460
  },
2461
2461
  "tweet_filter_rules": {
2462
2462
  "name": "tweet_filter_rules",
2463
- "scraped_at": "2025-12-26T01:08:55.890Z",
2463
+ "scraped_at": "2025-12-27T12:27:15.780Z",
2464
2464
  "type": "page",
2465
2465
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2466
2466
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2501,7 +2501,7 @@
2501
2501
  },
2502
2502
  "twitter_stream": {
2503
2503
  "name": "twitter_stream",
2504
- "scraped_at": "2025-12-26T01:08:56.307Z",
2504
+ "scraped_at": "2025-12-27T12:27:16.196Z",
2505
2505
  "type": "page",
2506
2506
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2507
2507
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2697,7 +2697,7 @@
2697
2697
  },
2698
2698
  "twitter_stream_manage": {
2699
2699
  "name": "twitter_stream_manage",
2700
- "scraped_at": "2025-12-26T01:08:56.595Z",
2700
+ "scraped_at": "2025-12-27T12:27:16.484Z",
2701
2701
  "type": "page",
2702
2702
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2703
2703
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2738,7 +2738,7 @@
2738
2738
  },
2739
2739
  "twitter_stream_subscription": {
2740
2740
  "name": "twitter_stream_subscription",
2741
- "scraped_at": "2025-12-26T01:08:56.878Z",
2741
+ "scraped_at": "2025-12-27T12:27:16.754Z",
2742
2742
  "type": "page",
2743
2743
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
2744
2744
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -2779,7 +2779,7 @@
2779
2779
  },
2780
2780
  "authentication": {
2781
2781
  "name": "authentication",
2782
- "scraped_at": "2025-12-26T01:08:57.559Z",
2782
+ "scraped_at": "2025-12-27T12:27:17.379Z",
2783
2783
  "type": "page",
2784
2784
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
2785
2785
  "description": "Learn how to authenticate your API requests using API keys",
@@ -2891,7 +2891,7 @@
2891
2891
  },
2892
2892
  "introduction": {
2893
2893
  "name": "introduction",
2894
- "scraped_at": "2025-12-26T01:08:57.942Z",
2894
+ "scraped_at": "2025-12-27T12:27:17.792Z",
2895
2895
  "type": "page",
2896
2896
  "title": "twitterapi.io - Twitter data, 96% cheaper. No auth, no limits, just API.",
2897
2897
  "description": "twitterapi.io docs.The best third-party Twitter API: reliable, high-performance, supports high QPS, and cost-effective.",
@@ -3003,7 +3003,7 @@
3003
3003
  "blogs": {
3004
3004
  "blog_analytics_guide": {
3005
3005
  "name": "blog_analytics_guide",
3006
- "scraped_at": "2025-12-26T01:08:58.305Z",
3006
+ "scraped_at": "2025-12-27T12:27:18.212Z",
3007
3007
  "type": "page",
3008
3008
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
3009
3009
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -3151,7 +3151,7 @@
3151
3151
  },
3152
3152
  "blog_apify_alternative": {
3153
3153
  "name": "blog_apify_alternative",
3154
- "scraped_at": "2025-12-26T01:08:58.723Z",
3154
+ "scraped_at": "2025-12-27T12:27:18.633Z",
3155
3155
  "type": "page",
3156
3156
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
3157
3157
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -3341,7 +3341,7 @@
3341
3341
  },
3342
3342
  "blog_building_x_trading_card_generator": {
3343
3343
  "name": "blog_building_x_trading_card_generator",
3344
- "scraped_at": "2025-12-26T01:08:59.071Z",
3344
+ "scraped_at": "2025-12-27T12:27:18.954Z",
3345
3345
  "type": "page",
3346
3346
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
3347
3347
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -3451,7 +3451,7 @@
3451
3451
  },
3452
3452
  "blog_kiro_ai": {
3453
3453
  "name": "blog_kiro_ai",
3454
- "scraped_at": "2025-12-26T01:08:59.424Z",
3454
+ "scraped_at": "2025-12-27T12:27:19.284Z",
3455
3455
  "type": "page",
3456
3456
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
3457
3457
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -3652,7 +3652,7 @@
3652
3652
  },
3653
3653
  "blog_leveraging_ai_for_crypto_trading": {
3654
3654
  "name": "blog_leveraging_ai_for_crypto_trading",
3655
- "scraped_at": "2025-12-26T01:08:59.788Z",
3655
+ "scraped_at": "2025-12-27T12:27:19.612Z",
3656
3656
  "type": "page",
3657
3657
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
3658
3658
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -3875,7 +3875,7 @@
3875
3875
  },
3876
3876
  "blog_login_post_api_guide": {
3877
3877
  "name": "blog_login_post_api_guide",
3878
- "scraped_at": "2025-12-26T01:09:00.126Z",
3878
+ "scraped_at": "2025-12-27T12:27:19.995Z",
3879
3879
  "type": "page",
3880
3880
  "title": "Complete Guide: Login to Twitter and Post Tweets Using API | TwitterAPI.io",
3881
3881
  "description": "Learn how to securely login to your Twitter account and post tweets using TwitterAPI.io. Step-by-step guide with 2FA setup, proxy configuration, and API implementation.",
@@ -4040,7 +4040,7 @@
4040
4040
  },
4041
4041
  "blog_monitor_tweets": {
4042
4042
  "name": "blog_monitor_tweets",
4043
- "scraped_at": "2025-12-26T01:09:00.474Z",
4043
+ "scraped_at": "2025-12-27T12:27:20.396Z",
4044
4044
  "type": "page",
4045
4045
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4046
4046
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -4194,7 +4194,7 @@
4194
4194
  },
4195
4195
  "blog_pricing_2025": {
4196
4196
  "name": "blog_pricing_2025",
4197
- "scraped_at": "2025-12-26T01:09:00.796Z",
4197
+ "scraped_at": "2025-12-27T12:27:20.727Z",
4198
4198
  "type": "page",
4199
4199
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4200
4200
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -4322,7 +4322,7 @@
4322
4322
  },
4323
4323
  "blog_resources": {
4324
4324
  "name": "blog_resources",
4325
- "scraped_at": "2025-12-26T01:09:01.151Z",
4325
+ "scraped_at": "2025-12-27T12:27:21.115Z",
4326
4326
  "type": "page",
4327
4327
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4328
4328
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -4493,7 +4493,7 @@
4493
4493
  },
4494
4494
  "blog_the_ultimate_guide_to_x_api_alternatives": {
4495
4495
  "name": "blog_the_ultimate_guide_to_x_api_alternatives",
4496
- "scraped_at": "2025-12-26T01:09:01.460Z",
4496
+ "scraped_at": "2025-12-27T12:27:21.442Z",
4497
4497
  "type": "page",
4498
4498
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4499
4499
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -4593,7 +4593,7 @@
4593
4593
  },
4594
4594
  "blog_twitter_api_alternatives_comprehensive_guide_2025": {
4595
4595
  "name": "blog_twitter_api_alternatives_comprehensive_guide_2025",
4596
- "scraped_at": "2025-12-26T01:09:01.837Z",
4596
+ "scraped_at": "2025-12-27T12:27:21.902Z",
4597
4597
  "type": "page",
4598
4598
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4599
4599
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -4894,7 +4894,7 @@
4894
4894
  },
4895
4895
  "blog_twitter_api_ultimate_guide_2025": {
4896
4896
  "name": "blog_twitter_api_ultimate_guide_2025",
4897
- "scraped_at": "2025-12-26T01:09:02.282Z",
4897
+ "scraped_at": "2025-12-27T12:27:22.216Z",
4898
4898
  "type": "page",
4899
4899
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
4900
4900
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -5003,7 +5003,7 @@
5003
5003
  },
5004
5004
  "blog_twitter_data_api_complete_guide": {
5005
5005
  "name": "blog_twitter_data_api_complete_guide",
5006
- "scraped_at": "2025-12-26T01:09:02.591Z",
5006
+ "scraped_at": "2025-12-27T12:27:22.538Z",
5007
5007
  "type": "page",
5008
5008
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
5009
5009
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -5240,7 +5240,7 @@
5240
5240
  },
5241
5241
  "blog_twitter_data_for_academic_research": {
5242
5242
  "name": "blog_twitter_data_for_academic_research",
5243
- "scraped_at": "2025-12-26T01:09:02.908Z",
5243
+ "scraped_at": "2025-12-27T12:27:22.907Z",
5244
5244
  "type": "page",
5245
5245
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
5246
5246
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -5432,7 +5432,7 @@
5432
5432
  },
5433
5433
  "blog_twitter_request_looks_like_it_might_be_automated_error_226": {
5434
5434
  "name": "blog_twitter_request_looks_like_it_might_be_automated_error_226",
5435
- "scraped_at": "2025-12-26T01:09:03.223Z",
5435
+ "scraped_at": "2025-12-27T12:27:23.237Z",
5436
5436
  "type": "page",
5437
5437
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
5438
5438
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -5600,7 +5600,7 @@
5600
5600
  },
5601
5601
  "blog_twitter_search_api_complete_guide_2025": {
5602
5602
  "name": "blog_twitter_search_api_complete_guide_2025",
5603
- "scraped_at": "2025-12-26T01:09:03.608Z",
5603
+ "scraped_at": "2025-12-27T12:27:23.695Z",
5604
5604
  "type": "page",
5605
5605
  "title": "Affordable, Real-Time X (Twitter) API — No Limits",
5606
5606
  "description": "Build with an affordable, real-time X (Twitter) API. Get instant access to timelines, tweets, and write actions with predictable pricing and no limits.",
@@ -5895,7 +5895,7 @@
5895
5895
  },
5896
5896
  "blog_understanding_twitter_api_rate_limits": {
5897
5897
  "name": "blog_understanding_twitter_api_rate_limits",
5898
- "scraped_at": "2025-12-26T01:09:03.893Z",
5898
+ "scraped_at": "2025-12-27T12:27:23.970Z",
5899
5899
  "type": "page",
5900
5900
  "title": "Understanding Twitter API Rate Limits: A Developer's Complete Guide",
5901
5901
  "description": "Learn how to effectively manage Twitter API rate limits and optimize your application performance. Compare Twitter's official API limits with TwitterAPI.io's enhanced capabilities.",
@@ -6012,7 +6012,7 @@
6012
6012
  },
6013
6013
  "blog_understanding_twitter_official_api_guide": {
6014
6014
  "name": "blog_understanding_twitter_official_api_guide",
6015
- "scraped_at": "2025-12-26T01:09:04.201Z",
6015
+ "scraped_at": "2025-12-27T12:27:24.298Z",
6016
6016
  "type": "page",
6017
6017
  "title": "Understanding Twitter's Official API: A Comprehensive Guide for Developers | TwitterAPI.io",
6018
6018
  "description": "Explore Twitter's new API tiers, pricing, and limitations. Compare with cost-effective alternatives like TwitterAPI.io for developers and businesses.",
@@ -6174,7 +6174,7 @@
6174
6174
  },
6175
6175
  "blog_using_webhooks_for_real_time_twitter_data": {
6176
6176
  "name": "blog_using_webhooks_for_real_time_twitter_data",
6177
- "scraped_at": "2025-12-26T01:09:04.518Z",
6177
+ "scraped_at": "2025-12-27T12:27:24.631Z",
6178
6178
  "type": "page",
6179
6179
  "title": "How to Use Webhooks to Receive Real-Time Twitter Data: A Complete Implementation Guide",
6180
6180
  "description": "Learn how to leverage TwitterAPI.io's webhook functionality to easily receive tweets matching specific rules without complex programming.",
@@ -6382,7 +6382,7 @@
6382
6382
  },
6383
6383
  "blog_using_websocket_for_real_time_twitter_data": {
6384
6384
  "name": "blog_using_websocket_for_real_time_twitter_data",
6385
- "scraped_at": "2025-12-26T01:09:04.831Z",
6385
+ "scraped_at": "2025-12-27T12:27:24.971Z",
6386
6386
  "type": "page",
6387
6387
  "title": "Using WebSocket for Real-Time Twitter Data: A Complete Guide | TwitterAPI.io",
6388
6388
  "description": "Learn how to use WebSocket to get real-time Twitter data through TwitterAPI.io. This guide covers setup, implementation, and best practices for efficient data streaming.",
@@ -6570,7 +6570,7 @@
6570
6570
  },
6571
6571
  "blog_why_twitter_scrapers_need_reliable_alternative": {
6572
6572
  "name": "blog_why_twitter_scrapers_need_reliable_alternative",
6573
- "scraped_at": "2025-12-26T01:09:05.119Z",
6573
+ "scraped_at": "2025-12-27T12:27:25.241Z",
6574
6574
  "type": "page",
6575
6575
  "title": "Why Twitter Scrapers Like ai16z's Tools Need a Reliable Alternative",
6576
6576
  "description": "Explore the challenges of DIY Twitter scrapers and why professional alternatives are crucial for production environments. Learn about reliability, cost efficiency, and making the right choice for your Twitter data needs.",
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * TwitterAPI.io Documentation MCP Server v1.0.9
3
+ * TwitterAPI.io Documentation MCP Server v1.0.10
4
4
  *
5
5
  * Production-ready MCP server with:
6
6
  * - Comprehensive error handling with ErrorType classification
@@ -44,6 +44,7 @@ import {
44
44
  ListToolsRequestSchema,
45
45
  ReadResourceRequestSchema,
46
46
  } from "@modelcontextprotocol/sdk/types.js";
47
+ import crypto from "crypto";
47
48
  import fs from "fs";
48
49
  import path from "path";
49
50
  import { fileURLToPath } from "url";
@@ -282,6 +283,8 @@ const logger = new Logger();
282
283
 
283
284
  // ========== HYBRID CACHE ==========
284
285
  const CACHE_DIR = path.join(__dirname, "cache");
286
+ const CACHE_KEY_HASH_LENGTH = 16;
287
+ const CACHE_KEY_MAX_LENGTH = 96;
285
288
 
286
289
  class HybridCache {
287
290
  constructor(name, options = {}) {
@@ -308,7 +311,16 @@ class HybridCache {
308
311
  }
309
312
 
310
313
  normalizeKey(key) {
311
- return key.toLowerCase().replace(/[^a-z0-9]/g, '_').slice(0, 100);
314
+ const raw = String(key ?? '');
315
+ const normalized = raw
316
+ .toLowerCase()
317
+ .replace(/[^a-z0-9]/g, '_')
318
+ .replace(/_+/g, '_')
319
+ .replace(/^_+|_+$/g, '');
320
+ const hash = crypto.createHash('sha256').update(raw).digest('hex').slice(0, CACHE_KEY_HASH_LENGTH);
321
+ const maxPrefix = Math.max(0, CACHE_KEY_MAX_LENGTH - CACHE_KEY_HASH_LENGTH - 1);
322
+ const prefix = normalized.slice(0, maxPrefix);
323
+ return prefix ? `${prefix}_${hash}` : hash;
312
324
  }
313
325
 
314
326
  isExpired(entry) {
@@ -619,6 +631,8 @@ function validateCategory(category) {
619
631
  }
620
632
 
621
633
  const ALLOWED_URL_HOSTS = new Set(['twitterapi.io', 'docs.twitterapi.io']);
634
+ const MAX_LIVE_FETCH_BYTES = 5 * 1024 * 1024;
635
+ const MAX_LIVE_FETCH_REDIRECTS = 3;
622
636
 
623
637
  function canonicalizeUrl(rawUrl) {
624
638
  const trimmed = rawUrl.trim();
@@ -1073,19 +1087,30 @@ function formatGuideMarkdown(name, page) {
1073
1087
  return output;
1074
1088
  }
1075
1089
 
1076
- function formatEndpointMarkdown(endpointName, endpoint) {
1090
+ function resolveAuthMeta(authMeta) {
1091
+ const meta = authMeta || {};
1092
+ return {
1093
+ header: meta.header || "x-api-key",
1094
+ headerValue: meta.header_value || "YOUR_API_KEY",
1095
+ baseUrl: meta.base_url || "https://api.twitterapi.io",
1096
+ dashboardUrl: meta.dashboard_url || "https://twitterapi.io/dashboard",
1097
+ };
1098
+ }
1099
+
1100
+ function formatEndpointMarkdown(endpointName, endpoint, authMeta = {}) {
1101
+ const auth = resolveAuthMeta(authMeta);
1077
1102
  const extractedMethod = extractHttpMethodFromCurl(endpoint?.curl_example);
1078
1103
  const method = endpoint.method || extractedMethod || "GET";
1079
1104
  const curlExample =
1080
1105
  endpoint.curl_example ||
1081
- `curl --request ${method} \\\n --url https://api.twitterapi.io${endpoint.path || ''} \\\n --header 'x-api-key: YOUR_API_KEY'`;
1106
+ `curl --request ${method} \\\n --url ${auth.baseUrl}${endpoint.path || ''} \\\n --header '${auth.header}: ${auth.headerValue}'`;
1082
1107
 
1083
1108
  return `# ${endpoint.title || endpointName}
1084
1109
 
1085
1110
  ## Endpoint Details
1086
1111
  - **Method:** ${method}
1087
1112
  - **Path:** ${endpoint.path || "Unknown"}
1088
- - **Full URL:** https://api.twitterapi.io${endpoint.path || ""}
1113
+ - **Full URL:** ${auth.baseUrl}${endpoint.path || ""}
1089
1114
  - **Documentation:** ${endpoint.url}
1090
1115
 
1091
1116
  ## Description
@@ -1100,9 +1125,9 @@ ${curlExample}
1100
1125
  \`\`\`
1101
1126
 
1102
1127
  ## Authentication
1103
- - **Header:** ${authHeader}: ${authHeaderValue}
1104
- - **Base URL:** ${authBaseUrl}
1105
- - **Dashboard:** ${authDashboardUrl}
1128
+ - **Header:** ${auth.header}: ${auth.headerValue}
1129
+ - **Base URL:** ${auth.baseUrl}
1130
+ - **Dashboard:** ${auth.dashboardUrl}
1106
1131
 
1107
1132
  ${endpoint.code_snippets?.length > 0 ? `## Code Examples
1108
1133
  \`\`\`
@@ -1156,11 +1181,66 @@ function findSnapshotItemByUrl(data, canonicalUrl) {
1156
1181
  return null;
1157
1182
  }
1158
1183
 
1184
+ async function readResponseTextWithLimit(response, maxBytes) {
1185
+ const lengthHeader = response.headers.get('content-length');
1186
+ if (lengthHeader) {
1187
+ const length = Number(lengthHeader);
1188
+ if (Number.isFinite(length) && length > maxBytes) {
1189
+ throw new Error(`Response too large (${length} bytes)`);
1190
+ }
1191
+ }
1192
+
1193
+ if (!response.body) {
1194
+ return await response.text();
1195
+ }
1196
+
1197
+ const chunks = [];
1198
+ let total = 0;
1199
+ for await (const chunk of response.body) {
1200
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
1201
+ total += buffer.length;
1202
+ if (total > maxBytes) {
1203
+ throw new Error(`Response exceeded ${maxBytes} bytes`);
1204
+ }
1205
+ chunks.push(buffer);
1206
+ }
1207
+
1208
+ return Buffer.concat(chunks).toString('utf-8');
1209
+ }
1210
+
1211
+ async function fetchWithAllowedRedirects(url, options = {}) {
1212
+ let currentUrl = url;
1213
+ const maxRedirects = options.maxRedirects ?? MAX_LIVE_FETCH_REDIRECTS;
1214
+
1215
+ for (let i = 0; i <= maxRedirects; i += 1) {
1216
+ const response = await fetch(currentUrl, {
1217
+ redirect: 'manual',
1218
+ signal: options.signal,
1219
+ headers: options.headers,
1220
+ });
1221
+
1222
+ if (response.status >= 300 && response.status < 400) {
1223
+ const location = response.headers.get('location');
1224
+ if (!location) {
1225
+ return { response, finalUrl: currentUrl };
1226
+ }
1227
+
1228
+ const resolved = new URL(location, currentUrl).toString();
1229
+ currentUrl = canonicalizeUrl(resolved);
1230
+ continue;
1231
+ }
1232
+
1233
+ return { response, finalUrl: currentUrl };
1234
+ }
1235
+
1236
+ throw new Error(`Too many redirects (>${maxRedirects})`);
1237
+ }
1238
+
1159
1239
  // ========== MCP SERVER ==========
1160
1240
  const server = new Server(
1161
1241
  {
1162
- name: "twitterapi-docs",
1163
- version: "1.0.9",
1242
+ name: "twitterapi-io-mcp",
1243
+ version: PACKAGE_VERSION,
1164
1244
  },
1165
1245
  {
1166
1246
  capabilities: {
@@ -1674,16 +1754,12 @@ ${allEndpoints.map(e => `- ${e}`).join('\n')}
1674
1754
  }
1675
1755
 
1676
1756
  const endpointMethod = getEndpointMethod(endpoint);
1677
- const authMeta = data.authentication || {};
1678
- const authHeader = authMeta.header || "x-api-key";
1679
- const authHeaderValue = authMeta.header_value || "YOUR_API_KEY";
1680
- const authBaseUrl = authMeta.base_url || "https://api.twitterapi.io";
1681
- const authDashboardUrl = authMeta.dashboard_url || "https://twitterapi.io/dashboard";
1757
+ const authMeta = resolveAuthMeta(data.authentication);
1682
1758
  const curlExample =
1683
1759
  endpoint.curl_example ||
1684
1760
  `curl --request ${endpointMethod} \\
1685
- --url ${authBaseUrl}${endpoint.path || ''} \\
1686
- --header '${authHeader}: ${authHeaderValue}'`;
1761
+ --url ${authMeta.baseUrl}${endpoint.path || ''} \\
1762
+ --header '${authMeta.header}: ${authMeta.headerValue}'`;
1687
1763
 
1688
1764
  const info = `# ${endpoint.title || validation.value}
1689
1765
 
@@ -1726,10 +1802,10 @@ ${endpoint.raw_text || "No additional content available."}`;
1726
1802
  code_snippets: endpoint.code_snippets || [],
1727
1803
  raw_text: endpoint.raw_text || "",
1728
1804
  auth: {
1729
- header: authHeader,
1730
- header_value: authHeaderValue,
1731
- base_url: authBaseUrl,
1732
- dashboard_url: authDashboardUrl
1805
+ header: authMeta.header,
1806
+ header_value: authMeta.headerValue,
1807
+ base_url: authMeta.baseUrl,
1808
+ dashboard_url: authMeta.dashboardUrl
1733
1809
  },
1734
1810
  cached: false,
1735
1811
  markdown: info
@@ -1938,7 +2014,7 @@ ${filtered.map((e) => `- **${e.name}**: ${e.method} ${e.path}\n ${e.description
1938
2014
  const match = findSnapshotItemByUrl(data, lookupUrl);
1939
2015
  if (match) {
1940
2016
  const markdown = match.kind === 'endpoint'
1941
- ? formatEndpointMarkdown(match.name, match.item)
2017
+ ? formatEndpointMarkdown(match.name, match.item, data.authentication)
1942
2018
  : formatGuideMarkdown(match.name, match.item);
1943
2019
 
1944
2020
  const structuredContent = {
@@ -1976,8 +2052,7 @@ ${filtered.map((e) => `- **${e.name}**: ${e.method} ${e.path}\n ${e.description
1976
2052
  const timeoutMs = 15000;
1977
2053
  const timeout = setTimeout(() => controller.abort(), timeoutMs);
1978
2054
 
1979
- const response = await fetch(requestedUrl, {
1980
- redirect: 'follow',
2055
+ const { response, finalUrl } = await fetchWithAllowedRedirects(requestedUrl, {
1981
2056
  signal: controller.signal,
1982
2057
  headers: {
1983
2058
  'user-agent': `twitterapi-io-mcp/${PACKAGE_VERSION} (+https://github.com/dorukardahan/twitterapi-io-mcp)`
@@ -1994,9 +2069,9 @@ ${filtered.map((e) => `- **${e.name}**: ${e.method} ${e.path}\n ${e.description
1994
2069
  });
1995
2070
  }
1996
2071
 
1997
- const html = await response.text();
2072
+ const html = await readResponseTextWithLimit(response, MAX_LIVE_FETCH_BYTES);
1998
2073
  const extracted = extractHtmlContent(html);
1999
- const parsed = new URL(requestedUrl);
2074
+ const parsed = new URL(finalUrl);
2000
2075
 
2001
2076
  let kind = 'page';
2002
2077
  let name = 'page';
@@ -2017,11 +2092,11 @@ ${filtered.map((e) => `- **${e.name}**: ${e.method} ${e.path}\n ${e.description
2017
2092
  name = normalizeKeyForName(parsed.pathname.replace(/^\/+|\/+$/g, '').replace(/\//g, '_'));
2018
2093
  }
2019
2094
 
2020
- const page = { ...extracted, url: requestedUrl };
2095
+ const page = { ...extracted, url: finalUrl };
2021
2096
  const markdown = formatGuideMarkdown(name, page);
2022
2097
 
2023
2098
  const structuredContent = {
2024
- url: requestedUrl,
2099
+ url: finalUrl,
2025
2100
  source: 'live',
2026
2101
  kind,
2027
2102
  name,
@@ -2041,6 +2116,22 @@ ${filtered.map((e) => `- **${e.name}**: ${e.method} ${e.path}\n ${e.description
2041
2116
  retryable: true
2042
2117
  });
2043
2118
  }
2119
+ if (error?.message?.includes('Response too large') || error?.message?.includes('Response exceeded')) {
2120
+ return formatToolError({
2121
+ type: ErrorType.INTERNAL_ERROR,
2122
+ message: error.message,
2123
+ suggestion: 'Use the offline snapshot or request a smaller page',
2124
+ retryable: false
2125
+ });
2126
+ }
2127
+ if (error?.message?.includes('Too many redirects')) {
2128
+ return formatToolError({
2129
+ type: ErrorType.INTERNAL_ERROR,
2130
+ message: error.message,
2131
+ suggestion: 'Check the URL or use the offline snapshot instead',
2132
+ retryable: false
2133
+ });
2134
+ }
2044
2135
  logger.error('url_fetch', `Failed to fetch URL: ${requestedUrl}`, error);
2045
2136
  return formatToolError({
2046
2137
  type: ErrorType.TIMEOUT,
@@ -2107,30 +2198,26 @@ TwitterAPI.io is **~97% cheaper** than official Twitter API.
2107
2198
  }
2108
2199
 
2109
2200
  case "get_twitterapi_auth": {
2110
- const auth = data.authentication || {};
2111
-
2112
- const header = auth.header || "x-api-key";
2113
- const baseUrl = auth.base_url || "https://api.twitterapi.io";
2114
- const dashboardUrl = auth.dashboard_url || "https://twitterapi.io/dashboard";
2201
+ const auth = resolveAuthMeta(data.authentication);
2115
2202
 
2116
2203
  const examples = {
2117
- curl: `curl -X GET "${baseUrl}/twitter/user/info?userName=elonmusk" \\\n -H "${header}: YOUR_API_KEY"`,
2204
+ curl: `curl -X GET "${auth.baseUrl}/twitter/user/info?userName=elonmusk" \\\n -H "${auth.header}: YOUR_API_KEY"`,
2118
2205
  python:
2119
- `import requests\n\nresponse = requests.get(\n "${baseUrl}/twitter/user/info",\n params={"userName": "elonmusk"},\n headers={"${header}": "YOUR_API_KEY"}\n)\nprint(response.json())`,
2206
+ `import requests\n\nresponse = requests.get(\n "${auth.baseUrl}/twitter/user/info",\n params={"userName": "elonmusk"},\n headers={"${auth.header}": "YOUR_API_KEY"}\n)\nprint(response.json())`,
2120
2207
  javascript:
2121
- `const response = await fetch(\n "${baseUrl}/twitter/user/info?userName=elonmusk",\n { headers: { "${header}": "YOUR_API_KEY" } }\n);\nconst data = await response.json();`
2208
+ `const response = await fetch(\n "${auth.baseUrl}/twitter/user/info?userName=elonmusk",\n { headers: { "${auth.header}": "YOUR_API_KEY" } }\n);\nconst data = await response.json();`
2122
2209
  };
2123
2210
 
2124
2211
  const markdown = `# TwitterAPI.io Authentication
2125
2212
 
2126
2213
  ## API Key Usage
2127
- All requests require the \`${header}\` header.
2214
+ All requests require the \`${auth.header}\` header.
2128
2215
 
2129
2216
  ## Base URL
2130
- \`${baseUrl}\`
2217
+ \`${auth.baseUrl}\`
2131
2218
 
2132
2219
  ## Getting Your API Key
2133
- 1. Go to ${dashboardUrl}
2220
+ 1. Go to ${auth.dashboardUrl}
2134
2221
  2. Sign up / Log in
2135
2222
  3. Copy your API key from the dashboard
2136
2223
 
@@ -2501,7 +2588,7 @@ server.setRequestHandler(CompleteRequestSchema, async () => {
2501
2588
  // ========== SERVER STARTUP ==========
2502
2589
  async function main() {
2503
2590
  try {
2504
- logger.info('init', 'Starting TwitterAPI.io Docs MCP Server v1.0.9');
2591
+ logger.info('init', `Starting TwitterAPI.io Docs MCP Server v${PACKAGE_VERSION}`);
2505
2592
 
2506
2593
  // Validate docs file exists
2507
2594
  if (!fs.existsSync(DOCS_PATH)) {
@@ -2536,7 +2623,7 @@ async function main() {
2536
2623
  await server.connect(transport);
2537
2624
 
2538
2625
  logger.info('init', 'MCP Server ready on stdio', {
2539
- version: '1.0.9',
2626
+ version: PACKAGE_VERSION,
2540
2627
  features: [
2541
2628
  'offline snapshot',
2542
2629
  'endpoints + pages + blogs',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "twitterapi-io-mcp",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "mcpName": "io.github.dorukardahan/twitterapi-io-mcp",
5
5
  "description": "TwitterAPI.io MCP server providing offline access to docs (endpoints, pages, blogs) for Claude and other AI assistants",
6
6
  "main": "index.js",