@scrapecreators/cli 1.0.27 → 1.0.29

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.
@@ -0,0 +1,132 @@
1
+ const sampleTelegramPost = {
2
+ id: "543",
3
+ channel_handle: "durov",
4
+ url: "https://t.me/durov/543",
5
+ author_name: "Pavel Durov",
6
+ author_url: "https://t.me/durov",
7
+ text: "Telegram has applied for the .gram domain zone. If approved, Telegram users could get their own second-level domains.",
8
+ published_at: "2026-08-18T17:37:31+00:00",
9
+ view_count: 1210000,
10
+ view_count_text: "1.21M",
11
+ reactions: [
12
+ {
13
+ emoji: "⭐",
14
+ emoji_id: null,
15
+ count: 16300,
16
+ count_text: "16.3K",
17
+ },
18
+ {
19
+ emoji: null,
20
+ emoji_id: "5373223594484587136",
21
+ count: 44700,
22
+ count_text: "44.7K",
23
+ },
24
+ ],
25
+ reaction_count: 89300,
26
+ forwarded_from: null,
27
+ media: [],
28
+ link_preview: null,
29
+ };
30
+
31
+ const sampleTelegramChannel = {
32
+ handle: "telegram",
33
+ name: "Telegram News",
34
+ description: "The official Telegram on Telegram. Much recursion. Very Telegram. Wow.",
35
+ url: "https://t.me/telegram",
36
+ avatar_url: "https://cdn1.telesco.pe/file/...",
37
+ is_verified: true,
38
+ subscriber_count: 9780000,
39
+ subscriber_count_text: "9.78M",
40
+ member_count: null,
41
+ member_count_text: null,
42
+ photo_count: 14,
43
+ video_count: 225,
44
+ file_count: null,
45
+ link_count: 372,
46
+ };
47
+
48
+ export const telegramApis = {
49
+ id: "telegram",
50
+ name: "Telegram",
51
+ description: "Scrape public Telegram channels, groups, and posts",
52
+ endpoints: [
53
+ {
54
+ name: "Channel Details",
55
+ method: "GET",
56
+ description: "Get public Telegram channel or group details from its web preview.",
57
+ fullDescription:
58
+ "Retrieves public Telegram channel or group metadata including its name, description, avatar, verification status, subscriber or member count, and public media counters. This endpoint uses Telegram's public web preview and does not use a logged-in Telegram account. Private channels, invite-only groups, numeric IDs, and channels with no public web preview are not supported.",
59
+ path: "/v1/telegram/channel",
60
+ sampleResponse: sampleTelegramChannel,
61
+ params: [
62
+ {
63
+ name: "handle",
64
+ type: "string",
65
+ required: true,
66
+ placeholder: "telegram",
67
+ description:
68
+ "Public Telegram handle, @handle, or t.me channel URL.",
69
+ },
70
+ ],
71
+ },
72
+ {
73
+ name: "Channel Posts",
74
+ method: "GET",
75
+ description: "Get one page of recent public posts from a Telegram channel or group.",
76
+ fullDescription:
77
+ "Retrieves one public web-preview page of Telegram posts with text, publish date, views, reactions when exposed, forwards, media previews, and link previews. Pass the returned cursor to fetch the previous page. Empty and terminal pages are not charged. Telegram does not expose every field on every public post, so reactions and downloadable media URLs can be absent. This endpoint does not support private or invite-only channels and groups.",
78
+ path: "/v1/telegram/channel/posts",
79
+ paginationField: "cursor",
80
+ sampleResponse: {
81
+ channel: {
82
+ ...sampleTelegramChannel,
83
+ handle: "durov",
84
+ name: "Pavel Durov",
85
+ description: "Founder of Telegram.",
86
+ url: "https://t.me/durov",
87
+ subscriber_count: 11100000,
88
+ subscriber_count_text: "11.1M",
89
+ },
90
+ posts: [sampleTelegramPost],
91
+ cursor: "523",
92
+ has_more: true,
93
+ },
94
+ params: [
95
+ {
96
+ name: "handle",
97
+ type: "string",
98
+ required: true,
99
+ placeholder: "durov",
100
+ description:
101
+ "Public Telegram handle, @handle, or t.me channel URL.",
102
+ },
103
+ {
104
+ name: "cursor",
105
+ type: "string",
106
+ required: false,
107
+ placeholder: "523",
108
+ description:
109
+ "Numeric cursor returned by the previous page. Omit it for the latest posts.",
110
+ },
111
+ ],
112
+ },
113
+ {
114
+ name: "Post Details",
115
+ method: "GET",
116
+ description: "Get one public Telegram post by URL.",
117
+ fullDescription:
118
+ "Retrieves one public Telegram post with its text, publish date, views, reactions when exposed, forward source, media previews, and link preview. This endpoint uses Telegram's public post widget without a logged-in account. Private and invite-only posts are not supported.",
119
+ path: "/v1/telegram/post",
120
+ sampleResponse: sampleTelegramPost,
121
+ params: [
122
+ {
123
+ name: "url",
124
+ type: "string",
125
+ required: true,
126
+ placeholder: "https://t.me/durov/543",
127
+ description: "Public Telegram post URL.",
128
+ },
129
+ ],
130
+ },
131
+ ],
132
+ };
@@ -180,12 +180,85 @@ export const tiktokBaseApis = {
180
180
  ],
