From f7741467a88f95bcfd777b91e8cecb77578d6506 Mon Sep 17 00:00:00 2001 From: Sahil Sunny Date: Tue, 18 Aug 2026 09:18:11 +0530 Subject: [PATCH 1/3] SCR-584: send API key via Authorization Bearer header; add nb_results to Google Search params - Auth moves from ?api_key= query param to Authorization: Bearer header (verified live against all endpoint families); client construction unchanged - Add nb_results?: number to GoogleSearchParams (accepted by the API) - Update unit tests to assert the Authorization header instead of the query param --- CHANGELOG.md | 2 ++ dist/index.d.ts | 1 + dist/index.js | 3 +-- src/index.ts | 8 +++++--- tests/client.test.ts | 45 +++++++++++++++++++++++++++++--------------- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61b5309..8746c10 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### 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 diff --git a/dist/index.d.ts b/dist/index.d.ts index c2e0b9e..50c4ff9 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -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; diff --git a/dist/index.js b/dist/index.js index 9cfeb43..24a3717 100644 --- a/dist/index.js +++ b/dist/index.js @@ -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, diff --git a/src/index.ts b/src/index.ts index 4991e2f..b9857e5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -87,6 +87,7 @@ export type GoogleSearchParams = { longitude?: number; max_price?: number; min_price?: number; + nb_results?: number; nfpr?: boolean; page?: number; pages?: number; @@ -355,13 +356,14 @@ export class ScrapingBeeClient { } private request(config: Record): 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, diff --git a/tests/client.test.ts b/tests/client.test.ts index e4a6954..1ab83f3 100644 --- a/tests/client.test.ts +++ b/tests/client.test.ts @@ -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\//); @@ -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\//); }); @@ -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'); @@ -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'); @@ -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'); }); @@ -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'); }); @@ -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'); }); @@ -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); }); @@ -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'); }); @@ -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'); }); @@ -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'); }); @@ -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'); @@ -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'); }); @@ -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'); }); @@ -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 () { From b2a11c8f3406e8bbb89ba2b62dcf4ab269e3e8f9 Mon Sep 17 00:00:00 2001 From: Sahil Sunny Date: Tue, 18 Aug 2026 18:41:16 +0530 Subject: [PATCH 2/3] Set 2.0.0 release date to 2026-08-24 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8746c10..6168b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # 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 From e435fb79de602680b6237df6586aa6423b77ec4b Mon Sep 17 00:00:00 2001 From: Sahil Sunny Date: Tue, 1 Sep 2026 13:00:58 +0530 Subject: [PATCH 3/3] Set 2.0.0 release date to 2026-09-01 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6168b45..2647311 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [2.0.0](https://github.com/ScrapingBee/scrapingbee-node/compare/v1.8.2...v2.0.0) (2026-08-24) +## [2.0.0](https://github.com/ScrapingBee/scrapingbee-node/compare/v1.8.2...v2.0.0) (2026-09-01) ### Features