x-twitter-scraper 0.4.5 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/README.md +8 -41
  4. data/lib/x_twitter_scraper/client.rb +1 -1
  5. data/lib/x_twitter_scraper/internal/type/union.rb +13 -0
  6. data/lib/x_twitter_scraper/models/account_retrieve_response.rb +4 -4
  7. data/lib/x_twitter_scraper/models/compose_create_params.rb +194 -122
  8. data/lib/x_twitter_scraper/models/compose_create_response.rb +326 -33
  9. data/lib/x_twitter_scraper/models/credit_retrieve_topup_status_params.rb +2 -2
  10. data/lib/x_twitter_scraper/models/error.rb +99 -3
  11. data/lib/x_twitter_scraper/models/extraction_estimate_cost_params.rb +8 -8
  12. data/lib/x_twitter_scraper/models/guest_wallet_create_params.rb +2 -2
  13. data/lib/x_twitter_scraper/models/guest_wallet_create_response.rb +27 -7
  14. data/lib/x_twitter_scraper/models/guest_wallet_topup_params.rb +2 -2
  15. data/lib/x_twitter_scraper/models/guest_wallet_topup_response.rb +27 -7
  16. data/lib/x_twitter_scraper/models/search_tweet.rb +12 -12
  17. data/lib/x_twitter_scraper/models/support/ticket_create_params.rb +7 -1
  18. data/lib/x_twitter_scraper/models/support/ticket_create_response.rb +40 -3
  19. data/lib/x_twitter_scraper/models/support/ticket_reply_params.rb +7 -1
  20. data/lib/x_twitter_scraper/models/support/ticket_reply_response.rb +40 -3
  21. data/lib/x_twitter_scraper/models/support/ticket_retrieve_response.rb +114 -1
  22. data/lib/x_twitter_scraper/models/x/communities/join_create_params.rb +8 -1
  23. data/lib/x_twitter_scraper/models/x/communities/join_create_response.rb +577 -4
  24. data/lib/x_twitter_scraper/models/x/communities/join_delete_all_params.rb +8 -1
  25. data/lib/x_twitter_scraper/models/x/communities/join_delete_all_response.rb +585 -4
  26. data/lib/x_twitter_scraper/models/x/community_create_params.rb +8 -1
  27. data/lib/x_twitter_scraper/models/x/community_create_response.rb +568 -8
  28. data/lib/x_twitter_scraper/models/x/community_delete_params.rb +8 -1
  29. data/lib/x_twitter_scraper/models/x/community_delete_response.rb +576 -4
  30. data/lib/x_twitter_scraper/models/x/dm_send_params.rb +8 -1
  31. data/lib/x_twitter_scraper/models/x/dm_send_response.rb +573 -7
  32. data/lib/x_twitter_scraper/models/x/media_upload_params.rb +8 -1
  33. data/lib/x_twitter_scraper/models/x/media_upload_response.rb +568 -11
  34. data/lib/x_twitter_scraper/models/x/profile_update_avatar_params.rb +8 -1
  35. data/lib/x_twitter_scraper/models/x/profile_update_avatar_response.rb +576 -4
  36. data/lib/x_twitter_scraper/models/x/profile_update_banner_params.rb +8 -1
  37. data/lib/x_twitter_scraper/models/x/profile_update_banner_response.rb +576 -4
  38. data/lib/x_twitter_scraper/models/x/profile_update_params.rb +8 -1
  39. data/lib/x_twitter_scraper/models/x/profile_update_response.rb +576 -4
  40. data/lib/x_twitter_scraper/models/x/tweet_author.rb +1 -14
  41. data/lib/x_twitter_scraper/models/x/tweet_create_params.rb +5 -5
  42. data/lib/x_twitter_scraper/models/x/tweet_create_response.rb +551 -12
  43. data/lib/x_twitter_scraper/models/x/tweet_delete_params.rb +8 -1
  44. data/lib/x_twitter_scraper/models/x/tweet_delete_response.rb +576 -4
  45. data/lib/x_twitter_scraper/models/x/tweets/like_create_params.rb +8 -1
  46. data/lib/x_twitter_scraper/models/x/tweets/like_create_response.rb +576 -4
  47. data/lib/x_twitter_scraper/models/x/tweets/like_delete_params.rb +8 -1
  48. data/lib/x_twitter_scraper/models/x/tweets/like_delete_response.rb +576 -4
  49. data/lib/x_twitter_scraper/models/x/tweets/retweet_create_params.rb +8 -1
  50. data/lib/x_twitter_scraper/models/x/tweets/retweet_create_response.rb +576 -4
  51. data/lib/x_twitter_scraper/models/x/tweets/retweet_delete_params.rb +8 -1
  52. data/lib/x_twitter_scraper/models/x/tweets/retweet_delete_response.rb +576 -4
  53. data/lib/x_twitter_scraper/models/x/user_remove_follower_params.rb +8 -1
  54. data/lib/x_twitter_scraper/models/x/user_remove_follower_response.rb +576 -4
  55. data/lib/x_twitter_scraper/models/x/user_retrieve_following_params.rb +2 -2
  56. data/lib/x_twitter_scraper/models/x/user_retrieve_replies_params.rb +2 -2
  57. data/lib/x_twitter_scraper/models/x/users/follow_create_params.rb +8 -1
  58. data/lib/x_twitter_scraper/models/x/users/follow_create_response.rb +576 -4
  59. data/lib/x_twitter_scraper/models/x/users/follow_delete_all_params.rb +8 -1
  60. data/lib/x_twitter_scraper/models/x/users/follow_delete_all_response.rb +576 -4
  61. data/lib/x_twitter_scraper/models/x/write_action_retrieve_response.rb +469 -52
  62. data/lib/x_twitter_scraper/models/x/x_account.rb +7 -7
  63. data/lib/x_twitter_scraper/models/x/x_account_detail.rb +1 -1
  64. data/lib/x_twitter_scraper/resources/compose.rb +8 -26
  65. data/lib/x_twitter_scraper/resources/credits.rb +1 -1
  66. data/lib/x_twitter_scraper/resources/extractions.rb +4 -4
  67. data/lib/x_twitter_scraper/resources/guest_wallets.rb +2 -2
  68. data/lib/x_twitter_scraper/resources/monitors/keywords.rb +4 -5
  69. data/lib/x_twitter_scraper/resources/monitors.rb +3 -3
  70. data/lib/x_twitter_scraper/resources/support/tickets.rb +24 -8
  71. data/lib/x_twitter_scraper/resources/trends.rb +1 -1
  72. data/lib/x_twitter_scraper/resources/x/communities/join.rb +22 -8
  73. data/lib/x_twitter_scraper/resources/x/communities.rb +25 -11
  74. data/lib/x_twitter_scraper/resources/x/dm.rb +13 -6
  75. data/lib/x_twitter_scraper/resources/x/media.rb +17 -7
  76. data/lib/x_twitter_scraper/resources/x/profile.rb +46 -17
  77. data/lib/x_twitter_scraper/resources/x/tweets/like.rb +22 -8
  78. data/lib/x_twitter_scraper/resources/x/tweets/retweet.rb +22 -8
  79. data/lib/x_twitter_scraper/resources/x/tweets.rb +31 -16
  80. data/lib/x_twitter_scraper/resources/x/users/follow.rb +22 -8
  81. data/lib/x_twitter_scraper/resources/x/users.rb +16 -9
  82. data/lib/x_twitter_scraper/resources/x.rb +1 -2
  83. data/lib/x_twitter_scraper/version.rb +1 -1
  84. data/rbi/x_twitter_scraper/client.rbi +1 -1
  85. data/rbi/x_twitter_scraper/models/account_retrieve_response.rbi +4 -4
  86. data/rbi/x_twitter_scraper/models/compose_create_params.rbi +392 -215
  87. data/rbi/x_twitter_scraper/models/compose_create_response.rbi +537 -48
  88. data/rbi/x_twitter_scraper/models/credit_retrieve_topup_status_params.rbi +2 -2
  89. data/rbi/x_twitter_scraper/models/error.rbi +379 -13
  90. data/rbi/x_twitter_scraper/models/extraction_estimate_cost_params.rbi +8 -8
  91. data/rbi/x_twitter_scraper/models/guest_wallet_create_params.rbi +2 -2
  92. data/rbi/x_twitter_scraper/models/guest_wallet_create_response.rbi +87 -5
  93. data/rbi/x_twitter_scraper/models/guest_wallet_topup_params.rbi +2 -2
  94. data/rbi/x_twitter_scraper/models/guest_wallet_topup_response.rbi +87 -5
  95. data/rbi/x_twitter_scraper/models/search_tweet.rbi +12 -12
  96. data/rbi/x_twitter_scraper/models/support/ticket_create_params.rbi +9 -1
  97. data/rbi/x_twitter_scraper/models/support/ticket_create_response.rbi +113 -7
  98. data/rbi/x_twitter_scraper/models/support/ticket_reply_params.rbi +9 -1
  99. data/rbi/x_twitter_scraper/models/support/ticket_reply_response.rbi +113 -7
  100. data/rbi/x_twitter_scraper/models/support/ticket_retrieve_response.rbi +276 -5
  101. data/rbi/x_twitter_scraper/models/x/communities/join_create_params.rbi +6 -0
  102. data/rbi/x_twitter_scraper/models/x/communities/join_create_response.rbi +1154 -3
  103. data/rbi/x_twitter_scraper/models/x/communities/join_delete_all_params.rbi +6 -0
  104. data/rbi/x_twitter_scraper/models/x/communities/join_delete_all_response.rbi +1154 -3
  105. data/rbi/x_twitter_scraper/models/x/community_create_params.rbi +6 -0
  106. data/rbi/x_twitter_scraper/models/x/community_create_response.rbi +1127 -5
  107. data/rbi/x_twitter_scraper/models/x/community_delete_params.rbi +6 -0
  108. data/rbi/x_twitter_scraper/models/x/community_delete_response.rbi +1148 -3
  109. data/rbi/x_twitter_scraper/models/x/dm_send_params.rbi +6 -0
  110. data/rbi/x_twitter_scraper/models/x/dm_send_response.rbi +1112 -6
  111. data/rbi/x_twitter_scraper/models/x/media_upload_params.rbi +6 -0
  112. data/rbi/x_twitter_scraper/models/x/media_upload_response.rbi +1124 -9
  113. data/rbi/x_twitter_scraper/models/x/profile_update_avatar_params.rbi +6 -0
  114. data/rbi/x_twitter_scraper/models/x/profile_update_avatar_response.rbi +1152 -3
  115. data/rbi/x_twitter_scraper/models/x/profile_update_banner_params.rbi +6 -0
  116. data/rbi/x_twitter_scraper/models/x/profile_update_banner_response.rbi +1152 -3
  117. data/rbi/x_twitter_scraper/models/x/profile_update_params.rbi +6 -0
  118. data/rbi/x_twitter_scraper/models/x/profile_update_response.rbi +1144 -3
  119. data/rbi/x_twitter_scraper/models/x/tweet_author.rbi +3 -13
  120. data/rbi/x_twitter_scraper/models/x/tweet_create_params.rbi +5 -8
  121. data/rbi/x_twitter_scraper/models/x/tweet_create_response.rbi +1108 -14
  122. data/rbi/x_twitter_scraper/models/x/tweet_delete_params.rbi +6 -0
  123. data/rbi/x_twitter_scraper/models/x/tweet_delete_response.rbi +1140 -3
  124. data/rbi/x_twitter_scraper/models/x/tweets/like_create_params.rbi +6 -0
  125. data/rbi/x_twitter_scraper/models/x/tweets/like_create_response.rbi +1154 -3
  126. data/rbi/x_twitter_scraper/models/x/tweets/like_delete_params.rbi +6 -0
  127. data/rbi/x_twitter_scraper/models/x/tweets/like_delete_response.rbi +1154 -3
  128. data/rbi/x_twitter_scraper/models/x/tweets/retweet_create_params.rbi +6 -0
  129. data/rbi/x_twitter_scraper/models/x/tweets/retweet_create_response.rbi +1154 -3
  130. data/rbi/x_twitter_scraper/models/x/tweets/retweet_delete_params.rbi +6 -0
  131. data/rbi/x_twitter_scraper/models/x/tweets/retweet_delete_response.rbi +1154 -3
  132. data/rbi/x_twitter_scraper/models/x/user_remove_follower_params.rbi +6 -0
  133. data/rbi/x_twitter_scraper/models/x/user_remove_follower_response.rbi +1152 -3
  134. data/rbi/x_twitter_scraper/models/x/user_retrieve_following_params.rbi +2 -2
  135. data/rbi/x_twitter_scraper/models/x/user_retrieve_replies_params.rbi +2 -2
  136. data/rbi/x_twitter_scraper/models/x/users/follow_create_params.rbi +6 -0
  137. data/rbi/x_twitter_scraper/models/x/users/follow_create_response.rbi +1154 -3
  138. data/rbi/x_twitter_scraper/models/x/users/follow_delete_all_params.rbi +6 -0
  139. data/rbi/x_twitter_scraper/models/x/users/follow_delete_all_response.rbi +1154 -3
  140. data/rbi/x_twitter_scraper/models/x/write_action_retrieve_response.rbi +930 -66
  141. data/rbi/x_twitter_scraper/models/x/x_account.rbi +9 -9
  142. data/rbi/x_twitter_scraper/models/x/x_account_detail.rbi +1 -1
  143. data/rbi/x_twitter_scraper/resources/compose.rbi +12 -38
  144. data/rbi/x_twitter_scraper/resources/credits.rbi +1 -1
  145. data/rbi/x_twitter_scraper/resources/extractions.rbi +4 -4
  146. data/rbi/x_twitter_scraper/resources/guest_wallets.rbi +2 -2
  147. data/rbi/x_twitter_scraper/resources/monitors/keywords.rbi +4 -5
  148. data/rbi/x_twitter_scraper/resources/monitors.rbi +3 -3
  149. data/rbi/x_twitter_scraper/resources/support/tickets.rbi +17 -2
  150. data/rbi/x_twitter_scraper/resources/trends.rbi +1 -1
  151. data/rbi/x_twitter_scraper/resources/x/communities/join.rbi +16 -4
  152. data/rbi/x_twitter_scraper/resources/x/communities.rbi +19 -7
  153. data/rbi/x_twitter_scraper/resources/x/dm.rbi +10 -3
  154. data/rbi/x_twitter_scraper/resources/x/media.rbi +9 -4
  155. data/rbi/x_twitter_scraper/resources/x/profile.rbi +27 -8
  156. data/rbi/x_twitter_scraper/resources/x/tweets/like.rbi +16 -4
  157. data/rbi/x_twitter_scraper/resources/x/tweets/retweet.rbi +16 -4
  158. data/rbi/x_twitter_scraper/resources/x/tweets.rbi +31 -12
  159. data/rbi/x_twitter_scraper/resources/x/users/follow.rbi +16 -4
  160. data/rbi/x_twitter_scraper/resources/x/users.rbi +13 -7
  161. data/rbi/x_twitter_scraper/resources/x.rbi +1 -2
  162. data/sig/x_twitter_scraper/models/compose_create_params.rbs +150 -90
  163. data/sig/x_twitter_scraper/models/compose_create_response.rbs +249 -27
  164. data/sig/x_twitter_scraper/models/error.rbs +170 -7
  165. data/sig/x_twitter_scraper/models/guest_wallet_create_response.rbs +35 -5
  166. data/sig/x_twitter_scraper/models/guest_wallet_topup_response.rbs +35 -5
  167. data/sig/x_twitter_scraper/models/support/ticket_create_params.rbs +7 -1
  168. data/sig/x_twitter_scraper/models/support/ticket_create_response.rbs +49 -5
  169. data/sig/x_twitter_scraper/models/support/ticket_reply_params.rbs +7 -1
  170. data/sig/x_twitter_scraper/models/support/ticket_reply_response.rbs +49 -5
  171. data/sig/x_twitter_scraper/models/support/ticket_retrieve_response.rbs +113 -2
  172. data/sig/x_twitter_scraper/models/x/communities/join_create_params.rbs +5 -1
  173. data/sig/x_twitter_scraper/models/x/communities/join_create_response.rbs +540 -4
  174. data/sig/x_twitter_scraper/models/x/communities/join_delete_all_params.rbs +5 -1
  175. data/sig/x_twitter_scraper/models/x/communities/join_delete_all_response.rbs +540 -4
  176. data/sig/x_twitter_scraper/models/x/community_create_params.rbs +10 -1
  177. data/sig/x_twitter_scraper/models/x/community_create_response.rbs +528 -7
  178. data/sig/x_twitter_scraper/models/x/community_delete_params.rbs +10 -1
  179. data/sig/x_twitter_scraper/models/x/community_delete_response.rbs +540 -4
  180. data/sig/x_twitter_scraper/models/x/dm_send_params.rbs +5 -0
  181. data/sig/x_twitter_scraper/models/x/dm_send_response.rbs +539 -5
  182. data/sig/x_twitter_scraper/models/x/media_upload_params.rbs +5 -1
  183. data/sig/x_twitter_scraper/models/x/media_upload_response.rbs +534 -7
  184. data/sig/x_twitter_scraper/models/x/profile_update_avatar_params.rbs +5 -1
  185. data/sig/x_twitter_scraper/models/x/profile_update_avatar_response.rbs +540 -4
  186. data/sig/x_twitter_scraper/models/x/profile_update_banner_params.rbs +5 -1
  187. data/sig/x_twitter_scraper/models/x/profile_update_banner_response.rbs +540 -4
  188. data/sig/x_twitter_scraper/models/x/profile_update_params.rbs +5 -0
  189. data/sig/x_twitter_scraper/models/x/profile_update_response.rbs +540 -4
  190. data/sig/x_twitter_scraper/models/x/tweet_author.rbs +3 -11
  191. data/sig/x_twitter_scraper/models/x/tweet_create_params.rbs +4 -6
  192. data/sig/x_twitter_scraper/models/x/tweet_create_response.rbs +518 -11
  193. data/sig/x_twitter_scraper/models/x/tweet_delete_params.rbs +5 -1
  194. data/sig/x_twitter_scraper/models/x/tweet_delete_response.rbs +540 -4
  195. data/sig/x_twitter_scraper/models/x/tweets/like_create_params.rbs +5 -1
  196. data/sig/x_twitter_scraper/models/x/tweets/like_create_response.rbs +540 -4
  197. data/sig/x_twitter_scraper/models/x/tweets/like_delete_params.rbs +5 -1
  198. data/sig/x_twitter_scraper/models/x/tweets/like_delete_response.rbs +540 -4
  199. data/sig/x_twitter_scraper/models/x/tweets/retweet_create_params.rbs +5 -1
  200. data/sig/x_twitter_scraper/models/x/tweets/retweet_create_response.rbs +540 -4
  201. data/sig/x_twitter_scraper/models/x/tweets/retweet_delete_params.rbs +5 -1
  202. data/sig/x_twitter_scraper/models/x/tweets/retweet_delete_response.rbs +540 -4
  203. data/sig/x_twitter_scraper/models/x/user_remove_follower_params.rbs +5 -1
  204. data/sig/x_twitter_scraper/models/x/user_remove_follower_response.rbs +540 -4
  205. data/sig/x_twitter_scraper/models/x/users/follow_create_params.rbs +5 -1
  206. data/sig/x_twitter_scraper/models/x/users/follow_create_response.rbs +540 -4
  207. data/sig/x_twitter_scraper/models/x/users/follow_delete_all_params.rbs +5 -1
  208. data/sig/x_twitter_scraper/models/x/users/follow_delete_all_response.rbs +540 -4
  209. data/sig/x_twitter_scraper/models/x/write_action_retrieve_response.rbs +428 -54
  210. data/sig/x_twitter_scraper/resources/compose.rbs +2 -12
  211. data/sig/x_twitter_scraper/resources/support/tickets.rbs +2 -0
  212. data/sig/x_twitter_scraper/resources/x/communities/join.rbs +2 -0
  213. data/sig/x_twitter_scraper/resources/x/communities.rbs +2 -0
  214. data/sig/x_twitter_scraper/resources/x/dm.rbs +1 -0
  215. data/sig/x_twitter_scraper/resources/x/media.rbs +1 -0
  216. data/sig/x_twitter_scraper/resources/x/profile.rbs +3 -0
  217. data/sig/x_twitter_scraper/resources/x/tweets/like.rbs +2 -0
  218. data/sig/x_twitter_scraper/resources/x/tweets/retweet.rbs +2 -0
  219. data/sig/x_twitter_scraper/resources/x/tweets.rbs +2 -1
  220. data/sig/x_twitter_scraper/resources/x/users/follow.rbs +2 -0
  221. data/sig/x_twitter_scraper/resources/x/users.rbs +1 -0
  222. metadata +17 -26
