# Stocklake + n8n: Self-Hosted Community Node

*Published 2026-09-01 | updated 2026-09-03 | tags: Guide*

> Install the n8n-nodes-stocklake community node on self-hosted n8n - typed operations, a credential test button, and three ready-to-paste example workflows.

Canonical: https://www.stocklake.dev/blog/stocklake-mcp-with-n8n

**n8n-nodes-stocklake** is a community node published on npm that turns Stocklake's market-data API into regular n8n building blocks: a *Resource* dropdown (Stock, Screener, Market, Signals, Earnings, News, Watchlist), an *Operation* dropdown per resource, autocomplete-friendly symbol fields, and a credential type with a working *Test* button. Because the node is marked `usableAsTool`, n8n also generates a second version of it automatically - `Stocklake Tool` - that an AI Agent node can call with parameters the model fills in itself.

One thing worth being upfront about, since it explains the "self-hosted only" framing of everything below: this is a **community** node, not a verified one. n8n's own review team looked at it and made a fair point - every operation the node exposes round-trips through the same public MCP server that n8n's built-in *MCP Client* node can already call directly, so from their side it doesn't add a capability their own node doesn't already reach. They're building a dedicated registry for MCP-shaped integrations like this one rather than accepting them into the general community-node catalog. Until that exists, the node installs and runs perfectly well on self-hosted n8n via npm - it just isn't (yet) something n8n Cloud will let you install, since Cloud restricts community installs to the verified catalog. Nothing below is locked behind the node either way: the built-in MCP Client and MCP Client Tool nodes reach the exact same data, pointed at the same endpoint, with zero installation.

A couple of terms, before diving in

Community node

A third-party node published on npm and installed by package name from n8n's own Settings screen - distinct from a node built into n8n itself.

Node vs. MCP Client

n8n-nodes-stocklake gives every operation its own typed Resource + Operation dropdown. n8n's built-in MCP Client node instead takes a tool name and a raw JSON arguments blob for whatever MCP server you point it at.

Tool variant

n8n's automatic second version of a `usableAsTool` node - same operations, but callable by an AI Agent via `$fromAI()` instead of manually-set parameters.

Guest / Free / Pro

Stocklake's three tiers. Guest needs no key (25 calls/day, IP-limited); Free (200/day) is a stable key; Pro (5,000/day) adds AI research, insider activity, and the live signals feed.

## Installing the community node

This works on self-hosted n8n only - Cloud restricts community-node installs to n8n's verified catalog, and this one isn't in it (see the FAQ below for why). If you're on Cloud, skip ahead to *No install? Use the built-in MCP Client*.

1. Open **Settings → Community Nodes**.
1. Click **Install a community node**.
1. npm Package Name: `n8n-nodes-stocklake`
1. Check the box acknowledging you're installing unverified code from a public npm registry, and confirm.
1. The *Stocklake* node (and its auto-generated *Stocklake Tool* variant, plus both credential types) show up in the node panel immediately - no restart needed.

Two settings your instance needs, both defaults on a fresh self-hosted install: `N8N_COMMUNITY_PACKAGES_ENABLED=true` (community nodes at all) and `N8N_UNVERIFIED_PACKAGES_ENABLED=true` (unverified ones specifically, which n8n-nodes-stocklake currently is). If *Install a community node* doesn't appear as an option at all, one of those two is set to false in your instance's environment.

