apick-api 4.1.0 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # 4.2.1
2
+
3
+ - `youtubeSubtitle()` fails with guidance to use an original-language track when an auto-translated caption (`translated: true`) is refused; such calls are not charged. Examples now pick a manual or original-language track. YouTube requests interrupted by a server restart are retried automatically.
4
+ - 자동 번역 자막(`translated: true`)을 받지 못하면 원어 자막을 쓰라는 안내와 함께 실패로 응답합니다(과금 없음). 예제는 수동·원어 자막을 고르도록 바꿨습니다. 서버 재시작으로 끊긴 유튜브 요청은 서버가 자동으로 다시 시도합니다.
5
+
6
+ # 4.2.0
7
+
8
+ - Add `amazonProduct`, `xProfile` and `xPost`, and collection jobs `createInstagramPostsJob`, `createInstagramCommentsJob`, `createTiktokSearchJob`, `createTiktokVideoJob`, `createTiktokCommentsJob`, `createAmazonReviewsJob` with `getScrapeJob` and `waitForScrapeJob`, all with typed results.
9
+ - Collection jobs reserve `maxResults` × unit price and charge only the results actually returned; failures are fully refunded and results are kept for 72 hours.
10
+ - 아마존 상품, X 프로필·게시물 조회와 인스타그램 게시물 목록·댓글, 틱톡 키워드 검색·영상·댓글, 아마존 리뷰 수집 작업 메서드, 작업 조회·대기 메서드와 결과 타입을 추가했습니다.
11
+ - 수집 작업은 `maxResults` × 단가를 예약하고 실제 결과 건수만 차감합니다. 실패는 전액 환불, 결과는 72시간 보관합니다.
12
+
1
13
  # 4.1.0
2
14
 
3
15
  - Add YouTube methods: `youtubeSearch`, `youtubeChannel`, `youtubePlaylist`, `youtubeHashtag`, `youtubeFormats`, `youtubeComments`, `downloadYoutubeVideo` and `downloadYoutubeAudio`. Downloads return a download link valid for 1 hour and are billed as a base fee plus 2 points per 10MB.
package/README.md CHANGED
@@ -78,7 +78,7 @@ Leave the allowed-IP list blank for unrestricted access. To restrict access, reg
78
78
  | `youtubeMetadata(url)` | 유튜브 영상 정보 / YouTube video metadata | JSON |
79
79
  | `youtubeThumbnail(url)` | 유튜브 썸네일 / YouTube thumbnail | JPG |
80
80
  | `youtubeSubtitleList(url)` | 유튜브 자막 언어 목록 / YouTube subtitle languages | JSON |
81
- | `youtubeSubtitle(url, lang, options)` | 유튜브 자막 다운로드 / YouTube subtitles | VTT·SRT·TXT |
81
+ | `youtubeSubtitle(url, lang, options)` | 유튜브 자막 다운로드(원어 자막 권장) / YouTube subtitles (prefer original-language tracks) | VTT·SRT·TXT |
82
82
  | `youtubeSearch(query, options)` | 유튜브 검색(정렬·필터) / YouTube search with sort and filters | JSON |
83
83
  | `youtubeChannel(channel, options)` | 유튜브 채널 정보·탭 목록 / YouTube channel and tab items | JSON |
84
84
  | `youtubePlaylist(url, options)` | 유튜브 재생목록 / YouTube playlist | JSON |
@@ -90,6 +90,16 @@ Leave the allowed-IP list blank for unrestricted access. To restrict access, reg
90
90
  | `instagramProfile(usernameOrUrl)` | 인스타그램 공개 프로필 / Instagram public profile | JSON |
91
91
  | `instagramPost(url)` | 인스타그램 게시물·릴스 / Instagram post or reel | JSON |
92
92
  | `tiktokProfile(usernameOrUrl)` | 틱톡 공개 프로필 / TikTok public profile | JSON |