@@ -6,13 +6,18 @@ module XTwitterScraper
6
6
  class Tweets
7
7
  # X write actions (tweets, likes, follows, DMs)
8
8
  class Like
9
+ # Some parameter documentations has been truncated, see
10
+ # {XTwitterScraper::Models::X::Tweets::LikeCreateParams} for more details.
11
+ #
9
12
  # Like tweet
10
13
  #
11
- # @overload create(id, account:, request_options: {})
14
+ # @overload create(id, account:, idempotency_key:, request_options: {})
15
+ #
16
+ # @param id [String] Path param: Tweet ID to like
12
17
  #
13
- # @param id [String] Tweet ID to like
18
+ # @param account [String] Body param: X account identifier (@username or account ID)
14
19
  #
15
- # @param account [String] X account identifier (@username or account ID)
20
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
16
21
  #
17
22
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
18
23
  #
@@ -21,22 +26,29 @@ module XTwitterScraper
21
26
  # @see XTwitterScraper::Models::X::Tweets::LikeCreateParams
22
27
  def create(id, params)
23
28
  parsed, options = XTwitterScraper::X::Tweets::LikeCreateParams.dump_request(params)
29
+ header_params = {idempotency_key: "idempotency-key"}
24
30
  @client.request(
25
31
  method: :post,
26
32
  path: ["x/tweets/%1$s/like", id],
27
- body: parsed,
33
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
34
+ body: parsed.except(*header_params.keys),
28
35
  model: XTwitterScraper::Models::X::Tweets::LikeCreateResponse,
29
36
  options: options
30
37
  )