Package: [npmjs.com/package/n8n-nodes-stocklake](https://www.npmjs.com/package/n8n-nodes-stocklake)

### No install? Use the built-in MCP Client

Everything in the three workflows below still works with zero installation, on Cloud or self-hosted: point n8n's built-in *MCP Client* node (or *MCP Client Tool*, for the agent workflow) at `https://api.stocklake.dev/mcp`, authentication set to *None* for the guest tier or a Bearer token for a Free/Pro key. You lose the typed dropdowns and the credential test button; you don't lose any data or any tool - it's the same MCP server either way.

## Credentials

The node ships two credential types. Neither is required - every operation works unauthenticated, as a guest, on n8n's own request.

| Credential | What it needs | Notes |
|---|---|---|
| Stocklake API | An API key (optional) | Leave it blank to call as a guest (25/day). Paste a Free or Pro key to raise the limit and unlock Pro-only fields. Has a *Test* button that calls `get_stock(AAPL)` and reports back which tier resolved. |
| Stocklake OAuth2 API | Nothing to paste | *Connect my account* opens Stocklake's real login/consent screen. Uses Dynamic Client Registration - n8n registers itself with Stocklake automatically on first connect, since every self-hosted instance has a different callback URL and there's no single client ID to hardcode. |

## Node vs. the built-in MCP Client

|  | n8n-nodes-stocklake | Built-in MCP Client |
|---|---|---|
| Choosing an operation | Typed Resource + Operation dropdowns | A tool name picked from a list, plus a raw JSON arguments field |
| Credential | Dedicated credential type with a Test button | Manual header/auth config per node |
| Agent-ready variant | Automatic (`Stocklake Tool`) | A separate MCP Client Tool node, same raw JSON args |
| Works on | Self-hosted only, today | Anywhere - Cloud and self-hosted |

All three workflows below paste directly onto an empty canvas - copy a file's JSON from the appendix, click the canvas, and `Ctrl+V`. No import dialog needed. Credentials are deliberately left unset in the JSON: n8n auto-selects a matching credential on paste **only when exactly one of that type exists**. If you have both a Stocklake API and a Stocklake OAuth2 API credential saved, open each node afterward and pick the one you want.

## 1. Run several lookups at once

▶

Manual Trigger

click to run

→

S

Get Stock

AAPL

S

Screener

oversold, sorted by RSI

S

Market Pulse

VIX, Fear & Greed, breadth

One execution, three independent Stocklake nodes running in parallel off the same trigger

The simplest shape: a Manual Trigger fanning out into three Stocklake nodes with no dependency between them - *Stock → Get* for one symbol, *Screener → Screen* with the oversold preset, and *Market → Get Pulse*. Every operation here works on the free tier, including with no credential attached at all (guest, 25 calls/day). This is the workflow to paste in first just to confirm the node installed correctly and your credential (if you set one) resolves to the tier you expect.

Show workflow JSON - Stocklake Common Actions

Copy, then paste (`Ctrl+V`) onto an empty n8n canvas

```
{
  "name": "Stocklake - Common Actions",
  "nodes": [
    {
      "parameters": {},
      "id": "a1000000-0000-4000-8000-000000000001",
      "name": "When clicking 'Execute workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -40,
        300
      ]
    },
    {
      "parameters": {
        "resource": "stock",
        "operation": "get",
        "symbol": {
          "__rl": true,
          "value": "AAPL",
          "mode": "id"
        }
      },
      "id": "a1000000-0000-4000-8000-000000000002",
      "name": "Get Stock - AAPL",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        100
      ]
    },
    {
      "parameters": {
        "resource": "screener",
        "operation": "screen",
        "preset": "oversold",
        "limit": 10,
        "additionalFields": {
          "sortBy": "rsi",
          "sortDir": "asc"
        }
      },
      "id": "a1000000-0000-4000-8000-000000000003",
      "name": "Screener - Oversold",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        300
      ]
    },
    {
      "parameters": {
        "resource": "market",
        "operation": "getPulse"
      },
      "id": "a1000000-0000-4000-8000-000000000004",
      "name": "Market Pulse",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        500
      ]
    }
  ],
  "connections": {
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "Get Stock - AAPL",
            "type": "main",
            "index": 0
          },
          {
            "node": "Screener - Oversold",
            "type": "main",
            "index": 0
          },
          {
            "node": "Market Pulse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

## 2. Give an agent a market-data tool

💬

Chat Trigger

on message received

→

A

AI Agent

chat model + Stocklake tool

→

✉

Reply

back to the chat

The auto-generated Stocklake Tool node, wired to an AI Agent’s tool list

This is the `Stocklake Tool` variant - the node's automatically-generated second form, attached to an AI Agent node's tool input instead of running as a linear step. The symbol field is set to `{{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}`, so the model extracts the ticker from whatever the user actually asked ("what's the RSI on NVDA?") rather than it being hardcoded. The Agent's system message explicitly tells it to always call the tool for real numbers rather than answer from memory - worth keeping in any agent you attach this to, since an LLM asked for a stock price without a tool will happily make one up.

You'll need a chat model attached to the Agent (the example workflow points at an OpenAI-compatible endpoint - set the model name and base URL to whatever you run). Any tool-calling model works; the node is only useful to an agent that can actually invoke it.

Show workflow JSON - Stocklake AI Agent

Copy, then paste (`Ctrl+V`) onto an empty n8n canvas

```
{
  "name": "Stocklake - AI Agent",
  "nodes": [
    {
      "parameters": {
        "options": {}
      },
      "id": "b2000000-0000-4000-8000-000000000001",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        -40,
        300
      ],
      "webhookId": "b2000000-0000-4000-8000-0000000000ff"
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "You are a market research assistant with live access to Stocklake.\n\nAlways call the Stocklake tool to get real numbers before answering - never answer a price, RSI or indicator question from memory. Quote the figures you get back and say what they imply. Keep answers to a few sentences."
        }
      },
      "id": "b2000000-0000-4000-8000-000000000002",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        220,
        300
      ]
    },
    {
      "parameters": {
        "model": "mistral-small-4-openrouter-1",
        "options": {
          "temperature": 0.2
        }
      },
      "id": "b2000000-0000-4000-8000-000000000003",
      "name": "Chat Model (LiteLLM)",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.1,
      "position": [
        140,
        520
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Live stock market data from Stocklake. Use for a single stock's price, fundamentals and technical indicators (RSI, MACD, Bollinger, moving averages). Pass the ticker symbol, e.g. NVDA or AAPL.",
        "resource": "stock",
        "operation": "get",
        "symbol": {
          "__rl": true,
          "value": "={{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}",
          "mode": "id"
        }
      },
      "id": "b2000000-0000-4000-8000-000000000004",
      "name": "Stocklake",
      "type": "n8n-nodes-stocklake.stocklakeTool",
      "typeVersion": 1,
      "position": [
        360,
        520
      ]
    }
  ],
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chat Model (LiteLLM)": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Stocklake": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