93
+ | `amazonProduct(urlOrAsin)` | 아마존 상품 정보 / Amazon product | JSON |
94
+ | `xProfile(usernameOrUrl)` | X 공개 프로필·최근 게시물 / X public profile and recent posts | JSON |
95
+ | `xPost(url)` | X 게시물 / X post | JSON |
96
+ | `createInstagramPostsJob(usernameOrUrl, options)` | 인스타그램 게시물 목록 수집 접수(최대 100) / Instagram posts job | JSON |
97
+ | `createInstagramCommentsJob(url, options)` | 인스타그램 댓글 수집 접수(최대 15) / Instagram comments job | JSON |
98
+ | `createTiktokSearchJob(keyword, options)` | 틱톡 키워드 영상 검색 접수(최대 50) / TikTok keyword search job | JSON |
99
+ | `createTiktokVideoJob(url, options)` | 틱톡 영상 정보 접수 / TikTok video job | JSON |
100
+ | `createTiktokCommentsJob(url, options)` | 틱톡 댓글 수집 접수(최대 100) / TikTok comments job | JSON |
101
+ | `createAmazonReviewsJob(urlOrAsin, options)` | 아마존 리뷰 수집 접수(최대 100) / Amazon reviews job | JSON |
102
+ | `getScrapeJob(jobId)` / `waitForScrapeJob(jobId, options)` | 수집 작업 상태·결과(무료, 결과 건수로 정산) / Collection job status and results | JSON |
93
103
  | `createTtsJob(text, options)` | 한국어 내레이션 작업 접수 / Create TTS job | JSON |
94
104
  | `getTtsJob(jobId)` | TTS 작업 상태 / TTS job status | JSON |
95
105
  | `cancelTtsJob(jobId)` | 대기·생성 중 TTS 작업 취소 / Cancel waiting or processing TTS job | JSON |
package/docs/guide.en.md CHANGED
@@ -82,6 +82,18 @@ Only public information from public accounts is returned. Lookups usually take 2
82
82
  const instagram = await client.instagramProfile('natgeo');
83
83
  const post = await client.instagramPost('https://www.instagram.com/p/DeHufcWDCjf/');
84
84
  const tiktok = await client.tiktokProfile('https://www.tiktok.com/@tiktok');
