{
  "name": "LinkedFlow · 3 · Enriquecer con Apify (asíncrono)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "linkedflow-enriquecer",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000001",
      "name": "Webhook de LinkedFlow",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [-720, 0],
      "webhookId": "c3000000-0000-4000-8000-0000000000aa",
      "notes": "URL de PRODUCCIÓN en el nodo «Petición HTTP» de LinkedFlow, con ?s=TU-SECRETO. Activa este workflow o dará 404."
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ ok: true, estado: 'enriquecimiento en curso' }) }}",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000002",
      "name": "Responder YA (antes de 15 s)",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [-480, 0],
      "notes": "CLAVE: LinkedFlow corta la petición a los 15 s y Apify tarda ~15 s solo en el actor más rápido. Se responde al instante y el trabajo sigue por debajo; el resultado vuelve a LinkedFlow por la API, no por esta respuesta."
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/apify~rag-web-browser/run-sync-get-dataset-items",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            { "name": "token", "value": "PEGA-AQUI-TU-TOKEN-DE-APIFY" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  query: ($json.body.prospect.company || $json.body.prospect.full_name) + ' empresa web oficial',\n  maxResults: 1,\n  outputFormats: ['markdown'],\n  scrapingTool: 'raw-http'\n}) }}",
        "options": {
          "timeout": 120000,
          "response": { "response": { "neverError": true } }
        }
      },
      "id": "c3000000-0000-4000-8000-000000000003",
      "name": "Apify · RAG Web Browser",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [-240, 0],
      "notes": "run-sync-get-dataset-items espera al actor y devuelve el dataset. Medido: ~15 s con scrapingTool=raw-http y 1 resultado. Token en Apify → Settings → API & Integrations."
    },
    {
      "parameters": {
        "jsCode": "// Reglas simples y explicables sobre lo que trajo Apify. Cuando esto\n// funcione, sustituye el bloque por una llamada a tu modelo pidiéndole\n// JSON estricto: { tier, angulo, dolor }.\nconst pagina = $input.first().json;\nconst texto = ((pagina.markdown || '') + ' ' + (pagina.metadata?.description || '')).toLowerCase();\nconst prospecto = $('Webhook de LinkedFlow').first().json.body.prospect;\n\nconst SENALES = [\n  { palabra: 'consultor', angulo: 'consultoría que vende por relación' },\n  { palabra: 'agencia', angulo: 'agencia con equipo comercial pequeño' },\n  { palabra: 'saas', angulo: 'producto con ciclo de venta corto' },\n  { palabra: 'formación', angulo: 'formación: prospecta por cohortes' },\n  { palabra: 'recruit', angulo: 'selección: vive de LinkedIn' }\n];\n\nconst encontrada = SENALES.find((s) => texto.includes(s.palabra));\nconst tier = encontrada ? 'A' : 'B';\n\nreturn [{\n  json: {\n    prospect_id: prospecto.id,\n    tier,\n    angulo: encontrada ? encontrada.angulo : 'sin señal clara en su web',\n    fuente: pagina.metadata?.url || null\n  }\n}];"
      },
      "id": "c3000000-0000-4000-8000-000000000004",
      "name": "Decidir tier",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [0, 0]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://app.linkedflow.pro/api/v1/prospects/bulk-tags",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [{ "name": "Accept", "value": "application/json" }]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  prospect_ids: [$json.prospect_id],\n  add: ['tier:' + $json.tier, 'angulo:' + $json.angulo.slice(0, 50)],\n  remove: ['enriquecimiento:pedido']\n}) }}",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000005",
      "name": "Escribir el tier en LinkedFlow",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [240, 0],
      "credentials": {
        "httpHeaderAuth": {
          "id": "REEMPLAZAR",
          "name": "LinkedFlow API (Authorization: Bearer …)"
        }
      },
      "notes": "El resultado vuelve por la API, no por la respuesta del webhook: ese es el patrón asíncrono."
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "loose", "version": 2 },
          "conditions": [
            {
              "id": "es-tier-a",
              "leftValue": "={{ $('Decidir tier').first().json.tier }}",
              "rightValue": "A",
              "operator": { "type": "string", "operation": "equals" }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000006",
      "name": "¿Es tier A?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [480, 0]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://app.linkedflow.pro/api/v1/lists/01a05d90-2a16-704f-ac87-5b6c82300e03/prospects",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [{ "name": "Accept", "value": "application/json" }]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ prospect_ids: [$('Decidir tier').first().json.prospect_id] }) }}",
        "options": {}
      },
      "id": "c3000000-0000-4000-8000-000000000007",
      "name": "Meter en «ICP-A (enriquecidos)»",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [720, -100],
      "credentials": {
        "httpHeaderAuth": {
          "id": "REEMPLAZAR",
          "name": "LinkedFlow API (Authorization: Bearer …)"
        }
      },
      "notes": "Entrar en esta lista puede disparar tu workflow de invitación: así el enriquecimiento decide a quién se escribe, sin que nadie mire una tabla."
    },
    {
      "parameters": {},
      "id": "c3000000-0000-4000-8000-000000000008",
      "name": "Tier B: se queda etiquetado",
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [720, 100]
    }
  ],
  "connections": {
    "Webhook de LinkedFlow": { "main": [[{ "node": "Responder YA (antes de 15 s)", "type": "main", "index": 0 }]] },
    "Responder YA (antes de 15 s)": { "main": [[{ "node": "Apify · RAG Web Browser", "type": "main", "index": 0 }]] },
    "Apify · RAG Web Browser": { "main": [[{ "node": "Decidir tier", "type": "main", "index": 0 }]] },
    "Decidir tier": { "main": [[{ "node": "Escribir el tier en LinkedFlow", "type": "main", "index": 0 }]] },
    "Escribir el tier en LinkedFlow": { "main": [[{ "node": "¿Es tier A?", "type": "main", "index": 0 }]] },
    "¿Es tier A?": {
      "main": [
        [{ "node": "Meter en «ICP-A (enriquecidos)»", "type": "main", "index": 0 }],
        [{ "node": "Tier B: se queda etiquetado", "type": "main", "index": 0 }]
      ]
    }
  },
  "settings": { "executionOrder": "v1" },
  "meta": {
    "descripcion": "Enriquecimiento ASÍNCRONO. El nodo «Petición HTTP» de LinkedFlow corta a los 15 s y el actor de Apify más rápido tarda ~15 s: esperar la respuesta no cabe. Aquí n8n responde al instante, hace el trabajo por debajo y devuelve el resultado escribiendo en la API de LinkedFlow (etiquetas + lista). Antes de activar: token de Apify en el nodo de Apify, credencial Header Auth de LinkedFlow, y el id de tu lista de destino."
  }
}