## 3. A scheduled screener → research briefing

⌛

Schedule Trigger

weekdays, 15:00

→

S

Market Assessment

regime context

→

S

Screener

oversold, >$2B

→

{ }

Split Out

one item per stock

→

S

Get Research

AI research, per hit

A scheduled screen that hands off into per-stock AI research - add your own delivery step (email, Slack, a sheet) after the last node

A weekday screen for a real signal, not a demo toy: *Market → Get Assessment* for regime context, then *Screener → Screen* for stocks under RSI 30 above a $2B market cap, split into one item per result, and *Stock → Get Research* on each hit for an AI-synthesized summary, catalysts, and risks. `Get Research` is Pro-only; everything upstream of it works on free.

**Rate limits, read carefully before widening this:** *Screener*, *Get Many*, *Market → Get Movers*, *Signals*, and *Earnings → Get Intelligence* bill **one call per row returned**, not one per request - a screener call returning 25 stocks costs 25, not 1. This workflow deliberately caps the screener at 5 for exactly that reason. Raise the limit with the daily quota in mind, especially if *Get Research* also runs per hit downstream.

This workflow stops at the per-stock research call by design - add whatever delivery step fits your setup after it (a Merge node to compile results, then Slack, email, or a row appended to a sheet).

Show workflow JSON - Stocklake Daily Oversold Briefing

Copy, then paste (`Ctrl+V`) onto an empty n8n canvas