31
38
  end
32
39
 
40
+ # Some parameter documentations has been truncated, see
41
+ # {XTwitterScraper::Models::X::Tweets::LikeDeleteParams} for more details.
42
+ #
33
43
  # Unlike tweet
34
44
  #
35
- # @overload delete(id, account:, request_options: {})
45
+ # @overload delete(id, account:, idempotency_key:, request_options: {})
46
+ #
47
+ # @param id [String] Path param: Tweet ID to unlike
36
48
  #
37
- # @param id [String] Tweet ID to unlike
49
+ # @param account [String] Body param: X account identifier (@username or account ID)
38
50
  #
39
- # @param account [String] X account identifier (@username or account ID)
51
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
40
52
  #
41
53
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
42
54
  #
@@ -45,10 +57,12 @@ module XTwitterScraper
45
57
  # @see XTwitterScraper::Models::X::Tweets::LikeDeleteParams
46
58
  def delete(id, params)
47
59
  parsed, options = XTwitterScraper::X::Tweets::LikeDeleteParams.dump_request(params)
60
+ header_params = {idempotency_key: "idempotency-key"}
48
61
  @client.request(
49
62
  method: :delete,
50
63
  path: ["x/tweets/%1$s/like", id],
51
- body: parsed,
64
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
65
+ body: parsed.except(*header_params.keys),
52
66
  model: XTwitterScraper::Models::X::Tweets::LikeDeleteResponse,
53
67
  options: options
54
68
  )