85
+ const product = await client.amazonProduct('B0BDHWDR12');
86
+ const x = await client.xProfile('NASA');
87
+ ```
88
+
89
+ ### Collection jobs (lists, comments, search, reviews)
90
+
91
+ Products that collect many items return a `job_id` immediately. Submitting reserves `maxResults` × unit price; when you read the result, only the results actually returned are charged and the rest is refunded. Failed jobs and missing targets are fully refunded, and results are kept for 72 hours. Comment and review authors are public usernames only.
92
+
93
+ ```js
94
+ const job = await client.createTiktokSearchJob('camping recipes', { maxResults: 10, idempotencyKey: 'camping-0001' });
95
+ const done = await client.waitForScrapeJob(job.data.job_id); // every 10 s, up to 10 min
96
+ console.log(done.data.status, done.data.charged_point, done.data.items);
85
97
  ```
86
98
 
87
99
  ## OCR
@@ -116,7 +128,9 @@ await screenshot.save('./example.jpeg');
116
128
  // Public YouTube videos: a video URL or the 11-character video ID
117
129
  const video = await client.youtubeMetadata('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
118
130
  const tracks = await client.youtubeSubtitleList(video.data.video_id);
119
- const subtitle = await client.youtubeSubtitle(video.data.video_id, 'en', { format: 'srt' });
131
+ // Auto-translated captions (translated=true) may be refused by YouTube, so pick a manual or original-language track.
132
+ const track = tracks.data.subtitles[0] || tracks.data.automatic_captions.find(item => !item.translated);
133
+ const subtitle = await client.youtubeSubtitle(video.data.video_id, track.lang, { format: 'srt' });
120
134
  await subtitle.save('./' + subtitle.filename);
121
135
  await (await client.youtubeThumbnail(video.data.video_id)).save('./thumbnail.jpg');
122
136
 
package/docs/guide.ko.md CHANGED
@@ -82,6 +82,18 @@ const rank = await client.googleRankCheck('주소 검색 API', 'apick.app'); //
82
82
  const instagram = await client.instagramProfile('natgeo');
83
83
  const post = await client.instagramPost('https://www.instagram.com/p/DeHufcWDCjf/');
84
84
  const tiktok = await client.tiktokProfile('https://www.tiktok.com/@tiktok');
85
+ const product = await client.amazonProduct('B0BDHWDR12');
86
+ const x = await client.xProfile('NASA');
87
+ ```
88
+
89
+ ### 수집 작업(목록·댓글·검색·리뷰)
90
+
91
+ 여러 건을 모으는 상품은 접수 즉시 `job_id` 를 돌려줍니다. 접수 때 `maxResults` × 단가를 예약하고, 결과를 받을 때 실제 결과 건수만 차감한 뒤 나머지는 돌려드립니다. 실패하거나 대상이 없으면 전액 환불되며 결과는 72시간 보관합니다. 댓글·리뷰 작성자는 공개 사용자명만 제공합니다.
92
+
93
+ ```js
94
+ const job = await client.createTiktokSearchJob('캠핑 요리', { maxResults: 10, idempotencyKey: 'camping-0001' });
95
+ const done = await client.waitForScrapeJob(job.data.job_id); // 기본 10초 간격, 최대 10분
96
+ console.log(done.data.status, done.data.charged_point, done.data.items);
85
97
  ```
86
98
 
87
99
  ## OCR
@@ -116,7 +128,9 @@ await screenshot.save('./example.jpeg');
116
128
  // 유튜브 공개 영상: 영상 주소 또는 11자리 영상 ID
