diff --git a/CHANGELOG.md b/CHANGELOG.md index 61b5309..6168b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 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 () {