@@ -6,13 +6,18 @@ module XTwitterScraper
6
6
  class Tweets
7
7
  # X write actions (tweets, likes, follows, DMs)
8
8
  class Retweet
9
+ # Some parameter documentations has been truncated, see
10
+ # {XTwitterScraper::Models::X::Tweets::RetweetCreateParams} for more details.
11
+ #
9
12
  # Retweet
10
13
  #
11
- # @overload create(id, account:, request_options: {})
14
+ # @overload create(id, account:, idempotency_key:, request_options: {})
15
+ #
16
+ # @param id [String] Path param: Tweet ID to retweet
12
17
  #
13
- # @param id [String] Tweet ID to retweet
18
+ # @param account [String] Body param: X account identifier (@username or account ID)
14
19
  #
15
- # @param account [String] X account identifier (@username or account ID)
20
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
16
21
  #
17
22
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
18
23
  #
@@ -21,22 +26,29 @@ module XTwitterScraper
21
26
  # @see XTwitterScraper::Models::X::Tweets::RetweetCreateParams
22
27
  def create(id, params)
23
28
  parsed, options = XTwitterScraper::X::Tweets::RetweetCreateParams.dump_request(params)
29
+ header_params = {idempotency_key: "idempotency-key"}
24
30
  @client.request(
25
31
  method: :post,
26
32
  path: ["x/tweets/%1$s/retweet", id],
27
- body: parsed,
33
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
34
+ body: parsed.except(*header_params.keys),
28
35
  model: XTwitterScraper::Models::X::Tweets::RetweetCreateResponse,
29
36
  options: options
30
37
  )
