{
  "id": "gKi0mFpc1WCMsXVooKuBP",
  "name": "Get location insights using free APIs",
  "tags": [],
  "nodes": [
    {
      "id": "a2ac9306-544c-4b4f-9a2f-60e8130a3243",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "notes": "Merges 4 parallel API responses into single object.\nInput Sources:\n1. HTTP Request (Nominatim) - Address data\n2. HTTP Request1 (TimezoneDB) - Timezone data\n3. HTTP Request2 (Sunrise-Sunset) - Sun times\n4. OpenWeatherMap - Weather data\nMerge Mode: Combine by position\nClash Handling: Add suffix to duplicate fields\nOutput: Single object with all data combined.",
      "position": [
        1088,
        496
      ],
      "parameters": {
        "mode": "combine",
        "options": {
          "clashHandling": {
            "values": {
              "resolveClash": "addSuffix"
            }
          }
        },
        "combineBy": "combineByPosition",
        "numberInputs": 4
      },
      "executeOnce": false,
      "notesInFlow": true,
      "typeVersion": 3.2
    },
    {
      "id": "72207d3a-9e6d-4afb-a4b3-c90411a2b2c7",
      "name": "OpenWeatherMap",
      "type": "n8n-nodes-base.openWeatherMap",
      "notes": "OpenWeatherMap API - Current weather conditions.\nCost: FREE tier (requires free API key)\nRate Limit: 60 calls/min, 1M calls/month\nReturns:\n- Temperature (current, min, max, feels like)\n- Atmospheric pressure & humidity\n- Weather condition & description\n- Weather icon URL\nFree tier is more than sufficient for most use cases.\nCredentials stored in n8n: \"OpenWeatherMap account\"\n",
      "position": [
        768,
        816
      ],
      "parameters": {
        "latitude": "={{ $json.query.lat }}",
        "longitude": "={{ $json.query.lon }}",
        "locationSelection": "coordinates"
      },
      "credentials": {
        "openWeatherMapApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "51206118-fa83-4411-acfd-3078f54924e5",
      "name": "HTTP Request (Nominatim)",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "OpenStreetMap Nominatim API - Converts coordinates to address.\nAPI: https://nominatim.openstreetmap.org/reverse\nCost: 100% FREE (no API key required)\nRate Limit: 1 request/second\nReturns:\n- Full address (display_name)\n- Address components (suburb, state, country, etc.)\n- Postcode\nUsage Policy: Fair use, max 1 req/sec",
      "position": [
        768,
        240
      ],
      "parameters": {
        "url": "https://nominatim.openstreetmap.org/reverse",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "lat",
              "value": "={{ $json.query.lat }}"
            },
            {
              "name": "lon",
              "value": "={{ $json.query.lon }}"
            },
            {
              "name": "format",
              "value": "json"
            },
            {
              "name": "accept-language",
              "value": "en"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "f188585d-1883-4f0b-bafa-5e0cdf88db79",
      "name": "Webhook - Accepts Coordinates",
      "type": "n8n-nodes-base.webhook",
      "notes": "Receives GPS coordinates via query parameters.\nRequired Parameters:\n- lat: Latitude (-90 to 90)\n- lon: Longitude (-180 to 180)\nExample:\nhttps://n8n.srinikb.in/webhook/geo-details?lat=27.1751495&lon=78.0395673\nThis triggers 3 parallel API calls for maximum efficiency.",
      "position": [
        320,
        528
      ],
      "parameters": {
        "path": "geo-details",
        "options": {},
        "responseMode": "responseNode"
      },
      "notesInFlow": true,
      "typeVersion": 2.1
    },
    {
      "id": "1c61c421-9465-488b-885c-49fcb2227226",
      "name": "HTTP Request (TimezoneDB)",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "TimezoneDB API - Gets timezone information.\nAPI: http://api.timezonedb.com/v2.1/get-time-zone\nCost: FREE tier (requires free API key)\nRate Limit: 1 request/second\nReturns:\n- Timezone name (e.g., \"Asia/Kolkata\")\n- Abbreviation (e.g., \"IST\")\n- Current local time & date\n- Unix timestamp\n- Country code\n\nAPI key required (Free tier)",
      "position": [
        768,
        416
      ],
      "parameters": {
        "url": "http://api.timezonedb.com/v2.1/get-time-zone",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpQueryAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "by",
              "value": "position"
            },
            {
              "name": "lat",
              "value": "={{ $json.query.lat }}"
            },
            {
              "name": "lng",
              "value": "={{ $json.query.lon }}"
            },
            {
              "name": "format",
              "value": "json"
            }
          ]
        }
      },
      "credentials": {
        "httpQueryAuth": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "acbea998-cffa-4644-af2e-6c88044302cc",
      "name": "HTTP Request (Sunrise-Sunset)",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "Sunrise-Sunset.org API - Calculates astronomical times.\nAPI: https://api.sunrise-sunset.org/json\nCost: 100% FREE (no API key required)\nRate Limit: No documented limit (fair use)\nReturns:\n- Sunrise time (local timezone)\n- Sunset time (local timezone)\n- Day length\nDepends on: Timezone data from HTTP Request1\nUses timezone ID for accurate local time conversion.",
      "position": [
        768,
        640
      ],
      "parameters": {
        "url": "https://api.sunrise-sunset.org/json",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "lat",
              "value": "={{ $('Webhook - Accepts Coordinates').item.json.query.lat }}"
            },
            {
              "name": "lng",
              "value": "={{ $('Webhook - Accepts Coordinates').item.json.query.lon }}"
            },
            {
              "name": "tzid",
              "value": "={{ $json.zoneName }}"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "88524b8f-20d5-4fbd-92f9-ce84564373bc",
      "name": "Edit Fields - Format & Structure Output",
      "type": "n8n-nodes-base.set",
      "notes": "Transforms merged data into clean, user-friendly format.\nCreates 28 structured fields:\n- Location: lat, lon, address components\n- Time: timezone, current time/date, timestamp\n- Sun: sunrise, sunset, day length\n- Weather: temperature, conditions, icons\n- Visual: country flag URL, weather icon URL\nFormatting:\n- Time: 12-hour format (hh:mm a)\n- Date: dd-MMM-yyyy format\n- Dot notation enabled for nested fields\nThis is the final data structure sent to client.\n",
      "position": [
        1296,
        528
      ],
      "parameters": {
        "options": {
          "dotNotation": true
        },
        "assignments": {
          "assignments": [
            {
              "id": "57a7fc2f-db0f-4339-8b53-d+1234567890b",
              "name": "lat",
              "type": "number",
              "value": "={{ $('Webhook - Accepts Coordinates').item.json.query.lat }}"
            },
            {
              "id": "466b0a54-f580-44ad-87d8-b16bd6a755d8",
              "name": "lon",
              "type": "number",
              "value": "={{ $('Webhook - Accepts Coordinates').item.json.query.lon }}"
            },
            {
              "id": "c190987c-5981-48a6-aea0-8ff38aaaf462",
              "name": "timezone",
              "type": "string",
              "value": "={{ $json.zoneName_2 }}"
            },
            {
              "id": "f017a847-4f38-4473-82e5-23e8bf973ab0",
              "name": "timezone_short",
              "type": "string",
              "value": "={{ $json.abbreviation_2 }}"
            },
            {
              "id": "c2050efe-784f-47c7-88ae-613f387b3ee1",
              "name": "current_time",
              "type": "string",
              "value": "={{ $json.formatted_2.toDateTime().format('hh:mm a') }}"
            },
            {
              "id": "3493e888-7cbd-4578-a9b9-d7d328ee944c",
              "name": "current_date",
              "type": "string",
              "value": "={{ $json.formatted_2.toDateTime().format('dd-MMM-yyyy') }}"
            },
            {
              "id": "a29d2911-f3a1-425d-8500-bdabecf1c7ee",
              "name": "timestamp",
              "type": "string",
              "value": "={{ $json.timestamp_2 }}"
            },
            {
              "id": "813398e7-b60d-4557-bb9a-be1d6917d05d",
              "name": "address_full",
              "type": "string",
              "value": "={{ $json.display_name_1 }}"
            },
            {
              "id": "d5599765-eb71-4f5e-85bb-d0a394e0dc22",
              "name": "neighbourhood",
              "type": "string",
              "value": "={{ $json.address_1.neighbourhood }}"
            },
            {
              "id": "dada089f-4bab-4bbe-9d57-270a0b68a90b",
              "name": "suburb",
              "type": "string",
              "value": "={{ $json.address_1.suburb }}"
            },
            {
              "id": "92636a4c-b7c9-4c1c-9f97-c328f9cf0130",
              "name": "town",
              "type": "string",
              "value": "={{ $json.address_1.town }}"
            },
            {
              "id": "188c93a9-bb8c-4e74-be38-f354940c075c",
              "name": "county",
              "type": "string",
              "value": "={{ $json.address_1.county }}"
            },
            {
              "id": "e9adde83-fea1-450d-8424-931732ba81fa",
              "name": "state_district",
              "type": "string",
              "value": "={{ $json.address_1.state_district }}"
            },
            {
              "id": "b67c05ed-21d1-4bc7-94ca-b8004f737b1e",
              "name": "state",
              "type": "string",
              "value": "={{ $json.address_1.state }}"
            },
            {
              "id": "3af6de13-7de8-4d97-82d6-ec90e62ad401",
              "name": "country",
              "type": "string",
              "value": "={{ $json.address_1.country }}"
            },
            {
              "id": "13203f45-1678-4cb8-8100-de0445a23f53",
              "name": "country_code",
              "type": "string",
              "value": "={{ $json.address_1.country_code }}"
            },
            {
              "id": "e47c932e-25da-41cc-98e2-6890c0711a8b",
              "name": "postcode",
              "type": "string",
              "value": "={{ $json.address_1.postcode }}"
            },
            {
              "id": "c6566ea7-cf3f-4907-912b-d4216dfffc89",
              "name": "sunrise",
              "type": "string",
              "value": "={{ $json.results_3.sunrise }}"
            },
            {
              "id": "f94ebe29-c1b2-40f5-a81a-5d359faf38fb",
              "name": "sunset",
              "type": "string",
              "value": "={{ $json.results_3.sunset }}"
            },
            {
              "id": "3c6a89ad-586f-4002-a45c-735b5a4596d7",
              "name": "day_length",
              "type": "string",
              "value": "={{ $json.results_3.day_length }}"
            },
            {
              "id": "49f3372a-dff4-40ae-a2e3-0e8f6c2e0838",
              "name": "temperature",
              "type": "string",
              "value": "={{ $json.main_4.temp }}"
            },
            {
              "id": "b2336d4c-60a7-4ede-9816-24184f12180b",
              "name": "feels_like",
              "type": "string",
              "value": "={{ $json.main_4.feels_like }}"
            },
            {
              "id": "fbd2e303-59bc-4a84-b68d-a4e20d306d13",
              "name": "temp_min",
              "type": "string",
              "value": "={{ $json.main_4.temp_min }}"
            },
            {
              "id": "e1cbcb95-9510-4c0f-a0d1-29b5660ff2ac",
              "name": "temp_max",
              "type": "string",
              "value": "={{ $json.main_4.temp_max }}"
            },
            {
              "id": "cfb5bfbf-1181-4255-aeee-61ab49c7ffac",
              "name": "pressure",
              "type": "string",
              "value": "={{ $json.main_4.pressure }}"
            },
            {
              "id": "4d49f7ad-b2c7-45c0-be5a-45e2348b6087",
              "name": "humidity",
              "type": "string",
              "value": "={{ $json.main_4.humidity }}"
            },
            {
              "id": "20d65083-c880-4eaa-b9ef-49244abdf222",
              "name": "weather_main",
              "type": "string",
              "value": "={{ $json.weather[0].main }}"
            },
            {
              "id": "c54f8c09-0c27-4473-ba85-161cbe3cc2bf",
              "name": "weather_description",
              "type": "string",
              "value": "={{ $json.weather[0].description }}"
            },
            {
              "id": "2fb0e544-bc23-4f69-912a-d3d3426e2e3e",
              "name": "weather_icon",
              "type": "string",
              "value": "=https://openweathermap.org/img/wn/{{ $json.weather[0].icon }}@2x.png"
            },
            {
              "id": "b688343f-6952-498c-b585-60af2372dd46",
              "name": "country_flag",
              "type": "string",
              "value": "=https://flagsapi.com/{{ $json.countryCode_2 }}/flat/64.png"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "48c95fab-6ef9-44ab-82c6-69f35416f897",
      "name": "Respond to Webhook - Return JSON Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "notes": "Sends formatted data back to client.\nResponse:\n- Status: 200 OK\n- Format: JSON array\n- Content: All enriched location data\nThe response contains 28 fields with complete location intelligence including address, timezone, weather, and astronomical data.\nTotal processing time: ~1-3 seconds\nAll data from 100% FREE APIs! \ud83c\udf89\n",
      "position": [
        1520,
        528
      ],
      "parameters": {
        "options": {
          "responseCode": 200
        },
        "respondWith": "allIncomingItems"
      },
      "notesInFlow": true,
      "typeVersion": 1.4
    },
    {
      "id": "1c6dcc33-9368-46da-9000-899f13531486",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        -192
      ],
      "parameters": {
        "width": 1382,
        "height": 368,
        "content": "## Get location insights using free APIs\nThis workflow transforms GPS coordinates into rich location intelligence using free public APIs.\nIt aggregates data from OpenStreetMap, TimezoneDB, OpenWeatherMap, and Sunrise-Sunset.org to provide address details, timezone, weather, and astronomical times in a single call.\n\n## How it works\n1. **Input**: Accepts `lat` and `lon` via webhook.\n2. **Process**: Fetches data from 4 parallel sources.\n3. **Output**: Returns a unified JSON object with 28 enriched fields.\n\n## Setup steps\n1. **Configure Webhook**: Set the path to `geo-details`.\n2. **Add Credentials**: Add your OpenWeatherMap and TimezoneDB free API keys.\n3. **Deploy**: Activate the workflow and use the production URL."
      },
      "typeVersion": 1
    },
    {
      "id": "4baa6824-d041-4af2-9f68-39ff722a29b2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1824,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 966,
        "height": 900,
        "content": "## Sample Request & Response\nLocation: Taj Mahal, Agra, India\n\nREQUEST:\n```\ncurl \"https://n8n.example.com/webhook/geo-details?lat=27.1751495&lon=78.0395673\"\n```\n\n\nRESPONSE: JSON\n```\n[\n  {\n    \"lat\": 27.1751495,\n    \"lon\": 78.0395673,\n    \"timezone\": \"Asia/Kolkata\",\n    \"timezone_short\": \"IST\",\n    \"current_time\": \"10:25 PM\",\n    \"current_date\": \"15-Feb-2026\",\n    \"timestamp\": \"1771194349\",\n    \"address_full\": \"Cicuit House Road, Taj Ganj, Agra, Uttar Pradesh, 282004, India\",\n    \"neighbourhood\": null,\n    \"suburb\": \"Taj Ganj\",\n    \"town\": null,\n    \"county\": null,\n    \"state_district\": \"Agra\",\n    \"state\": \"Uttar Pradesh\",\n    \"country\": \"India\",\n    \"country_code\": \"in\",\n    \"postcode\": \"282004\",\n    \"sunrise\": \"6:53:17 AM\",\n    \"sunset\": \"6:10:35 PM\",\n    \"day_length\": \"11:17:18\",\n    \"temperature\": \"18.96\",\n    \"feels_like\": \"17.85\",\n    \"temp_min\": \"18.96\",\n    \"temp_max\": \"18.96\",\n    \"pressure\": \"1014\",\n    \"humidity\": \"36\",\n    \"weather_main\": \"Clear\",\n    \"weather_description\": \"clear sky\",\n    \"weather_icon\": \"https://openweathermap.org/img/wn/01n@2x.png\",\n    \"country_flag\": \"https://flagsapi.com/IN/flat/64.png\"\n  }\n]\n```\nNote: Returns 28 fields with complete location data from 100% FREE APIs"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "0889b815-81ef-43ec-9400-1b2b2b453e44",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Edit Fields - Format & Structure Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenWeatherMap": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "HTTP Request (Nominatim)": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request (TimezoneDB)": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          },
          {
            "node": "HTTP Request (Sunrise-Sunset)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request (Sunrise-Sunset)": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Webhook - Accepts Coordinates": {
      "main": [
        [
          {
            "node": "HTTP Request (Nominatim)",
            "type": "main",
            "index": 0
          },
          {
            "node": "HTTP Request (TimezoneDB)",
            "type": "main",
            "index": 0
          },
          {
            "node": "OpenWeatherMap",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields - Format & Structure Output": {
      "main": [
        [
          {
            "node": "Respond to Webhook - Return JSON Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}