This workflow corresponds to n8n.io template #17982 — we link there as the canonical source.
This workflow follows the Agent → HTTP Request 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": "fKE9t4Navvq1z1Bs",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI Safety Assistant",
"tags": [],
"nodes": [
{
"id": "fcad6837-4955-4572-ae17-6a1cffc50813",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3424,
704
],
"parameters": {
"width": 480,
"height": 896,
"content": "## AI Safety Assistant\n\n### How it works\n\nThis workflow analyzes suspicious calls, WhatsApp messages, and emails using AI to detect scams, explain risks simply, suggest safe actions, alert trusted family members about high-risk fraud, and maintain a history of suspicious activity.\n\n### Setup steps\n\n- Configure the webhook endpoint and ensure the calling app sends the expected message text, channel, sender, and claimed identity fields.\n- Add Anthropic credentials for both AI agent model nodes and verify the prompts/model settings match your safety-assistant use case.\n- Configure Google Sheets API access for the scam tracker request, including the target spreadsheet ID, range, and authorization credentials.\n- Configure SendGrid API credentials, sender details, and family alert recipient addresses for the notification request.\n- Review the JavaScript nodes for expected input/output field names so the scoring, parsing, logging, and response payloads align.\n\n### Customization\n\nAdjust heuristic keywords, AI prompts, composite risk scoring weights, family-alert thresholds, Google Sheets columns, and response wording to match the audience and escalation policy."
},
"typeVersion": 1
},
{
"id": "de42107c-c31f-4ff7-8ed0-53bb1b909a62",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2864,
992
],
"parameters": {
"color": 7,
"width": 640,
"height": 320,
"content": "## Receive message context\n\nWebhook entry cluster that receives the suspicious message, prepares standard context fields, and extracts initial heuristic risk signals before AI analysis."
},
"typeVersion": 1
},
{
"id": "048a2b52-0989-4dc7-9c32-874cbf92c50a",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2192,
1024
],
"parameters": {
"color": 7,
"width": 688,
"height": 512,
"content": "## Analyze fraud indicators\n\nRuns the first AI fraud-analysis pass after a wait step, using the Anthropic model, then parses the AI response into structured analysis data."
},
"typeVersion": 1
},
{
"id": "0a1cf41b-70c6-4499-8bd2-ea14a6fdda2c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1472,
880
],
"parameters": {
"color": 7,
"width": 416,
"height": 528,
"content": "## Validate and score risk\n\nChecks whether the fraud analysis is usable, returns an insufficiency response when it is not, and otherwise calculates the composite risk score for downstream guidance."
},
"typeVersion": 1
},
{
"id": "c0bf27c4-6e1f-4ec7-9104-788d15cf0d68",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
928
],
"parameters": {
"color": 7,
"width": 768,
"height": 512,
"content": "## Generate safety guidance\n\nWaits before the second AI step, generates safety guidance and recommendations with Anthropic, then parses the guidance and formats a log record."
},
"typeVersion": 1
},
{
"id": "8ab30fb1-d565-450c-baa4-4eae382a7b6a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
896
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Log and decide alert\n\nSaves the formatted scam report to the Google Sheets tracker and evaluates whether the case requires a family alert notification."
},
"typeVersion": 1
},
{
"id": "d56129df-4bb0-40ad-975c-4b0193d42991",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
448
],
"parameters": {
"color": 7,
"width": 416,
"height": 1024,
"content": "## Send high-risk alert\n\nHigh-risk branch that sends a SendGrid family alert email and responds to the webhook confirming the alert was sent.\n\n\n## Return normal guidance\n\nNo-alert endpoint that returns the generated guidance to the webhook when a family notification is not required."
},
"typeVersion": 1
},
{
"id": "057d7d98-f4ce-4a05-952c-2d9c85946eaa",
"name": "When Message Received",
"type": "n8n-nodes-base.webhook",
"position": [
-2816,
1152
],
"parameters": {
"path": "ai-safety-assistant-inbound",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 1.1
},
{
"id": "e5168e23-d31e-45e0-bda5-138092729e76",
"name": "Prepare Message Context",
"type": "n8n-nodes-base.set",
"position": [
-2592,
1152
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"name": "messageText",
"type": "string",
"value": "={{ $json.messageText || $json.body?.messageText || 'Caller said this is the Social Security Administration and my Social Security number has been suspended due to suspicious activity linked to a crime. They said I must act immediately or I will be arrested, and I can fix this by buying $500 in Google Play gift cards and reading them the codes over the phone. They told me not to tell my family because it is a confidential federal investigation.' }}"
},
{
"name": "messageChannel",
"type": "string",
"value": "={{ $json.messageChannel || $json.body?.messageChannel || 'Phone Call' }}"
},
{
"name": "senderInfo",
"type": "string",
"value": "={{ $json.senderInfo || $json.body?.senderInfo || '+1-800-555-0199, caller ID showed \"SSA\"' }}"
},
{
"name": "claimedIdentity",
"type": "string",
"value": "={{ $json.claimedIdentity || $json.body?.claimedIdentity || 'Social Security Administration' }}"
},
{
"name": "recipientName",
"type": "string",
"value": "={{ $json.recipientName || $json.body?.recipientName || 'Eleanor Whitfield' }}"
},
{
"name": "recipientAge",
"type": "number",
"value": "={{ $json.recipientAge || $json.body?.recipientAge || 78 }}"
},
{
"name": "trustedFamilyContactName",
"type": "string",
"value": "={{ $json.trustedFamilyContactName || $json.body?.trustedFamilyContactName || 'Daniel Whitfield' }}"
},
{
"name": "trustedFamilyContactEmail",
"type": "string",
"value": "={{ $json.trustedFamilyContactEmail || $json.body?.trustedFamilyContactEmail || 'daniel.whitfield@example.com' }}"
},
{
"name": "submittedBy",
"type": "string",
"value": "={{ $json.submittedBy || $json.body?.submittedBy || 'Eleanor Whitfield (self-reported)' }}"
},
{
"name": "submittedAt",
"type": "string",
"value": "={{ new Date().toISOString() }}"
},
{
"name": "reportId",
"type": "string",
"value": "={{ 'SCAM-' + Date.now().toString().slice(-8) }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "47e3453d-208f-4f04-b98d-699105cb3e98",
"name": "Extract Risk Signals",
"type": "n8n-nodes-base.code",
"position": [
-2368,
1152
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $input.item.json;\nconst text = (item.messageText || '').toLowerCase();\n\nconst keywordCategories = {\n urgency: ['act now', 'immediately', 'urgent', 'right away', 'expires today', 'act fast', 'final notice', 'do not delay'],\n paymentMethod: ['gift card', 'gift cards', 'wire transfer', 'bitcoin', 'cryptocurrency', 'prepaid card', 'money order', 'itunes card', 'google play card', 'read me the codes', 'read the codes'],\n secrecy: [\"don't tell\", 'do not tell', 'keep this between us', 'confidential', 'secret', 'do not discuss this with anyone', 'tell no one'],\n threats: ['arrest', 'arrested', 'lawsuit', 'jail', 'warrant', 'suspend your', 'legal action', 'frozen your account', 'seize your assets'],\n impersonatedAuthority: ['social security', 'irs', 'medicare', 'the bank', 'your bank', 'amazon', 'tech support', 'microsoft', 'grandson', 'granddaughter', 'grandchild', 'government agency']\n};\n\nconst categoryWeights = {\n urgency: 12,\n paymentMethod: 25,\n secrecy: 20,\n threats: 20,\n impersonatedAuthority: 8\n};\n\nconst matchedFlags = [];\nlet heuristicScore = 0;\n\nfor (const [category, keywords] of Object.entries(keywordCategories)) {\n let categoryMatched = false;\n for (const kw of keywords) {\n if (text.includes(kw)) {\n matchedFlags.push(category + ': \"' + kw + '\"');\n categoryMatched = true;\n }\n }\n if (categoryMatched) heuristicScore += categoryWeights[category];\n}\n\nheuristicScore = Math.max(0, Math.min(100, heuristicScore));\n\nreturn {\n json: {\n ...item,\n heuristicFlags: matchedFlags,\n heuristicScore,\n heuristicFlagCount: matchedFlags.length\n }\n};"
},
"typeVersion": 2
},
{
"id": "3923b0a6-d8a8-4840-b6a9-204a75052768",
"name": "Wait for Analysis",
"type": "n8n-nodes-base.wait",
"position": [
-2144,
1152
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2549ece1-3d77-400b-bf2f-027f58b0b0ba",
"name": "Fraud Indicator Analysis Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-1936,
1152
],
"parameters": {
"options": {}
},
"typeVersion": 1.6
},
{
"id": "95e05573-4825-45bd-919e-b0ec0711dd3b",
"name": "Claude Fraud Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-1840,
1376
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-20250514"
},
"options": {
"temperature": 0.4
}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "2aa29874-0f71-49b6-b0a3-4c1bfa0009f0",
"name": "Parse Analysis Output",
"type": "n8n-nodes-base.code",
"position": [
-1648,
1152
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $input.item.json;\nlet parsed = {};\ntry {\n const rawText = item.output || item.text || item.response || '{}';\n const clean = rawText.replace(/```json|```/g, '').trim();\n parsed = JSON.parse(clean);\n if (typeof parsed.analysisConfidence !== 'number') throw new Error('missing confidence');\n} catch (e) {\n const fallbackRisk = (item.heuristicScore || 0) >= 50 ? 65 : 45;\n parsed = {\n analysisConfidence: 3,\n isLikelyScam: true,\n scamType: 'Unclear - AI parsing failed, treat as a placeholder',\n aiRiskScore: fallbackRisk,\n redFlagsDetected: ['AI analysis parsing failed - flagged for manual review as a precaution'],\n whyThisIsRisky: 'We could not fully analyze this message automatically, so it is being treated cautiously until a person reviews it.',\n requiresUrgentFamilyAlert: (item.heuristicScore || 0) >= 50\n };\n}\n\nreturn {\n json: {\n ...item,\n analysisConfidence: parsed.analysisConfidence,\n isLikelyScam: parsed.isLikelyScam,\n scamType: parsed.scamType,\n aiRiskScore: parsed.aiRiskScore,\n redFlagsDetected: parsed.redFlagsDetected,\n whyThisIsRisky: parsed.whyThisIsRisky,\n requiresUrgentFamilyAlert: parsed.requiresUrgentFamilyAlert\n }\n};"
},
"typeVersion": 2
},
{
"id": "50f17c4d-a0a9-4164-ae1f-36f1e6bf469a",
"name": "Check Analysis Usability",
"type": "n8n-nodes-base.if",
"position": [
-1424,
1152
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-analysis-confidence",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.analysisConfidence }}",
"rightValue": 4
}
]
}
},
"typeVersion": 2.2
},
{
"id": "f9a5a12f-864b-41cb-8dc0-dfcdddc3f20f",
"name": "Respond Analysis Insufficient",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
-1200,
1248
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"success\": false,\n \"reportId\": \"{{ $json.reportId }}\",\n \"status\": \"Message Detail Insufficient\",\n \"analysisConfidence\": {{ $json.analysisConfidence }},\n \"message\": \"There wasn't enough detail in the message to assess it confidently. Please provide more of the actual message text, who it claimed to be from, and what it asked for, then resubmit. If money or personal information has already been shared, contact the bank or relevant institution directly right away.\"\n}"
},
"typeVersion": 1
},
{
"id": "60ec026e-05bc-468c-a2a1-206efc23eb90",
"name": "Calculate Risk Score",
"type": "n8n-nodes-base.code",
"position": [
-1200,
1056
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $input.item.json;\nconst heuristicScore = item.heuristicScore || 0;\nconst aiRiskScore = item.aiRiskScore || 0;\nconst redFlagCount = (item.redFlagsDetected || []).length;\n\n// Weighted blend of the independent keyword heuristic and the AI's own assessment,\n// with a small boost for the number of distinct red flags the AI actually named.\nlet compositeRiskScore = Math.round(\n (heuristicScore * 0.4) +\n (aiRiskScore * 0.6) +\n Math.min(redFlagCount * 2, 10)\n);\ncompositeRiskScore = Math.max(0, Math.min(100, compositeRiskScore));\n\nlet riskTier = 'Low Risk';\nif (compositeRiskScore >= 80) riskTier = 'Critical Risk';\nelse if (compositeRiskScore >= 55) riskTier = 'High Risk';\nelse if (compositeRiskScore >= 30) riskTier = 'Medium Risk';\n\nconst requiresFamilyAlert = riskTier === 'High Risk' || riskTier === 'Critical Risk' || item.requiresUrgentFamilyAlert === true;\n\nreturn {\n json: {\n ...item,\n compositeRiskScore,\n riskTier,\n requiresFamilyAlert\n }\n};"
},
"typeVersion": 2
},
{
"id": "a97cdc01-ad37-48fb-a4d9-23ad44b9b934",
"name": "Safety Guidance Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-752,
1056
],
"parameters": {
"options": {}
},
"typeVersion": 1.6
},
{
"id": "7ef5b6ac-f193-4c37-8258-70c9fdad6abe",
"name": "Claude Guidance Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-672,
1280
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-20250514"
},
"options": {
"temperature": 0.3
}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "a8847b6e-7fe6-425f-be5c-50d8d382e98f",
"name": "Parse Guidance & Log Record",
"type": "n8n-nodes-base.code",
"position": [
-400,
1056
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "const item = $input.item.json;\nlet parsed = {};\ntry {\n const rawText = item.output || item.text || item.response || '{}';\n const clean = rawText.replace(/```json|```/g, '').trim();\n parsed = JSON.parse(clean);\n} catch (e) {\n parsed = {\n overallSafetyRecommendation: 'Do Not Engage - Block and Report',\n plainLanguageExplanation: 'We could not fully process this automatically, so please treat this message with caution. Do not send any money or share personal information. Talk to a family member or call the organization directly using a number you look up yourself, not one given in the message.',\n stepByStepActions: ['Do not respond, click links, or send any money.', 'Do not give out personal or account information.', 'Talk to a trusted family member before taking any action.'],\n whatToSayIfContactedAgain: 'I need to verify this independently before doing anything. I will call you back using a number I look up myself.',\n familyAlertMessage: 'A message reached ' + (item.recipientName || 'a family member') + ' that could not be automatically verified as safe. Please review it together as a precaution.',\n recommendationConfidence: 40\n };\n}\n\nconst decidedAt = new Date().toISOString();\n\nreturn {\n json: {\n ...item,\n ...parsed,\n decidedAt,\n reportSummaryRow: [\n item.reportId || 'N/A',\n item.recipientName || '',\n item.messageChannel || '',\n item.claimedIdentity || '',\n item.compositeRiskScore || 0,\n item.riskTier || '',\n item.isLikelyScam || false,\n item.scamType || '',\n parsed.overallSafetyRecommendation || '',\n item.requiresFamilyAlert || false,\n decidedAt\n ]\n }\n};"
},
"typeVersion": 2
},
{
"id": "f414db62-318d-4df9-8d74-c0b15334c8bc",
"name": "Post Scam Report to Sheets",
"type": "n8n-nodes-base.httpRequest",
"position": [
-32,
1056
],
"parameters": {
"url": "https://sheets.googleapis.com/v4/spreadsheets/YOUR_SHEET_ID/values/ScamCheckLog!A1:append?valueInputOption=USER_ENTERED",
"method": "POST",
"options": {},
"jsonBody": "={\n \"values\": [{{ JSON.stringify($json.reportSummaryRow) }}]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "oAuth2Api"
},
"credentials": {
"oAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e58d4ec1-5fbe-46bd-983d-f23368cbab1a",
"name": "Check for Family Alert",
"type": "n8n-nodes-base.if",
"position": [
192,
1056
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "cond-requires-family-alert",
"operator": {
"type": "boolean",
"operation": "true"
},
"leftValue": "={{ $json.requiresFamilyAlert }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "603b77d0-40a5-4082-a27b-7494ca9b9933",
"name": "Post Alert to SendGrid",
"type": "n8n-nodes-base.httpRequest",
"position": [
416,
864
],
"parameters": {
"url": "https://api.sendgrid.com/v3/mail/send",
"method": "POST",
"options": {},
"jsonBody": "={\n \"personalizations\": [{\"to\": [{\"email\": \"{{ $json.trustedFamilyContactEmail }}\"}]}],\n \"from\": {\"email\": \"ai-safety-assistant@youragency.com\", \"name\": \"AI Safety Assistant\"},\n \"subject\": \"URGENT: Possible Scam Targeting {{ $json.recipientName }} ({{ $json.riskTier }})\",\n \"content\": [{\n \"type\": \"text/plain\",\n \"value\": \"{{ $json.familyAlertMessage }}\\n\\nReport ID: {{ $json.reportId }}\\nChannel: {{ $json.messageChannel }}\\nClaimed Identity: {{ $json.claimedIdentity }}\\nComposite Risk Score: {{ $json.compositeRiskScore }}/100 ({{ $json.riskTier }})\\nScam Type: {{ $json.scamType }}\\nRecommendation: {{ $json.overallSafetyRecommendation }}\\n\\nRed Flags Detected: {{ JSON.stringify($json.redFlagsDetected) }}\\n\\nWhat we told {{ $json.recipientName }} to do:\\n{{ JSON.stringify($json.stepByStepActions) }}\\n\\nPlease check in with {{ $json.recipientName }} as soon as you can.\"\n }]\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "f138ae03-6f33-4742-90e0-7ce2f5e7be06",
"name": "Respond High Risk Alert Sent",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
640,
864
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"success\": true,\n \"reportId\": \"{{ $json.reportId }}\",\n \"riskTier\": \"{{ $json.riskTier }}\",\n \"compositeRiskScore\": {{ $json.compositeRiskScore }},\n \"overallSafetyRecommendation\": \"{{ $json.overallSafetyRecommendation }}\",\n \"plainLanguageExplanation\": \"{{ $json.plainLanguageExplanation }}\",\n \"stepByStepActions\": {{ JSON.stringify($json.stepByStepActions) }},\n \"whatToSayIfContactedAgain\": \"{{ $json.whatToSayIfContactedAgain }}\",\n \"familyAlertSent\": true,\n \"message\": \"This looked like a serious scam attempt, so we've alerted {{ $json.trustedFamilyContactName }} right away. Please follow the recommended steps and don't send any money or information in the meantime.\"\n}"
},
"typeVersion": 1
},
{
"id": "72dc0b27-c2b3-4206-b6b6-605dd95e10f9",
"name": "Respond Guidance No Alert",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
640,
1264
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"success\": true,\n \"reportId\": \"{{ $json.reportId }}\",\n \"riskTier\": \"{{ $json.riskTier }}\",\n \"compositeRiskScore\": {{ $json.compositeRiskScore }},\n \"overallSafetyRecommendation\": \"{{ $json.overallSafetyRecommendation }}\",\n \"plainLanguageExplanation\": \"{{ $json.plainLanguageExplanation }}\",\n \"stepByStepActions\": {{ JSON.stringify($json.stepByStepActions) }},\n \"whatToSayIfContactedAgain\": \"{{ $json.whatToSayIfContactedAgain }}\",\n \"familyAlertSent\": false,\n \"message\": \"Here's what we found. This didn't reach the level where we'd alert a family member automatically, but please follow the steps above if anything about it still feels off.\"\n}"
},
"typeVersion": 1
},
{
"id": "664590fa-f3a6-4a56-90df-b747df13350b",
"name": "Wait for Data Processed",
"type": "n8n-nodes-base.wait",
"position": [
-976,
1056
],
"parameters": {},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "f01774fd-7ae7-44b0-a708-009367c4e177",
"nodeGroups": [],
"connections": {
"Wait for Analysis": {
"main": [
[
{
"node": "Fraud Indicator Analysis Agent",
"type": "main",
"index": 0
}
]
]
},
"Claude Fraud Model": {
"ai_languageModel": [
[
{
"node": "Fraud Indicator Analysis Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Calculate Risk Score": {
"main": [
[
{
"node": "Wait for Data Processed",
"type": "main",
"index": 0
}
]
]
},
"Extract Risk Signals": {
"main": [
[
{
"node": "Wait for Analysis",
"type": "main",
"index": 0
}
]
]
},
"Claude Guidance Model": {
"ai_languageModel": [
[
{
"node": "Safety Guidance Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Parse Analysis Output": {
"main": [
[
{
"node": "Check Analysis Usability",
"type": "main",
"index": 0
}
]
]
},
"Safety Guidance Agent": {
"main": [
[
{
"node": "Parse Guidance & Log Record",
"type": "main",
"index": 0
}
]
]
},
"When Message Received": {
"main": [
[
{
"node": "Prepare Message Context",
"type": "main",
"index": 0
}
]
]
},
"Check for Family Alert": {
"main": [
[
{
"node": "Post Alert to SendGrid",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond Guidance No Alert",
"type": "main",
"index": 0
}
]
]
},
"Post Alert to SendGrid": {
"main": [
[
{
"node": "Respond High Risk Alert Sent",
"type": "main",
"index": 0
}
]
]
},
"Prepare Message Context": {
"main": [
[
{
"node": "Extract Risk Signals",
"type": "main",
"index": 0
}
]
]
},
"Wait for Data Processed": {
"main": [
[
{
"node": "Safety Guidance Agent",
"type": "main",
"index": 0
}
]
]
},
"Check Analysis Usability": {
"main": [
[
{
"node": "Calculate Risk Score",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond Analysis Insufficient",
"type": "main",
"index": 0
}
]
]
},
"Post Scam Report to Sheets": {
"main": [
[
{
"node": "Check for Family Alert",
"type": "main",
"index": 0
}
]
]
},
"Parse Guidance & Log Record": {
"main": [
[
{
"node": "Post Scam Report to Sheets",
"type": "main",
"index": 0
}
]
]
},
"Fraud Indicator Analysis Agent": {
"main": [
[
{
"node": "Parse Analysis Output",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
anthropicApioAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow analyzes suspicious calls, WhatsApp messages, and emails using AI to detect scams, explain risks simply, suggest safe actions, alert trusted family members about high-risk fraud, and maintain a history of suspicious activity. Receives a suspicious message…
Source: https://n8n.io/workflows/17982/ — 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.
⏺ 🚀 How it works
WhatsApp AI Agent - Template. Uses redis, httpRequest, postgres, agent. Webhook trigger; 89 nodes.
Airtable Operations System: Leads, AI Agent, Outreach, Sync, Canva, Make/Zapier Bridge. Uses airtable, anthropic, slack, agent. Webhook trigger; 82 nodes.
Lead Pipeline v3.0. Uses httpRequest, agent, lmChatAnthropic, toolThink. Webhook trigger; 77 nodes.
What if AI didn't just write content—but actually thought about how to write it? This n8n workflow revolutionizes content creation by deploying multiple specialized AI agents that handle every aspect