Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# Changelog

## [2.0.0](https://github.com/ScrapingBee/scrapingbee-node/compare/v1.8.2...v2.0.0) (2026-08-05)
## [2.0.0](https://github.com/ScrapingBee/scrapingbee-node/compare/v1.8.2...v2.0.0) (2026-08-24)

### Features

- The API key is now sent via the `Authorization: Bearer` header instead of the `api_key` query parameter, keeping keys out of URLs and server logs (SCR-584). No change to how you construct the client.
- Added `nb_results` param to Google Search params type
- Added `fastSearch()` method for Fast Search API
- Added `amazonPricing()` method for Amazon Pricing API
- Added `gemini()` method for Gemini API
Expand Down
1 change: 1 addition & 0 deletions dist/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ export declare type GoogleSearchParams = {
longitude?: number;
max_price?: number;
min_price?: number;
nb_results?: number;
nfpr?: boolean;
page?: number;
pages?: number;
Expand Down
3 changes: 1 addition & 2 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,11 @@ class ScrapingBeeClient {
}
request(config) {
var _a;
config.params['api_key'] = this.api_key;
const axiosConfig = {
method: config.method,
url: config.endpoint,
params: config.params,
headers: config.headers,
headers: Object.assign(Object.assign({}, config.headers), { Authorization: `Bearer ${this.api_key}` }),
data: config.data,
responseType: 'arraybuffer',
timeout: (_a = config.timeout) !== null && _a !== void 0 ? _a : 0,
Expand Down
8 changes: 5 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ export type GoogleSearchParams = {
longitude?: number;
max_price?: number;
min_price?: number;
nb_results?: number;
nfpr?: boolean;
page?: number;
pages?: number;
Expand Down Expand Up @@ -355,13 +356,14 @@ export class ScrapingBeeClient {
}

private request(config: Record<string, any>): AxiosPromise {
config.params['api_key'] = this.api_key;

const axiosConfig: AxiosRequestConfig = {
method: config.method as Method,
url: config.endpoint,
params: config.params,
headers: config.headers,
headers: {
...config.headers,
Authorization: `Bearer ${this.api_key}`,
},
data: config.data,
responseType: 'arraybuffer',
timeout: config.timeout ?? 0,
Expand Down
45 changes: 30 additions & 15 deletions tests/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ describe('test_ScrapingBeeClient.htmlApi', function () {
it('should make a GET request by default', async function () {
var res = await client.htmlApi({ url: target_url });
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['url'], target_url);
// @ts-ignore
assert.match(res.config.headers['User-Agent'], /^ScrapingBee-Node\//);
Expand All @@ -38,7 +39,8 @@ describe('test_ScrapingBeeClient.htmlApi', function () {
data: 'test=data'
});
assert.deepStrictEqual(res.status, 201);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
// @ts-ignore
assert.match(res.config.headers['User-Agent'], /^ScrapingBee-Node\//);
});
Expand Down Expand Up @@ -178,7 +180,8 @@ describe('test_ScrapingBeeClient.googleSearch', function () {
params: { language: 'en', country_code: 'us' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['search'], 'test query');
assert.deepStrictEqual(res.config.params['language'], 'en');
assert.deepStrictEqual(res.config.params['country_code'], 'us');
Expand Down Expand Up @@ -246,7 +249,8 @@ describe('test_ScrapingBeeClient.amazonSearch', function () {
params: { domain: 'com', language: 'en' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['query'], 'laptop');
assert.deepStrictEqual(res.config.params['domain'], 'com');
assert.deepStrictEqual(res.config.params['language'], 'en');
Expand Down Expand Up @@ -297,7 +301,8 @@ describe('test_ScrapingBeeClient.amazonProduct', function () {
params: { domain: 'com' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['query'], 'B0D2Q9397Y');
assert.deepStrictEqual(res.config.params['domain'], 'com');
});
Expand Down Expand Up @@ -344,7 +349,8 @@ describe('test_ScrapingBeeClient.walmartSearch', function () {
params: { sort_by: 'best_match', device: 'desktop' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['query'], 'laptop');
assert.deepStrictEqual(res.config.params['sort_by'], 'best_match');
});
Expand Down Expand Up @@ -394,7 +400,8 @@ describe('test_ScrapingBeeClient.walmartProduct', function () {
params: { device: 'desktop' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['product_id'], '123456789');
assert.deepStrictEqual(res.config.params['device'], 'desktop');
});
Expand Down Expand Up @@ -440,7 +447,8 @@ describe('test_ScrapingBeeClient.chatGPT', function () {
params: { search: true }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['prompt'], 'What is web scraping?');
assert.deepStrictEqual(res.config.params['search'], true);
});
Expand Down Expand Up @@ -482,7 +490,8 @@ describe('test_ScrapingBeeClient.youtubeSearch', function () {
params: { sort_by: 'relevance', type: 'video' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['search'], 'web scraping tutorial');
assert.deepStrictEqual(res.config.params['sort_by'], 'relevance');
});
Expand Down Expand Up @@ -530,7 +539,8 @@ describe('test_ScrapingBeeClient.youtubeMetadata', function () {
video_id: 'dQw4w9WgXcQ'
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['video_id'], 'dQw4w9WgXcQ');
});

Expand Down Expand Up @@ -559,7 +569,8 @@ describe('test_ScrapingBeeClient.youtubeSubtitles', function () {
params: { language: 'en' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['video_id'], 'dQw4w9WgXcQ');
assert.deepStrictEqual(res.config.params['language'], 'en');
});
Expand Down Expand Up @@ -599,7 +610,8 @@ describe('test_ScrapingBeeClient.fastSearch', function () {
params: { language: 'en', country_code: 'us' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['search'], 'test query');
assert.deepStrictEqual(res.config.params['language'], 'en');
assert.deepStrictEqual(res.config.params['country_code'], 'us');
Expand Down Expand Up @@ -642,7 +654,8 @@ describe('test_ScrapingBeeClient.amazonPricing', function () {
params: { domain: 'com' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['asin'], 'B0D2Q9397Y');
assert.deepStrictEqual(res.config.params['domain'], 'com');
});
Expand Down Expand Up @@ -692,7 +705,8 @@ describe('test_ScrapingBeeClient.gemini', function () {
params: { country_code: 'us' }
});
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
assert.deepStrictEqual(res.config.params['prompt'], 'What is web scraping?');
assert.deepStrictEqual(res.config.params['country_code'], 'us');
});
Expand Down Expand Up @@ -729,7 +743,8 @@ describe('test_ScrapingBeeClient.usage', function () {
it('should make a request with correct params', async function () {
var res = await client.usage();
assert.deepStrictEqual(res.status, 200);
assert.deepStrictEqual(res.config.params['api_key'], api_key);
// @ts-ignore
assert.deepStrictEqual(res.config.headers['Authorization'], `Bearer ${api_key}`);
});

it('should work with empty config', async function () {
Expand Down