The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Vision+Search",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "test",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-40,
120
],
"id": "11edb4af-216a-4784-bd88-28b6341acf7a",
"name": "Webhook"
},
{
"parameters": {
"jsCode": "// Extract the auction items array from your nested data structure\nconst auctionData = $input.first().json.body.result.data\n\n// Return each auction as a separate item with flattened metadata\nreturn auctionData.map((auction, index) => ({\n json: {\n ...auction,\n // Add useful metadata from parent object\n job_id: $input.first().json.body.job_id,\n timestamp: $input.first().json.body.result.timestamp,\n total_found: $input.first().json.body.result.total_found,\n item_index: index + 1\n }\n}));\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
320,
120
],
"id": "928a1bc8-b439-41fc-925c-5be6bc1ce7c7",
"name": "Code"
},
{
"parameters": {
"batchSize": "={{ $json.total_found }}",
"options": {
"reset": false
}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
640,
120
],
"id": "cf919673-b7ed-40b0-beb1-4a5ea8d83da1",
"name": "Loop Over Items"
},
{
"parameters": {
"method": "POST",
"url": "https://openrouter.ai/api/v1/chat/completions",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openRouterApi",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "google/gemini-2.5-flash-lite-preview-06-17"
},
{
"name": "messages",
"value": "={{ [{\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": \"Describe in detail what is in the picture.\"\n },\n {\n \"type\": \"image_url\",\n \"image_url\": {\n \"url\":$json.detail_images[0]\n }\n },\n {\n \"type\": \"image_url\",\n \"image_url\": {\n \"url\": $json.detail_images[1]\n }\n }\n ]\n}]}}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
920,
140
],
"id": "0b9a464d-79eb-4853-bcc2-bd249469d5f6",
"name": "Vision Analysis1",
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"model": "gemini-2.5-flash-preview-04-17",
"prompt": "=Search to identify the exact item from this description:\"{{ $json.choices[0].message.content }}\",then try to estimate value in USD based on search.",
"options": {}
},
"type": "n8n-nodes-gemini-search.geminiSearch",
"typeVersion": 1,
"position": [
1240,
140
],
"id": "2a0d9989-f08c-4bc9-89f7-ba1969741fd2",
"name": "Gemini Search",
"credentials": {
"geminiSearchApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "451d8691-b050-4744-86dc-efb6098a912f",
"name": "title",
"value": "={{ $('Filter').item.json.title }}",
"type": "string"
},
{
"id": "6e6bc291-64ef-4c43-be9d-59d645104247",
"name": "price",
"value": "={{ $('Filter').item.json.price }}",
"type": "string"
},
{
"id": "a64ae774-50cd-4b1e-9fa2-076063e49bd5",
"name": "SearchResult",
"value": "={{ $json.response }}",
"type": "string"
},
{
"id": "ef70ee8e-858d-43d0-84ba-ecf65d1e7a6a",
"name": "sources",
"value": "={{ $json.fullResponse.candidates[0].groundingMetadata.groundingChunks }}",
"type": "array"
},
{
"id": "4437fc7c-2052-447d-aaba-505188c1b3d8",
"name": "url",
"value": "={{ $('Filter').item.json.url }}",
"type": "string"
},
{
"id": "31a77393-81d8-4aeb-b9f2-47b38e48775d",
"name": "seller_rating",
"value": "={{ $('Filter').item.json.seller_rating }}",
"type": "string"
},
{
"id": "679c8fc9-c9a2-491c-9d97-8326563934c9",
"name": "timeLeft",
"value": "={{ $('Filter').item.json.timeLeft }}",
"type": "string"
},
{
"id": "46a2227b-66cd-4ba0-a622-e1b1578b6cf5",
"name": "bidCount",
"value": "={{ $('Filter').item.json.bidCount }}",
"type": "string"
},
{
"id": "21a0e96c-1908-4ebe-be13-a88fe9a3ae17",
"name": "imageUrl",
"value": "={{ $('Filter').item.json.imageUrl }}",
"type": "string"
},
{
"id": "23905f8d-cd16-4045-9482-e9133aa0a68b",
"name": "job_id",
"value": "={{ $('Filter').item.json.job_id }}",
"type": "string"
},
{
"id": "9d09fc0f-3f04-47e0-b03e-21f1bd0b5743",
"name": "timestamp",
"value": "={{ $('Filter').item.json.timestamp }}",
"type": "string"
},
{
"id": "80e81b8b-99a5-4d5d-95e2-bd6a3cc57b8d",
"name": "item_index",
"value": "={{ $('Filter').item.json.item_index }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1420,
140
],
"id": "c5fa5444-8bf2-4ed1-8fcf-f68b4cf9fd9b",
"name": "Edit Fields"
},
{
"parameters": {
"promptType": "define",
"text": "=Data from backend use these, do not make your own stuff!:\"{{ $json.stringData }}\"\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Rare Coin Auctions | Premium Collectibles</title>\n \n <!-- CDN Dependencies -->\n <script src=\"https://cdn.tailwindcss.com\"></script>\n <link href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\" rel=\"stylesheet\">\n <script type=\"module\" src=\"https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js\"></script>\n \n <script>\n // TailwindCSS Configuration\n tailwind.config = {\n theme: {\n extend: {\n colors: {\n primary: '#8b5cf6',\n secondary: '#06b6d4',\n accent: '#f59e0b',\n success: '#10b981', // Green for good deals\n danger: '#ef4444', // Red for high prices\n dark: '#0f172a',\n 'dark-lighter': '#1e293b',\n 'dark-card': '#334155'\n }\n }\n }\n }\n </script>\n <style>\n /* A softer, more colorful background, kupo! */\n body { \n background-color: #0f172a; \n background-image: linear-gradient(to bottom, #0f172a, #1e293b);\n color: white; \n min-height: 100vh; \n }\n .line-clamp-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }\n </style>\n</head>\n<body>\n <div class=\"container mx-auto px-4 py-8\">\n <!-- Header -->\n <header class=\"text-center mb-12\">\n <h1 class=\"text-4xl font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent mb-4\">\n <i class=\"fas fa-coins mr-3\"></i>Rare Coin Auctions\n </h1>\n <p class=\"text-gray-400 text-lg\">Premium Historical Collectibles & Numismatic Treasures</p>\n </header>\n\n <!-- Lit App Root -->\n <auction-app></auction-app>\n\n </div>\n\n <!-- Main Application Logic -->\n <script type=\"module\">\n import { LitElement, html, css } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js';\n\n class AuctionCard extends LitElement {\n static properties = {\n item: { type: Object },\n _sourcesVisible: { state: true }\n };\n\n constructor() {\n super();\n this._sourcesVisible = false;\n }\n\n static styles = css`\n .search-result-box {\n background-color: rgba(139, 92, 246, 0.05);\n border-left: 3px solid #8b5cf6;\n padding: 0.75rem;\n margin-top: 1rem;\n margin-bottom: 1rem;\n border-radius: 0.25rem;\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: #d1d5db;\n }\n .search-result-box p { margin: 0; }\n .sources-list a {\n display: block;\n font-size: 0.75rem;\n background-color: rgba(51, 65, 85, 0.5);\n color: #9ca3af;\n padding: 0.5rem;\n border-radius: 0.25rem;\n transition: all 0.2s;\n }\n .sources-list a:hover {\n background-color: rgba(6, 182, 212, 0.2);\n color: #06b6d4;\n }\n `;\n \n toggleSources() { this._sourcesVisible = !this._sourcesVisible; }\n\n render() {\n const { item } = this;\n if (!item) return html``;\n\n // --- NEW: Price Difference Logic, kupo! ---\n // We check if the price is a good deal or not\n const priceDiffValue = item.PriceDifference ? parseFloat(item.PriceDifference) : 0;\n let priceDiffColor = '#9ca3af'; // Neutral gray\n if (priceDiffValue < 0) priceDiffColor = '#10b981'; // Success Green (Good deal!)\n if (priceDiffValue > 0) priceDiffColor = '#ef4444'; // Danger Red (Above market)\n \n const isUrgent = item.timeLeft.toLowerCase().includes('minut');\n\n return html`\n <!-- Softer corners with rounded-2xl! -->\n <div class=\"bg-dark-lighter border border-dark-card rounded-2xl p-6 hover:border-primary/50 transition-all duration-300 hover:shadow-2xl hover:shadow-primary/20 group\">\n \n <!-- FIX: Added overflow-hidden to contain the scaling image -->\n <div class=\"relative mb-4 rounded-xl overflow-hidden\">\n <img src=\"${item.imageUrl}\" alt=\"${item.title}\" \n class=\"w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300\"\n onerror=\"this.src='data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 width=%22200%22 height=%22200%22><rect width=%22100%25%22 height=%22100%25%22 fill=%22%23334155%22/><text x=%2250%25%22 y=%2250%25%22 text-anchor=%22middle%22 dy=%22.3em%22 fill=%22%2364748b%22>\ud83e\ude99</text></svg>'\">\n ${isUrgent ? html`<div class=\"absolute top-2 left-2 bg-danger/90 text-white px-2 py-1 rounded-full text-xs font-bold animate-pulse\"><i class=\"fas fa-clock mr-1\"></i>ENDING SOON</div>` : ''}\n </div>\n \n <h3 class=\"text-lg font-semibold mb-2 line-clamp-2 group-hover:text-primary transition-colors\">${item.title}</h3>\n \n <div class=\"space-y-2\">\n <div class=\"bg-dark-card rounded-lg p-3 flex items-center justify-between\">\n <span class=\"text-sm text-gray-400\">Current Price:</span>\n <span class=\"text-xl font-bold text-accent\">${item.price}</span>\n </div>\n\n <!-- NEW: PriceDifference display with colors! -->\n ${item.PriceDifference ? html`\n <div class=\"bg-dark-card rounded-lg p-3 flex items-center justify-between\">\n <span class=\"text-sm text-gray-400\">Market Value:</span>\n <span class=\"text-lg font-bold\" style=\"color: ${priceDiffColor};\">\n ${priceDiffValue > 0 ? '+' : ''}${item.PriceDifference}\n </span>\n </div>\n ` : ''}\n </div>\n \n <div class=\"search-result-box\">\n <p>${item.SearchResult}</p>\n </div>\n\n <div class=\"flex items-center justify-between text-sm text-gray-400 mb-4\">\n <div class=\"flex items-center\" title=\"Time Left\"><i class=\"fas fa-clock mr-2 text-secondary\"></i><span>${item.timeLeft}</span></div>\n <div class=\"flex items-center\" title=\"Bid Count\"><i class=\"fas fa-gavel mr-2 text-primary\"></i><span>${item.bidCount} bids</span></div>\n <div class=\"flex items-center text-green-400\" title=\"Seller Rating\"><i class=\"fas fa-star mr-1\"></i><span>${item.seller_rating}</span></div>\n </div>\n\n <div>\n <button @click=${this.toggleSources} class=\"w-full bg-dark-card hover:bg-dark-card/80 text-gray-300 py-2 px-3 rounded-lg text-sm transition-colors duration-200 flex items-center justify-center\">\n <i class=\"fas ${this._sourcesVisible ? 'fa-chevron-up' : 'fa-chevron-down'} mr-2\"></i>\n ${this._sourcesVisible ? 'Hide' : 'Show'} Sources (${item.sources.length})\n </button>\n ${this._sourcesVisible ? html`\n <div class=\"mt-2 space-y-1 sources-list\">\n ${item.sources.map(source => html`\n <a href=\"${source.web.uri}\" target=\"_blank\" rel=\"noopener noreferrer\">\n <i class=\"fas fa-external-link-alt mr-2\"></i>${new URL(source.web.uri).hostname}\n </a>\n `)}\n </div>` : ''}\n </div>\n \n <a href=\"${item.url}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block w-full bg-gradient-to-r from-primary to-secondary hover:from-primary/80 hover:to-secondary/80 text-white font-semibold py-3 px-4 rounded-lg text-center transition-all duration-300 hover:shadow-lg hover:shadow-primary/25 mt-4\">\n <i class=\"fas fa-external-link-alt mr-2\"></i>View Auction\n </a>\n </div>\n `;\n }\n }\n customElements.define('auction-card', AuctionCard);\n\n class AuctionApp extends LitElement {\n static properties = { auctionData: { type: Array } };\n constructor() { super(); this.auctionData = []; }\n \n static styles = css`\n :host {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));\n gap: 1.5rem;\n }\n `;\n\n render() {\n if (this.auctionData.length === 0) {\n return html`<p class=\"text-gray-400 col-span-full text-center py-10\">No auction data loaded yet, kupo! Waiting for treasures...</p>`;\n }\n return html`${this.auctionData.map(item => html`<auction-card .item=${item}></auction-card>`)}`;\n }\n }\n customElements.define('auction-app', AuctionApp);\n \n // --- AI INJECTION POINT ---\n window.loadAuctionData = (data) => {\n const app = document.querySelector('auction-app');\n if (app) app.auctionData = data;\n };\n </script>\n</body>\n</html>\n",
"messages": {
"messageValues": [
{
"message": "You are an expert web developer tasked with generating HTML content based on provided templates and data structures. Your goal is to create functional, well-structured HTML that follows the template's design patterns and incorporates the given data seamlessly. Instructions: Template Analysis: Carefully examine the provided HTML template to understand: Overall structure and layout patterns CSS classes and styling approach (Tailwind, custom CSS, etc.) JavaScript functionality and data binding methods Component patterns and reusable elements Data Integration: Use the provided data to: Populate dynamic content areas Generate repeated elements (cards, lists, tables) Apply conditional rendering based on data properties Maintain data type consistency and formatting Code Quality Standards: Write clean, semantic HTML5 Preserve existing CSS class structures Maintain JavaScript functionality patterns Use functional programming approaches where applicable Ensure responsive design principles are followed Key Requirements: Generate complete, valid HTML documents Preserve all interactive features from the template Apply proper data binding and templating logic Handle edge cases (missing data, empty arrays, etc.) Maintain accessibility standards Output Format: Provide complete HTML file with inline CSS/JS as needed Include proper DOCTYPE and meta tags Ensure cross-browser compatibility Use modern JavaScript (ES6+) syntax"
}
]
},
"batching": {}
},
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.7,
"position": [
1700,
-440
],
"id": "61fcc6ce-b3b9-4fbf-894d-b5bb87e0e6b6",
"name": "Basic LLM Chain1"
},
{
"parameters": {
"model": "google/gemini-2.5-flash-lite-preview-06-17",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
1720,
-280
],
"id": "809b8f34-5cfe-40a4-95a8-52e48de358c6",
"name": "OpenRouter Chat Model1",
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "write",
"fileName": "/data/output/aukro.html",
"options": {
"append": false
}
},
"type": "n8n-nodes-base.readWriteFile",
"typeVersion": 1,
"position": [
2220,
-440
],
"id": "cff3d8fb-6449-453e-a328-3e41cfacafbe",
"name": "Read/Write Files from Disk"
},
{
"parameters": {
"operation": "toText",
"sourceProperty": "text",
"options": {}
},
"type": "n8n-nodes-base.convertToFile",
"typeVersion": 1.1,
"position": [
2020,
-440
],
"id": "631a23e3-0566-4eff-ad57-4330d31ce883",
"name": "Convert to File1"
},
{
"parameters": {
"aggregate": "aggregateAllItemData",
"options": {}
},
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
1300,
-440
],
"id": "38fe86f9-5b75-4c10-990b-ea78c6d9c12c",
"name": "Aggregate"
},
{
"parameters": {
"jsCode": "const stringData = JSON.stringify($input.first().json.data);\nreturn { stringData };\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1460,
-440
],
"id": "41972a87-c249-426f-be9e-5754f017198d",
"name": "Code1"
},
{
"parameters": {
"model": "gemini-2.5-flash-preview-04-17",
"prompt": "=Evaluate the following item based on your instructions.\n\n**Evaluation Notes:**\n{{ $json.SearchResult }}\n\n**Current Price:**\n{{ $json.price }}\n\nReturn ONLY the percentage difference as a number.\n",
"systemInstruction": "You are an automated Price Evaluator. Your sole function is to determine if an item is overvalued or undervalued based on provided notes and a current price.\n\nYour operational steps are:\n1. Parse the 'Evaluation Notes' to find the estimated value range (e.g., \u20ac21.95 to \u20ac25.00). Calculate the average of this range to establish a single 'Estimated Price'.\n2. Identify the 'Current Price' and its currency (e.g., 275 K\u010d).\n3. You MUST use your internal tools to find the current, real-time exchange rate between the currency of the 'Estimated Price' and the 'Current Price'.\n4. Convert the 'Current Price' into the same currency as the 'Estimated Price'.\n5. Calculate the percentage difference using the formula: ((Converted Current Price - Estimated Price) / Estimated Price) * 100.\n6. Your final output MUST be a single number representing this percentage difference.\n7. Do NOT include the '%' sign, currency symbols, or any explanatory text in your response. Only the number.\n8. A positive number means the item is overvalued. A negative number means it is undervalued. Round the result to two decimal places.\n",
"options": {}
},
"type": "n8n-nodes-gemini-search.geminiSearch",
"typeVersion": 1,
"position": [
820,
-440
],
"id": "5d57949a-4c67-44c3-855f-d71b374db241",
"name": "Gemini Search2",
"credentials": {
"geminiSearchApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "c4dd91df-0346-41f8-93bf-854754baa65b",
"name": "title",
"value": "={{ $('Loop Over Items').item.json.title }}",
"type": "string"
},
{
"id": "8018e01a-47ab-4913-83af-f4e2e8174031",
"name": "price",
"value": "={{ $('Loop Over Items').item.json.price }}",
"type": "string"
},
{
"id": "e895a571-38e4-4624-b094-d0146a5f8914",
"name": "priceDifference",
"value": "={{ $json.response }}",
"type": "number"
},
{
"id": "5b575583-522c-4388-90f3-8babf9f91e3a",
"name": "SearchResult",
"value": "={{ $('Loop Over Items').item.json.SearchResult }}",
"type": "string"
},
{
"id": "a3bb17d1-d43a-4890-9768-402530b05f56",
"name": "sources",
"value": "={{ $('Loop Over Items').item.json.sources }}",
"type": "array"
},
{
"id": "76d8694e-3de2-4752-b7f3-8a5ec4edceb8",
"name": "sources[1]",
"value": "={{ $('Loop Over Items').item.json.sources[1] }}",
"type": "object"
},
{
"id": "57de972e-04c7-4434-a133-0cd9201c69f0",
"name": "sources[2]",
"value": "={{ $('Loop Over Items').item.json.sources[2] }}",
"type": "object"
},
{
"id": "47c4d61f-231b-4b9f-a79e-3bfcc0d38007",
"name": "sources[3]",
"value": "={{ $('Loop Over Items').item.json.sources[3] }}",
"type": "object"
},
{
"id": "17131656-43e5-41c0-92b8-ba04185397d6",
"name": "sources[4]",
"value": "={{ $('Loop Over Items').item.json.sources[4] }}",
"type": "object"
},
{
"id": "28766700-c5db-4056-82d6-749cb9d410f6",
"name": "url",
"value": "={{ $('Loop Over Items').item.json.url }}",
"type": "string"
},
{
"id": "6ce36054-81e5-4ebe-b7be-b0ed25265793",
"name": "seller_rating",
"value": "={{ $('Loop Over Items').item.json.seller_rating }}",
"type": "string"
},
{
"id": "b2754138-b1ed-41fa-b3b5-976a68ca15c1",
"name": "timeLeft",
"value": "={{ $('Loop Over Items').item.json.timeLeft }}",
"type": "string"
},
{
"id": "eacb30d8-1bee-4116-9073-023f964497f5",
"name": "bidCount",
"value": "={{ $('Loop Over Items').item.json.bidCount }}",
"type": "string"
},
{
"id": "227c93f4-d53a-4863-8b78-470b76ed4689",
"name": "imageUrl",
"value": "={{ $('Loop Over Items').item.json.imageUrl }}",
"type": "string"
},
{
"id": "e9807d08-4eb4-4212-baca-9296e69aa406",
"name": "job_id",
"value": "={{ $('Loop Over Items').item.json.job_id }}",
"type": "string"
},
{
"id": "1cd64ecc-3e60-478e-9b17-c8718da4f02d",
"name": "timestamp",
"value": "={{ $('Loop Over Items').item.json.timestamp }}",
"type": "string"
},
{
"id": "0e4d7533-c495-4f55-92ea-47c3427e376a",
"name": "item_index",
"value": "={{ $('Loop Over Items').item.json.item_index }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1000,
-440
],
"id": "10c05829-67f7-4659-bd34-e36aa2ae9a44",
"name": "Edit Fields1"
},
{
"parameters": {
"content": "# \ud83d\udce5 Data Ingestion\n**Endpoint:** POST /test\n**Expected Input:** Nested auction data structure\n",
"height": 440,
"width": 340,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-160,
-80
],
"id": "8dfca7d7-aa1d-456b-9341-55da1452203d",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "# \ud83d\udc41\ufe0f AI Image Analysis \n**Model:** Gemini 2.5 Flash Lite\n**Input:** First 2 detail_images from auction\n**Output:** Detailed item description\n",
"height": 440,
"width": 380,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
780,
-80
],
"id": "1c19cd17-3f4c-4900-b066-b0b4f4298705",
"name": "Sticky Note"
},
{
"parameters": {
"content": "# \ud83d\udcb0 Value Estimation\n**Process:** \n1. Search item based on vision description\n2. Estimate USD value from market data\n**Model:** Gemini 2.5 Flash Preview\n",
"height": 440,
"width": 380,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1200,
-80
],
"id": "c6471362-3d93-4a32-917e-43854e6e4c41",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "# \ud83d\udcb9 Price Analysis Engine\n**Function:** Smart valuation assessment\n**Logic:** Compares auction price vs. AI estimated value",
"height": 540,
"width": 480,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
720,
-740
],
"id": "3d8f13e3-2ac5-4451-a746-cd4a677abd52",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "# \ud83c\udfa8 Dynamic HTML Generator\n**Purpose:** Template-driven content creation\n**Input:** Processed auction data + analysis results\n\n**Template Features:**\n- Item cards with images & details\n- Price comparison indicators\n- Responsive design elements\n- Rich metadata display\n\n**Output:** Ready-to-serve HTML content",
"height": 540,
"width": 740,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1240,
-740
],
"id": "866037cc-7a06-44e6-8c53-5f4d2160a74b",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "# \ud83d\udcbe Persistent Storage\n**Function:** Disk I/O operations\n**Writes:** Generated HTML to filesystem",
"height": 540,
"width": 400,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2000,
-740
],
"id": "18114d4b-d312-4066-82a9-cf0ef1329cbb",
"name": "Sticky Note5"
},
{
"parameters": {
"content": "# \ud83d\udd0d Vision+Search Auction Analyzer\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n**Purpose:** Automated auction item identification & valuation\n**Flow:** Webhook \u2192 Process Data \u2192 AI Vision \u2192 Search & Value \u2192 Results\n\n\u26a1 **Key Features:**\n- Multi-image analysis via Gemini Vision\n- Automated value estimation\n- Batch processing support\n- Rich metadata extraction\n",
"height": 600,
"width": 780,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-160,
-740
],
"id": "544ed475-b0b5-4a6e-a24a-3e7eaaea8d85",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "# \ud83d\udd04 Data Transformation\n**Function:** Flattens auction array + adds metadata\n**Output:** Individual auction items with:\n- job_id, timestamp, total_found\n- item_index for tracking\n",
"height": 440,
"width": 420,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
200,
-80
],
"id": "4cb857d6-aaa3-430a-bd42-d1a0e269aafd",
"name": "Sticky Note7"
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Code": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Gemini Search2",
"type": "main",
"index": 0
}
],
[
{
"node": "Vision Analysis1",
"type": "main",
"index": 0
}
]
]
},
"Vision Analysis1": {
"main": [
[
{
"node": "Gemini Search",
"type": "main",
"index": 0
}
]
]
},
"Gemini Search": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model1": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Convert to File1": {
"main": [
[
{
"node": "Read/Write Files from Disk",
"type": "main",
"index": 0
}
]
]
},
"Basic LLM Chain1": {
"main": [
[
{
"node": "Convert to File1",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Code1",
"type": "main",
"index": 0
}
]
]
},
"Code1": {
"main": [
[
{
"node": "Basic LLM Chain1",
"type": "main",
"index": 0
}
]
]
},
"Gemini Search2": {
"main": [
[
{
"node": "Edit Fields1",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields1": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "55335af6-e725-4dd4-8dc8-0434bda0b6d3",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "tlqqNQe44raOGpH8",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
geminiSearchApiopenRouterApi
About this workflow
Vision+Search. Uses splitInBatches, httpRequest, n8n-nodes-gemini-search, chainLlm. Webhook trigger; 22 nodes.
Source: https://gitlab.com/Tiartyos/n8n-workflows/-/blob/master/workflows/aukro-scraper/workflow.json — original creator credit. Request a take-down →