AutomationFlowsAI & RAG › Email News Briefing by Keyword From Bright Data with AI Summary

Email News Briefing by Keyword From Bright Data with AI Summary

ByGleb D @glebd on n8n.io

This n8n workflow automatically retrieves recent Reuters news articles related to a user-specified keyword, summarizes the main findings using Google Gemini, formats the output into styled HTML, and sends a clean email report to a specified address.

Event trigger★★★★☆ complexityAI-powered13 nodesHTTP RequestForm TriggerGoogle Gemini ChatEmail SendChain Llm
AI & RAG Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #4570 — we link there as the canonical source.

This workflow follows the Chainllm → Emailsend recipe pattern — see all workflows that pair these two integrations.

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 →

Download .json
{
  "nodes": [
    {
      "id": "78600483-749e-452c-a1e0-cde275f2656c",
      "name": "Snapshot Progress",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        220,
        0
      ],
      "parameters": {
        "url": "=https://api.brightdata.com/datasets/v3/progress/{{ $('HTTP Request- Post API call to Bright Data').item.json.snapshot_id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "2dbd6ad2-bcd7-4753-a150-6a4bff419d76",
      "name": "HTTP Request- Post API call to Bright Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -280,
        260
      ],
      "parameters": {
        "url": "https://api.brightdata.com/datasets/v3/trigger",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendQuery": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "keyword",
              "value": "={{ $json[\"Keyword\"] }}"
            },
            {
              "name": "sort",
              "value": "relevance"
            }
          ]
        },
        "queryParameters": {
          "parameters": [
            {
              "name": "dataset_id",
              "value": "gd_lyptx9h74wtlvpnfu"
            },
            {
              "name": "type",
              "value": "discover_new"
            },
            {
              "name": "discover_by",
              "value": "keyword"
            },
            {
              "name": "include_errors",
              "value": "true"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "dfd7a841-be32-4ea4-954c-95e24b6bb46a",
      "name": "Wait - Polling Bright Data",
      "type": "n8n-nodes-base.wait",
      "position": [
        0,
        0
      ],
      "parameters": {
        "amount": 15
      },
      "executeOnce": false,
      "typeVersion": 1.1
    },
    {
      "id": "f9f032aa-5128-4705-94ab-af93965159fb",
      "name": "If - Checking status of Snapshot - if data is ready or not",
      "type": "n8n-nodes-base.if",
      "position": [
        440,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "7932282b-71bb-4bbb-ab73-4978e554de7e",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "running"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e5b658cd-c7df-4b17-ac1d-378cd58a1197",
      "name": "HTTP Request - Getting data from Bright Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        660,
        0
      ],
      "parameters": {
        "url": "=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "format",
              "value": "json"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "d2aa4201-f58c-4d63-81ae-ebb721297c31",
      "name": "When User Completes Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -500,
        260
      ],
      "parameters": {
        "options": {
          "ignoreBots": true
        },
        "formTitle": "Search from Reuters by keyword",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Keyword",
              "placeholder": "e.g. \"energy shutdown\"",
              "requiredField": true
            }
          ]
        },
        "responseMode": "lastNode",
        "formDescription": "Provide a keyword to search and summarize relevant news"
      },
      "typeVersion": 2.2
    },
    {
      "id": "f45da408-0497-45ad-ace6-bef91660f8b3",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        440
      ],
      "parameters": {
        "height": 220,
        "content": "## Note\nYou can customize the sorting filter to \"newest\" or \"oldest\" if you prefer. However, it's recommended to keep it set to \"relevance\" - the results will be sorted by the most recent founding dates in the next steps anyway."
      },
      "typeVersion": 1
    },
    {
      "id": "9038d986-d23a-4f83-87c0-9ce213aa7021",
      "name": "Code - Parse and Clean JSON Data",
      "type": "n8n-nodes-base.code",
      "position": [
        880,
        0
      ],
      "parameters": {
        "language": "python",
        "pythonCode": "from datetime import datetime\n\nall_news = _input.all()\n\nvalid_news = []\nfor item in all_news:\n    news = item.json\n    date_str = news.get(\"publication_date\")\n    try:\n        date = datetime.strptime(date_str, \"%Y-%m-%dT%H:%M:%S.%fZ\")\n        valid_news.append((date, news))\n    except (TypeError, ValueError):\n        continue\n\nsorted_news = sorted(valid_news, key=lambda x: x[0], reverse=True)\n\ncleaned = []\nfor _, c in sorted_news[:10]:\n    topics = c.get(\"topics\") or []\n\n    cleaned.append({\n        \"headline\": c.get(\"headline\"),\n        \"url\": c.get(\"url\"),\n        \"author\": c.get(\"author\"),\n        \"publication_date\": c.get(\"publication_date\"),\n        \"type\": c.get(\"type\"),\n        \"content\": c.get(\"content\"),\n        \"keyword\": c.get(\"keyword\"),\n        \"topics\": \", \".join(topics)\n    })\n\nreturn [{\n    \"json\": {\n        \"news\": cleaned\n    }\n}]\n"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "21f43041-f540-4158-a23d-648921ac3cac",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        660,
        440
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.0-flash"
      },
      "typeVersion": 1
    },
    {
      "id": "90b674c1-c8f4-4256-b27c-999ea1d93ee6",
      "name": "Email Report",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1480,
        260
      ],
      "parameters": {
        "html": "={{ $json.html }}",
        "options": {},
        "subject": "=Your N8N report about Reuters News by keyword: {{ $('When User Completes Form').first().json['Keyword']}}",
        "toEmail": "user@example.com",
        "fromEmail": "user@example.com"
      },
      "typeVersion": 2.1
    },
    {
      "id": "53fc100e-a4ee-4d91-9b75-af96b6ba0fcd",
      "name": "Markdown",
      "type": "n8n-nodes-base.markdown",
      "position": [
        1040,
        260
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.text }}",
        "destinationKey": "html"
      },
      "typeVersion": 1
    },
    {
      "id": "ba02c4c2-5b52-409b-9d83-d69ab9d762fd",
      "name": "Code - Build HTML",
      "type": "n8n-nodes-base.code",
      "position": [
        1260,
        260
      ],
      "parameters": {
        "jsCode": "const rawHtml = $json.html;\n\nreturn [{\n  json: {\n    html: `\n      <html>\n        <head>\n          <style>\n            body { font-family: Arial, sans-serif; line-height: 1.5; font-size: 15px; }\n            h1, h2, h3 { color: #333; }\n            a { color: #1a73e8; text-decoration: none; }\n            ul { padding-left: 20px; }\n            li { margin-bottom: 6px; }\n          </style>\n        </head>\n        <body>\n          ${rawHtml}\n        </body>\n      </html>\n    `\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "a3241735-79ca-49ca-aebb-8b17b3ef9ad4",
      "name": "Google Gemini - Summary Analisys",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        660,
        260
      ],
      "parameters": {
        "text": "={{$json}}",
        "messages": {
          "messageValues": [
            {
              "message": "=You are tasked with creating a news briefing. I will supply latest news articles about [keyword] which is interesting to user.\n\nYour goal is to produce a consolidated summary that captures the essence of these reports. Focus on:\n- What are the most important events, announcements, or findings?\n- Are there any recurring themes or common threads across the articles?\n- What is the overall sentiment or implication, if discernible from the facts presented?\n\nBe sure that every news article you are analyzing is closely related to [keyword]. Otherwise, skip it.\nProvide a brief, integrated summary.\nAlways include date range (from - to) about these news and use source links when mention exact news topics.\nThe [keyword] user requested initially: {{ $('When User Completes Form').first().json['Keyword']}}.\nDon't start your answer with 'Okay'."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.6
    }
  ],
  "connections": {
    "Markdown": {
      "main": [
        [
          {
            "node": "Code - Build HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Build HTML": {
      "main": [
        [
          {
            "node": "Email Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Snapshot Progress": {
      "main": [
        [
          {
            "node": "If - Checking status of Snapshot - if data is ready or not",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Google Gemini - Summary Analisys",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "When User Completes Form": {
      "main": [
        [
          {
            "node": "HTTP Request- Post API call to Bright Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait - Polling Bright Data": {
      "main": [
        [
          {
            "node": "Snapshot Progress",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code - Parse and Clean JSON Data": {
      "main": [
        [
          {
            "node": "Google Gemini - Summary Analisys",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini - Summary Analisys": {
      "main": [
        [
          {
            "node": "Markdown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request- Post API call to Bright Data": {
      "main": [
        [
          {
            "node": "Wait - Polling Bright Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request - Getting data from Bright Data": {
      "main": [
        [
          {
            "node": "Code - Parse and Clean JSON Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If - Checking status of Snapshot - if data is ready or not": {
      "main": [
        [
          {
            "node": "Wait - Polling Bright Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "HTTP Request - Getting data from Bright Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This n8n workflow automatically retrieves recent Reuters news articles related to a user-specified keyword, summarizes the main findings using Google Gemini, formats the output into styled HTML, and sends a clean email report to a specified address.

Source: https://n8n.io/workflows/4570/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Learn Anything From Hn - Get Top Resource Recommendations From Hacker News. Uses lmChatGoogleGemini, chainLlm, hackerNews, httpRequest. Event-driven trigger; 10 nodes.

Google Gemini Chat, Chain Llm, Hacker News +3
AI & RAG

Learning something new? Endlessly searching to find the best resources? This workflow finds top community-recommended learning resources on any topic from Hacker News, delivered to your inbox. User su

Google Gemini Chat, Chain Llm, Hacker News +3
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.

Form Trigger, Chain Llm, Output Parser Structured +8
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7
AI & RAG

This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.

Output Parser Structured, OpenAI Chat, Form Trigger +8