{
  "name": "Agent 9: API Key Manager — add keys & resume verification",
  "description": null,
  "active": false,
  "nodes": [
    {
      "parameters": {
        "path": "yourbrand-abstract-keys",
        "responseMode": "responseNode",
        "options": {}
      },
      "name": "Form Page",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ],
      "id": "f9ddb9a8-fe8d-4c98-b0e5-4ee459af3f71"
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "<!doctype html><html><head><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>Add AbstractAPI Key</title></head>\n<body style=\"font-family:Arial,sans-serif;background:#f7fafc;margin:0;padding:40px 16px\">\n<div style=\"max-width:460px;margin:auto;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:32px\">\n<h2 style=\"margin:0 0 6px;color:#1a202c\">Add AbstractAPI key</h2>\n<p style=\"color:#718096;font-size:14px;margin:0 0 20px\">Paste a new AbstractAPI key or Tavily key (tvly-...). The type is auto-detected. It will be tested, added to all Meraku agents, and pending emails will be verified automatically.</p>\n<form method=\"GET\" action=\"https://your-n8n-instance.com/webhook/yourbrand-abstract-keys-save\">\n<input name=\"key\" placeholder=\"Paste AbstractAPI or Tavily key here\" autocomplete=\"off\" style=\"width:100%;box-sizing:border-box;padding:12px;border:1px solid #cbd5e0;border-radius:8px;font-size:15px;font-family:monospace\" />\n<button type=\"submit\" style=\"margin-top:14px;width:100%;background:#2e7d5b;color:#fff;border:none;padding:13px;border-radius:8px;font-size:16px;font-weight:bold;cursor:pointer\">Save &amp; resume verification</button>\n</form>\n<p style=\"color:#a0aec0;font-size:12px;margin:16px 0 0\">Tip: you can paste multiple keys separated by commas.</p>\n</div></body></html>",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "text/html; charset=utf-8"
              }
            ]
          }
        }
      },
      "name": "Serve Form",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        224,
        0
      ],
      "id": "09e5e996-cb41-44df-8c46-951a6162953c"
    },
    {
      "parameters": {
        "path": "yourbrand-abstract-keys-save",
        "responseMode": "responseNode",
        "options": {}
      },
      "name": "Save Hook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        320
      ],
      "id": "3bd7ccf5-6c29-414d-b674-470828a0a341"
    },
    {
      "parameters": {
        "jsCode": "const q=$json.query||{};\nconst raw=String(q.key||q.keys||'').trim();\nconst tokens=[...new Set(raw.split(/[,\\s]+/).map(s=>s.trim()).filter(Boolean))];\nconst absCand=tokens.filter(s=>/^[a-f0-9]{25,40}$/i.test(s));\nconst tvCand=tokens.filter(s=>/^tvly-[A-Za-z0-9_-]{20,80}$/.test(s));\nif(!absCand.length && !tvCand.length) return [{json:{valid:false,reason:'No valid-looking key found. AbstractAPI keys are ~32 letters/numbers; Tavily keys start with tvly-.'}}];\nconst goodAbs=[],goodTv=[],bad=[];\nfor(const k of absCand){\n  try{\n    const res=await this.helpers.httpRequest({method:'GET',url:'https://emailreputation.abstractapi.com/v1/?api_key='+k+'&email=manvendra%40meraku.in',json:true,returnFullResponse:true,ignoreHttpStatusErrors:true,timeout:20000});\n    if(Number(res.statusCode)>=200&&Number(res.statusCode)<300&&res.body&&res.body.email_deliverability) goodAbs.push(k);\n    else bad.push('AbstractAPI '+k.slice(0,8)+'... (HTTP '+res.statusCode+')');\n  }catch(e){bad.push('AbstractAPI '+k.slice(0,8)+'... (network)');}\n  await new Promise(r=>setTimeout(r,1300));\n}\nfor(const k of tvCand){\n  try{\n    const res=await this.helpers.httpRequest({method:'POST',url:'https://api.tavily.com/search',\n      headers:{'Authorization':'Bearer '+k,'Content-Type':'application/json'},\n      body:{query:'senior living',max_results:1},json:true,returnFullResponse:true,ignoreHttpStatusErrors:true,timeout:20000});\n    if(Number(res.statusCode)>=200&&Number(res.statusCode)<300&&res.body&&Array.isArray(res.body.results)) goodTv.push(k);\n    else bad.push('Tavily '+k.slice(0,13)+'... (HTTP '+res.statusCode+')');\n  }catch(e){bad.push('Tavily '+k.slice(0,13)+'... (network)');}\n}\nif(!goodAbs.length && !goodTv.length) return [{json:{valid:false,reason:'Key test failed: '+bad.join('; ')+'. Check the key and try again.'}}];\nreturn [{json:{valid:true,new_keys:goodAbs,tavily_keys:goodTv,rejected:bad}}];"
      },
      "name": "Test Keys",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        224,
        320
      ],
      "id": "bbbeca7e-245f-4ade-88b3-f7e63eb71998"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "kv",
              "leftValue": "={{ $json.valid === true }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "name": "Key Valid?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        448,
        320
      ],
      "id": "4355fe44-25eb-4d81-b6e9-f208f58642e8"
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "<!doctype html><html><body style=\"font-family:Arial,sans-serif;background:#f7fafc;padding:40px 16px\">\n<div style=\"max-width:460px;margin:auto;background:#fff;border:1px solid #c6f6d5;border-radius:12px;padding:32px;text-align:center\">\n<h2 style=\"color:#1f7a1f;margin:0 0 8px\">Key accepted &#10003;</h2>\n<p style=\"color:#4a5568\">The key passed a live test and is being added to all Meraku agents right now. Pending emails are being verified in the background (takes a few minutes).</p>\n<p style=\"color:#718096;font-size:13px\">The next digest will show the updated green verified count. You can close this page.</p>\n</div></body></html>",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "text/html; charset=utf-8"
              }
            ]
          }
        }
      },
      "name": "Respond OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        672,
        224
      ],
      "id": "6f7c7376-ae6b-4f37-bf5b-3473dda7f688"
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "<!doctype html><html><body style=\"font-family:Arial,sans-serif;background:#f7fafc;padding:40px 16px\">\n<div style=\"max-width:460px;margin:auto;background:#fff;border:1px solid #fed7d7;border-radius:12px;padding:32px\">\n<h2 style=\"color:#c53030;margin:0 0 8px\">Key not accepted</h2>\n<p style=\"color:#4a5568\">={{ $json.reason }}</p>\n<p><a href=\"https://your-n8n-instance.com/webhook/yourbrand-abstract-keys\" style=\"color:#2e7d5b;font-weight:bold\">&larr; Try again</a></p>\n</div></body></html>",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "text/html; charset=utf-8"
              }
            ]
          }
        }
      },
      "name": "Respond Error",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        672,
        416
      ],
      "id": "e35a3b88-a962-4155-9eff-fe0ec5441009"
    },
    {
      "parameters": {
        "jsCode": "const N8N='https://your-n8n-instance.com/api/v1';\nconst H={'X-N8N-API-KEY':'YOUR_N8N_API_KEY','Content-Type':'application/json'};\n\nconst ALLOWED=['saveExecutionProgress','saveManualExecutions','saveDataErrorExecution','saveDataSuccessExecution','executionTimeout','errorWorkflow','timezone','executionOrder'];\nconst newAbs=$json.new_keys||[];\nconst newTv=$json.tavily_keys||[];\nconst targets={\n 'nGhFnY97AkWjKtCC':{abs:['Verify Emails (AbstractAPI)'],tv:['Tavily — Find Key People','Tavily — Find Email']},\n 'kyYqnR6vx3GKCFFF':{abs:['Verify Alt Email (AbstractAPI)'],tv:['Tavily — Find Alt Email']},\n 'KsgvUADepQ48Z7wZ':{abs:['Stamp Today','Stamp Today All','Verify Digest Drafts'],tv:[]},\n 'HqaFxyYlJuSSv9LD':{abs:[],tv:['Tavily — Find Businesses']}};\nconst req=(m,p,b)=>this.helpers.httpRequest({method:m,url:N8N+p,headers:H,json:true,body:b});\nlet allAbs=[...newAbs];\nfor(const wid of Object.keys(targets)){\n  const t=targets[wid];\n  const touchAbs=newAbs.length&&t.abs.length, touchTv=newTv.length&&t.tv.length;\n  if(!touchAbs&&!touchTv) continue;\n  const wf=await req('GET','/workflows/'+wid);\n  const sdPre=JSON.parse(JSON.stringify(wf.staticData||{}));\n  for(const n of wf.nodes){\n    if(touchAbs&&t.abs.includes(n.name)){\n      const m=n.parameters.jsCode.match(/const ABSTRACT_KEYS=\\[([^\\]]*)\\];/);\n      const existing=m?m[1].split(',').map(s=>s.replace(/['\"\\s]/g,'')).filter(Boolean):[];\n      const merged=[...new Set([...existing,...newAbs])];\n      allAbs=[...new Set([...allAbs,...merged])];\n      n.parameters.jsCode=n.parameters.jsCode.replace(/const ABSTRACT_KEYS=\\[[^\\]]*\\];/,'const ABSTRACT_KEYS='+JSON.stringify(merged)+';');\n    }\n    if(touchTv&&t.tv.includes(n.name)){\n      const m=n.parameters.jsCode.match(/const TAVILY_KEYS=\\[([^\\]]*)\\];/);\n      const existing=m?m[1].split(',').map(s=>s.replace(/['\"\\s]/g,'')).filter(Boolean):[];\n      const merged=[...new Set([...newTv,...existing])];\n      n.parameters.jsCode=n.parameters.jsCode.replace(/const TAVILY_KEYS=\\[[^\\]]*\\];/,'const TAVILY_KEYS='+JSON.stringify(merged)+';');\n    }\n  }\n  const settings={};for(const k2 of ALLOWED){if(wf.settings&&wf.settings[k2]!==undefined)settings[k2]=wf.settings[k2];}\n  await req('PUT','/workflows/'+wid,{name:wf.name,nodes:wf.nodes,connections:wf.connections,settings});\n  await req('POST','/workflows/'+wid+'/deactivate');\n  await req('POST','/workflows/'+wid+'/activate');\n  try{\n    await new Promise(r=>setTimeout(r,3000));\n    const wf2=await req('GET','/workflows/'+wid);\n    const sd=wf2.staticData||{};\n    const g=sd.global||sd; const gPre=sdPre.global||sdPre;\n    g.abstractCache=Object.assign({},gPre.abstractCache||{},g.abstractCache||{});\n    if(newAbs.length) g.abstractExhausted={};\n    if(newTv.length) g.tavilyExhausted={};\n    if(!sd.global && Object.keys(sd).length===0){ sd.global=g; }\n    const settings2={};for(const k2 of ALLOWED){if(wf2.settings&&wf2.settings[k2]!==undefined)settings2[k2]=wf2.settings[k2];}\n    await req('PUT','/workflows/'+wid,{name:wf2.name,nodes:wf2.nodes,connections:wf2.connections,settings:settings2,staticData:sd});\n  }catch(e){}\n}\nreturn [{json:{all_keys:allAbs,new_keys:newAbs,tavily_keys:newTv}}];"
      },
      "name": "Distribute Keys",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        896,
        224
      ],
      "id": "2a6dfc48-566d-49d6-a19a-1e15e0784027"
    },
    {
      "parameters": {
        "operation": "getAll",
        "tableId": "outreach_log",
        "returnAll": true,
        "matchType": "allFilters",
        "filters": {
          "conditions": [
            {
              "keyName": "approval_status",
              "condition": "eq",
              "keyValue": "pending"
            },
            {
              "keyName": "bounced",
              "condition": "eq",
              "keyValue": "false"
            },
            {
              "keyName": "reply_received",
              "condition": "eq",
              "keyValue": "false"
            }
          ]
        }
      },
      "name": "Fetch Pending",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        1120,
        224
      ],
      "id": "63b672d6-d66f-4da2-a529-6e362d3ad88e"
    },
    {
      "parameters": {
        "jsCode": "const N8N='https://your-n8n-instance.com/api/v1';\nconst H={'X-N8N-API-KEY':'YOUR_N8N_API_KEY','Content-Type':'application/json'};\n\nconst dist=$('Distribute Keys').first().json;\nif(!(dist.new_keys||[]).length) return [];\nconst ABSTRACT_KEYS=dist.all_keys||[];\nconst req=(m,p,b)=>this.helpers.httpRequest({method:m,url:N8N+p,headers:H,json:true,body:b});\nlet cache={};\ntry{ const a4=await req('GET','/workflows/KsgvUADepQ48Z7wZ'); const g=(a4.staticData||{}).global||a4.staticData||{}; cache=Object.assign({},g.abstractCache||{}); }catch(e){}\nconst __sleep=(ms)=>new Promise(r=>setTimeout(r,ms));\nconst verifyEmail=async(email)=>{\n  email=String(email||'').toLowerCase().trim();\n  if(!email||!email.includes('@')) return 'undeliverable';\n  const c=cache[email];\n  if(c && Date.now()-c.ts < 30*24*3600*1000) return c.status;\n  for(const k of ABSTRACT_KEYS){\n    let attempts=0;\n    while(attempts<5){\n      attempts++;\n      try{\n        await __sleep(1400+Math.floor(Math.random()*800));\n        const res=await this.helpers.httpRequest({method:'GET',url:'https://emailreputation.abstractapi.com/v1/?api_key='+k+'&email='+encodeURIComponent(email),json:true,returnFullResponse:true,ignoreHttpStatusErrors:true,timeout:20000});\n        const code=Number(res.statusCode||0);\n        if(code===422){const msg422=JSON.stringify(res.body||'').toLowerCase(); if(msg422.includes('quota')) break; return 'error';}\n        if(code===429){const msg=JSON.stringify(res.body||'').toLowerCase();const isQuota=msg.includes('quota')&&!msg.includes('per second');\n          if(isQuota) break; if(attempts<5){await __sleep(1200*attempts+500);continue;} return 'error';}\n        if(code===401||code===402||code===403) break;\n        if(code<200||code>=300) return 'error';\n        const st=String((res.body&&res.body.email_deliverability&&res.body.email_deliverability.status)||'unknown').toLowerCase();\n        const fin=(st==='deliverable')?'deliverable':(st==='undeliverable'?'undeliverable':'unknown');\n        cache[email]={status:fin,ts:Date.now()};\n        return fin;\n      }catch(e){ return 'error'; }\n    }\n  }\n  return 'quota_exhausted';\n};\nconst out=[];\nfor(const it of $input.all()){\n  const d={...it.json};\n  d.verify_result=await verifyEmail(d.to_email);\n  out.push({json:d});\n}\ntry{\n  const a4=await req('GET','/workflows/KsgvUADepQ48Z7wZ');\n  const sd=a4.staticData||{}; const g=sd.global||sd;\n  g.abstractCache=Object.assign({},g.abstractCache||{},cache);\n  if(!sd.global && Object.keys(sd).length===0){ sd.global=g; }\n  const ALLOWED=['saveExecutionProgress','saveManualExecutions','saveDataErrorExecution','saveDataSuccessExecution','executionTimeout','errorWorkflow','timezone','executionOrder'];\n  const settings={};for(const k2 of ALLOWED){if(a4.settings&&a4.settings[k2]!==undefined)settings[k2]=a4.settings[k2];}\n  await req('PUT','/workflows/KsgvUADepQ48Z7wZ',{name:a4.name,nodes:a4.nodes,connections:a4.connections,settings,staticData:sd});\n}catch(e){}\nreturn out;"
      },
      "name": "Verify Pending",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1344,
        224
      ],
      "id": "f4e72c45-421b-4c77-98b7-a92280ee814f"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "ud",
              "leftValue": "={{ $json.verify_result === 'undeliverable' }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "name": "Undeliverable?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1568,
        224
      ],
      "id": "5abef130-910b-41f7-8f92-5f39344574f5"
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "outreach_log",
        "filters": {
          "conditions": [
            {
              "keyName": "id",
              "condition": "eq",
              "keyValue": "={{ $json.id }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "bounced",
              "fieldValue": "={{ true }}"
            },
            {
              "fieldId": "bounce_date",
              "fieldValue": "={{ new Date().toISOString().slice(0,10) }}"
            }
          ]
        }
      },
      "name": "Mark VF Log",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        1792,
        224
      ],
      "id": "8eeedab7-95c0-4526-b051-2b297652e2fc",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "prospects",
        "filters": {
          "conditions": [
            {
              "keyName": "email",
              "condition": "ilike",
              "keyValue": "={{ $json.to_email }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "email_valid",
              "fieldValue": "={{ false }}"
            },
            {
              "fieldId": "email_status",
              "fieldValue": "verify_failed"
            }
          ]
        }
      },
      "name": "Mark VF Prospect",
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        2016,
        224
      ],
      "id": "6449d959-8667-462d-9db1-d8336a430f93",
      "onError": "continueRegularOutput"
    },
    {
      "name": "Tavily Alert Hook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        600
      ],
      "parameters": {
        "httpMethod": "GET",
        "path": "yourbrand-tavily-exhausted",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "01fa362c-5588-4c6f-a2bc-364221bfc89a"
    },
    {
      "name": "Tavily Alert Guard",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        200,
        600
      ],
      "parameters": {
        "jsCode": "const sd=$getWorkflowStaticData('global');\nconst last=Number(sd.lastTavilyAlert||0);\nconst need=(Date.now()-last)>24*3600*1000;\nif(need) sd.lastTavilyAlert=Date.now();\nreturn [{json:{_send_alert:need}}];"
      },
      "id": "408015dc-755f-4d2c-941e-1a6eacee5b88"
    },
    {
      "name": "Tavily Alert?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        400,
        600
      ],
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "ta",
              "leftValue": "={{ $json._send_alert === true }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "f14e4315-449d-4734-bb8d-99b552c2f54a"
    },
    {
      "name": "Gmail — Tavily Alert",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        600,
        600
      ],
      "onError": "continueRegularOutput",
      "parameters": {
        "sendTo": "you@yourdomain.com",
        "subject": "[ACTION] Add Tavily key — prospect research paused",
        "message": "<p><b>Tavily search credits are exhausted on all configured keys.</b></p><p>Prospect research (Agents 1, 2, 6) is running without web data until a key works again. Exhausted keys retry automatically every 24h, so they recover on Tavily's monthly reset.</p><p style=\"margin:20px 0\"><a href=\"https://your-n8n-instance.com/webhook/yourbrand-abstract-keys\" style=\"background:#2e7d5b;color:#ffffff;padding:13px 26px;border-radius:6px;text-decoration:none;font-weight:bold;font-size:15px\">ADD NEW TAVILY KEY</a></p><p style=\"color:#555\">Create a free account at tavily.com (1000 credits/month), copy the tvly-... key, click the button, paste, save. It is auto-detected and distributed.</p>",
        "options": {
          "appendAttribution": false
        }
      },
      "id": "324002f8-c1a4-4ef9-a9e3-6da4a5aa6187"
    }
  ],
  "connections": {
    "Form Page": {
      "main": [
        [
          {
            "node": "Serve Form",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Hook": {
      "main": [
        [
          {
            "node": "Test Keys",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Test Keys": {
      "main": [
        [
          {
            "node": "Key Valid?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Key Valid?": {
      "main": [
        [
          {
            "node": "Respond OK",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Respond OK": {
      "main": [
        [
          {
            "node": "Distribute Keys",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Distribute Keys": {
      "main": [
        [
          {
            "node": "Fetch Pending",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Pending": {
      "main": [
        [
          {
            "node": "Verify Pending",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Pending": {
      "main": [
        [
          {
            "node": "Undeliverable?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Undeliverable?": {
      "main": [
        [
          {
            "node": "Mark VF Log",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Mark VF Log": {
      "main": [
        [
          {
            "node": "Mark VF Prospect",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tavily Alert Hook": {
      "main": [
        [
          {
            "node": "Tavily Alert Guard",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tavily Alert Guard": {
      "main": [
        [
          {
            "node": "Tavily Alert?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tavily Alert?": {
      "main": [
        [
          {
            "node": "Gmail — Tavily Alert",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "timezone": "Asia/Kolkata",
    "executionTimeout": 3600,
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "binaryMode": "separate"
  }
}