{
  "name": "LinkedFlow · 1 · Señal externa → prospecto en lista",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "days",
              "triggerAtHour": 7,
              "triggerAtMinute": 30
            }
          ]
        }
      },
      "id": "a1000000-0000-4000-8000-000000000001",
      "name": "Cada mañana 07:30",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -460,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "list-id-1",
              "name": "list_id",
              "value": "PEGA-AQUI-EL-ID-DE-TU-LISTA",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "a1000000-0000-4000-8000-000000000009",
      "name": "Lista de destino",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -460,
        180
      ],
      "notes": "El ID de la lista se copia en la app: Prospectos → selecciona la lista → «Copiar ID». Tiene forma de UUID (01a05d4e-…). Si pegas otra cosa, la API responde 422 diciendo que list_id no es válido."
    },
    {
      "parameters": {
        "jsCode": "// Sustituye este nodo por tu fuente real de señales (Apify, RSS,\n// tu CRM, una hoja...). Lo único que LinkedFlow necesita de cada\n// elemento es una URL de perfil de LinkedIn.\nconst señales = [\n  { url: 'https://www.linkedin.com/in/ejemplo-uno', motivo: 'contrata equipo comercial', empresa: 'Consultora Norte' },\n  { url: 'https://www.linkedin.com/in/ejemplo-dos', motivo: 'publicó sobre prospección', empresa: 'Estudio Ferrer' }\n];\n\nreturn señales.map((s) => ({\n  json: {\n    linkedin_url: s.url.split('?')[0].replace(/\\/$/, ''),\n    company: s.empresa,\n    signal: s.motivo\n  }\n}));"
      },
      "id": "a1000000-0000-4000-8000-000000000002",
      "name": "Normalizar señales",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -240,
        0
      ]
    },
    {
      "parameters": {
        "compare": "selectedFields",
        "fieldsToCompare": "linkedin_url",
        "options": {}
      },
      "id": "a1000000-0000-4000-8000-000000000003",
      "name": "Quitar duplicados",
      "type": "n8n-nodes-base.removeDuplicates",
      "typeVersion": 1.1,
      "position": [
        -20,
        0
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://app.linkedflow.pro/api/v1/prospects",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  linkedin_url: $json.linkedin_url,\n  company: $json.company,\n  source: 'n8n',\n  tags: ['n8n', 'señal:' + $json.signal],\n  list_id: $('Lista de destino').first().json.list_id\n}) }}",
        "options": {
          "response": {
            "response": {
              "neverError": true,
              "fullResponse": true
            }
          }
        }
      },
      "id": "a1000000-0000-4000-8000-000000000004",
      "name": "POST /prospects (con list_id)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        200,
        0
      ],
      "credentials": {
        "httpHeaderAuth": {
          "id": "REEMPLAZAR",
          "name": "LinkedFlow API (Authorization: Bearer …)"
        }
      },
      "notes": "409 = ya existía: NO es un error, lo añade igualmente a la lista y el workflow arranca. Por eso neverError + fullResponse."
    },
    {
      "parameters": {
        "jsCode": "// 201 = creado · 409 = ya existía (y añadido a la lista igualmente).\n// Cualquier otro código merece que mires el cuerpo.\nconst resumen = { creados: 0, existentes: 0, fallos: [] };\n\nfor (const item of $input.all()) {\n  const code = item.json.statusCode;\n  if (code === 201) resumen.creados++;\n  else if (code === 409) resumen.existentes++;\n  else resumen.fallos.push({ code, body: item.json.body });\n}\n\nreturn [{ json: resumen }];"
      },
      "id": "a1000000-0000-4000-8000-000000000005",
      "name": "Resumen (201 / 409 / fallos)",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        440,
        0
      ]
    }
  ],
  "connections": {
    "Cada mañana 07:30": {
      "main": [
        [
          {
            "node": "Normalizar señales",
            "type": "main",
            "index": 0
          },
          {
            "node": "Lista de destino",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalizar señales": {
      "main": [
        [
          {
            "node": "Quitar duplicados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Quitar duplicados": {
      "main": [
        [
          {
            "node": "POST /prospects (con list_id)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "POST /prospects (con list_id)": {
      "main": [
        [
          {
            "node": "Resumen (201 / 409 / fallos)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "descripcion": "Mete prospectos en una lista de LinkedFlow. El workflow de LinkedFlow que escucha esa lista (disparador «Al añadir a una lista») arranca solo. Antes de activar: crea la credencial Header Auth (nombre Authorization, valor «Bearer <tu-token-de-api>») y pega el ID de tu lista en el nodo «Lista de destino» — se copia desde Prospectos → selecciona la lista → «Copiar ID»."
  }
}