31
38
  end
32
39
 
40
+ # Some parameter documentations has been truncated, see
41
+ # {XTwitterScraper::Models::X::Tweets::RetweetDeleteParams} for more details.
42
+ #
33
43
  # Unretweet
34
44
  #
35
- # @overload delete(id, account:, request_options: {})
45
+ # @overload delete(id, account:, idempotency_key:, request_options: {})
46
+ #
47
+ # @param id [String] Path param: Tweet ID to unretweet
36
48
  #
37
- # @param id [String] Tweet ID to unretweet
49
+ # @param account [String] Body param: X account identifier (@username or account ID)
38
50
  #
39
- # @param account [String] X account identifier (@username or account ID)
51
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
40
52
  #
41
53
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
42
54
  #
@@ -45,10 +57,12 @@ module XTwitterScraper
45
57
  # @see XTwitterScraper::Models::X::Tweets::RetweetDeleteParams
46
58
  def delete(id, params)
47
59
  parsed, options = XTwitterScraper::X::Tweets::RetweetDeleteParams.dump_request(params)
60
+ header_params = {idempotency_key: "idempotency-key"}
48
61
  @client.request(
49
62
  method: :delete,
50
63
  path: ["x/tweets/%1$s/retweet", id],
51
- body: parsed,
64
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
65
+ body: parsed.except(*header_params.keys),
52
66
  model: XTwitterScraper::Models::X::Tweets::RetweetDeleteResponse,
53
67
  options: options
54
68
  )
