This workflow corresponds to n8n.io template #8653 — we link there as the canonical source.
This workflow follows the Agent → Chainllm 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 →
{
"id": "B3qMasLQ1QMkxzGW",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Search and analyze social media profiles with Bright Data MCP and AIAgents",
"tags": [],
"nodes": [
{
"id": "19fda137-b8be-43b0-8828-0880db36deee",
"name": "Social Media Research Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
352,
336
],
"parameters": {
"options": {},
"formTitle": "Social Media Presence Researcher",
"formFields": {
"values": [
{
"fieldLabel": "Full Name",
"placeholder": "e.g., John Smith",
"requiredField": true
},
{
"fieldLabel": "Email Address",
"placeholder": "e.g., user@example.com"
},
{
"fieldLabel": "Company/Organization",
"placeholder": "e.g., TechCorp Inc"
},
{
"fieldLabel": "Location",
"placeholder": "e.g., San Francisco, CA"
},
{
"fieldType": "textarea",
"fieldLabel": "Known Social Handles",
"placeholder": "Optional: List any known social media handles\nLinkedIn: john-smith\nTwitter: @jsmith\nGitHub: jsmith-dev"
},
{
"fieldType": "dropdown",
"fieldLabel": "Search Depth",
"fieldOptions": {
"values": [
{
"option": "Basic - Quick scan"
},
{
"option": "Comprehensive - Full analysis"
},
{
"option": "Deep - Maximum detail"
}
]
},
"requiredField": true
},
{
"fieldType": "checkbox",
"fieldLabel": "Platforms to Search",
"fieldOptions": {
"values": [
{
"option": "LinkedIn"
},
{
"option": "X/Twitter"
},
{
"option": "Instagram"
},
{
"option": "GitHub"
},
{
"option": "YouTube"
},
{
"option": "TikTok"
},
{
"option": "Facebook"
},
{
"option": "Reddit"
},
{
"option": "Pinterest"
},
{
"option": "Snapchat"
}
]
}
}
]
},
"formDescription": "Enter person details to discover and analyze their complete social media presence across all major platforms"
},
"typeVersion": 2.3
},
{
"id": "e24ffee7-7895-4572-8de1-273baf764b8c",
"name": "Input Validator",
"type": "n8n-nodes-base.code",
"position": [
576,
336
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "// Get form data - handle both form and webhook inputs\nconst rawData = $input.item.json;\nconst formData = rawData.body || rawData; // Use body if it exists (webhook), otherwise use raw data (form)\n\n// Helper function to extract handles from text\nfunction parseKnownHandles(text) {\n if (!text) return {};\n \n const handles = {};\n const lines = text.split('\\n');\n \n lines.forEach(line => {\n // Check for LinkedIn URLs or mentions\n if (line.toLowerCase().includes('linkedin')) {\n const urlMatch = line.match(/linkedin\\.com\\/in\\/([^/\\s?]+)/);\n const textMatch = line.match(/linkedin:\\s*([A-Za-z0-9-]+)/i);\n if (urlMatch) handles.linkedin = urlMatch[1];\n else if (textMatch) handles.linkedin = textMatch[1];\n }\n \n // Check for Twitter/X handles\n if (line.toLowerCase().includes('twitter') || line.toLowerCase().includes('x:') || line.includes('@')) {\n const match = line.match(/@([A-Za-z0-9_]+)|twitter:\\s*([A-Za-z0-9_]+)|x:\\s*([A-Za-z0-9_]+)/i);\n if (match) handles.twitter = match[1] || match[2] || match[3];\n }\n \n // Check for GitHub\n if (line.toLowerCase().includes('github')) {\n const urlMatch = line.match(/github\\.com\\/([A-Za-z0-9-]+)/);\n const textMatch = line.match(/github:\\s*([A-Za-z0-9_-]+)/i);\n if (urlMatch) handles.github = urlMatch[1];\n else if (textMatch) handles.github = textMatch[1];\n }\n \n // Check for Instagram\n if (line.toLowerCase().includes('instagram')) {\n const urlMatch = line.match(/instagram\\.com\\/@?([A-Za-z0-9_.]+)/);\n const textMatch = line.match(/instagram:\\s*@?([A-Za-z0-9_.]+)/i);\n if (urlMatch) handles.instagram = urlMatch[1];\n else if (textMatch) handles.instagram = textMatch[1];\n }\n \n // Check for YouTube\n if (line.toLowerCase().includes('youtube')) {\n const channelMatch = line.match(/youtube\\.com\\/(?:c\\/|@)([A-Za-z0-9_-]+)/);\n const textMatch = line.match(/youtube:\\s*@?([A-Za-z0-9_-]+)/i);\n if (channelMatch) handles.youtube = channelMatch[1];\n else if (textMatch) handles.youtube = textMatch[1];\n }\n \n // Check for Facebook\n if (line.toLowerCase().includes('facebook')) {\n const urlMatch = line.match(/facebook\\.com\\/([A-Za-z0-9.]+)/);\n const textMatch = line.match(/facebook:\\s*([A-Za-z0-9.]+)/i);\n if (urlMatch) handles.facebook = urlMatch[1];\n else if (textMatch) handles.facebook = textMatch[1];\n }\n \n // Check for TikTok\n if (line.toLowerCase().includes('tiktok')) {\n const urlMatch = line.match(/tiktok\\.com\\/@([A-Za-z0-9_.]+)/);\n const textMatch = line.match(/tiktok:\\s*@?([A-Za-z0-9_.]+)/i);\n if (urlMatch) handles.tiktok = urlMatch[1];\n else if (textMatch) handles.tiktok = textMatch[1];\n }\n });\n \n return handles;\n}\n\n// Generate name variations for searching\nfunction generateNameVariations(fullName) {\n if (!fullName) return [];\n \n const cleanName = fullName.trim();\n const parts = cleanName.split(' ').filter(p => p); // Remove empty parts\n const variations = new Set([cleanName]);\n \n if (parts.length === 1) {\n // Single name - just return it\n variations.add(parts[0]);\n } else if (parts.length === 2) {\n const [first, last] = parts;\n variations.add(`${first} ${last}`);\n variations.add(`${first}.${last}`);\n variations.add(`${first}${last}`);\n variations.add(`${first[0]}. ${last}`);\n variations.add(`${first} ${last[0]}.`);\n variations.add(`${last} ${first}`);\n variations.add(`${last}, ${first}`);\n } else if (parts.length === 3) {\n const [first, middle, last] = parts;\n variations.add(`${first} ${middle} ${last}`);\n variations.add(`${first} ${last}`);\n variations.add(`${first} ${middle[0]}. ${last}`);\n variations.add(`${first[0]}. ${middle[0]}. ${last}`);\n variations.add(`${last}, ${first} ${middle}`);\n variations.add(`${last}, ${first}`);\n } else if (parts.length >= 4) {\n // Handle longer names (like Jean-Claude Van Damme Jr.)\n // Take first and last parts as primary\n const first = parts[0];\n const last = parts[parts.length - 1];\n const middle = parts.slice(1, -1).join(' ');\n \n variations.add(cleanName); // Full name\n variations.add(`${first} ${last}`);\n variations.add(`${last}, ${first}`);\n if (middle) {\n variations.add(`${first} ${middle[0]}. ${last}`);\n variations.add(`${last}, ${first} ${middle}`);\n }\n }\n \n // Return as array\n return Array.from(variations);\n}\n\n// Build search queries for each platform\nfunction buildSearchQueries(name, company, location, platform) {\n const queries = [];\n const baseQuery = `\"${name}\"`;\n \n switch(platform.toLowerCase()) {\n case 'linkedin':\n queries.push(`${baseQuery} site:linkedin.com/in`);\n if (company) queries.push(`${baseQuery} \"${company}\" site:linkedin.com`);\n if (location) queries.push(`${baseQuery} \"${location}\" site:linkedin.com`);\n break;\n \n case 'x/twitter':\n queries.push(`${baseQuery} site:twitter.com`);\n queries.push(`${baseQuery} site:x.com`);\n if (company) queries.push(`${baseQuery} \"${company}\" twitter`);\n break;\n \n case 'github':\n queries.push(`${baseQuery} site:github.com`);\n if (company) queries.push(`${baseQuery} \"${company}\" github`);\n break;\n \n case 'instagram':\n queries.push(`${baseQuery} site:instagram.com`);\n if (location) queries.push(`${baseQuery} \"${location}\" instagram`);\n break;\n \n case 'youtube':\n queries.push(`${baseQuery} site:youtube.com/@`);\n queries.push(`${baseQuery} site:youtube.com/c/`);\n if (company) queries.push(`${baseQuery} YouTube channel`);\n break;\n \n case 'tiktok':\n queries.push(`${baseQuery} site:tiktok.com/@`);\n queries.push(`${baseQuery} TikTok`);\n break;\n \n case 'facebook':\n queries.push(`${baseQuery} site:facebook.com`);\n if (location) queries.push(`${baseQuery} \"${location}\" facebook`);\n break;\n \n case 'reddit':\n queries.push(`${baseQuery} site:reddit.com/user`);\n queries.push(`${baseQuery} reddit user`);\n break;\n \n case 'pinterest':\n queries.push(`${baseQuery} site:pinterest.com`);\n break;\n \n case 'snapchat':\n queries.push(`${baseQuery} snapchat`);\n queries.push(`${baseQuery} \"snapcode\"`);\n break;\n }\n \n return queries;\n}\n\n// Validate required fields\nconst errors = [];\nif (!formData['Full Name']?.trim()) {\n errors.push('Full Name is required');\n}\nif (!formData['Search Depth']) {\n errors.push('Search Depth is required');\n}\nif (!formData['Platforms to Search'] || formData['Platforms to Search'].length === 0) {\n errors.push('At least one platform must be selected');\n}\n\n// Process the form data\nconst validatedData = {\n // Original inputs\n fullName: formData['Full Name']?.trim() || '',\n email: formData['Email Address']?.trim() || '',\n company: formData['Company/Organization']?.trim() || '',\n location: formData['Location']?.trim() || '',\n searchDepth: formData['Search Depth'] || 'Comprehensive - Full analysis',\n platformsToSearch: formData['Platforms to Search'] || [],\n \n // Parsed and generated data\n knownHandles: parseKnownHandles(formData['Known Social Handles']),\n nameVariations: generateNameVariations(formData['Full Name']),\n \n // Search configuration\n searchConfig: {\n depth: formData['Search Depth']?.includes('Basic') ? 'basic' : \n formData['Search Depth']?.includes('Deep') ? 'deep' : 'comprehensive',\n maxResultsPerPlatform: formData['Search Depth']?.includes('Basic') ? 5 : \n formData['Search Depth']?.includes('Deep') ? 20 : 10\n },\n \n // Validation\n isValid: errors.length === 0,\n validationErrors: errors,\n \n // Timestamp\n processedAt: new Date().toISOString()\n};\n\n// Build search queries for each selected platform\nvalidatedData.searchQueries = {};\nconst platforms = formData['Platforms to Search'] || [];\n\nif (validatedData.isValid) {\n platforms.forEach(platform => {\n validatedData.searchQueries[platform] = [];\n \n // Add queries for each name variation\n validatedData.nameVariations.forEach(nameVar => {\n const queries = buildSearchQueries(nameVar, formData['Company/Organization'], formData['Location'], platform);\n validatedData.searchQueries[platform].push(...queries);\n });\n \n // Remove duplicates\n validatedData.searchQueries[platform] = [...new Set(validatedData.searchQueries[platform])];\n });\n}\n\n// Add summary\nvalidatedData.summary = {\n totalPlatforms: platforms.length,\n hasKnownHandles: Object.keys(validatedData.knownHandles).length > 0,\n nameVariationCount: validatedData.nameVariations.length,\n totalSearchQueries: Object.values(validatedData.searchQueries).flat().length\n};\n\nreturn validatedData;"
},
"typeVersion": 2
},
{
"id": "3b4ecc52-8cd6-43ee-8c14-33246c2b796e",
"name": "Bright Data MCP",
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"position": [
2016,
1456
],
"parameters": {
"options": {},
"endpointUrl": "https://mcp.brightdata.com/mcp?token=YOUR_TOKEN_HERE&unlocker=UNLOCKER_CODE_HERE&pro=1",
"serverTransport": "httpStreamable"
},
"typeVersion": 1.1
},
{
"id": "ac0cb825-f1a0-48db-9395-4f307f326c38",
"name": "discovery agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
864,
336
],
"parameters": {
"text": "=You have been given information about {{ $json.fullName }} to find and verify their social media profiles.\n\n## Your Task:\nFind and verify social media profiles for this person across the platforms they selected.\n\n## Input Data:\n- Full Name: {{ $json.fullName }}\n- Company: {{ $json.company || \"Not provided\" }}\n- Location: {{ $json.location || \"Not provided\" }}\n- Email: {{ $json.email || \"Not provided\" }}\n- Known Handles: {{ JSON.stringify($json.knownHandles) }}\n- Platforms to Search: {{ JSON.stringify($json.platformsToSearch) }}\n- Search Depth: {{ $json.searchConfig.depth }}\n- Max Results Per Platform: {{ $json.searchConfig.maxResultsPerPlatform }}\n\n## Search Queries Available:\n{{ JSON.stringify($json.searchQueries, null, 2) }}\n\n## Instructions:\n\n1. **Search Phase**: For each platform in platformsToSearch:\n - Use the search_engine tool with the provided queries\n - Start with the first 2-3 queries per platform\n - Look for profile URLs that match the person\n\n2. **Verification Phase**: For each potential profile found:\n - Check if the profile name matches our target person\n - Look for matching company, location, or other details\n - Cross-reference with known handles if available\n - Note any bio links that connect to other profiles\n\n3. **Confidence Scoring**: Assign confidence scores (0.0 to 1.0):\n - 0.9-1.0: Perfect match (name, company, location all match)\n - 0.7-0.9: Strong match (name matches, plus 1-2 other factors)\n - 0.5-0.7: Possible match (name matches, some uncertainty)\n - Below 0.5: Unlikely match (include only if no better options)\n\n4. **Evidence Collection**: For each profile, note:\n - URL of the profile\n - Handle/username\n - Matching factors (what confirmed this is the right person)\n - Any bio description or tagline\n - Follower/connection count if visible\n\n## Important Guidelines:\n\n- If you find a profile with HIGH confidence on one platform, use that information to improve searches on other platforms\n- If known handles are provided, verify them first before searching\n- Use scrape_as_markdown if you need to get more details from a specific profile page\n- Limit your search to {{ $json.searchConfig.maxResultsPerPlatform }} results per platform\n- Focus on quality over quantity - better to have 3 verified profiles than 10 uncertain ones\n\n## Required Output Format:\nReturn your findings in the structured format defined by the output parser.",
"options": {
"systemMessage": "You are a Social Media Discovery Agent specialized in finding and verifying people's social media profiles across multiple platforms. You are thorough, analytical, and skilled at cross-referencing information to ensure accurate profile matching. You use search engines effectively and can identify the same person across different platforms by analyzing profile details, photos, bios, and cross-platform links."
},
"promptType": "define"
},
"retryOnFail": true,
"typeVersion": 2.2
},
{
"id": "cc09048c-a755-4725-93e9-6840dd176920",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
800,
560
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "c97b1714-0285-4d9c-8161-7f9619df1f3f",
"name": "Output validator",
"type": "n8n-nodes-base.code",
"position": [
1264,
336
],
"parameters": {
"jsCode": "// Get the AI agent's output\nconst agentOutput = $input.item.json;\n\n// Helper function to normalize platform names\nfunction normalizePlatformName(platform) {\n const mapping = {\n 'LinkedIn': 'linkedin',\n 'X/Twitter': 'twitter',\n 'Twitter': 'twitter',\n 'X': 'twitter',\n 'Instagram': 'instagram',\n 'GitHub': 'github',\n 'Youtube': 'youtube',\n 'YouTube': 'youtube',\n 'TikTok': 'tiktok',\n 'Facebook': 'facebook',\n 'Reddit': 'reddit',\n 'Pinterest': 'pinterest',\n 'Snapchat': 'snapchat'\n };\n \n return mapping[platform] || platform.toLowerCase();\n}\n\n// Parse the agent's output\nlet discoveredProfiles = {};\nlet metadata = {\n searchQueriesUsed: 0,\n platformsChecked: 0,\n profilesFound: 0,\n highConfidenceProfiles: 0,\n timeTakenSeconds: 0,\n searchStartTime: new Date().toISOString(),\n searchEndTime: new Date().toISOString()\n};\n\n// Parse the agent output\nlet parsedData = null;\ntry {\n if (agentOutput.output && typeof agentOutput.output === 'string') {\n // Parse the JSON string in the output field\n parsedData = JSON.parse(agentOutput.output);\n } else if (agentOutput.output && typeof agentOutput.output === 'object') {\n parsedData = agentOutput.output;\n } else if (agentOutput.profiles) {\n parsedData = { profiles: agentOutput.profiles };\n }\n} catch (e) {\n console.error('Error parsing agent output:', e);\n}\n\n// Process the profiles OBJECT format (not array!)\nif (parsedData && parsedData.profiles && typeof parsedData.profiles === 'object') {\n // Iterate over the platforms (object keys)\n Object.entries(parsedData.profiles).forEach(([platform, profilesArray]) => {\n const normalizedPlatform = normalizePlatformName(platform);\n \n // Check if this platform has any profiles found\n if (profilesArray && Array.isArray(profilesArray) && profilesArray.length > 0) {\n // Take the first (most confident) profile for each platform\n const profile = profilesArray[0];\n \n discoveredProfiles[normalizedPlatform] = {\n handle: profile.handle || profile.username || '',\n url: profile.url || '',\n confidence: profile.confidence_score || profile.confidence || 0.5,\n markers: profile.matching_factors || [],\n profileData: {\n name: profile.name || '',\n bio: profile.bio_description || profile.bio || '',\n followers: profile.follower_count || profile.followers_connections || profile.followers || '',\n company: profile.company || '',\n location: profile.location || '',\n notes: profile.notes || ''\n }\n };\n \n metadata.profilesFound++;\n metadata.platformsChecked++;\n \n if (profile.confidence_score > 0.8 || profile.confidence > 0.8) {\n metadata.highConfidenceProfiles++;\n }\n } else {\n // Platform was checked but no profiles found\n metadata.platformsChecked++;\n }\n });\n} else if (parsedData && parsedData.profilesDiscovered) {\n // Handle the expected format if the agent returns it\n discoveredProfiles = parsedData.profilesDiscovered;\n if (parsedData.discoveryMetadata) {\n metadata = { ...metadata, ...parsedData.discoveryMetadata };\n }\n}\n\n// If still no profiles, try to extract from raw text\nif (Object.keys(discoveredProfiles).length === 0) {\n const text = JSON.stringify(agentOutput);\n \n // Extract URLs using regex\n const urlPatterns = {\n linkedin: /linkedin\\.com\\/in\\/([a-zA-Z0-9-]+)/gi,\n twitter: /(?:twitter|x)\\.com\\/([a-zA-Z0-9_]+)/gi,\n github: /github\\.com\\/([a-zA-Z0-9-]+)/gi,\n instagram: /instagram\\.com\\/@?([a-zA-Z0-9_.]+)/gi,\n youtube: /youtube\\.com\\/(?:channel\\/|@)?([a-zA-Z0-9_-]+)/gi,\n tiktok: /tiktok\\.com\\/@([a-zA-Z0-9_.]+)/gi\n };\n \n for (const [platform, pattern] of Object.entries(urlPatterns)) {\n const matches = text.matchAll(pattern);\n for (const match of matches) {\n if (!discoveredProfiles[platform]) {\n discoveredProfiles[platform] = {\n handle: match[1],\n url: `https://${match[0]}`,\n confidence: 0.5,\n markers: [\"Found in search results\"],\n profileData: {}\n };\n metadata.profilesFound++;\n }\n }\n }\n}\n\n// Update platform count\nmetadata.platformsChecked = Object.keys(discoveredProfiles).length;\n\n// Build final output in the structure expected by the next nodes\nconst formattedOutput = {\n profilesDiscovered: discoveredProfiles,\n discoveryMetadata: metadata,\n verificationDetails: {\n crossPlatformLinks: [],\n commonIdentifiers: {},\n consistentData: {}\n },\n recommendedPrimaryProfiles: {},\n searchErrors: [],\n // Keep original input data for reference\n originalInput: {\n fullName: agentOutput.fullName || '',\n company: agentOutput.company || '',\n location: agentOutput.location || '',\n email: agentOutput.email || ''\n }\n};\n\n// Add verification details if we have multiple profiles\nif (Object.keys(discoveredProfiles).length > 1) {\n // Extract common data across profiles\n const allNames = new Set();\n const allCompanies = new Set();\n const allLocations = new Set();\n \n Object.values(discoveredProfiles).forEach(profile => {\n if (profile.profileData) {\n if (profile.profileData.name) allNames.add(profile.profileData.name);\n if (profile.profileData.company) allCompanies.add(profile.profileData.company);\n if (profile.profileData.location) allLocations.add(profile.profileData.location);\n }\n });\n \n formattedOutput.verificationDetails.consistentData = {\n name: allNames.size === 1 ? Array.from(allNames)[0] : '',\n company: allCompanies.size === 1 ? Array.from(allCompanies)[0] : '',\n location: allLocations.size === 1 ? Array.from(allLocations)[0] : '',\n profilePhoto: false // Would need actual photo comparison\n };\n}\n\n// Add recommended profiles based on what was found\nif (discoveredProfiles.linkedin) {\n formattedOutput.recommendedPrimaryProfiles.professional = {\n platform: 'linkedin',\n url: discoveredProfiles.linkedin.url,\n reason: 'Primary professional network profile'\n };\n}\n\nif (discoveredProfiles.twitter) {\n formattedOutput.recommendedPrimaryProfiles.social = {\n platform: 'twitter',\n url: discoveredProfiles.twitter.url,\n reason: 'Primary social media presence'\n };\n}\n\nif (discoveredProfiles.github) {\n formattedOutput.recommendedPrimaryProfiles.technical = {\n platform: 'github',\n url: discoveredProfiles.github.url,\n reason: 'Primary technical/developer profile'\n };\n}\n\nif (discoveredProfiles.youtube) {\n formattedOutput.recommendedPrimaryProfiles.content = {\n platform: 'youtube',\n url: discoveredProfiles.youtube.url,\n reason: 'Content creation and thought leadership'\n };\n}\n\n// Add summary statistics\nformattedOutput.summary = {\n totalProfilesFound: metadata.profilesFound,\n highConfidenceMatches: metadata.highConfidenceProfiles,\n platformsCovered: Object.keys(discoveredProfiles),\n primaryProfile: formattedOutput.recommendedPrimaryProfiles.professional || \n formattedOutput.recommendedPrimaryProfiles.social || \n formattedOutput.recommendedPrimaryProfiles.technical ||\n null\n};\n\nreturn formattedOutput;"
},
"typeVersion": 2
},
{
"id": "282c09b4-db66-4524-a4a8-67cb4433e1b6",
"name": "Profiles validator",
"type": "n8n-nodes-base.code",
"position": [
1488,
336
],
"parameters": {
"jsCode": "// Get discovered profiles from previous node\nconst discoveryOutput = $input.item.json;\nconst profiles = discoveryOutput.profilesDiscovered || {};\n\n// Initialize validation results\nconst validationResults = {\n profilesValidated: {},\n crossPlatformVerification: {\n nameConsistency: 0,\n locationConsistency: 0,\n companyConsistency: 0,\n overallConsistency: 0\n },\n confidenceScores: {},\n verificationMatrix: {},\n primaryIdentity: {\n name: '',\n company: '',\n location: '',\n email: '',\n primaryPlatform: ''\n },\n validationFlags: [],\n suggestedActions: []\n};\n\n// Extract all unique values across profiles\nconst names = new Set();\nconst companies = new Set();\nconst locations = new Set();\nconst bios = [];\nconst highestConfidenceProfile = { confidence: 0, platform: '' };\n\n// Analyze each profile\nObject.entries(profiles).forEach(([platform, profile]) => {\n if (!profile || !profile.url) return;\n \n // Track confidence scores\n validationResults.confidenceScores[platform] = profile.confidence || 0.5;\n \n // Track highest confidence profile\n if (profile.confidence > highestConfidenceProfile.confidence) {\n highestConfidenceProfile.confidence = profile.confidence;\n highestConfidenceProfile.platform = platform;\n }\n \n // Extract identity markers\n if (profile.profileData) {\n if (profile.profileData.name) names.add(profile.profileData.name);\n if (profile.profileData.company) companies.add(profile.profileData.company);\n if (profile.profileData.location) locations.add(profile.profileData.location);\n if (profile.profileData.bio) bios.push({ platform, bio: profile.profileData.bio });\n }\n \n // Build validated profile entry\n validationResults.profilesValidated[platform] = {\n ...profile,\n validationStatus: profile.confidence >= 0.7 ? 'verified' : \n profile.confidence >= 0.5 ? 'probable' : 'uncertain',\n validationNotes: []\n };\n});\n\n// Calculate consistency scores\nvalidationResults.crossPlatformVerification.nameConsistency = \n names.size <= 1 ? 1.0 : 0.5 / names.size;\nvalidationResults.crossPlatformVerification.companyConsistency = \n companies.size <= 1 ? 1.0 : 0.5 / companies.size;\nvalidationResults.crossPlatformVerification.locationConsistency = \n locations.size <= 1 ? 1.0 : 0.5 / locations.size;\n\n// Overall consistency score\nvalidationResults.crossPlatformVerification.overallConsistency = \n (validationResults.crossPlatformVerification.nameConsistency + \n validationResults.crossPlatformVerification.companyConsistency + \n validationResults.crossPlatformVerification.locationConsistency) / 3;\n\n// Determine primary identity based on highest confidence profile\nif (highestConfidenceProfile.platform && profiles[highestConfidenceProfile.platform]) {\n const primaryProfile = profiles[highestConfidenceProfile.platform];\n validationResults.primaryIdentity = {\n name: Array.from(names)[0] || discoveryOutput.originalInput?.fullName || '',\n company: Array.from(companies)[0] || discoveryOutput.originalInput?.company || '',\n location: Array.from(locations)[0] || discoveryOutput.originalInput?.location || '',\n email: discoveryOutput.originalInput?.email || '',\n primaryPlatform: highestConfidenceProfile.platform\n };\n}\n\n// Create verification matrix (which platforms link to each other)\nObject.entries(profiles).forEach(([platform1, profile1]) => {\n validationResults.verificationMatrix[platform1] = {};\n \n Object.entries(profiles).forEach(([platform2, profile2]) => {\n if (platform1 === platform2) {\n validationResults.verificationMatrix[platform1][platform2] = 1.0;\n } else {\n // Check for cross-references in bios or markers\n let linkScore = 0;\n \n // Check if bio mentions other platform\n if (profile1.profileData?.bio && \n profile1.profileData.bio.toLowerCase().includes(platform2.toLowerCase())) {\n linkScore += 0.5;\n }\n \n // Check if markers mention cross-platform links\n if (profile1.markers) {\n profile1.markers.forEach(marker => {\n if (marker.toLowerCase().includes(platform2.toLowerCase())) {\n linkScore += 0.3;\n }\n });\n }\n \n validationResults.verificationMatrix[platform1][platform2] = Math.min(linkScore, 1.0);\n }\n });\n});\n\n// Add validation flags based on findings\nif (validationResults.crossPlatformVerification.overallConsistency < 0.7) {\n validationResults.validationFlags.push({\n type: 'warning',\n message: 'Inconsistent information across profiles - manual review recommended',\n severity: 'medium'\n });\n}\n\nif (names.size > 1) {\n validationResults.validationFlags.push({\n type: 'info',\n message: `Multiple name variations found: ${Array.from(names).join(', ')}`,\n severity: 'low'\n });\n}\n\nif (Object.keys(profiles).length < 2) {\n validationResults.validationFlags.push({\n type: 'info',\n message: 'Limited profiles found for cross-verification',\n severity: 'low'\n });\n}\n\n// Suggest actions for improving validation\nif (Object.keys(profiles).length < 3) {\n validationResults.suggestedActions.push('Search additional platforms for better cross-verification');\n}\n\nObject.entries(validationResults.confidenceScores).forEach(([platform, score]) => {\n if (score < 0.7) {\n validationResults.suggestedActions.push(`Manual verification recommended for ${platform} profile`);\n \n // Add specific validation notes\n if (validationResults.profilesValidated[platform]) {\n validationResults.profilesValidated[platform].validationNotes.push(\n 'Low confidence score - additional verification needed'\n );\n }\n }\n});\n\n// Calculate trust score for the entire profile set\nconst avgConfidence = Object.values(validationResults.confidenceScores)\n .reduce((sum, score) => sum + score, 0) / Object.keys(validationResults.confidenceScores).length;\n\nvalidationResults.overallTrustScore = \n (avgConfidence * 0.5) + \n (validationResults.crossPlatformVerification.overallConsistency * 0.3) +\n (Object.keys(profiles).length / 10 * 0.2); // More platforms = higher trust\n\n// Add metadata\nvalidationResults.validationMetadata = {\n timestamp: new Date().toISOString(),\n profilesAnalyzed: Object.keys(profiles).length,\n highConfidenceProfiles: Object.values(validationResults.confidenceScores)\n .filter(score => score >= 0.8).length,\n validationMethod: 'cross-platform-analysis',\n trustLevel: validationResults.overallTrustScore >= 0.8 ? 'high' :\n validationResults.overallTrustScore >= 0.6 ? 'medium' : 'low'\n};\n\n// Pass through all original data plus validation results\nreturn {\n ...discoveryOutput,\n validationResults,\n profilesValidated: validationResults.profilesValidated,\n primaryIdentity: validationResults.primaryIdentity,\n trustScore: validationResults.overallTrustScore,\n proceedToAnalysis: validationResults.overallTrustScore >= 0.5 // Only proceed if trust is sufficient\n};"
},
"typeVersion": 2
},
{
"id": "b279af3a-8f2b-49e8-9218-1d9ec409103c",
"name": "Split Platforms into Items",
"type": "n8n-nodes-base.code",
"position": [
1712,
336
],
"parameters": {
"jsCode": "// Get the validated profiles from previous node\nconst validatedData = $input.item.json;\nconst profiles = validatedData.profilesDiscovered || {};\n\n// Create an array to hold separate items for each platform\nconst platformItems = [];\n\n// Process each discovered platform\nObject.entries(profiles).forEach(([platform, profileData]) => {\n if (!profileData || !profileData.url) return;\n \n // Create an item for each platform\n platformItems.push({\n json: {\n platform: platform.toLowerCase(),\n profileUrl: profileData.url,\n handle: profileData.handle,\n confidence: profileData.confidence,\n markers: profileData.markers,\n profileData: profileData.profileData,\n searchDepth: validatedData.searchConfig?.depth || 'comprehensive',\n analysisDepth: validatedData.searchConfig?.depth || 'comprehensive',\n originalInput: validatedData.originalInput || {},\n primaryIdentity: validatedData.primaryIdentity || {},\n trustScore: validatedData.trustScore || 0.5\n }\n });\n});\n\n// Return all platform items for processing\nreturn platformItems;"
},
"typeVersion": 2
},
{
"id": "90b1798a-b321-4fab-90f0-8a24862b7941",
"name": "LinkedIn Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
-144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are a LinkedIn profile analyst specializing in professional insights. You focus on career progression, skills assessment, network quality, thought leadership, and professional achievements. You use Bright Data MCP PRO tools to extract detailed LinkedIn data."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this LinkedIn profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Professional title and current position\n2. Career progression and trajectory\n3. Skills and endorsements\n4. Network size and quality\n5. Recent activity and posts\n6. Education and certifications\n7. Recommendations received\n8. Industry influence and thought leadership\n\nUse web_data_linkedin_person_profile to get full profile data.\nUse web_data_linkedin_posts to analyze recent activity.\n\nProvide structured insights about their professional standing."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_linkedin_person_profile\", \"web_data_linkedin_posts\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"professionalTitle\", \"company\", \"skills\", \"connections\", \"recentActivity\", \"education\", \"certifications\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ae097d74-0d6e-4d7e-8037-f78a420c8ddf",
"name": "Twitter/X Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are a Twitter/X analyst specializing in social media engagement and influence. You analyze tweet patterns, engagement metrics, topics of interest, and social influence. You use Bright Data MCP PRO tools to extract Twitter/X data."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this Twitter/X profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Tweet frequency and posting patterns\n2. Main topics and themes discussed\n3. Engagement rates (likes, retweets, replies)\n4. Follower count and growth\n5. Influence and reach metrics\n6. Sentiment of tweets\n7. Key hashtags used\n8. Interactions with other users\n\nUse web_data_x_posts to analyze tweets and engagement.\nUse search_engine for additional context if needed.\n\nProvide insights about their social media presence and influence."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_x_posts\", \"search_engine\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"tweetFrequency\", \"topTopics\", \"engagement\", \"followers\", \"sentiment\", \"hashtags\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "6ed900d1-2485-4a06-8c04-7063807ca605",
"name": "Instagram Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are an Instagram analyst specializing in visual content analysis and engagement metrics. You analyze content themes, posting patterns, visual aesthetics, and audience engagement. You use Bright Data MCP PRO tools for Instagram data extraction."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this Instagram profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Content themes and categories\n2. Posting frequency and schedule\n3. Engagement rate per post\n4. Follower demographics insights\n5. Hashtag strategy and reach\n6. Visual style and branding\n7. Stories and Reels performance\n8. Brand collaborations or sponsorships\n\nUse web_data_instagram_profiles for profile metrics.\nUse web_data_instagram_posts for content analysis.\nUse web_data_instagram_reels for video content.\n\nProvide insights about their content strategy and audience engagement."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_instagram_profiles\", \"web_data_instagram_posts\", \"web_data_instagram_reels\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"contentThemes\", \"postingFrequency\", \"engagementRate\", \"hashtags\", \"visualStyle\", \"reelsPerformance\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "5167b40f-5645-4cac-bd77-2cb7094ee59b",
"name": "YouTube Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
432
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are a YouTube channel analyst specializing in content strategy and audience engagement. You analyze video content, upload patterns, viewer metrics, and channel growth. You use Bright Data MCP PRO tools for YouTube data extraction."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this YouTube channel in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Channel focus and content categories\n2. Upload schedule and consistency\n3. View counts and watch time metrics\n4. Subscriber count and growth rate\n5. Video production quality\n6. Audience engagement (likes, comments)\n7. Most popular videos and topics\n8. Monetization indicators\n\nUse web_data_youtube_profiles for channel statistics.\nUse web_data_youtube_videos for video analytics.\n\nProvide insights about their content strategy and channel performance."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_youtube_profiles\", \"web_data_youtube_videos\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"channelFocus\", \"uploadSchedule\", \"viewMetrics\", \"subscribers\", \"topVideos\", \"engagement\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e62bfe80-f36c-4f69-91f5-995e9b478dca",
"name": "GitHub Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
624
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are a GitHub analyst specializing in technical expertise assessment and open-source contributions. You analyze repositories, coding patterns, collaboration, and technical skills. You use Bright Data MCP PRO tools for GitHub data extraction."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this GitHub profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Repository count and types\n2. Primary programming languages\n3. Contribution frequency and patterns\n4. Popular/starred repositories\n5. Collaboration and pull requests\n6. Code quality indicators\n7. Open source involvement\n8. Technical expertise areas\n\nUse web_data_github_repository_file for repository analysis.\nUse search_engine for additional context about projects.\n\nProvide insights about their technical skills and collaboration patterns."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_github_repository_file\", \"search_engine\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"repositories\", \"languages\", \"contributions\", \"popularProjects\", \"collaboration\", \"expertise\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "34cf7453-c52c-44c2-8b81-6903b15565cc",
"name": "TikTok Prompt Builder",
"type": "n8n-nodes-base.set",
"position": [
2160,
816
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "1",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "2",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "3",
"name": "analysisDepth",
"type": "string",
"value": "={{ $json.analysisDepth }}"
},
{
"id": "4",
"name": "systemPrompt",
"type": "string",
"value": "You are a TikTok analyst specializing in viral content and creator metrics. You analyze video performance, trend participation, audience engagement, and content strategy. You use Bright Data MCP PRO tools for TikTok data extraction."
},
{
"id": "5",
"name": "userPrompt",
"type": "string",
"value": "=Analyze this TikTok profile in detail:\n\nProfile URL: {{ $json.profileUrl }}\nAnalysis Depth: {{ $json.analysisDepth }}\n\nFocus areas:\n1. Content themes and niches\n2. Viral videos and reach\n3. Posting frequency\n4. Follower count and growth\n5. Engagement metrics (likes, comments, shares)\n6. Trend participation\n7. Audio and hashtag usage\n8. Creator fund eligibility indicators\n\nUse web_data_tiktok_profiles for creator statistics.\nUse web_data_tiktok_posts for video metrics.\n\nProvide insights about their content strategy and viral potential."
},
{
"id": "6",
"name": "proTools",
"type": "array",
"value": "=[\"web_data_tiktok_profiles\", \"web_data_tiktok_posts\"]"
},
{
"id": "7",
"name": "analysisFields",
"type": "array",
"value": "=[\"contentThemes\", \"viralVideos\", \"postingFrequency\", \"followers\", \"engagement\", \"trends\"]"
},
{
"id": "8",
"name": "handle",
"type": "string",
"value": "={{ $json.handle }}"
},
{
"id": "9",
"name": "confidence",
"type": "number",
"value": "={{ $json.confidence }}"
},
{
"id": "10",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "0b84e3a7-08f2-4428-b5be-2ace65b48b48",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
1936,
272
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "LinkedIn",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "linkedin"
}
]
},
"renameOutput": true
},
{
"outputKey": "Twitter",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "twitter"
}
]
},
"renameOutput": true
},
{
"outputKey": "Instagram",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "instagram"
}
]
},
"renameOutput": true
},
{
"outputKey": "YouTube",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "youtube"
}
]
},
"renameOutput": true
},
{
"outputKey": "GitHub",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "github"
}
]
},
"renameOutput": true
},
{
"outputKey": "TikTok",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.platform }}",
"rightValue": "tiktok"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "96782079-6878-4168-b4ac-43305b175dc4",
"name": "Research Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2672,
464
],
"parameters": {
"text": "={{ $json.userPrompt }}",
"options": {
"systemMessage": "={{ $json.systemPrompt }}"
},
"promptType": "define"
},
"retryOnFail": true,
"typeVersion": 2.2
},
{
"id": "f38a6156-f044-41b4-b919-67325b274b43",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
2384,
272
],
"parameters": {
"numberInputs": 6
},
"typeVersion": 3.2
},
{
"id": "5effc409-e30d-44cf-b648-f35be74b390e",
"name": "OpenAI Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2608,
688
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "c41d9b89-f376-4f8f-bd58-b1ae819db71a",
"name": "OpenAI Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
3824,
560
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1",
"cachedResultName": "gpt-4.1"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "2235b8ab-ec5a-4294-ace7-4f01e302c27f",
"name": "Aggregate analyses",
"type": "n8n-nodes-base.aggregate",
"position": [
3520,
336
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "platforms"
},
"typeVersion": 1
},
{
"id": "e1bd36e1-90ec-4a77-8e7e-54c6b01271a9",
"name": "Merge1",
"type": "n8n-nodes-base.merge",
"position": [
3072,
336
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "1a830e97-d111-4a6c-8ca9-2cfc00e20763",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
3296,
336
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d8df7c36-f9ae-4b63-a734-7bc7ab29a0a4",
"name": "platform",
"type": "string",
"value": "={{ $json.platform }}"
},
{
"id": "3b2bf0a7-da33-497a-9bbe-d7e8229c1755",
"name": "profileUrl",
"type": "string",
"value": "={{ $json.profileUrl }}"
},
{
"id": "75c498e7-17fe-4f1f-bce7-5597dcca12fe",
"name": "profileData",
"type": "object",
"value": "={{ $json.profileData }}"
},
{
"id": "5da9fb30-9d87-4406-8e13-9f11f96f61d2",
"name": "research_result",
"type": "string",
"value": "={{ $json.output }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a4e5d89d-8929-49a9-97fa-87536e819b15",
"name": "Basic LLM Chain",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
3744,
336
],
"parameters": {
"text": "=## Social Media Intelligence Request\n\nAnalyze the following social media data and create a comprehensive intelligence report.\n\n## Platform Data:\n\n{{ $json.platforms.map((item, index) => {\n const platform = item.platform;\n const url = item.profileUrl;\n const profileData = item.profileData;\n const research = item.research_result;\n \n return `### Platform ${ind
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.
googleDriveOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Get a 360 Social media presence report for a person
Source: https://n8n.io/workflows/8653/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow serves as a comprehensive "Workflow Nodes SEO & Documentation Generator". It uses AI to analyze, rename, and document n8n workflows, offering a streamlined way to optimize workflow reada
This workflow helps support teams evaluate call quality and deliver structured feedback without manual review. Agents upload their recordings using an n8n Form, and the system handles transcription, s
This workflow generates comprehensive B2B leads, from a selected Business type in ANY CITY IN THE WORLD, including: Company name; Website; Email (enriched with AI Agent); Phone number; Address; Main L
It uses the Bright Data community node and Bright Data MCP for scraping and AI message generation. Form Submission
HR Job Posting and Evaluation with AI. Uses formTrigger, airtable, googleDrive, stickyNote. Event-driven trigger; 36 nodes.