This workflow corresponds to n8n.io template #13411 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"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
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
httpQueryAuthopenWeatherMapApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform GPS coordinates into rich location data using 100% free APIs. This webhook aggregates address, timezone, weather, and sun data into a single response. Perfect for location tracking apps, travel platforms, and IoT projects.
Source: https://n8n.io/workflows/13411/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Community Node Disclaimer: This workflow uses KlickTipp community nodes.
Automatically sync Fizzy cards to Basecamp todos in real-time. When cards are created, assigned, completed, or reopened in Fizzy, the changes sync instantly to your Basecamp project. Card tags determi
This workflow automates accounts payable: upload a PDF invoice, let Claude AI extract the key fields, and automatically create a vendor bill (incoming invoice) in Odoo 18.
This n8n workflow automates airline customer support by classifying travel-related questions, fetching relevant information, generating AI answers, and delivering structured responses to users. It ens
This n8n template lets you automatically pull market data for the cryptocurrencies from CoinGecko every hour, calculate custom volatility and market-health metrics, classify each coin’s price action i