{
  "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
          }
        ]
      ]
    }
  }
}