@@ -17,21 +17,21 @@ module XTwitterScraper
17
17
  #
18
18
  # Create tweet
19
19
  #
20
- # @overload create(account:, attachment_url: nil, community_id: nil, is_note_tweet: nil, media: nil, reply_to_tweet_id: nil, text: nil, request_options: {})
20
+ # @overload create(account:, idempotency_key:, community_id: nil, is_note_tweet: nil, media: nil, reply_to_tweet_id: nil, text: nil, request_options: {})
21
21
  #
22
- # @param account [String] X account (@username or account ID)
22
+ # @param account [String] Body param: X account (@username or account ID)
23
23
  #
24
- # @param attachment_url [String]
24
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
25
25
  #
26
- # @param community_id [String]
26
+ # @param community_id [String] Body param
27
27
  #
28
- # @param is_note_tweet [Boolean]
28
+ # @param is_note_tweet [Boolean] Body param
29
29
  #
30
- # @param media [Array<String>] Array of public media URLs to attach. Supports up to 4 images or exactly 1 MP4 v
30
+ # @param media [Array<String>] Body param: Array of public media URLs to attach. Supports up to 4 images or exa
31
31
  #
32
- # @param reply_to_tweet_id [String]
32
+ # @param reply_to_tweet_id [String] Body param
33
33
  #
34
- # @param text [String] Tweet text (optional when media is provided)
34
+ # @param text [String] Body param: Tweet text (optional when media is provided)
35
35
  #
36
36
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
37
37
  #
@@ -40,16 +40,18 @@ module XTwitterScraper
40
40
  # @see XTwitterScraper::Models::X::TweetCreateParams
41
41
  def create(params)
42
42
  parsed, options = XTwitterScraper::X::TweetCreateParams.dump_request(params)
43
+ header_params = {idempotency_key: "idempotency-key"}
43
44
  @client.request(
44
45
  method: :post,
45
46
  path: "x/tweets",
46
- body: parsed,
47
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
48
+ body: parsed.except(*header_params.keys),
47
49
  model: XTwitterScraper::Models::X::TweetCreateResponse,
48
50
  options: options
49
51
  )
50
52
  end
51
53
 
52
- # Get tweet with full text, author, metrics and media
54
+ # Get tweet with full text, author, metrics & media
53
55
  #
54
56
  # @overload retrieve(id, request_options: {})
55
57
  #
@@ -92,13 +94,18 @@ module XTwitterScraper
92
94
  )
93
95
  end
94
96
 
97
+ # Some parameter documentations has been truncated, see
98
+ # {XTwitterScraper::Models::X::TweetDeleteParams} for more details.
99
+ #
95
100
  # Delete tweet
96
101
  #
97
- # @overload delete(id, account:, request_options: {})
102
+ # @overload delete(id, account:, idempotency_key:, request_options: {})
103
+ #
104
+ # @param id [String] Path param: Tweet ID to delete
98
105
  #
99
- # @param id [String] Tweet ID to delete
106
+ # @param account [String] Body param: X account identifier (@username or account ID)
100
107
  #
101
- # @param account [String] X account identifier (@username or account ID)
108
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
102
109
  #
103
110
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
104
111
  #
@@ -107,10 +114,12 @@ module XTwitterScraper
107
114
  # @see XTwitterScraper::Models::X::TweetDeleteParams
108
115
  def delete(id, params)
109
116
  parsed, options = XTwitterScraper::X::TweetDeleteParams.dump_request(params)
117
+ header_params = {idempotency_key: "idempotency-key"}
110
118
  @client.request(
111
119
  method: :delete,
112
120
  path: ["x/tweets/%1$s", id],
113
- body: parsed,
121
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
122
+ body: parsed.except(*header_params.keys),
114
123
  model: XTwitterScraper::Models::X::TweetDeleteResponse,
115
124
  options: options
116
125
  )
@@ -119,7 +128,9 @@ module XTwitterScraper
119
128
  # Some parameter documentations has been truncated, see
120
129
  # {XTwitterScraper::Models::X::TweetGetFavoritersParams} for more details.
121
130
  #
122
- # List users who liked a tweet
131
+ # Returns liker profiles that X makes visible for the post. X can withhold liker
132
+ # identities even when the post reports likes. In that case this endpoint returns
133
+ # 424 `favoriters_unavailable` instead of a misleading empty success.
123
134
  #
124
135
  # @overload get_favoriters(id, cursor: nil, page_size: nil, request_options: {})
125
136
  #
@@ -257,7 +268,11 @@ module XTwitterScraper
257
268
  # Some parameter documentations has been truncated, see
258
269
  # {XTwitterScraper::Models::X::TweetGetRepliesParams} for more details.
259
270
  #
260
- # List replies to a tweet
271
+ # Returns visible replies. For an unfiltered first page, Xquik compares a terminal
272
+ # page with the post's reported reply count. If the page is visibly incomplete,
273
+ # the endpoint returns 424 `replies_incomplete` instead of presenting partial
274
+ # coverage as complete. Use tweet search with a `conversation_id:{id}` query as
275
+ # the broader fallback.
261
276
  #