```
{
  "name": "Stocklake - Daily Oversold Briefing",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 15 * * 1-5"
            }
          ]
        }
      },
      "id": "c3000000-0000-4000-8000-000000000001",
      "name": "Weekdays 15:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -40,
        300
      ]
    },
    {
      "parameters": {
        "resource": "market",
        "operation": "getAssessment",
        "historyCount": 0
      },
      "id": "c3000000-0000-4000-8000-000000000002",
      "name": "Market Assessment",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        200,
        300
      ]
    },
    {
      "parameters": {
        "resource": "screener",
        "operation": "screen",
        "preset": "",
        "limit": 5,
        "additionalFields": {
          "maxRsi": 30,
          "minMarketCapB": 2,
          "sortBy": "rsi",
          "sortDir": "asc"
        }
      },
      "id": "c3000000-0000-4000-8000-000000000003",
      "name": "Oversold, >$2B",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        420,
        300
      ]
    },
    {
      "parameters": {
        "fieldToSplitOut": "results",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000004",
      "name": "One Item Per Stock",
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        640,
        300
      ]
    },
    {
      "parameters": {
        "resource": "stock",
        "operation": "getResearch",
        "symbol": {
          "__rl": true,
          "value": "={{ $json.symbol }}",
          "mode": "id"
        }
      },
      "id": "c3000000-0000-4000-8000-000000000005",
      "name": "AI Research (Pro)",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        860,
        300
      ]
    }
  ],
  "connections": {
    "Weekdays 15:00": {
      "main": [
        [
          {
            "node": "Market Assessment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Market Assessment": {
      "main": [
        [
          {
            "node": "Oversold, >$2B",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Oversold, >$2B": {
      "main": [
        [
          {
            "node": "One Item Per Stock",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "One Item Per Stock": {
      "main": [
        [
          {
            "node": "AI Research (Pro)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

## Which one should you build first?

|  | Setup time | Needs | Best for |
|---|---|---|---|
| 1. Run several lookups | ~5 minutes | Nothing - guest tier works | Confirming the node installed and your credential resolves correctly |
| 2. Agent tool | ~10 minutes | An AI Agent node with a chat model attached | Adding real market data to a bot you already run |
| 3. Screener → research | ~15 minutes | A Pro key, and a delivery step of your choosing | A standing daily watchlist you actually read |

One shared limitation across all three, worth knowing before you rely on any of them: on the guest tier, rate limiting is by IP address, not by identity - fine for a single self-hosted instance calling once a day, less fine if your n8n runs behind a shared or rotating IP alongside other guest traffic. If a scheduled run ever comes back empty with no error, check for a 429 in the node's output before assuming Stocklake genuinely found nothing.

## Frequently asked questions

Is there a verified n8n-nodes-stocklake node, or an official Stocklake listing in n8n's node directory?

Not yet. n8n-nodes-stocklake is a community node, installable today on any self-hosted n8n instance via npm. It hasn't gone through n8n's verified-node review - their reviewers pointed out, correctly, that every operation in the node round-trips through the same public MCP server n8n's own built-in MCP Client node can already call directly, and they're building a dedicated registry for that class of integration rather than accepting it into the general community-node catalog. Nothing here is locked behind the community node either way - the built-in MCP Client and MCP Client Tool nodes reach the identical data and tools with zero installation, on Cloud or self-hosted.

Can I install this on n8n Cloud?

Not the community node - Cloud only allows nodes that have passed n8n's verified review, and this one hasn't yet. On Cloud, point the built-in MCP Client node at https://api.stocklake.dev/mcp instead; every operation the community node exposes is reachable that way too, just addressed by tool name and raw JSON arguments instead of typed dropdowns.

Do I need a Stocklake API key to use the node?

No. Leave the node's credential unset and it calls Stocklake as a guest - 25 calls a day, rate-limited by IP. A free API key raises that to 200 calls/day with a stable identity instead of an IP limit. A Pro key (5,000/day) unlocks AI research, insider activity, and the live signals feed, and adds a second credential type - OAuth2 - that connects with one click via Dynamic Client Registration, with no client ID or secret to paste in.

What's the difference between the node and its Tool variant?

n8n auto-generates a Tool variant for any node marked usableAsTool - n8n-nodes-stocklake.stocklakeTool here. Same operations, same credential, but its parameters can be filled by an AI Agent at runtime via $fromAI() instead of being set by hand, so it plugs straight into an Agent node's tool list. This comes for free once the node is installed; no separate MCP Client Tool node needed.

Is there a discount for n8n users?

Yes - use code N8N-20OFF at checkout for 20% off Stocklake Pro, applied for 24 months. It unlocks the AI verdict/score fields, insider activity, and the live signals feed used in workflow 3 above, on top of a higher daily rate limit than free or guest.

## Appendix: full workflow JSON

### Workflow 1 - common actions

Full JSON - Stocklake Common Actions

Same file as above

```
{
  "name": "Stocklake - Common Actions",
  "nodes": [
    {
      "parameters": {},
      "id": "a1000000-0000-4000-8000-000000000001",
      "name": "When clicking 'Execute workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -40,
        300
      ]
    },
    {
      "parameters": {
        "resource": "stock",
        "operation": "get",
        "symbol": {
          "__rl": true,
          "value": "AAPL",
          "mode": "id"
        }
      },
      "id": "a1000000-0000-4000-8000-000000000002",
      "name": "Get Stock - AAPL",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        100
      ]
    },
    {
      "parameters": {
        "resource": "screener",
        "operation": "screen",
        "preset": "oversold",
        "limit": 10,
        "additionalFields": {
          "sortBy": "rsi",
          "sortDir": "asc"
        }
      },
      "id": "a1000000-0000-4000-8000-000000000003",
      "name": "Screener - Oversold",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        300
      ]
    },
    {
      "parameters": {
        "resource": "market",
        "operation": "getPulse"
      },
      "id": "a1000000-0000-4000-8000-000000000004",
      "name": "Market Pulse",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        220,
        500
      ]
    }
  ],
  "connections": {
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "Get Stock - AAPL",
            "type": "main",
            "index": 0
          },
          {
            "node": "Screener - Oversold",
            "type": "main",
            "index": 0
          },
          {
            "node": "Market Pulse",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

### Workflow 2 - AI agent tool

Full JSON - Stocklake AI Agent

Same file as above

```
{
  "name": "Stocklake - AI Agent",
  "nodes": [
    {
      "parameters": {
        "options": {}
      },
      "id": "b2000000-0000-4000-8000-000000000001",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.1,
      "position": [
        -40,
        300
      ],
      "webhookId": "b2000000-0000-4000-8000-0000000000ff"
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "You are a market research assistant with live access to Stocklake.\n\nAlways call the Stocklake tool to get real numbers before answering - never answer a price, RSI or indicator question from memory. Quote the figures you get back and say what they imply. Keep answers to a few sentences."
        }
      },
      "id": "b2000000-0000-4000-8000-000000000002",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        220,
        300
      ]
    },
    {
      "parameters": {
        "model": "mistral-small-4-openrouter-1",
        "options": {
          "temperature": 0.2
        }
      },
      "id": "b2000000-0000-4000-8000-000000000003",
      "name": "Chat Model (LiteLLM)",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.1,
      "position": [
        140,
        520
      ]
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Live stock market data from Stocklake. Use for a single stock's price, fundamentals and technical indicators (RSI, MACD, Bollinger, moving averages). Pass the ticker symbol, e.g. NVDA or AAPL.",
        "resource": "stock",
        "operation": "get",
        "symbol": {
          "__rl": true,
          "value": "={{ $fromAI('symbol', 'The stock ticker symbol, e.g. NVDA', 'string') }}",
          "mode": "id"
        }
      },
      "id": "b2000000-0000-4000-8000-000000000004",
      "name": "Stocklake",
      "type": "n8n-nodes-stocklake.stocklakeTool",
      "typeVersion": 1,
      "position": [
        360,
        520
      ]
    }
  ],
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chat Model (LiteLLM)": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Stocklake": {
      "ai_tool": [
        [
          {
            "node": "AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

### Workflow 3 - daily oversold briefing

Full JSON - Stocklake Daily Oversold Briefing

Same file as above

```
{
  "name": "Stocklake - Daily Oversold Briefing",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 15 * * 1-5"
            }
          ]
        }
      },
      "id": "c3000000-0000-4000-8000-000000000001",
      "name": "Weekdays 15:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -40,
        300
      ]
    },
    {
      "parameters": {
        "resource": "market",
        "operation": "getAssessment",
        "historyCount": 0
      },
      "id": "c3000000-0000-4000-8000-000000000002",
      "name": "Market Assessment",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        200,
        300
      ]
    },
    {
      "parameters": {
        "resource": "screener",
        "operation": "screen",
        "preset": "",
        "limit": 5,
        "additionalFields": {
          "maxRsi": 30,
          "minMarketCapB": 2,
          "sortBy": "rsi",
          "sortDir": "asc"
        }
      },
      "id": "c3000000-0000-4000-8000-000000000003",
      "name": "Oversold, >$2B",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        420,
        300
      ]
    },
    {
      "parameters": {
        "fieldToSplitOut": "results",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000004",
      "name": "One Item Per Stock",
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        640,
        300
      ]
    },
    {
      "parameters": {
        "resource": "stock",
        "operation": "getResearch",
        "symbol": {
          "__rl": true,
          "value": "={{ $json.symbol }}",
          "mode": "id"
        }
      },
      "id": "c3000000-0000-4000-8000-000000000005",
      "name": "AI Research (Pro)",
      "type": "n8n-nodes-stocklake.stocklake",
      "typeVersion": 1,
      "position": [
        860,
        300
      ]
    }
  ],
  "connections": {
    "Weekdays 15:00": {
      "main": [
        [
          {
            "node": "Market Assessment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Market Assessment": {
      "main": [
        [
          {
            "node": "Oversold, >$2B",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Oversold, >$2B": {
      "main": [
        [
          {
            "node": "One Item Per Stock",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "One Item Per Stock": {
      "main": [
        [
          {
            "node": "AI Research (Pro)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {}
}
```

Node types, versions, and field names above are copied directly from real exported n8n workflows against `n8n-nodes-stocklake@0.1.1` at the time of writing, not guessed. If a newer version has renamed a field, the node panel itself is the source of truth; reconfigure that one field and the rest of the import still holds.