181
181
  },
182
182
  },
183
+ {
184
+ name: "Collection Videos",
185
+ method: "GET",
186
+ description:
187
+ "Scrapes the videos in a public TikTok collection. Pass cursor to get more videos.",
188
+ fullDescription:
189
+ "Fetches the videos saved in a public TikTok collection, which TikTok also calls a playlist. Pass the collection URL. Returns `videos` using TikTok's native web video object format, including `id`, `desc`, `author`, `stats`, and `video`. To fetch the next page, pass the previous response's `max_cursor` as `cursor` when `has_more` is true.",
190
+ path: "/v1/tiktok/collection/videos",
191
+ paginationField: "max_cursor",
192
+ params: [
193
+ {
194
+ name: "url",
195
+ type: "string",
196
+ required: true,
197
+ description: "Public TikTok collection URL",
198
+ placeholder:
199
+ "https://www.tiktok.com/@kibblemaster808/collection/Want-to-go-7665668414573546258",
200
+ },
201
+ {
202
+ name: "cursor",
203
+ type: "string",
204
+ required: false,
205
+ description:
206
+ "Cursor to get more videos. Use max_cursor from the previous response.",
207
+ placeholder: "4",
208
+ },
209
+ ],
210
+ sampleResponse: {
211
+ success: true,
212
+ credits_remaining: 100,
213
+ collection_id: "7665668414573546258",
214
+ has_more: false,
215
+ max_cursor: "5",
216
+ status_code: 0,
217
+ status_msg: "",
218
+ videos: [
219
+ {
220
+ AIGCDescription: "",
221
+ CategoryType: 116,
222
+ IsHDBitrate: false,
223
+ ShowAIGC: true,
224
+ anchors: [
225
+ {
226
+ description: "CapCut · Video Editor",
227
+ type: 54,
228
+ },
229
+ ],
230
+ author: {
231
+ id: "7506421330087576593",
232
+ uniqueId: "miotravelapp",
233
+ nickname: "miotravelapp",
234
+ },
235
+ createTime: 1784185607,
236
+ desc: "How often do you reckon they think about the Roman Empire? 🐈‍⬛",
237
+ id: "7663018809392909588",
238
+ stats: {
239
+ collectCount: 18900,
240
+ commentCount: 359,
241
+ diggCount: 113000,
242
+ playCount: 865200,
243
+ shareCount: 15700,
244
+ },
245
+ video: {
246
+ duration: 68,
247
+ height: 1024,
248
+ width: 576,
249
+ cover:
250
+ "https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/oUYM7iBIKB1BL5CGgwAtAiwJEfLCFXAiX9IAEA~tplv-tiktokx-origin.image",
251
+ },
252
+ },
253
+ ],
254
+ },
255
+ },
183
256
  {
184
257
  name: "Profile Videos",
185
258
  method: "GET",
186
259
  description:
187
- "Scrapes videos from a TikTok profile. Pass cursor to get more videos.",
188
- fullDescription: "Fetches videos posted by a TikTok user, sortable by latest or most popular — use this to get a creator's video feed or TikToks. Returns `aweme_list`, an array of video objects each containing `aweme_id`, `desc` (caption), `statistics` (play_count, digg_count/likes, comment_count, share_count, collect_count/saves), and `video` (download URLs, duration, cover image). Paginate with `max_cursor` from the previous response.",
260
+ "Scrapes videos from a TikTok profile. Pass cursor to get more videos. If a profile should have videos but returns none, try `region=US` or another relevant region.",
261
+ fullDescription: "Fetches videos posted by a TikTok user, sortable by latest or most popular — use this to get a creator's video feed or TikToks. Returns `aweme_list`, an array of video objects each containing `aweme_id`, `desc` (caption), `statistics` (play_count, digg_count/likes, comment_count, share_count, collect_count/saves), and `video` (download URLs, duration, cover image). Paginate with `max_cursor` from the previous response. If a profile should have videos but returns none, try `region=US` or another relevant two-letter country code.",
189
262
  path: "/v3/tiktok/profile/videos",
190
263
  paginationField: "max_cursor",
191
264
  params: [
@@ -223,8 +296,9 @@ export const tiktokBaseApis = {
223
296
  name: "region",
224
297
  type: "string",
225
298
  required: false,
226
- placeholder: "US",
227
- description: "Region (Country) you want the proxy in. Defaults to US.",
299
+ placeholder: "GB",
300
+ description:
301
+ "Region (country) for the proxy. Defaults to GB. If a profile should have videos but returns none, try US or another relevant two-letter country code.",
228
302
  },
229
303
  {
230
304
  name: "trim",
@@ -5543,10 +5617,10 @@ export const tiktokBaseApis = {
5543
5617
  },
5544
5618
  },
5545
5619
  {
5546
- name: "TikTok Live",
5620
+ name: "Live",
5547
5621
  method: "GET",
5548
5622
  description: "Scrapes a TikTok user's live stream",
5549
- fullDescription: "Checks if a TikTok user is currently live streaming and retrieves their live room details. Returns `liveRoomUserInfo` (nickname, avatar, followerCount, roomId) and `liveRoom` (title, startTime, status, `liveRoomStats` with enterCount and userCount, plus `streamData` with playback URLs in multiple qualities).",
5623
+ fullDescription: "Checks if a TikTok user is currently live streaming and retrieves their live room details. Use the top-level `is_live` boolean instead of checking TikTok's numeric status values yourself. Also returns `liveRoomUserInfo` (nickname, avatar, followerCount, roomId) and `liveRoom` (title, startTime, status, `liveRoomStats` with enterCount and userCount, plus `streamData` with playback URLs in multiple qualities).",
5550
5624
  path: "/v1/tiktok/user/live",
5551
5625
  params: [
5552
5626
  {
@@ -5559,6 +5633,7 @@ export const tiktokBaseApis = {
5559
5633
  ],
5560
5634
  sampleResponse: {
5561
5635
  success: true,
5636
+ is_live: true,
5562
5637
  liveRoomUserInfo: {
5563
5638
  avatarLarger:
5564
5639
  "https://p19-pu-sign-useast8.tiktokcdn-us.com/tos-useast5-avt-0068-tx/b169e9223700dc8d20d327510eb47f94~tplv-tiktokx-cropcenter:1080:1080.webp?dr=9640&refresh_token=c39a7259&x-expires=1751918400&x-signature=2Q%2F13wVO%2F%2F5OFBDinwMuULyBINc%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=useast5",
@@ -5661,6 +5736,45 @@ export const tiktokBaseApis = {
5661
5736
  },
5662
5737
  },
5663
5738
  },
5739
+ {
5740
+ name: "Live Info",
5741
+ method: "GET",
5742
+ description: "Gets info for a TikTok live room, including like count.",
5743
+ fullDescription:
5744
+ "Gets curated room-level info for a TikTok live using TokAPI's live info endpoint. Use `/v1/tiktok/user/live` first to find the `room_id`. If you only have a TikTok handle and need the user's numeric id, use `/v1/tiktok/profile` first to get `user.id`. This endpoint is separate from `/v1/tiktok/user/live` because it uses a different upstream call and returns a smaller response with the most relevant fields: `room_id`, `like_count`, `viewer_count`, `status`, `title`, `cover_url`, and `owner`.",
5745
+ path: "/v1/tiktok/live",
5746
+ params: [
5747
+ {
5748
+ name: "room_id",
5749
+ type: "string",
5750
+ required: true,
5751
+ description:
5752
+ "TikTok live room id. Get this from `/v1/tiktok/user/live` in `liveRoomUserInfo.roomId` or `liveRoom.id` when the user is live.",
5753
+ placeholder: "7523685855395842871",
5754
+ },
5755
+ {
5756
+ name: "user_id",
5757
+ type: "string",
5758
+ required: true,
5759
+ description:
5760
+ "TikTok numeric user id for the live owner. Get this from `/v1/tiktok/profile` in `user.id`.",
5761
+ placeholder: "6742945285876515845",
5762
+ },
5763
+ ],
5764
+ sampleResponse: {
5765
+ room_id: "7523685855395842871",
5766
+ like_count: 4317,
5767
+ viewer_count: 268,
5768
+ status: "live",
5769
+ title: "6'13 Grateful Streamer",
5770
+ cover_url: "https://p16-webcast.tiktokcdn-us.com/webcast/cover.jpeg",
5771
+ owner: {
5772
+ id: "6742945285876515845",
5773
+ username: "thejustalex",
5774
+ display_name: "JustAlex",
5775
+ },
5776
+ },
5777
+ },
5664
5778
  {
5665
5779
  name: "Comments",
5666
5780
  method: "GET",
@@ -10721,6 +10835,96 @@ export const tiktokBaseApis = {
10721
10835
  },
10722
10836
  ],
10723
10837
  },
10838
+ {
10839
+ name: "Search Suggestions",
10840
+ method: "GET",
10841
+ description: "Gets TikTok autocomplete search suggestions for a query.",
10842
+ fullDescription:
10843
+ "Gets the autocomplete suggestions TikTok shows while someone is typing in search. Returns `suggestions`, a clean array of suggested search terms and the most useful metadata for each suggestion.",
10844
+ path: "/v1/tiktok/search/suggestions",
10845
+ sampleResponse: {
10846
+ success: true,
10847
+ credits_remaining: 49995926120,
10848
+ suggestions: [
10849
+ {
10850
+ text: "dogs cute",
10851
+ position: 0,
10852
+ language: "en",
10853
+ score: 0.011535803,
10854
+ },
10855
+ {
10856
+ text: "Dogs In Snow",
10857
+ position: 1,
10858
+ language: "en",
10859
+ score: 0.0013200018,
10860
+ },
10861
+ {
10862
+ text: "dogs season",
10863
+ position: 2,
10864
+ language: "en",
10865
+ score: 0.0013042383,
10866
+ },
10867
+ {
10868
+ text: "dogs with kids",
10869
+ position: 3,
10870
+ language: "en",
10871
+ score: 0.0012028236,
10872
+ },
10873
+ {
10874
+ text: "dogs protecting owners",
10875
+ position: 4,
10876
+ language: "en",
10877
+ score: 0.0008062465,
10878
+ },
10879
+ {
10880
+ text: "dogseven",
10881
+ position: 5,
10882
+ language: "en",
10883
+ score: 0.0011085697,
10884
+ },
10885
+ {
10886
+ text: "Dogs Video",
10887
+ position: 6,
10888
+ language: "en",
10889
+ score: 0.003553978,
10890
+ },
10891
+ {
10892
+ text: "dogs edit",
10893
+ position: 7,
10894
+ language: "en",
10895
+ score: 0.0014429367,
10896
+ },
10897
+ {
10898
+ text: "dogs funny videos",
10899
+ position: 8,
10900
+ language: "en",
10901
+ score: 0.0039043615,
10902
+ },
10903
+ {
10904
+ text: "dogs eating foods",
10905
+ position: 9,
10906
+ language: "en",
10907
+ score: 0.001083838,
10908
+ },
10909
+ ],
10910
+ },
10911
+ params: [
10912
+ {
10913
+ name: "query",
10914
+ type: "string",
10915
+ required: true,
10916
+ description: "Search query to get suggestions for",
10917
+ placeholder: "dogs",
10918
+ },
10919
+ {
10920
+ name: "region",
10921
+ type: "string",
10922
+ required: false,
10923
+ description: "Region code for suggestions",
10924
+ placeholder: "US",
10925
+ },
10926
+ ],
10927
+ },
10724
10928
  {
10725
10929
  name: "Search by Hashtag",
10726
10930
  method: "GET",
@@ -15876,6 +16080,7 @@ export const tiktokBaseApis = {
15876
16080
  // ],
15877
16081
  // },
15878
16082
  // },
16083
+ /* Retired July 16, 2026: TikTok no longer makes this data available.
15879
16084
  {
15880
16085
  name: "Get popular hashtags",
15881
16086
  method: "GET",
@@ -16047,6 +16252,7 @@ export const tiktokBaseApis = {
16047
16252
  },
16048
16253
  },
16049
16254
  },
16255
+ */
16050
16256
  {
16051
16257
  name: "Get Song Details",
16052
16258
  method: "GET",
@@ -47,7 +47,7 @@ export const tiktokShopApis = {
47
47
  ],
48
48
  placeholder: "US",
49
49
  description:
50
- "Region to search shop products in.",
50
+ "Region to search shop products in. Non-US TikTok Shop regions are not reliable right now and may return limited or inconsistent results. Sorry for the inconvenience.",
51
51
  },
52
52
  ],
53
53
  sampleResponse: {
@@ -185,8 +185,8 @@ export const tiktokShopApis = {
185
185
  name: "Shop Products",
186
186
  method: "GET",
187
187
  description:
188
- "Get the products from a TikTok Shop. This endpoint costs 1 credit per request. Use the cursor from the response to paginate through results.",
189
- fullDescription: "Lists all products from a specific TikTok Shop store by its URL. Returns an array of product objects each with `title`, `cover` images, `url`, `price` info, `sold_count`, `review_count`, and `rating`. Paginate with `cursor` from the previous response; filter by region; use `sort_by=top` for best-selling products or `sort_by=new_releases` for newest products.",
188
+ "Get the products from a TikTok Shop. This endpoint costs 1 credit per request. Use the cursor from the response to paginate through results. Non-US shop catalog coverage depends on TikTok exposing that shop in the selected region.",
189
+ fullDescription: "Lists all products from a specific TikTok Shop store by its URL. Returns an array of product objects each with `title`, `cover` images, `url`, `price` info, `sold_count`, `review_count`, and `rating`. Paginate with `cursor` from the previous response; filter by region; use `sort_by=top` for best-selling products or `sort_by=new_releases` for newest products. Non-US shop catalog coverage depends on TikTok exposing that shop in the selected region, so some shops can return `not_found` outside the US even when they appear in shop search.",
190
190
  path: "/v1/tiktok/shop/products",
191
191
  params: [
192
192
  {
@@ -237,7 +237,7 @@ export const tiktokShopApis = {
237
237
  ],
238
238
  placeholder: "US",
239
239
  description:
240
- "Region to get shop products from. Defaults to US if not provided.",
240
+ "Region to get shop products from. Defaults to US if not provided. Non-US regions are not reliable right now and may return `not_found` or limited catalog data even when the shop appears in search. Sorry for the inconvenience.",
241
241
  },
242
242
  ],
243
243
  sampleResponse: {
@@ -375,8 +375,8 @@ export const tiktokShopApis = {
375
375
  name: "Product Details",
376
376
  method: "GET",
377
377
  description:
378
- "Get the details of a TikTok Shop Product! Get the exact amount of stock the product has, related tiktok videos promoting the product, and more!",
379
- fullDescription: "Fetches full details for a specific TikTok Shop product by its URL, including stock levels and affiliate videos. Returns `product_info` with `product_base` (title, images, sold_count, price), `skus` (variants with exact `stock` counts), and `product_detail_review` (product_rating, review_count, sample reviews); also returns `shop_info` (shop_name, shop_rating, followers_count) and `related_videos` (affiliate TikToks promoting the product). Related videos are only available in the US region.",
378
+ "Get the details of a TikTok Shop Product. This endpoint currently supports US TikTok Shop products only.",
379
+ fullDescription: "Fetches full details for a specific US TikTok Shop product by its URL, including stock levels and affiliate videos. Returns `product_info` with `product_base` (title, images, sold_count, price), `skus` (variants with exact `stock` counts), and `product_detail_review` (product_rating, review_count, sample reviews); also returns `shop_info` (shop_name, shop_rating, followers_count) and `related_videos` (affiliate TikToks promoting the product). This endpoint currently supports the US region only.",
380
380
  path: "/v1/tiktok/product",
381
381
  params: [
382
382
  {
@@ -392,7 +392,7 @@ export const tiktokShopApis = {
392
392
  required: false,
393
393
  type: "string",
394
394
  description:
395
- "Region the proxy will be set to so you can access products from that country. Use 2 letter country codes like US, GB, FR, etc. For England, don't use UK, use GB.",
395
+ "Region for the product details request. US is the reliable region right now; non-US regions should not be considered reliable and may return `bad_request` or missing product data. Sorry for the inconvenience.",
396
396
  placeholder: "US",
397
397
  },
398
398
  ],
@@ -770,7 +770,8 @@ export const tiktokShopApis = {
770
770
  },
771
771
  {
772
772
  name: "region",
773
- description: "The region of the product. This is *very* important.",
773
+ description:
774
+ "The region of the product. US is the reliable region right now; non-US regions should not be considered reliable and may return limited or inconsistent review data. Sorry for the inconvenience.",
774
775
  type: "string",
775
776
  required: false,
776
777
  placeholder: "US",
@@ -931,7 +932,8 @@ export const tiktokShopApis = {
931
932
  {
932
933
  name: "region",
933
934
  type: "string",
934
- description: "Region to put the proxy in",
935
+ description:
936
+ "Region to put the proxy in. Non-US TikTok Shop regions are not reliable right now and may return limited or inconsistent showcase data. Sorry for the inconvenience.",
935
937
  required: false,
936
938
  placeholder: "US",
937
939
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@scrapecreators/cli",
3
- "version": "1.0.27",
4
- "description": "CLI for the ScrapeCreators API — scrape 27+ social media platforms from the terminal",
3
+ "version": "1.0.29",
4
+ "description": "CLI for the ScrapeCreators API — use 180+ endpoints across 30+ platforms from the terminal",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "scrapecreators": "bin/scrapecreators.js"
package/src/cli.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Command } from "commander";
2
+ import { readFileSync } from "node:fs";
2
3
  import { registerApiCommands } from "./command-registry.js";
3
4
  import { authLogin, authStatus, authLogout } from "./commands/auth.js";
4
5
  import { configSet, configGet, configList } from "./commands/config.js";
@@ -7,13 +8,17 @@ import { listCommand } from "./commands/list.js";
7
8
  import { agentAddCommand } from "./commands/agent.js";
8
9
  import { runInteractive } from "./interactive.js";
9
10
 
11
+ const { version } = JSON.parse(
12
+ readFileSync(new URL("../package.json", import.meta.url), "utf8"),
13
+ );
14
+
10
15
  export function run(argv) {
11
16
  const program = new Command();
12
17
 
13
18
  program
14
19
  .name("scrapecreators")
15
- .description("CLI for the ScrapeCreators API — scrape 27+ social media platforms")
16
- .version("1.0.0")
20
+ .description("CLI for the ScrapeCreators API — use 180+ endpoints across 30+ platforms")
21
+ .version(version)
17
22
  .option("--api-key <key>", "API key (overrides env and config)")
18
23
  .option("--format <format>", "output format: json, table, csv, markdown", "auto")
19
24
  .option("--json", "shorthand for compact JSON (default)")