262
277
  # @overload get_replies(id, any_words: nil, cashtags: nil, conversation_id: nil, cursor: nil, exact_phrase: nil, exclude_words: nil, from_user: nil, hashtags: nil, in_reply_to_tweet_id: nil, language: nil, media_type: nil, mentioning: nil, min_faves: nil, min_quotes: nil, min_replies: nil, min_retweets: nil, page_size: nil, quotes: nil, quotes_of_tweet_id: nil, replies: nil, retweets: nil, retweets_of_tweet_id: nil, since_date: nil, since_time: nil, to_user: nil, until_date: nil, until_time: nil, url: nil, verified_only: nil, request_options: {})
263
278
  #
@@ -6,13 +6,18 @@ module XTwitterScraper
6
6
  class Users
7
7
  # X write actions (tweets, likes, follows, DMs)
8
8
  class Follow
9
+ # Some parameter documentations has been truncated, see
10
+ # {XTwitterScraper::Models::X::Users::FollowCreateParams} for more details.
11
+ #
9
12
  # Follow user
10
13
  #
11
- # @overload create(id, account:, request_options: {})
14
+ # @overload create(id, account:, idempotency_key:, request_options: {})
15
+ #
16
+ # @param id [String] Path param: User ID to follow
12
17
  #
13
- # @param id [String] User ID to follow
18
+ # @param account [String] Body param: X account identifier (@username or account ID)
14
19
  #
15
- # @param account [String] X account identifier (@username or account ID)
20
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
16
21
  #
17
22
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
18
23
  #
@@ -21,22 +26,29 @@ module XTwitterScraper
21
26
  # @see XTwitterScraper::Models::X::Users::FollowCreateParams
22
27
  def create(id, params)
23
28
  parsed, options = XTwitterScraper::X::Users::FollowCreateParams.dump_request(params)
29
+ header_params = {idempotency_key: "idempotency-key"}
24
30
  @client.request(
25
31
  method: :post,
26
32
  path: ["x/users/%1$s/follow", id],
27
- body: parsed,
33
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
34
+ body: parsed.except(*header_params.keys),
28
35
  model: XTwitterScraper::Models::X::Users::FollowCreateResponse,
29
36
  options: options
30
37
  )
31
38
  end
32
39
 
40
+ # Some parameter documentations has been truncated, see
41
+ # {XTwitterScraper::Models::X::Users::FollowDeleteAllParams} for more details.
42
+ #
33
43
  # Unfollow user
34
44
  #
35
- # @overload delete_all(id, account:, request_options: {})
45
+ # @overload delete_all(id, account:, idempotency_key:, request_options: {})
46
+ #
47
+ # @param id [String] Path param: User ID to unfollow
36
48
  #
37
- # @param id [String] User ID to unfollow
49
+ # @param account [String] Body param: X account identifier (@username or account ID)
38
50
  #
39
- # @param account [String] X account identifier (@username or account ID)
51
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
40
52
  #
41
53
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
42
54
  #
@@ -45,10 +57,12 @@ module XTwitterScraper
45
57
  # @see XTwitterScraper::Models::X::Users::FollowDeleteAllParams
46
58
  def delete_all(id, params)
47
59
  parsed, options = XTwitterScraper::X::Users::FollowDeleteAllParams.dump_request(params)
60
+ header_params = {idempotency_key: "idempotency-key"}
48
61
  @client.request(
49
62
  method: :delete,
50
63
  path: ["x/users/%1$s/follow", id],
51
- body: parsed,
64
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
65
+ body: parsed.except(*header_params.keys),
52
66
  model: XTwitterScraper::Models::X::Users::FollowDeleteAllResponse,
53
67
  options: options
54
68
  )
@@ -8,7 +8,7 @@ module XTwitterScraper
8
8
  # @return [XTwitterScraper::Resources::X::Users::Follow]
9
9
  attr_reader :follow
10
10
 
11
- # Get user profile with follower counts and verification
11
+ # Get user profile with follower counts & verification
12
12
  #
13
13
  # @overload retrieve(id, request_options: {})
14
14
  #
@@ -28,13 +28,18 @@ module XTwitterScraper
28
28
  )
29
29
  end
30
30
 
31
+ # Some parameter documentations has been truncated, see
32
+ # {XTwitterScraper::Models::X::UserRemoveFollowerParams} for more details.
33
+ #
31
34
  # Remove follower
32
35
  #
33
- # @overload remove_follower(id, account:, request_options: {})
36
+ # @overload remove_follower(id, account:, idempotency_key:, request_options: {})
34
37
  #
35
- # @param id [String] User ID to remove from your followers
38
+ # @param id [String] Path param: User ID to remove from your followers
36
39
  #
37
- # @param account [String] X account identifier (@username or account ID)
40
+ # @param account [String] Body param: X account identifier (@username or account ID)
41
+ #
42
+ # @param idempotency_key [String] Header param: Generate one unique value for each intended write. Reuse it only w
38
43
  #
39
44
  # @param request_options [XTwitterScraper::RequestOptions, Hash{Symbol=>Object}, nil]
40
45
  #
@@ -43,10 +48,12 @@ module XTwitterScraper
43
48
  # @see XTwitterScraper::Models::X::UserRemoveFollowerParams
44
49
  def remove_follower(id, params)