117
129
  const video = await client.youtubeMetadata('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
118
130
  const tracks = await client.youtubeSubtitleList(video.data.video_id);
119
- const subtitle = await client.youtubeSubtitle(video.data.video_id, 'en', { format: 'srt' });
131
+ // 자동 번역 자막(translated=true)은 유튜브 제한으로 받지 못할 수 있어 수동 자막이나 원어 자동 자막을 고른다.
132
+ const track = tracks.data.subtitles[0] || tracks.data.automatic_captions.find(item => !item.translated);
133
+ const subtitle = await client.youtubeSubtitle(video.data.video_id, track.lang, { format: 'srt' });
120
134
  await subtitle.save('./' + subtitle.filename);
121
135
  await (await client.youtubeThumbnail(video.data.video_id)).save('./thumbnail.jpg');
122
136
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apick-api",
3
- "version": "4.1.0",
3
+ "version": "4.2.1",
4
4
  "description": "Official zero-dependency Node.js client for APICK data, AI, and image APIs. 에이픽 데이터·AI·이미지 API 공식 Node.js SDK.",
5
5
  "type": "module",
6
6
  "main": "./src/index.cjs",
package/src/index.cjs CHANGED
@@ -44,6 +44,10 @@ const SERVICE_DEFINITIONS = Object.freeze({
44
44
  instagramProfile: { endpoint: '/rest/instagram_profile', timeoutMs: 110_000, output: 'json' },
45
45
  instagramPost: { endpoint: '/rest/instagram_post', timeoutMs: 110_000, output: 'json' },
46
46
  tiktokProfile: { endpoint: '/rest/tiktok_profile', timeoutMs: 110_000, output: 'json' },
47
+ amazonProduct: { endpoint: '/rest/amazon_product', timeoutMs: 110_000, output: 'json' },
48
+ xProfile: { endpoint: '/rest/x_profile', timeoutMs: 110_000, output: 'json' },
49
+ xPost: { endpoint: '/rest/x_post', timeoutMs: 110_000, output: 'json' },
50
+ getScrapeJob: { endpoint: '/rest/scrape_jobs', timeoutMs: 35_000, output: 'json' },
47
51
  screenshot: { endpoint: '/rest/url_screenshot', timeoutMs: 75_000, output: 'binary', filename: 'screenshot.jpeg' },
48
52
  youtubeMetadata: { endpoint: '/rest/youtube_metadata', timeoutMs: 60_000, output: 'json' },
49
53
  youtubeThumbnail: { endpoint: '/rest/youtube_thumbnail', timeoutMs: 60_000, output: 'binary', filename: 'thumbnail.jpg' },
@@ -93,6 +97,29 @@ function profileInput(value) {
93
97
  return /^https?:\/\//i.test(text) ? { url: text } : { username: text.replace(/^@/, '') };
94
98
  }
95
99
 
100
+ // 아마존 상품 입력: 주소면 url, 10자리 ASIN 이면 asin 으로 보낸다.
101
+ function amazonInput(value) {
102
+ const text = requiredString('urlOrAsin', value, 2048);
103
+ return /^https?:\/\//i.test(text) ? { url: text } : { asin: text.toUpperCase() };
104
+ }
105
+
106
+ const SCRAPE_JOB_PRODUCTS = Object.freeze({ instagram_posts: 100, instagram_comments: 15, tiktok_search: 50, tiktok_video: 1, tiktok_comments: 100, amazon_reviews: 100 });
107
+
108
+ // 수집 작업 공통 옵션: maxResults(상품별 상한), idempotencyKey(응답을 못 받아 다시 보낼 때 같은 접수로 처리).
109
+ function scrapeJobOptions(product, payload, options) {
110
+ const config = options || {};
111
+ if (config.maxResults !== undefined && SCRAPE_JOB_PRODUCTS[product] > 1) {
112
+ const max = Number(config.maxResults);
113
+ if (!Number.isInteger(max) || max < 1 || max > SCRAPE_JOB_PRODUCTS[product]) throw new RangeError(`maxResults must be an integer from 1 to ${SCRAPE_JOB_PRODUCTS[product]}.`);
114
+ payload.max_results = max;
115
+ }
116
+ if (config.idempotencyKey !== undefined) {
117
+ if (typeof config.idempotencyKey !== 'string' || !/^[A-Za-z0-9_.:-]{8,128}$/.test(config.idempotencyKey)) throw new TypeError('idempotencyKey must be 8-128 characters of letters, digits, and . _ : -');
118
+ payload.idempotency_key = config.idempotencyKey;
119
+ }
120
+ return payload;
121
+ }
122
+
96
123
  function requiredString(name, value, maxLength) {
97
124
  if (typeof value !== 'string' || !value.trim()) {
98
125
  throw new TypeError(`${name} must be a non-empty string.`);
@@ -639,6 +666,68 @@ class ApickClient {
639
666
  return this._call('tiktokProfile', profileInput(usernameOrUrl));
640
667
  }
641
668
 
669
+ // 상품 주소(/dp/ASIN) 또는 10자리 ASIN(미국 아마존).
670
+ amazonProduct(urlOrAsin) {
671
+ return this._call('amazonProduct', amazonInput(urlOrAsin));
672
+ }
673
+
674
+ xProfile(usernameOrUrl) {
675
+ return this._call('xProfile', profileInput(usernameOrUrl));
676
+ }
677
+
678
+ xPost(url) {
679
+ return this._call('xPost', { url: requiredString('url', url, 2048) });
680
+ }
681
+
682
+ // 수집 작업: 접수 즉시 job_id 를 돌려준다. maxResults × 단가를 예약하고 결과를 받을 때 실제 건수만 차감한다.
683
+ _createScrapeJob(product, payload, options) {
684
+ return this._call('getScrapeJob', scrapeJobOptions(product, payload, options), null, { endpoint: '/rest/' + product + '/jobs', json: true });
685
+ }
686
+
687
+ createInstagramPostsJob(usernameOrUrl, options) {
688
+ return this._createScrapeJob('instagram_posts', profileInput(usernameOrUrl), options);
689
+ }
690
+
691
+ createInstagramCommentsJob(url, options) {
692
+ return this._createScrapeJob('instagram_comments', { url: requiredString('url', url, 2048) }, options);
693
+ }
694
+
695
+ createTiktokSearchJob(keyword, options) {
696
+ return this._createScrapeJob('tiktok_search', { keyword: requiredString('keyword', keyword, 100) }, options);
697
+ }
698
+
699
+ createTiktokVideoJob(url, options) {
700
+ return this._createScrapeJob('tiktok_video', { url: requiredString('url', url, 2048) }, options);
701
+ }
702
+
703
+ createTiktokCommentsJob(url, options) {
704
+ return this._createScrapeJob('tiktok_comments', { url: requiredString('url', url, 2048) }, options);
705
+ }
706
+
707
+ createAmazonReviewsJob(urlOrAsin, options) {
708
+ return this._createScrapeJob('amazon_reviews', amazonInput(urlOrAsin), options);
709
+ }
710
+
711
+ // 상태·결과 조회(무료). 끝난 작업은 실제 결과 건수로 정산돼 있다.
712
+ getScrapeJob(jobId) {
713
+ if (typeof jobId !== 'string' || !/^[a-f0-9]{32}$/.test(jobId)) throw new TypeError('jobId must be a 32-character job ID.');
714
+ return this._call('getScrapeJob', null, null, { endpoint: '/rest/scrape_jobs/' + jobId, method: 'GET', timeoutMs: 70_000 });
715
+ }
716
+
717
+ // completed 또는 failed 가 될 때까지 조회한다. 기본 10초 간격, 최대 10분.
718
+ async waitForScrapeJob(jobId, options) {
719
+ const config = options || {};
720
+ const intervalMs = Math.max(3_000, positiveInteger('intervalMs', config.intervalMs, 10_000));
721
+ const deadline = Date.now() + positiveInteger('timeoutMs', config.timeoutMs, 600_000);
722
+ for (;;) {
723
+ const result = await this.getScrapeJob(jobId);
724
+ const status = result && result.data && result.data.status;
725
+ if (status === 'completed' || status === 'failed') return result;
726
+ if (Date.now() + intervalMs > deadline) throw new ApickApiError('Scrape job did not finish in time.', { code: 'APICK_TIMEOUT' });
727
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
728
+ }
729
+ }
730
+
642
731
  screenshot(url) {
643
732
  return this._call('screenshot', { url: normalizeUrl(url) });
644
733
  }
package/src/index.d.ts CHANGED
@@ -79,6 +79,148 @@ export interface RankCheck {
79
79
  readonly unchecked_ranks: readonly string[];
80
80
  }
81
81
 
82
+ export interface AmazonProduct {
83
+ readonly asin: string;
84
+ readonly url: string;
85
+ readonly title: string;
86
+ readonly brand: string;
87
+ readonly price: number | null;
88
+ readonly original_price: number | null;
89
+ readonly currency: string;
90
+ readonly rating: number | null;
91
+ readonly reviews_count: number | null;
92
+ readonly availability: string;
93
+ readonly is_available: boolean;
94
+ readonly bought_past_month: number | null;
95
+ readonly seller_name: string;
96
+ readonly categories: readonly string[];
97
+ readonly features: readonly string[];
98
+ readonly customers_say: string;
99
+ readonly image_url: string;
100
+ readonly image_urls: readonly string[];
101
+ readonly date_first_available: string;
102
+ readonly model_number: string;
103
+ }
104
+
105
+ export interface XPostSummary {
106
+ readonly post_id: string;
107
+ readonly url: string;
108
+ readonly text: string;
109
+ readonly posted_at: string;
110
+ readonly likes: number | null;
111
+ readonly reposts: number | null;
112
+ readonly replies: number | null;
113
+ readonly views: number | null;
114
+ readonly hashtags: readonly string[];
115
+ }
116
+
117
+ export interface XProfile {
118
+ readonly username: string;
119
+ readonly name: string;
120
+ readonly biography: string;
121
+ readonly followers: number | null;
122
+ readonly following: number | null;
123
+ readonly posts_count: number | null;
124
+ readonly is_verified: boolean;
125
+ readonly is_business_account: boolean;
126
+ readonly is_government_account: boolean;
127
+ readonly location: string;
128
+ readonly website: string;
129
+ readonly joined_at: string;
130
+ readonly profile_image_url: string;
131
+ readonly banner_image_url: string;
132
+ readonly profile_url: string;
133
+ readonly recent_posts: readonly XPostSummary[];
134
+ }
135
+
136
+ export interface XPost {
137
+ readonly post_id: string;
138
+ readonly url: string;
139
+ readonly username: string;
140
+ readonly name: string;
141
+ readonly text: string;
142
+ readonly posted_at: string;
143
+ readonly likes: number | null;
144
+ readonly reposts: number | null;
145
+ readonly replies: number | null;
146
+ readonly quotes: number | null;
147
+ readonly views: number | null;
148
+ readonly bookmarks: number | null;
149
+ readonly hashtags: readonly string[];
150
+ readonly is_repost: boolean;
151
+ readonly photo_urls: readonly string[];
152
+ readonly video_urls: readonly string[];
153
+ readonly author: { readonly followers: number | null; readonly is_verified: boolean };
154
+ }
155
+
156
+ export interface TiktokVideo {
157
+ readonly video_id: string;
158
+ readonly url: string;
159
+ readonly username: string;
160
+ readonly description: string;
161
+ readonly posted_at: string;
162
+ readonly views: number | null;
163
+ readonly likes: number | null;
164
+ readonly comments: number | null;
165
+ readonly shares: number | null;
166
+ readonly saves: number | null;
167
+ readonly duration_sec: number | null;
168
+ readonly hashtags: readonly string[];
169
+ readonly region: string;
170
+ readonly cover_image_url: string;
171
+ readonly author: { readonly followers: number | null; readonly is_verified: boolean };
172
+ }
173
+
174
+ /** 댓글 작성자는 공개 사용자명만 제공한다. */
175
+ export interface SocialComment {
176
+ readonly comment_id: string;
177
+ readonly username: string;
178
+ readonly text: string;
179
+ readonly posted_at: string;
180
+ readonly likes: number | null;
181
+ readonly replies: number | null;
182
+ }
183
+
184
+ export interface AmazonReview {
185
+ readonly review_id: string;
186
+ readonly rating: number | null;
187
+ readonly title: string;
188
+ readonly text: string;
189
+ readonly author: string;
190
+ readonly posted_at: string;
191
+ readonly country: string;
192
+ readonly is_verified_purchase: boolean;
193
+ readonly helpful_count: number | null;
194
+ readonly variant: string;
195
+ }
196
+
197
+ export type ScrapeJobProduct = "instagram_posts" | "instagram_comments" | "tiktok_search" | "tiktok_video" | "tiktok_comments" | "amazon_reviews";
198
+
199
+ export interface ScrapeJobOptions {
200
+ /** 최대 결과 수. 이 수 × 단가를 예약하고 실제 결과 건수만 차감한다(instagram_comments 15, tiktok_search 50, 그 밖 100). */
201
+ readonly maxResults?: number;
202
+ /** 응답을 못 받아 다시 보낼 때 같은 접수로 처리할 키(8~128자). */
203
+ readonly idempotencyKey?: string;
204
+ }
205
+
206
+ export interface ScrapeJob<T = unknown> {
207
+ readonly job_id: string;
208
+ readonly product: ScrapeJobProduct;
209
+ readonly status: "waiting" | "processing" | "completed" | "failed";
210
+ readonly max_results: number;
211
+ readonly unit_point: number;
212
+ readonly reserved_point: number;
213
+ readonly charged_point: number;
214
+ readonly result_count: number;
215
+ readonly created_at: string;
216
+ readonly completed_at: string | null;
217
+ /** 결과 보관 기한(완료 후 72시간). */
218
+ readonly result_expires_at?: string;
219
+ readonly result_expired?: boolean;
220
+ readonly items?: readonly T[];
221
+ readonly error?: { readonly code: string; readonly message: string };
222
+ }
223
+
82
224
  export interface InstagramProfile {
83
225
  readonly username: string;
84
226
  readonly full_name: string;
@@ -313,6 +455,7 @@ export interface YoutubeMetadata {
313
455
  age_limit: number | null; chapters: YoutubeChapter[]; thumbnail: string | null; thumbnails: YoutubeThumbnail[];
314
456
  subtitle_languages: string[]; automatic_caption_count: number;
315
457
  }
458
+ /** translated=true 인 자동 번역 자막은 유튜브 제한으로 받지 못할 수 있다. 수동 자막이나 원어 자동 자막을 권장한다. */
316
459
  export interface YoutubeSubtitleTrack { lang: string; name: string | null; auto: boolean; formats: string[]; translated?: boolean; }
317
460
  export interface YoutubeSubtitleList {
318
461
  video_id: string; title: string | null; original_language: string | null;
@@ -472,6 +615,17 @@ export class ApickClient {
472
615
  instagramProfile(usernameOrUrl: string): Promise<ApickResult<InstagramProfile>>;
473
616
  instagramPost(url: string): Promise<ApickResult<InstagramPost>>;
474
617
  tiktokProfile(usernameOrUrl: string): Promise<ApickResult<TiktokProfile>>;
618
+ amazonProduct(urlOrAsin: string): Promise<ApickResult<AmazonProduct>>;
619
+ xProfile(usernameOrUrl: string): Promise<ApickResult<XProfile>>;
620
+ xPost(url: string): Promise<ApickResult<XPost>>;
621
+ createInstagramPostsJob(usernameOrUrl: string, options?: ScrapeJobOptions): Promise<ApickResult<ScrapeJob<InstagramPost>>>;
622
+ createInstagramCommentsJob(url: string, options?: ScrapeJobOptions): Promise<ApickResult<ScrapeJob<SocialComment>>>;
623
+ createTiktokSearchJob(keyword: string, options?: ScrapeJobOptions): Promise<ApickResult<ScrapeJob<TiktokVideo>>>;
624
+ createTiktokVideoJob(url: string, options?: Pick<ScrapeJobOptions, "idempotencyKey">): Promise<ApickResult<ScrapeJob<TiktokVideo>>>;
625
+ createTiktokCommentsJob(url: string, options?: ScrapeJobOptions): Promise<ApickResult<ScrapeJob<SocialComment>>>;
626
+ createAmazonReviewsJob(urlOrAsin: string, options?: ScrapeJobOptions): Promise<ApickResult<ScrapeJob<AmazonReview>>>;
627
+ getScrapeJob<T = unknown>(jobId: string): Promise<ApickResult<ScrapeJob<T>>>;
628
+ waitForScrapeJob<T = unknown>(jobId: string, options?: { intervalMs?: number; timeoutMs?: number }): Promise<ApickResult<ScrapeJob<T>>>;
475
629
  screenshot(url: string): Promise<ApickBinaryResult>;
476
630
  youtubeMetadata(url: string): Promise<ApickResult<YoutubeMetadata>>;
477
631
  youtubeThumbnail(url: string): Promise<ApickBinaryResult>;