@youdotcom-oss/n8n-nodes-youdotcom 0.2.6 → 0.2.8

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/README.md CHANGED
@@ -1,109 +1,90 @@
1
- # n8n-nodes-youdotcom
1
+ # @youdotcom-oss/n8n-nodes-youdotcom
2
2
 
3
- An n8n community node for integrating [You.com APIs](https://you.com/apis) into your n8n workflows. Search the web and extract content from URLs.
3
+ Add real time web search, page content extraction, and AI powered deep research to your n8n workflows with the [You.com](https://you.com) API.
4
4
 
5
- ## Installation
6
-
7
- Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
5
+ [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
8
6
 
9
- ```bash
10
- npm install @youdotcom-oss/n8n-nodes-youdotcom
11
- ```
7
+ [Installation](#installation) | [Operations](#operations) | [Credentials](#credentials) | [Usage](#usage) | [Resources](#resources)
12
8
 
13
- Or install via the n8n UI:
9
+ ## Installation
14
10
 
15
- 1. Go to **Settings > Community Nodes**
16
- 2. Select **Install**
17
- 3. Enter `@youdotcom-oss/n8n-nodes-youdotcom`
18
- 4. Agree to the risks and select **Install**
11
+ Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
19
12
 
20
13
  ## Operations
21
14
 
22
15
  ### Search
23
16
 
24
- Search the web and news using You.com's search API.
25
-
26
- | Parameter | Required | Description |
27
- | ---------------- | -------- | ------------------------------------------------------- |
28
- | Query | Yes | The search query (supports search operators, see below) |
29
- | Count | No | Maximum number of results per section (1-100) |
30
- | Country | No | Country code for geographical focus (e.g., US, GB, DE) |
31
- | Freshness | No | Filter by recency: day, week, month, or year |
32
- | Language | No | Language of results (BCP 47 format) |
33
- | Livecrawl | No | Fetch full page content for web, news, or all results |
34
- | Livecrawl Format | No | Format for livecrawled content (HTML or Markdown) |
35
- | Offset | No | Pagination offset (0-9) |
36
- | Safe Search | No | Content moderation: off, moderate, or strict |
17
+ Search the web and news with up to date results. Supports advanced query operators (`site:`, `filetype:`, `+`, `-`, `AND`, `OR`, `NOT`) and geographic/language filtering.
37
18
 
38
- **Search operators:**
19
+ Great for monitoring mentions, pulling recent news, or feeding live data into AI agent workflows.
39
20
 
40
- Include these directly in your query to refine results. See [search operators documentation](https://docs.you.com/search/search-operators) for details.
41
-
42
- | Operator | Example | Description |
43
- | ---------- | ----------------------- | -------------------------------------------------- |
44
- | `site:` | `site:github.com` | Restrict to a specific domain (including subdomains) |
45
- | `filetype:`| `filetype:pdf` | Filter by file type |
46
- | `+` | `+GAAP` | Require exact term in results |
47
- | `-` | `-marketing` | Exclude exact term from results |
48
- | `AND` | `Python AND PyTorch` | Logical AND to combine expressions |
49
- | `OR` | `Python OR PyTorch` | Logical OR to combine expressions |
50
- | `NOT` | `NOT site:example.com` | Negate an expression |
51
-
52
- **Example:** `machine learning (Python OR PyTorch) -TensorFlow filetype:pdf` searches for ML content about Python or PyTorch, excluding TensorFlow, in PDF format.
21
+ | Parameter | Description |
22
+ |-----------|-------------|
23
+ | Query | The search query (required) |
24
+ | Count | Max results per section, 1-100 (default: 10) |
25
+ | Country | Two-letter country code to focus results geographically |
26
+ | Freshness | Filter by recency: day, week, month, or year |
27
+ | Language | BCP 47 language code for results (default: EN) |
28
+ | Livecrawl | Fetch full page content for web, news, or all results |
29
+ | Livecrawl Format | Format for livecrawled content: markdown or HTML |
30
+ | Offset | Pagination offset, 0-9 |
31
+ | Safe Search | Content filter: off, moderate, or strict |
53
32
 
54
33
  ### Get Contents
55
34
 
56
- Extract content from one or more URLs. Returns clean text, HTML, or structured metadata.
35
+ Extract clean, structured content from one or more web pages. Returns page text as markdown or HTML, plus metadata like JSON-LD, OpenGraph, and Twitter Cards.
57
36
 
58
- | Parameter | Required | Description |
59
- | ------------- | -------- | -------------------------------------------------------- |
60
- | URLs | Yes | Comma-separated list of URLs to extract content from |
61
- | Formats | No | Output formats: Markdown, HTML, and/or Metadata |
62
- | Crawl Timeout | No | Timeout in seconds for page crawling (1-60) |
37
+ Useful for scraping product pages, pulling article text, or extracting structured data from any URL.
63
38
 
64
- **Output formats:**
39
+ | Parameter | Description |
40
+ |-----------|-------------|
41
+ | URLs | Comma-separated list of URLs to extract (required) |
42
+ | Formats | Output formats: markdown, HTML, and/or metadata (JSON-LD, OpenGraph, Twitter Cards) |
43
+ | Crawl Timeout | Timeout in seconds for page crawling, 1-60 (default: 30) |
65
44
 
66
- - **Markdown** - Clean text content, ideal for LLM processing
67
- - **HTML** - Full HTML with layout preserved
68
- - **Metadata** - Structured data (JSON-LD, OpenGraph, Twitter Cards)
45
+ ### Research
69
46
 
70
- ## Credentials
47
+ Get a comprehensive, cited answer to a complex question. The Research API searches the web, reads multiple sources, and synthesizes a detailed markdown response with inline numbered citations.
71
48
 
72
- 1. Visit [you.com/platform/api-keys](https://you.com/platform/api-keys) to get an API key
73
- 2. In n8n, go to **Credentials > New Credential**
74
- 3. Search for "You.com API"
75
- 4. Enter your API key and save
49
+ Perfect for competitive analysis, market research, technical due diligence, or any question that needs more than a simple search result.
76
50
 
77
- ## Example Use Cases
51
+ | Parameter | Description |
52
+ |-----------|-------------|
53
+ | Input | The research question (required) |
54
+ | Research Effort | Controls depth and speed (see below, default: standard) |
78
55
 
79
- - **Research workflows**: Search for information and extract full content from top results
80
- - **Content aggregation**: Monitor news across topics with customizable filters
81
- - **Data enrichment**: Extract metadata from URLs in your workflows
56
+ **Research Effort levels:**
82
57
 
83
- ## Development
58
+ | Level | Description |
59
+ |-------|-------------|
60
+ | Lite | Quick answers for straightforward questions |
61
+ | Standard | Balanced speed and depth (default) |
62
+ | Deep | More time researching and cross-referencing sources |
63
+ | Exhaustive | Most thorough option for complex research tasks |
64
+
65
+ ## Credentials
84
66
 
85
- ```bash
86
- # Install dependencies
87
- bun install
67
+ 1. Go to [you.com/platform/api-keys](https://you.com/platform/api-keys) to get an API key
68
+ 2. In n8n, go to Credentials and create a new "You.com API" credential
69
+ 3. Paste your API key and save
88
70
 
89
- # Build the package
90
- bun run build
71
+ ## Usage
91
72
 
92
- # Run tests
93
- bun test
73
+ 1. Add the "You.com" node to your workflow
74
+ 2. Select an operation (Search, Get Contents, or Research)
75
+ 3. Configure the parameters for your chosen operation
76
+ 4. Run the workflow
94
77
 
95
- # Linting, formatting, and type checking
96
- bun run check
97
- ```
78
+ This node also works as a tool for [AI agents in n8n](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/). Connect it to an agent node and let the agent decide when to search the web, extract page content, or run deep research.
98
79
 
99
80
  ## Resources
100
81
 
101
- - [You.com API Documentation](https://docs.you.com/)
102
- - [Search API Reference](https://docs.you.com/api-reference/search/v1-search)
103
- - [Search Operators](https://docs.you.com/search/search-operators)
104
- - [Contents API Reference](https://docs.you.com/api-reference/search/contents)
105
- - [n8n Community Nodes Documentation](https://docs.n8n.io/integrations/community-nodes/)
82
+ - [You.com API docs](https://docs.you.com/)
83
+ - [Search API reference](https://docs.you.com/api-reference/search)
84
+ - [Contents API reference](https://docs.you.com/api-reference/contents)
85
+ - [Research API reference](https://docs.you.com/api-reference/research)
86
+ - [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)
106
87
 
107
88
  ## License
108
89
 
109
- MIT
90
+ [MIT](LICENSE)
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
6
8
  var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
8
10
  if (entry)
9
11
  return entry;
10
12
  entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
16
21
  __moduleCache.set(from, entry);
17
22
  return entry;
18
23
  };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
19
29
  var __export = (target, all) => {
20
30
  for (var name in all)
21
31
  __defProp(target, name, {
22
32
  get: all[name],
23
33
  enumerable: true,
24
34
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
35
+ set: __exportSetter.bind(all, name)
26
36
  });
27
37
  };
28
38
 
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __moduleCache = /* @__PURE__ */ new WeakMap;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
6
8
  var __toCommonJS = (from) => {
7
- var entry = __moduleCache.get(from), desc;
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
8
10
  if (entry)
9
11
  return entry;
10
12
  entry = __defProp({}, "__esModule", { value: true });
11
- if (from && typeof from === "object" || typeof from === "function")
12
- __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
- get: () => from[key],
14
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
- }));
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
16
21
  __moduleCache.set(from, entry);
17
22
  return entry;
18
23
  };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
19
29
  var __export = (target, all) => {
20
30
  for (var name in all)
21
31
  __defProp(target, name, {
22
32
  get: all[name],
23
33
  enumerable: true,
24
34
  configurable: true,
25
- set: (newValue) => all[name] = () => newValue
35
+ set: __exportSetter.bind(all, name)
26
36
  });
27
37
  };
28
38
 
@@ -33,58 +43,7 @@ __export(exports_YouDotCom_node, {
33
43
  });
34
44
  module.exports = __toCommonJS(exports_YouDotCom_node);
35
45
  var import_n8n_workflow = require("n8n-workflow");
36
- var import_zod2 = require("zod");
37
-
38
- // nodes/YouDotCom/YouDotCom.schemas.ts
39
- var import_zod = require("zod");
40
- var SearchOptionsSchema = import_zod.z.object({
41
- count: import_zod.z.number().int().min(1).max(100).optional().describe("Number of search results to return (1-100)"),
42
- country: import_zod.z.string().optional().describe("Two-letter country code to filter results (e.g., US, GB)"),
43
- freshness: import_zod.z.enum(["day", "week", "month", "year"]).optional().describe("Filter results by recency"),
44
- language: import_zod.z.string().optional().describe("BCP 47 language code to filter results (e.g., en, es, fr)"),
45
- livecrawl: import_zod.z.enum(["web", "news", "all"]).optional().describe("Type of content to crawl in real-time"),
46
- livecrawl_formats: import_zod.z.enum(["html", "markdown"]).optional().describe("Format for live-crawled content"),
47
- offset: import_zod.z.number().int().min(0).max(9).optional().describe("Pagination offset for search results (0-9)"),
48
- safesearch: import_zod.z.enum(["off", "moderate", "strict"]).optional().describe("Safe search filtering level")
49
- });
50
- var WebResultSchema = import_zod.z.object({
51
- url: import_zod.z.string().describe("URL of the search result"),
52
- title: import_zod.z.string().describe("Title of the search result"),
53
- description: import_zod.z.string().describe("Description snippet of the search result"),
54
- snippets: import_zod.z.array(import_zod.z.string()).optional().describe("Content snippets"),
55
- page_age: import_zod.z.string().optional().describe("Publication timestamp")
56
- }).passthrough();
57
- var NewsResultSchema = import_zod.z.object({
58
- url: import_zod.z.string().describe("URL of the news article"),
59
- title: import_zod.z.string().describe("Title of the news article"),
60
- description: import_zod.z.string().describe("Description snippet of the news article"),
61
- page_age: import_zod.z.string().optional().describe("Publication timestamp")
62
- }).passthrough();
63
- var MetadataSchema = import_zod.z.object({
64
- search_uuid: import_zod.z.string().optional().describe("Unique search request ID"),
65
- query: import_zod.z.string().optional().describe("Query that was searched"),
66
- latency: import_zod.z.number().optional().describe("Latency in seconds")
67
- }).passthrough();
68
- var SearchResponseSchema = import_zod.z.object({
69
- results: import_zod.z.object({
70
- web: import_zod.z.array(WebResultSchema).optional().describe("Web search results"),
71
- news: import_zod.z.array(NewsResultSchema).optional().describe("News search results")
72
- }).passthrough(),
73
- metadata: MetadataSchema.optional()
74
- }).passthrough();
75
- var ContentsOptionsSchema = import_zod.z.object({
76
- formats: import_zod.z.array(import_zod.z.enum(["markdown", "html", "metadata"])).optional().describe("Output formats for extracted content"),
77
- crawl_timeout: import_zod.z.number().int().min(1).max(60).optional().describe("Timeout in seconds for content crawling (1-60)")
78
- });
79
- var ContentsResponseSchema = import_zod.z.array(import_zod.z.object({
80
- url: import_zod.z.string().url().describe("URL of the extracted content"),
81
- markdown: import_zod.z.string().optional().describe("Content in Markdown format"),
82
- html: import_zod.z.string().optional().describe("Content in HTML format"),
83
- metadata: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional().describe("Metadata extracted from the page")
84
- }).passthrough());
85
-
86
- // nodes/YouDotCom/YouDotCom.node.ts
87
- var PACKAGE_VERSION = "0.2.6";
46
+ var PACKAGE_VERSION = "0.2.8";
88
47
  var USER_AGENT = `n8n-nodes-youdotcom/${PACKAGE_VERSION} (https://github.com/youdotcom-oss/n8n-nodes-youdotcom)`;
89
48
 
90
49
  class YouDotCom {
@@ -96,26 +55,18 @@ class YouDotCom {
96
55
  version: 1,
97
56
  usableAsTool: true,
98
57
  subtitle: '={{$parameter["operation"]}}',
99
- description: "Search the web and extract content from URLs using You.com APIs",
58
+ description: "Search the web, extract content from URLs, and run multi-step research using You.com APIs",
100
59
  defaults: {
101
60
  name: "You.com"
102
61
  },
103
- inputs: ["main"],
104
- outputs: ["main"],
62
+ inputs: [import_n8n_workflow.NodeConnectionTypes.Main],
63
+ outputs: [import_n8n_workflow.NodeConnectionTypes.Main],
105
64
  credentials: [
106
65
  {
107
66
  name: "youDotComApi",
108
67
  required: true
109
68
  }
110
69
  ],
111
- requestDefaults: {
112
- baseURL: "https://ydc-index.io",
113
- headers: {
114
- Accept: "application/json",
115
- "Content-Type": "application/json",
116
- "User-Agent": USER_AGENT
117
- }
118
- },
119
70
  properties: [
120
71
  {
121
72
  displayName: "Operation",
@@ -123,17 +74,23 @@ class YouDotCom {
123
74
  type: "options",
124
75
  noDataExpression: true,
125
76
  options: [
126
- {
127
- name: "Search",
128
- value: "search",
129
- description: "Search the web and news using You.com",
130
- action: "Search the web and news"
131
- },
132
77
  {
133
78
  name: "Get Contents",
134
79
  value: "contents",
135
80
  description: "Extract content from one or more URLs",
136
81
  action: "Extract content from web pages"
82
+ },
83
+ {
84
+ name: "Research",
85
+ value: "research",
86
+ description: "Get a comprehensive, cited answer to a complex question",
87
+ action: "Research a complex question"
88
+ },
89
+ {
90
+ name: "Search",
91
+ value: "search",
92
+ description: "Search the web and news using You.com",
93
+ action: "Search the web and news"
137
94
  }
138
95
  ],
139
96
  default: "search"
@@ -410,6 +367,57 @@ class YouDotCom {
410
367
  description: "Timeout in seconds for page crawling (1-60)"
411
368
  }
412
369
  ]
370
+ },
371
+ {
372
+ displayName: "Input",
373
+ name: "input",
374
+ type: "string",
375
+ required: true,
376
+ typeOptions: {
377
+ rows: 4
378
+ },
379
+ displayOptions: {
380
+ show: {
381
+ operation: ["research"]
382
+ }
383
+ },
384
+ default: "",
385
+ placeholder: "e.g., Which global cities improved air quality the most over the past 10 years?",
386
+ description: "The research question or complex query requiring in-depth investigation"
387
+ },
388
+ {
389
+ displayName: "Research Effort",
390
+ name: "researchEffort",
391
+ type: "options",
392
+ displayOptions: {
393
+ show: {
394
+ operation: ["research"]
395
+ }
396
+ },
397
+ default: "standard",
398
+ description: "Controls the depth and time spent on research",
399
+ options: [
400
+ {
401
+ name: "Lite",
402
+ value: "lite",
403
+ description: "Quick answers for straightforward questions"
404
+ },
405
+ {
406
+ name: "Standard",
407
+ value: "standard",
408
+ description: "Balanced speed and depth for most questions"
409
+ },
410
+ {
411
+ name: "Deep",
412
+ value: "deep",
413
+ description: "More time researching and cross-referencing sources"
414
+ },
415
+ {
416
+ name: "Exhaustive",
417
+ value: "exhaustive",
418
+ description: "Most thorough option for complex research tasks"
419
+ }
420
+ ]
413
421
  }
414
422
  ]
415
423
  };
@@ -431,31 +439,14 @@ class YouDotCom {
431
439
  itemData: { item: i }
432
440
  });
433
441
  returnData.push(...executionData);
434
- }
435
- } catch (error) {
436
- if (error instanceof import_zod2.ZodError) {
437
- const errorMessage = `Validation error:
438
- ${error.issues.map((e, i2) => ` ${i2 + 1}. ${e.path.join(".") || "root"}: ${e.message}`).join(`
439
- `)}`;
440
- const serializedIssues = error.issues.map((issue) => ({
441
- path: issue.path.join("."),
442
- message: issue.message,
443
- code: issue.code
444
- }));
445
- if (this.continueOnFail()) {
446
- returnData.push({
447
- json: {
448
- error: errorMessage,
449
- validationErrors: serializedIssues
450
- },
451
- pairedItem: { item: i }
452
- });
453
- continue;
454
- }
455
- throw new import_n8n_workflow.NodeApiError(this.getNode(), { message: errorMessage, issues: serializedIssues }, {
456
- itemIndex: i
442
+ } else if (operation === "research") {
443
+ const response = await YouDotCom.#executeResearch(this, i);
444
+ const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(response), {
445
+ itemData: { item: i }
457
446
  });
447
+ returnData.push(...executionData);
458
448
  }
449
+ } catch (error) {
459
450
  if (this.continueOnFail()) {
460
451
  returnData.push({
461
452
  json: {
@@ -474,8 +465,7 @@ ${error.issues.map((e, i2) => ` ${i2 + 1}. ${e.path.join(".") || "root"}: ${e.m
474
465
  }
475
466
  static async#executeSearch(context, itemIndex) {
476
467
  const query = context.getNodeParameter("query", itemIndex);
477
- const rawOptions = context.getNodeParameter("searchOptions", itemIndex);
478
- const options = SearchOptionsSchema.parse(rawOptions);
468
+ const options = context.getNodeParameter("searchOptions", itemIndex);
479
469
  const qs = { query };
480
470
  if (options.count)
481
471
  qs.count = options.count;
@@ -502,20 +492,19 @@ ${error.issues.map((e, i2) => ` ${i2 + 1}. ${e.path.join(".") || "root"}: ${e.m
502
492
  qs,
503
493
  json: true
504
494
  });
505
- const response = SearchResponseSchema.parse(rawResponse);
506
- return response;
495
+ return rawResponse;
507
496
  }
508
497
  static async#executeContents(context, itemIndex) {
509
498
  const urlsString = context.getNodeParameter("urls", itemIndex);
510
- const rawOptions = context.getNodeParameter("contentsOptions", itemIndex);
511
- const options = ContentsOptionsSchema.parse(rawOptions);
499
+ const options = context.getNodeParameter("contentsOptions", itemIndex);
512
500
  const urls = urlsString.split(",").map((url) => url.trim()).filter((url) => url.length > 0);
513
501
  if (urls.length === 0) {
514
502
  throw new import_n8n_workflow.NodeOperationError(context.getNode(), "At least one URL is required", { itemIndex });
515
503
  }
516
504
  const body = { urls };
517
- if (options.formats && options.formats.length > 0) {
518
- body.formats = options.formats;
505
+ const formats = options.formats;
506
+ if (formats && formats.length > 0) {
507
+ body.formats = formats;
519
508
  }
520
509
  if (options.crawl_timeout) {
521
510
  body.crawl_timeout = options.crawl_timeout;
@@ -529,7 +518,24 @@ ${error.issues.map((e, i2) => ` ${i2 + 1}. ${e.path.join(".") || "root"}: ${e.m
529
518
  body,
530
519
  json: true
531
520
  });
532
- const response = ContentsResponseSchema.parse(rawResponse);
533
- return response;
521
+ return rawResponse;
522
+ }
523
+ static async#executeResearch(context, itemIndex) {
524
+ const input = context.getNodeParameter("input", itemIndex);
525
+ const researchEffort = context.getNodeParameter("researchEffort", itemIndex);
526
+ const body = { input };
527
+ if (researchEffort) {
528
+ body.research_effort = researchEffort;
529
+ }
530
+ const rawResponse = await context.helpers.httpRequestWithAuthentication.call(context, "youDotComApi", {
531
+ method: "POST",
532
+ url: "https://api.you.com/v1/research",
533
+ headers: {
534
+ "User-Agent": USER_AGENT
535
+ },
536
+ body,
537
+ json: true
538
+ });
539
+ return rawResponse;
534
540
  }
535
541
  }
@@ -6,7 +6,7 @@
6
6
  "resources": {
7
7
  "credentialDocumentation": [
8
8
  {
9
- "url": "https://docs.you.com/get-started/quickstart"
9
+ "url": "https://docs.you.com/quickstart"
10
10
  }
11
11
  ],
12
12
  "primaryDocumentation": [
@@ -14,11 +14,27 @@
14
14
  "url": "https://docs.you.com/api-reference/search"
15
15
  },
16
16
  {
17
- "url": "https://docs.you.com/api-reference/search/contents"
17
+ "url": "https://docs.you.com/api-reference/contents"
18
+ },
19
+ {
20
+ "url": "https://docs.you.com/api-reference/research"
18
21
  }
19
22
  ]
20
23
  },
21
- "alias": ["search", "web search", "you", "youdotcom", "news", "ai search", "contents", "extract", "scrape", "crawl"],
24
+ "alias": [
25
+ "search",
26
+ "web search",
27
+ "you",
28
+ "youdotcom",
29
+ "news",
30
+ "ai search",
31
+ "contents",
32
+ "extract",
33
+ "scrape",
34
+ "crawl",
35
+ "research",
36
+ "deep research"
37
+ ],
22
38
  "subcategories": {
23
39
  "Utility": ["Data Transformation"]
24
40
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@youdotcom-oss/n8n-nodes-youdotcom",
3
- "version": "0.2.6",
4
- "description": "n8n community node for You.com APIs - Search and Contents extraction",
3
+ "version": "0.2.8",
4
+ "description": "n8n community node for You.com APIs - Search, Contents extraction, and Research",
5
5
  "license": "MIT",
6
6
  "engines": {
7
7
  "node": ">=18"
@@ -58,8 +58,7 @@
58
58
  ]
59
59
  },
60
60
  "peerDependencies": {
61
- "n8n-workflow": "^2.6.0",
62
- "zod": "^3.25.67"
61
+ "n8n-workflow": "*"
63
62
  },
64
63
  "devDependencies": {
65
64
  "@biomejs/biome": "^2.3.8",
@@ -67,7 +66,6 @@
67
66
  "@types/bun": "^1.3.9",
68
67
  "eslint": "9.32.0",
69
68
  "n8n-workflow": "^2.6.0",
70
- "typescript": "^5.9.3",
71
- "zod": "^3.25.67"
69
+ "typescript": "^5.9.3"
72
70
  }
73
71
  }