45
50
  parsed, options = XTwitterScraper::X::UserRemoveFollowerParams.dump_request(params)
51
+ header_params = {idempotency_key: "idempotency-key"}
46
52
  @client.request(
47
53
  method: :post,
48
54
  path: ["x/users/%1$s/remove-follower", id],
49
- body: parsed,
55
+ headers: parsed.slice(*header_params.keys).transform_keys(header_params),
56
+ body: parsed.except(*header_params.keys),
50
57
  model: XTwitterScraper::Models::X::UserRemoveFollowerResponse,
51
58
  options: options
52
59
  )
@@ -85,7 +92,7 @@ module XTwitterScraper
85
92
  #
86
93
  # @overload retrieve_followers(id, after: nil, cursor: nil, limit: nil, page_size: nil, request_options: {})
87
94
  #
88
- # @param id [String] User ID or username
95
+ # @param id [String] Target user ID or username for follower lookup.
89
96
  #
90
97
  # @param after [String] Legacy cursor alias. Prefer cursor.
91
98
  #
@@ -152,7 +159,7 @@ module XTwitterScraper
152
159
  #
153
160
  # @param id [String] User ID or username for following lookup
154
161
  #
155
- # @param after [String] Legacy cursor alias. Prefer cursor.
162
+ # @param after [String] Deprecated following cursor alias. Prefer cursor.
156
163
  #
157
164
  # @param cursor [String] Pagination cursor for following list
158
165
  #
@@ -487,7 +494,7 @@ module XTwitterScraper
487
494
  #
488
495
  # @overload retrieve_replies(id, any_words: nil, cashtags: nil, conversation_id: nil, cursor: nil, exact_phrase: nil, exclude_words: nil, from_user: nil, hashtags: nil, include_parent_tweet: nil, in_reply_to_tweet_id: nil, language: nil, media_type: nil, mentioning: nil, min_faves: nil, min_quotes: nil, min_replies: nil, min_retweets: nil, page_size: nil, quotes: nil, quotes_of_tweet_id: nil, replies: nil, retweets: nil, retweets_of_tweet_id: nil, since_date: nil, to_user: nil, until_date: nil, url: nil, verified_only: nil, request_options: {})
489
496
  #
490
- # @param id [String] X user ID or username
497
+ # @param id [String] Target user ID or username for the replies timeline.
491
498
  #
492
499
  # @param any_words [String] Words or quoted phrases where any one can match. Separate with spaces, commas, o
493
500
  #
@@ -505,7 +512,7 @@ module XTwitterScraper
505
512
  #
506
513
  # @param hashtags [String] Hashtags separated by spaces, commas, or lines.
507
514
  #
508
- # @param include_parent_tweet [Boolean] Include parent tweet for replies
515
+ # @param include_parent_tweet [Boolean] Include each reply's parent tweet.
509
516
  #
510
517
  # @param in_reply_to_tweet_id [String] Only replies to this tweet ID.
511
518
  #
@@ -20,7 +20,6 @@ module XTwitterScraper
20
20
  # @return [XTwitterScraper::Resources::X::Dm]
21
21
  attr_reader :dm
22
22
 
23
- # Media upload and download
24
23
  # @return [XTwitterScraper::Resources::X::Media]
25
24
  attr_reader :media
26
25
 
@@ -121,7 +120,7 @@ module XTwitterScraper
121
120
  )
122
121
  end
123
122
 
124
- # Get trending hashtags and topics from X by region
123
+ # Get trending hashtags & topics from X by region
125
124
  #
126
125
  # @overload get_trends(count: nil, woeid: nil, request_options: {})
127
126
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module XTwitterScraper
4
- VERSION = "0.4.5"
4
+ VERSION = "0.5.2"
5
5
  end
@@ -41,7 +41,7 @@ module XTwitterScraper
41
41
  sig { returns(XTwitterScraper::Resources::Radar) }
42
42
  attr_reader :radar
43
43
 
44
- # Real-time X account monitoring
44
+ # X account monitoring with 1-second checks
45
45
  sig { returns(XTwitterScraper::Resources::Monitors) }
46
46
  attr_reader :monitors
47
47
 
@@ -126,11 +126,11 @@ module XTwitterScraper
126
126
  sig { returns(String) }
127
127
  attr_accessor :active_hourly_burn
128
128
 
129
- # Estimated daily credits for 1 active instant monitor.
129
+ # Rounded daily estimate for 1 active monitor.
130
130
  sig { returns(String) }
131
131
  attr_accessor :credits_per_active_monitor_day
132
132
 
133
- # Hourly credits charged for 1 active instant monitor.
133
+ # Hourly credits charged for 1 active monitor.
134
134
  sig { returns(String) }
135
135
  attr_accessor :credits_per_active_monitor_hour
136
136
 
@@ -162,9 +162,9 @@ module XTwitterScraper
162
162
  active_daily_estimate:,
163
163
  # Credits charged each hour for currently active monitors.
164
164
  active_hourly_burn:,
165
- # Estimated daily credits for 1 active instant monitor.
165
+ # Rounded daily estimate for 1 active monitor.
166
166
  credits_per_active_monitor_day:,
167
- # Hourly credits charged for 1 active instant monitor.
167
+ # Hourly credits charged for 1 active monitor.
168
168
  credits_per_active_monitor_hour:,
169
169
  # Webhook and event deliveries are included in monitor billing.
170
170
  events_included:,