n8n-nodes-google-ads-transparency-api 0.1.0

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.
Files changed (24) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +107 -0
  3. package/dist/credentials/ApifyApi.credentials.d.ts +10 -0
  4. package/dist/credentials/ApifyApi.credentials.js +36 -0
  5. package/dist/credentials/ApifyApi.credentials.js.map +1 -0
  6. package/dist/credentials/ApifyOAuth2Api.credentials.d.ts +9 -0
  7. package/dist/credentials/ApifyOAuth2Api.credentials.js +66 -0
  8. package/dist/credentials/ApifyOAuth2Api.credentials.js.map +1 -0
  9. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.d.ts +13 -0
  10. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.js +82 -0
  11. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.js.map +1 -0
  12. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.json +34 -0
  13. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.properties.d.ts +3 -0
  14. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.properties.js +157 -0
  15. package/dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.properties.js.map +1 -0
  16. package/dist/nodes/ApifyAdsTransparency/helpers/executeActor.d.ts +5 -0
  17. package/dist/nodes/ApifyAdsTransparency/helpers/executeActor.js +95 -0
  18. package/dist/nodes/ApifyAdsTransparency/helpers/executeActor.js.map +1 -0
  19. package/dist/nodes/ApifyAdsTransparency/helpers/genericFunctions.d.ts +10 -0
  20. package/dist/nodes/ApifyAdsTransparency/helpers/genericFunctions.js +91 -0
  21. package/dist/nodes/ApifyAdsTransparency/helpers/genericFunctions.js.map +1 -0
  22. package/dist/nodes/ApifyAdsTransparency/logo.svg +10 -0
  23. package/dist/package.json +74 -0
  24. package/package.json +74 -0
