{
  "name": "OpenSERP — Search to Google Sheets",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ],
      "id": "549943c6-7ae2-4ead-a48e-7f4975e79607",
      "name": "When clicking ‘Execute workflow’"
    },
    {
      "parameters": {
        "jsCode": "return [\n  { json: { query: \"open source search api\" } },\n  { json: { query: \"web search for ai agents\" } },\n  { json: { query: \"n8n search automation\" } }\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        224,
        0
      ],
      "id": "db5301e3-58a7-4ff2-b428-26e2b0bd7a3b",
      "name": "Code in JavaScript"
    },
    {
      "parameters": {
        "url": "https://api.openserp.org/v1/google/search",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "text",
              "value": "={{ $json.query }}"
            },
            {
              "name": "limit",
              "value": "10"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.5,
      "position": [
        448,
        0
      ],
      "id": "c300f573-0aba-48eb-864c-e7558d423a87",
      "name": "HTTP Request"
    },
    {
      "parameters": {
        "jsCode": "const rows = [];\nconst checkedAt = new Date().toISOString();\nconst queries = $(\"Code in JavaScript\").all();\n\nfor (const [index, item] of $input.all().entries()) {\n  const response = item.json;\n  const query = response.query?.text\n    ?? queries[index]?.json.query\n    ?? \"\";\n\n  if (!Array.isArray(response.results)) {\n    throw new Error(`Invalid API response: missing results array for query \"${query}\".`);\n  }\n\n  if (response.results.length === 0) {\n    rows.push({\n      json: {\n        Query: query,\n        Engine: response.query?.engines_requested?.[0] ?? \"google\",\n        Position: \"\",\n        Title: \"No results found\",\n        URL: \"\",\n        Snippet: \"The search returned no results.\",\n        checked_at: checkedAt\n      }\n    });\n    continue;\n  }\n\n  for (const result of response.results) {\n    rows.push({\n      json: {\n        Query: query,\n        Engine: result.engine ?? \"google\",\n        Position: result.rank ?? result.position?.absolute ?? \"\",\n        Title: result.title ?? \"\",\n        URL: result.url ?? \"\",\n        Snippet: result.snippet ?? \"\",\n        checked_at: checkedAt\n      }\n    });\n  }\n}\n\nreturn rows;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        672,
        0
      ],
      "id": "27e26890-8bf8-45dc-ab85-a6105cb3244e",
      "name": "Prepare rows"
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "",
          "mode": "list"
        },
        "sheetName": {
          "__rl": true,
          "value": "",
          "mode": "list"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": [
            {
              "id": "Query",
              "displayName": "Query",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Engine",
              "displayName": "Engine",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Position",
              "displayName": "Position",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Title",
              "displayName": "Title",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "displayName": "URL",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Snippet",
              "displayName": "Snippet",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "checked_at",
              "displayName": "checked_at",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "cellFormat": "RAW"
        }
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        896,
        0
      ],
      "id": "a25997b0-683a-4e27-8102-fb9d275f0035",
      "name": "Append row in sheet"
    }
  ],
  "pinData": {},
  "connections": {
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Prepare rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare rows": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate"
  },
  "nodeGroups": [],
  "tags": []
}