package/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2026 John Cole
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # n8n-nodes-google-ads-transparency-api
2
+
3
+ An [n8n](https://n8n.io/) community node that pulls an advertiser's ads from the Google Ads Transparency Center and returns structured records: advertiser, ad creative ID, format, and run dates. It is backed by the [Google Ads Transparency API](https://apify.com/johnvc/google-ads-transparency-api?fpr=9n7kx3) on [Apify](https://apify.com?fpr=9n7kx3) and bills per result, so there are no subscriptions and no minimums.
4
+
5
+ [Installation](#installation) · [Credentials](#credentials) · [Operations](#operations) · [Output](#output) · [Example workflows](#example-workflows) · [Pricing](#pricing) · [Resources](#resources)
6
+
7
+ ## What it does
8
+
9
+ Give the node an advertiser ID, and it returns one item per ad with the advertiser name, ad creative ID, format, first- and last-shown dates, total days shown, and a details link. It also works as an **AI Agent tool**, so an agent can research competitor advertising on demand.
10
+
11
+ - Pull the ad library for any advertiser by ID
12
+ - Optionally filter by region
13
+ - Choose how much data to return per ad: Simplified, Raw, or Selected Fields
14
+
15
+ ## Installation
16
+
17
+ Follow the n8n [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation/):
18
+
19
+ 1. In n8n, open **Settings > Community Nodes**.
20
+ 2. Select **Install**.
21
+ 3. Enter `n8n-nodes-google-ads-transparency-api` as the npm package name.
22
+ 4. Agree to the risks of using community nodes, then select **Install**.
23
+
24
+ After it installs, the **Google Ads Transparency** node appears in the nodes panel.
25
+
26
+ > n8n Cloud only allows verified community nodes. Until this node is verified, install it on a self-hosted n8n instance.
27
+
28
+ ## Credentials
29
+
30
+ You need a free [Apify account](https://apify.com?fpr=9n7kx3) and an API token.
31
+
32
+ 1. Sign in to the [Apify Console](https://console.apify.com?fpr=9n7kx3).
33
+ 2. Open **Settings > Integrations** and copy your **Personal API token**.
34
+ 3. In n8n, create a new **Apify API** credential and paste the token.
35
+ 4. Use the credential's **Test** button to confirm it works.
36
+
37
+ The node also supports **Apify OAuth2** if you prefer to connect that way.
38
+
39
+ ## Operations
40
+
41
+ **Ad > Get** returns ads run by an advertiser.
42
+
43
+ | Parameter | Description |
44
+ | --- | --- |
45
+ | Advertiser ID | The Google Ads Transparency advertiser ID. Required. |
46
+ | Region | Region code to filter by. Optional. |
47
+ | Maximum Results per Advertiser | How many ads to return. |
48
+ | Output | How much data to return: Simplified, Raw, or Selected Fields. |
49
+
50
+ ## Output
51
+
52
+ Each ad is returned as its own n8n item. The **Output** parameter lets you choose how much to return:
53
+
54
+ - **Simplified** (default): a compact object with `advertiser`, `advertiserId`, `adCreativeId`, `format`, `firstShown`, `lastShown`, `totalDaysShown`, and `detailsLink`. This mode is also used automatically when the node runs as an AI Agent tool, to keep responses small.
55
+ - **Raw**: every field the API returns for each ad, using the original field names below.
56
+ - **Selected Fields**: pick exactly which fields to include.
57
+
58
+ ### Fields (Raw and Selected Fields)
59
+
60
+ | Field | Type | Description |
61
+ | --- | --- | --- |
62
+ | `position` | integer | Rank in the results |
63
+ | `ad_creative_id` | string | Ad creative identifier |
64
+ | `advertiser` | string | Advertiser name |
65
+ | `advertiser_id` | string | Advertiser identifier |
66
+ | `format` | string | Ad format, for example `text`, `image`, or `video` |
67
+ | `first_shown` | integer | First-shown timestamp (Unix) |
68
+ | `last_shown` | integer | Last-shown timestamp (Unix) |
69
+ | `total_days_shown` | integer | Total days the ad has been shown |
70
+ | `details_link` | string | Link to the ad in the Transparency Center |
71
+ | `result_type` | string | Record type, for example `ad` |
72
+ | `fetched_at` | string | When the ad was fetched (ISO 8601) |
73
+
74
+ ## Example workflows
75
+
76
+ ### 1. Track a competitor's ad activity
77
+
78
+ 1. **Schedule Trigger**: run weekly.
79
+ 2. **Google Ads Transparency**: Advertiser ID a competitor, Output `Simplified`.
80
+ 3. **Google Sheets**: append `adCreativeId`, `format`, and `totalDaysShown`.
81
+
82
+ ### 2. Alert on new ad creatives
83
+
84
+ 1. **Schedule Trigger**: run daily.
85
+ 2. **Google Ads Transparency**: an advertiser.
86
+ 3. **Remove Duplicates** then **Slack**: alert on new `adCreativeId` values.
87
+
88
+ ### 3. Let an AI Agent research ads
89
+
90
+ 1. **AI Agent** node.
91
+ 2. Attach **Google Ads Transparency** as a tool.
92
+ 3. Ask "What ads is this advertiser currently running?" The agent calls the node (in Simplified mode) and answers.
93
+
94
+ ## Pricing
95
+
96
+ This node calls the [Google Ads Transparency API](https://apify.com/johnvc/google-ads-transparency-api?fpr=9n7kx3) on Apify, which is billed **pay-per-result**, with no subscription and no minimums. Apify also includes a free monthly usage tier that covers typical volumes. See the [Actor page](https://apify.com/johnvc/google-ads-transparency-api?fpr=9n7kx3) for current rates.
97
+
98
+ ## Resources
99
+
100
+ - [Google Ads Transparency API on Apify](https://apify.com/johnvc/google-ads-transparency-api?fpr=9n7kx3)
101
+ - [npm package](https://www.npmjs.com/package/n8n-nodes-google-ads-transparency-api)
102
+ - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
103
+ - [Apify n8n integration guide](https://docs.apify.com/platform/integrations/n8n)
104
+
105
+ ## License
106
+
107
+ [MIT](LICENSE.md)
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, Icon, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class ApifyApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ icon: Icon;
7
+ properties: INodeProperties[];
8
+ authenticate: IAuthenticateGeneric;
9
+ test: ICredentialTestRequest;
10
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApifyApi = void 0;
4
+ class ApifyApi {
5
+ constructor() {
6
+ this.name = 'apifyApi';
7
+ this.displayName = 'Apify API';
8
+ this.documentationUrl = 'https://docs.apify.com/platform/integrations/api#api-token';
9
+ this.icon = "file:../nodes/ApifyAdsTransparency/logo.svg";
10
+ this.properties = [
11
+ {
12
+ displayName: 'API Key',
13
+ name: 'apiKey',
14
+ type: 'string',
15
+ typeOptions: { password: true },
16
+ default: '',
17
+ },
18
+ ];
19
+ this.authenticate = {
20
+ type: 'generic',
21
+ properties: {
22
+ headers: {
23
+ Authorization: '=Bearer {{$credentials.apiKey}}',
24
+ },
25
+ },
26
+ };
27
+ this.test = {
28
+ request: {
29
+ method: 'GET',
30
+ url: 'https://api.apify.com/v2/me',
31
+ },
32
+ };
33
+ }
34
+ }
35
+ exports.ApifyApi = ApifyApi;
36
+ //# sourceMappingURL=ApifyApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApifyApi.credentials.js","sourceRoot":"","sources":["../../credentials/ApifyApi.credentials.ts"],"names":[],"mappings":";;;AAEA,MAAa,QAAQ;IAArB;QACC,SAAI,GAAG,UAAU,CAAC;QAElB,gBAAW,GAAG,WAAW,CAAC;QAE1B,qBAAgB,GAAG,4DAA4D,CAAC;QAEhF,SAAI,GAAS,6CAA6C,CAAA;QAE1D,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;aACX;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAKF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK;gBACb,GAAG,EAAE,6BAA6B;aAClC;SACD,CAAC;IACH,CAAC;CAAA;AArCD,4BAqCC"}
@@ -0,0 +1,9 @@
1
+ import type { Icon, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class ApifyOAuth2Api implements ICredentialType {
3
+ name: string;
4
+ extends: string[];
5
+ displayName: string;
6
+ icon: Icon;
7
+ documentationUrl: string;
8
+ properties: INodeProperties[];
9
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApifyOAuth2Api = void 0;
4
+ const scopes = ['profile', 'full_api_access'];
5
+ class ApifyOAuth2Api {
6
+ constructor() {
7
+ this.name = 'apifyOAuth2Api';
8
+ this.extends = ['oAuth2Api'];
9
+ this.displayName = 'Apify OAuth2 API';
10
+ this.icon = "file:../nodes/ApifyAdsTransparency/logo.svg";
11
+ this.documentationUrl = 'https://docs.apify.com/api/v2';
12
+ this.properties = [
13
+ {
14
+ displayName: 'Grant Type',
15
+ name: 'grantType',
16
+ type: 'hidden',
17
+ default: 'pkce',
18
+ },
19
+ {
20
+ displayName: 'Authorization URL',
21
+ name: 'authUrl',
22
+ type: 'hidden',
23
+ default: 'https://console.apify.com/authorize/oauth',
24
+ },
25
+ {
26
+ displayName: 'Access Token URL',
27
+ name: 'accessTokenUrl',
28
+ type: 'hidden',
29
+ default: 'https://console-backend.apify.com/oauth/apps/token',
30
+ },
31
+ {
32
+ displayName: 'Scope',
33
+ name: 'scope',
34
+ type: 'hidden',
35
+ default: `${scopes.join(' ')}`,
36
+ },
37
+ {
38
+ displayName: 'Auth URI Query Parameters',
39
+ name: 'authQueryParameters',
40
+ type: 'hidden',
41
+ default: '',
42
+ },
43
+ {
44
+ displayName: 'Authentication',
45
+ name: 'authentication',
46
+ type: 'hidden',
47
+ default: 'header',
48
+ },
49
+ {
50
+ displayName: 'Client ID',
51
+ name: 'clientId',
52
+ type: 'hidden',
53
+ default: '',
54
+ },
55
+ {
56
+ displayName: 'Client Secret',
57
+ name: 'clientSecret',
58
+ type: 'hidden',
59
+ default: '',
60
+ typeOptions: { password: true },
61
+ },
62
+ ];
63
+ }
64
+ }
65
+ exports.ApifyOAuth2Api = ApifyOAuth2Api;
66
+ //# sourceMappingURL=ApifyOAuth2Api.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApifyOAuth2Api.credentials.js","sourceRoot":"","sources":["../../credentials/ApifyOAuth2Api.credentials.ts"],"names":[],"mappings":";;;AAEA,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAE9C,MAAa,cAAc;IAA3B;QACC,SAAI,GAAG,gBAAgB,CAAC;QAExB,YAAO,GAAG,CAAC,WAAW,CAAC,CAAC;QAExB,gBAAW,GAAG,kBAAkB,CAAC;QAEjC,SAAI,GAAS,6CAA6C,CAAA;QAG1D,qBAAgB,GAAG,+BAA+B,CAAC;QAEnD,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,YAAY;gBACzB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,MAAM;aACf;YACD;gBACC,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2CAA2C;aACpD;YACD;gBACC,WAAW,EAAE,kBAAkB;gBAC/B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,oDAAoD;aAC7D;YACD;gBACC,WAAW,EAAE,OAAO;gBACpB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;aAC9B;YACD;gBACC,WAAW,EAAE,2BAA2B;gBACxC,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;aACX;YACD;gBACC,WAAW,EAAE,gBAAgB;gBAC7B,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ;aACjB;YACD;gBACC,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;aACX;YACD;gBACC,WAAW,EAAE,eAAe;gBAC5B,IAAI,EAAE,cAAc;gBACpB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC/B;SACD,CAAC;IACH,CAAC;CAAA;AA/DD,wCA+DC"}
@@ -0,0 +1,13 @@
1
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare const ACTOR_ID: string;
3
+ export declare const PACKAGE_NAME: string;
4
+ export declare const CLASS_NAME: string;
5
+ export declare const ClassNameCamel: string;
6
+ export declare const X_PLATFORM_HEADER_ID: string;
7
+ export declare const X_PLATFORM_APP_HEADER_ID: string;
8
+ export declare const DISPLAY_NAME: string;
9
+ export declare const DESCRIPTION: string;
10
+ export declare class ApifyAdsTransparency implements INodeType {
11
+ description: INodeTypeDescription;
12
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
13
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApifyAdsTransparency = exports.DESCRIPTION = exports.DISPLAY_NAME = exports.X_PLATFORM_APP_HEADER_ID = exports.X_PLATFORM_HEADER_ID = exports.ClassNameCamel = exports.CLASS_NAME = exports.PACKAGE_NAME = exports.ACTOR_ID = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const ApifyAdsTransparency_properties_1 = require("./ApifyAdsTransparency.properties");
6
+ const executeActor_1 = require("./helpers/executeActor");
7
+ exports.ACTOR_ID = '1SOrTCb3mzaT2TXHK';
8
+ exports.PACKAGE_NAME = 'n8n-nodes-google-ads-transparency-api';
9
+ exports.CLASS_NAME = 'ApifyAdsTransparency';
10
+ exports.ClassNameCamel = exports.CLASS_NAME.charAt(0).toLowerCase() + exports.CLASS_NAME.slice(1);
11
+ exports.X_PLATFORM_HEADER_ID = 'n8n';
12
+ exports.X_PLATFORM_APP_HEADER_ID = 'google-ads-transparency-app';
13
+ exports.DISPLAY_NAME = 'Google Ads Transparency';
14
+ exports.DESCRIPTION = 'Get an advertiser\'s ads from the Google Ads Transparency Center with formats and run dates';
15
+ class ApifyAdsTransparency {
16
+ constructor() {
17
+ this.description = {
18
+ displayName: exports.DISPLAY_NAME,
19
+ name: exports.ClassNameCamel,
20
+ icon: 'file:logo.svg',
21
+ group: ['transform'],
22
+ version: [1],
23
+ defaultVersion: 1,
24
+ subtitle: 'Get Ads',
25
+ description: exports.DESCRIPTION,
26
+ defaults: {
27
+ name: exports.DISPLAY_NAME,
28
+ },
29
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
30
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
31
+ usableAsTool: true,
32
+ credentials: [
33
+ {
34
+ displayName: 'Apify API key connection',
35
+ name: 'apifyApi',
36
+ required: false,
37
+ displayOptions: {
38
+ show: {
39
+ authentication: ['apifyApi'],
40
+ },
41
+ },
42
+ },
43
+ {
44
+ displayName: 'Apify OAuth2 connection',
45
+ name: 'apifyOAuth2Api',
46
+ required: false,
47
+ displayOptions: {
48
+ show: {
49
+ authentication: ['apifyOAuth2Api'],
50
+ },
51
+ },
52
+ },
53
+ ],
54
+ properties: ApifyAdsTransparency_properties_1.properties,
55
+ };
56
+ }
57
+ async execute() {
58
+ const items = this.getInputData();
59
+ const returnData = [];
60
+ for (let i = 0; i < items.length; i++) {
61
+ try {
62
+ const data = await executeActor_1.runActor.call(this, i);
63
+ for (const item of data) {
64
+ returnData.push({ ...item, pairedItem: { item: i } });
65
+ }
66
+ }
67
+ catch (error) {
68
+ if (this.continueOnFail()) {
69
+ returnData.push({
70
+ json: { error: error.message },
71
+ pairedItem: { item: i },
72
+ });
73
+ continue;
74
+ }
75
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), error, { itemIndex: i });
76
+ }
77
+ }
78
+ return [returnData];
79
+ }
80
+ }
81
+ exports.ApifyAdsTransparency = ApifyAdsTransparency;
82
+ //# sourceMappingURL=ApifyAdsTransparency.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApifyAdsTransparency.node.js","sourceRoot":"","sources":["../../../nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.ts"],"names":[],"mappings":";;;AAAA,+CAQsB;AACtB,uFAA+D;AAC/D,yDAAkD;AAGrC,QAAA,QAAQ,GAAG,mBAA6B,CAAC;AAEzC,QAAA,YAAY,GAAG,uCAAiD,CAAC;AACjE,QAAA,UAAU,GAAG,sBAAgC,CAAC;AAC9C,QAAA,cAAc,GAAG,kBAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,kBAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1E,QAAA,oBAAoB,GAAG,KAAe,CAAC;AACvC,QAAA,wBAAwB,GAAG,6BAAuC,CAAC;AAEnE,QAAA,YAAY,GAAG,yBAAmC,CAAC;AACnD,QAAA,WAAW,GACvB,6FAAuG,CAAC;AAEzG,MAAa,oBAAoB;IAAjC;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,oBAAY;YACzB,IAAI,EAAE,sBAAc;YAGpB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,CAAC,WAAW,CAAC;YAEpB,OAAO,EAAE,CAAC,CAAC,CAAC;YACZ,cAAc,EAAE,CAAC;YAGjB,QAAQ,EAAE,SAAS;YAGnB,WAAW,EAAE,mBAAW;YACxB,QAAQ,EAAE;gBACT,IAAI,EAAE,oBAAY;aAClB;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ;oBACC,WAAW,EAAE,0BAA0B;oBACvC,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE,KAAK;oBACf,cAAc,EAAE;wBACf,IAAI,EAAE;4BACL,cAAc,EAAE,CAAC,UAAU,CAAC;yBAC5B;qBACD;iBACD;gBACD;oBACC,WAAW,EAAE,yBAAyB;oBACtC,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,KAAK;oBACf,cAAc,EAAE;wBACf,IAAI,EAAE;4BACL,cAAc,EAAE,CAAC,gBAAgB,CAAC;yBAClC;qBACD;iBACD;aACD;YAED,UAAU,EAAV,4CAAU;SACV,CAAC;IA0BH,CAAC;IAxBA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,MAAM,uBAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;oBACzB,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvD,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;wBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,2BAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAmB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AAzED,oDAyEC"}
@@ -0,0 +1,34 @@
1
+ {
2
+ "node": "n8n-nodes-google-ads-transparency-api",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": [
6
+ "Data & Storage",
7
+ "Analytics",
8
+ "Marketing"
9
+ ],
10
+ "resources": {
11
+ "credentialDocumentation": [
12
+ {
13
+ "url": "https://docs.apify.com/platform/integrations/n8n"
14
+ }
15
+ ],
16
+ "primaryDocumentation": [
17
+ {
18
+ "url": "https://apify.com/johnvc/google-ads-transparency-api?fpr=9n7kx3"
19
+ }
20
+ ]
21
+ },
22
+ "alias": [
23
+ "google ads transparency",
24
+ "ads transparency",
25
+ "ad library",
26
+ "competitor ads",
27
+ "advertising",
28
+ "ad intelligence",
29
+ "ads",
30
+ "marketing",
31
+ "ad creatives",
32
+ "apify"
33
+ ]
34
+ }
@@ -0,0 +1,3 @@
1
+ import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2
+ export declare function buildActorInput(context: IExecuteFunctions, itemIndex: number, defaultInput: Record<string, any>): Record<string, any>;
3
+ export declare const properties: INodeProperties[];
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.properties = void 0;
4
+ exports.buildActorInput = buildActorInput;
5
+ function buildActorInput(context, itemIndex, defaultInput) {
6
+ const input = {
7
+ ...defaultInput,
8
+ advertiserId: context.getNodeParameter('advertiserId', itemIndex),
9
+ maxResultsPerAdvertiser: context.getNodeParameter('maxResultsPerAdvertiser', itemIndex),
10
+ };
11
+ const region = context.getNodeParameter('region', itemIndex, '');
12
+ if (region)
13
+ input.region = region;
14
+ return input;
15
+ }
16
+ const resourceProperties = [
17
+ {
18
+ displayName: 'Resource',
19
+ name: 'resource',
20
+ type: 'options',
21
+ noDataExpression: true,
22
+ options: [
23
+ {
24
+ name: 'Ad',
25
+ value: 'ad',
26
+ },
27
+ ],
28
+ default: 'ad',
29
+ },
30
+ {
31
+ displayName: 'Operation',
32
+ name: 'operation',
33
+ type: 'options',
34
+ noDataExpression: true,
35
+ displayOptions: {
36
+ show: {
37
+ resource: ['ad'],
38
+ },
39
+ },
40
+ options: [
41
+ {
42
+ name: 'Get',
43
+ value: 'get',
44
+ action: 'Get ads for an advertiser',
45
+ description: 'Get ads run by an advertiser, one item per ad',
46
+ },
47
+ ],
48
+ default: 'get',
49
+ },
50
+ ];
51
+ const actorProperties = [
52
+ {
53
+ displayName: 'Advertiser ID',
54
+ name: 'advertiserId',
55
+ type: 'string',
56
+ required: true,
57
+ default: '',
58
+ placeholder: 'e.g. AR03136609393588568065',
59
+ description: 'The Google Ads Transparency advertiser ID',
60
+ displayOptions: { show: { resource: ['ad'], operation: ['get'] } },
61
+ },
62
+ {
63
+ displayName: 'Region',
64
+ name: 'region',
65
+ type: 'string',
66
+ default: '',
67
+ placeholder: 'e.g. US',
68
+ description: 'Region code to filter ads by where they ran. Optional.',
69
+ displayOptions: { show: { resource: ['ad'], operation: ['get'] } },
70
+ },
71
+ {
72
+ displayName: 'Maximum Results per Advertiser',
73
+ name: 'maxResultsPerAdvertiser',
74
+ type: 'number',
75
+ default: 50,
76
+ typeOptions: { minValue: 1 },
77
+ description: 'How many ads to return',
78
+ displayOptions: { show: { resource: ['ad'], operation: ['get'] } },
79
+ },
80
+ ];
81
+ const outputProperties = [
82
+ {
83
+ displayName: 'Output',
84
+ name: 'output',
85
+ type: 'options',
86
+ noDataExpression: true,
87
+ displayOptions: { show: { resource: ['ad'], operation: ['get'] } },
88
+ options: [
89
+ {
90
+ name: 'Raw',
91
+ value: 'raw',
92
+ description: 'Return every field the API produces for each ad',
93
+ },
94
+ {
95
+ name: 'Selected Fields',
96
+ value: 'selected',
97
+ description: 'Choose exactly which fields to return',
98
+ },
99
+ {
100
+ name: 'Simplified',
101
+ value: 'simplified',
102
+ description: 'Return a compact set of the most useful ad fields',
103
+ },
104
+ ],
105
+ default: 'simplified',
106
+ description: 'How much data to return for each ad',
107
+ },
108
+ {
109
+ displayName: 'Fields to Include',
110
+ name: 'fields',
111
+ type: 'multiOptions',
112
+ displayOptions: {
113
+ show: { resource: ['ad'], operation: ['get'], output: ['selected'] },
114
+ },
115
+ options: [
116
+ { name: 'Ad Creative ID', value: 'ad_creative_id' },
117
+ { name: 'Advertiser', value: 'advertiser' },
118
+ { name: 'Advertiser ID', value: 'advertiser_id' },
119
+ { name: 'Details Link', value: 'details_link' },
120
+ { name: 'Fetched At', value: 'fetched_at' },
121
+ { name: 'First Shown', value: 'first_shown' },
122
+ { name: 'Format', value: 'format' },
123
+ { name: 'Last Shown', value: 'last_shown' },
124
+ { name: 'Position', value: 'position' },
125
+ { name: 'Result Type', value: 'result_type' },
126
+ { name: 'Total Days Shown', value: 'total_days_shown' },
127
+ ],
128
+ default: ['advertiser', 'ad_creative_id', 'format', 'first_shown', 'last_shown'],
129
+ description: 'Which fields to return when Output is set to Selected Fields',
130
+ },
131
+ ];
132
+ const authenticationProperties = [
133
+ {
134
+ displayName: 'Authentication',
135
+ name: 'authentication',
136
+ type: 'options',
137
+ options: [
138
+ {
139
+ name: 'API Key',
140
+ value: 'apifyApi',
141
+ },
142
+ {
143
+ name: 'OAuth2',
144
+ value: 'apifyOAuth2Api',
145
+ },
146
+ ],
147
+ default: 'apifyApi',
148
+ description: 'Choose which authentication method to use',
149
+ },
150
+ ];
151
+ exports.properties = [
152
+ ...resourceProperties,
153
+ ...actorProperties,
154
+ ...outputProperties,
155
+ ...authenticationProperties,
156
+ ];
157
+ //# sourceMappingURL=ApifyAdsTransparency.properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApifyAdsTransparency.properties.js","sourceRoot":"","sources":["../../../nodes/ApifyAdsTransparency/ApifyAdsTransparency.properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function getDefaultBuild(this: IExecuteFunctions, actorId: string): Promise<any>;
3
+ export declare function getDefaultInputsFromBuild(build: any): Record<string, any>;
4
+ export declare function runActorApi(this: IExecuteFunctions, actorId: string, mergedInput: Record<string, any>, qs: Record<string, any>): Promise<any>;
5
+ export declare function runActor(this: IExecuteFunctions, i: number): Promise<INodeExecutionData[]>;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultBuild = getDefaultBuild;
4
+ exports.getDefaultInputsFromBuild = getDefaultInputsFromBuild;
5
+ exports.runActorApi = runActorApi;
6
+ exports.runActor = runActor;
7
+ const n8n_workflow_1 = require("n8n-workflow");
8
+ const genericFunctions_1 = require("./genericFunctions");
9
+ const ApifyAdsTransparency_node_1 = require("../ApifyAdsTransparency.node");
10
+ const ApifyAdsTransparency_properties_1 = require("../ApifyAdsTransparency.properties");
11
+ async function getDefaultBuild(actorId) {
12
+ const defaultBuildResp = await genericFunctions_1.apiRequest.call(this, {
13
+ method: 'GET',
14
+ uri: `/v2/acts/${actorId}/builds/default`,
15
+ });
16
+ if (!(defaultBuildResp === null || defaultBuildResp === void 0 ? void 0 : defaultBuildResp.data)) {
17
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), {
18
+ message: `Could not fetch default build for Actor ${actorId}`,
19
+ });
20
+ }
21
+ return defaultBuildResp.data;
22
+ }
23
+ function getDefaultInputsFromBuild(build) {
24
+ var _a, _b;
25
+ const buildInputProperties = (_b = (_a = build === null || build === void 0 ? void 0 : build.actorDefinition) === null || _a === void 0 ? void 0 : _a.input) === null || _b === void 0 ? void 0 : _b.properties;
26
+ const defaultInput = {};
27
+ if (buildInputProperties && typeof buildInputProperties === 'object') {
28
+ for (const [key, property] of Object.entries(buildInputProperties)) {
29
+ if (property &&
30
+ typeof property === 'object' &&
31
+ 'prefill' in property &&
32
+ property.prefill !== undefined &&
33
+ property.prefill !== null) {
34
+ defaultInput[key] = property.prefill;
35
+ }
36
+ }
37
+ }
38
+ return defaultInput;
39
+ }
40
+ async function runActorApi(actorId, mergedInput, qs) {
41
+ return await genericFunctions_1.apiRequest.call(this, {
42
+ method: 'POST',
43
+ uri: `/v2/acts/${actorId}/runs`,
44
+ body: mergedInput,
45
+ qs,
46
+ });
47
+ }
48
+ function shapeItem(item, mode, fields) {
49
+ if (mode === 'raw') {
50
+ return item;
51
+ }
52
+ if (mode === 'selected') {
53
+ const picked = {};
54
+ for (const field of fields) {
55
+ if (field in item) {
56
+ picked[field] = item[field];
57
+ }
58
+ }
59
+ return picked;
60
+ }
61
+ return {
62
+ advertiser: item.advertiser,
63
+ advertiserId: item.advertiser_id,
64
+ adCreativeId: item.ad_creative_id,
65
+ format: item.format,
66
+ firstShown: item.first_shown,
67
+ lastShown: item.last_shown,
68
+ totalDaysShown: item.total_days_shown,
69
+ detailsLink: item.details_link,
70
+ };
71
+ }
72
+ async function runActor(i) {
73
+ var _a, _b;
74
+ const build = await getDefaultBuild.call(this, ApifyAdsTransparency_node_1.ACTOR_ID);
75
+ const defaultInput = getDefaultInputsFromBuild(build);
76
+ const mergedInput = (0, ApifyAdsTransparency_properties_1.buildActorInput)(this, i, defaultInput);
77
+ const run = await runActorApi.call(this, ApifyAdsTransparency_node_1.ACTOR_ID, mergedInput, { waitForFinish: 0 });
78
+ if (!((_a = run === null || run === void 0 ? void 0 : run.data) === null || _a === void 0 ? void 0 : _a.id)) {
79
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), {
80
+ message: 'Run ID not found after starting the Actor',
81
+ });
82
+ }
83
+ const runId = run.data.id;
84
+ const datasetId = run.data.defaultDatasetId;
85
+ await genericFunctions_1.pollRunStatus.call(this, runId);
86
+ const items = await genericFunctions_1.getResults.call(this, datasetId);
87
+ let mode = this.getNodeParameter('output', i, 'simplified');
88
+ if ((0, genericFunctions_1.isUsedAsAiTool)(this.getNode().type)) {
89
+ mode = 'simplified';
90
+ }
91
+ const fields = (_b = this.getNodeParameter('fields', i, [])) !== null && _b !== void 0 ? _b : [];
92
+ const shaped = items.map((item) => shapeItem(item, mode, fields));
93
+ return this.helpers.returnJsonArray(shaped);
94
+ }
95
+ //# sourceMappingURL=executeActor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executeActor.js","sourceRoot":"","sources":["../../../../nodes/ApifyAdsTransparency/helpers/executeActor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type IExecuteFunctions, type IHookFunctions, type ILoadOptionsFunctions, type IHttpRequestOptions } from 'n8n-workflow';
2
+ type IApiRequestOptions = Omit<IHttpRequestOptions, 'url'> & {
3
+ uri?: string;
4
+ url?: string;
5
+ };
6
+ export declare function apiRequest(this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, requestOptions: IApiRequestOptions): Promise<any>;
7
+ export declare function isUsedAsAiTool(nodeType: string): boolean;
8
+ export declare function pollRunStatus(this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, runId: string): Promise<any>;
9
+ export declare function getResults(this: IExecuteFunctions, datasetId: string): Promise<any[]>;
10
+ export {};
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiRequest = apiRequest;
4
+ exports.isUsedAsAiTool = isUsedAsAiTool;
5
+ exports.pollRunStatus = pollRunStatus;
6
+ exports.getResults = getResults;
7
+ const n8n_workflow_1 = require("n8n-workflow");
8
+ const ApifyAdsTransparency_node_1 = require("../ApifyAdsTransparency.node");
9
+ async function apiRequest(requestOptions) {
10
+ var _a;
11
+ const { method = 'GET', qs, uri, ...rest } = requestOptions;
12
+ const query = qs || {};
13
+ const endpoint = `https://api.apify.com${uri !== null && uri !== void 0 ? uri : ''}`;
14
+ const headers = {
15
+ 'x-apify-integration-platform': ApifyAdsTransparency_node_1.X_PLATFORM_HEADER_ID,
16
+ ...(ApifyAdsTransparency_node_1.X_PLATFORM_APP_HEADER_ID && { 'x-apify-integration-app-id': ApifyAdsTransparency_node_1.X_PLATFORM_APP_HEADER_ID }),
17
+ };
18
+ if (isUsedAsAiTool(this.getNode().type)) {
19
+ headers['x-apify-integration-ai-tool'] = 'true';
20
+ }
21
+ const options = {
22
+ ...rest,
23
+ method,
24
+ qs: query,
25
+ url: endpoint,
26
+ headers,
27
+ json: true,
28
+ };
29
+ if (method === 'GET' && 'body' in options) {
30
+ delete options.body;
31
+ }
32
+ try {
33
+ const authenticationMethod = this.getNodeParameter('authentication', 0);
34
+ try {
35
+ await this.getCredentials(authenticationMethod);
36
+ }
37
+ catch {
38
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `No valid credentials found for ${authenticationMethod}. Please configure them first.`);
39
+ }
40
+ return await this.helpers.httpRequestWithAuthentication.call(this, authenticationMethod, options);
41
+ }
42
+ catch (error) {
43
+ const apiError = error;
44
+ const body = (_a = apiError.response) === null || _a === void 0 ? void 0 : _a.body;
45
+ if (body) {
46
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), apiError, {
47
+ message: typeof body === 'string' ? body : JSON.stringify(body),
48
+ description: apiError.message,
49
+ });
50
+ }
51
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), apiError);
52
+ }
53
+ }
54
+ function isUsedAsAiTool(nodeType) {
55
+ const parts = nodeType.split('.');
56
+ return parts[parts.length - 1] === `${ApifyAdsTransparency_node_1.ClassNameCamel}Tool`;
57
+ }
58
+ async function pollRunStatus(runId) {
59
+ var _a;
60
+ let lastRunData;
61
+ while (true) {
62
+ try {
63
+ const pollResult = await apiRequest.call(this, {
64
+ method: 'GET',
65
+ uri: `/v2/actor-runs/${runId}`,
66
+ });
67
+ const status = (_a = pollResult === null || pollResult === void 0 ? void 0 : pollResult.data) === null || _a === void 0 ? void 0 : _a.status;
68
+ lastRunData = pollResult === null || pollResult === void 0 ? void 0 : pollResult.data;
69
+ if (['SUCCEEDED', 'FAILED', 'TIMED-OUT', 'ABORTED'].includes(status))
70
+ break;
71
+ }
72
+ catch (err) {
73
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), {
74
+ message: `Error polling run status: ${err}`,
75
+ });
76
+ }
77
+ await (0, n8n_workflow_1.sleep)(1000);
78
+ }
79
+ return lastRunData;
80
+ }
81
+ async function getResults(datasetId) {
82
+ const results = await apiRequest.call(this, {
83
+ method: 'GET',
84
+ uri: `/v2/datasets/${datasetId}/items`,
85
+ });
86
+ if (Array.isArray(results)) {
87
+ return results;
88
+ }
89
+ return results ? [results] : [];
90
+ }
91
+ //# sourceMappingURL=genericFunctions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genericFunctions.js","sourceRoot":"","sources":["../../../../nodes/ApifyAdsTransparency/helpers/genericFunctions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64" fill="none">
2
+ <!-- badge -->
3
+ <rect x="4" y="4" width="56" height="56" rx="14" fill="#2563EB"/>
4
+ <!-- megaphone -->
5
+ <path d="M16 28 L40 20 V44 L16 36 Z" fill="#DBEAFE"/>
6
+ <rect x="40" y="22" width="6" height="20" rx="3" fill="#93C5FD"/>
7
+ <path d="M20 36 v6 a4 4 0 0 0 8 0 v-3" fill="none" stroke="#DBEAFE" stroke-width="3"/>
8
+ <!-- sound -->
9
+ <path d="M50 26 q4 6 0 12" fill="none" stroke="#DBEAFE" stroke-width="3" stroke-linecap="round"/>
10
+ </svg>
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "n8n-nodes-google-ads-transparency-api",
3
+ "version": "0.1.0",
4
+ "description": "Get an advertiser's ads from the Google Ads Transparency Center with formats and run dates. Apify-backed n8n community node, pay-per-result, and usable as an AI agent tool.",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "n8n-nodes",
8
+ "n8n",
9
+ "google-ads-transparency",
10
+ "ad-library",
11
+ "competitor-ads",
12
+ "advertising",
13
+ "ad-intelligence",
14
+ "marketing",
15
+ "apify",
16
+ "ai-tool"
17
+ ],
18
+ "license": "MIT",
19
+ "author": {
20
+ "name": "John Cole",
21
+ "email": "tirade.charge_4v@icloud.com"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api.git"
26
+ },
27
+ "homepage": "https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api/issues"
30
+ },
31
+ "engines": {
32
+ "node": ">=18.10"
33
+ },
34
+ "packageManager": "npm@10.8.2",
35
+ "main": "index.js",
36
+ "scripts": {
37
+ "build": "n8n-node build",
38
+ "dev": "n8n-node dev",
39
+ "lint": "n8n-node lint",
40
+ "lint:fix": "n8n-node lint --fix"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "n8n": {
46
+ "n8nNodesApiVersion": 1,
47
+ "credentials": [
48
+ "dist/credentials/ApifyApi.credentials.js",
49
+ "dist/credentials/ApifyOAuth2Api.credentials.js"
50
+ ],
51
+ "nodes": [
52
+ "dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.js"
53
+ ]
54
+ },
55
+ "peerDependencies": {
56
+ "n8n-workflow": "*"
57
+ },
58
+ "devDependencies": {
59
+ "@n8n/node-cli": "0.32.1",
60
+ "@types/jest": "^29.5.14",
61
+ "@types/node": "^24.0.1",
62
+ "apify-client": "^2.16.0",
63
+ "chalk": "^5.6.0",
64
+ "eslint": "9.29.0",
65
+ "glob": "^11.0.3",
66
+ "gulp": "^4.0.2",
67
+ "jest": "^29.7.0",
68
+ "nock": "^14.0.5",
69
+ "prettier": "^3.6.2",
70
+ "sharp": "^0.34.2",
71
+ "ts-jest": "^29.3.2",
72
+ "typescript": "5.9.2"
73
+ }
74
+ }
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "n8n-nodes-google-ads-transparency-api",
3
+ "version": "0.1.0",
4
+ "description": "Get an advertiser's ads from the Google Ads Transparency Center with formats and run dates. Apify-backed n8n community node, pay-per-result, and usable as an AI agent tool.",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "n8n-nodes",
8
+ "n8n",
9
+ "google-ads-transparency",
10
+ "ad-library",
11
+ "competitor-ads",
12
+ "advertising",
13
+ "ad-intelligence",
14
+ "marketing",
15
+ "apify",
16
+ "ai-tool"
17
+ ],
18
+ "license": "MIT",
19
+ "author": {
20
+ "name": "John Cole",
21
+ "email": "tirade.charge_4v@icloud.com"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api.git"
26
+ },
27
+ "homepage": "https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api#readme",
28
+ "bugs": {
29
+ "url": "https://github.com/johnisanerd/n8n-nodes-google-ads-transparency-api/issues"
30
+ },
31
+ "engines": {
32
+ "node": ">=18.10"
33
+ },
34
+ "packageManager": "npm@10.8.2",
35
+ "main": "index.js",
36
+ "scripts": {
37
+ "build": "n8n-node build",
38
+ "dev": "n8n-node dev",
39
+ "lint": "n8n-node lint",
40
+ "lint:fix": "n8n-node lint --fix"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "n8n": {
46
+ "n8nNodesApiVersion": 1,
47
+ "credentials": [
48
+ "dist/credentials/ApifyApi.credentials.js",
49
+ "dist/credentials/ApifyOAuth2Api.credentials.js"
50
+ ],
51
+ "nodes": [
52
+ "dist/nodes/ApifyAdsTransparency/ApifyAdsTransparency.node.js"
53
+ ]
54
+ },
55
+ "peerDependencies": {
56
+ "n8n-workflow": "*"
57
+ },
58
+ "devDependencies": {
59
+ "@n8n/node-cli": "0.32.1",
60
+ "@types/jest": "^29.5.14",
61
+ "@types/node": "^24.0.1",
62
+ "apify-client": "^2.16.0",
63
+ "chalk": "^5.6.0",
64
+ "eslint": "9.29.0",
65
+ "glob": "^11.0.3",
66
+ "gulp": "^4.0.2",
67
+ "jest": "^29.7.0",
68
+ "nock": "^14.0.5",
69
+ "prettier": "^3.6.2",
70
+ "sharp": "^0.34.2",
71
+ "ts-jest": "^29.3.2",
72
+ "typescript": "5.9.2"
73
+ }
74
+ }