GeoLinker

GeoLinker GPS Visualizer

Real-time GPS tracking for IoT devices. Send location data from ESP32, Arduino, or any device and visualize on interactive maps.

10,000 waypoints storageView Docs

Get Started in Minutes

Start sending IoT notifications in just a few simple steps

1

Create Account

Sign up for free, no credit card required

2

Get API Key

Generate your API key from dashboard

3

Send GPS Data

Send location from ESP32, Arduino, or NodeMCU

4

View Your Map

See real-time data visualized on map

GPS Simulator

Simulate GPS data and send it to GeoLinker in real-time

Leaflet © OpenStreetMap contributors
API Key:
cd_xxxxxxxxxxxxxxxxxxxx
Sign in to select a device
11.010915, 77.013209
1/5 custom
sensor

Key names: letters, digits, underscores only. Sent as payload[0]. Sensor names (temperature, humidity, battery…) are stored as sensor fields. Any other name is custom: up to 5 per device (the first 5 it sends are kept), values up to 30 characters.

Before you write your firmware

  • Send timestamp in UTC as YYYY-MM-DD HH:MM:SS (GPS modules already give UTC). Points timed in the future or more than a year ago are placed at the time we receive them.
  • Send sensor values as their own fields: speed, battery, temperature, humidity, altitude, heading, accuracy, signal_strength, satellites.
  • Anything else goes in payload: up to 5 custom names per device, with values up to 30 characters. The first 5 names a device sends are kept, so choose them before you deploy. To start over, use Delete All History on the Live Map.
POST /api/v1/geolinker Arduino / ESP32
1#include <WiFi.h>
2#include <HTTPClient.h>
3#include <TinyGPS++.h>
4#include <HardwareSerial.h>
5
6const char* ssid     = "YOUR_WIFI_SSID";
7const char* password = "YOUR_WIFI_PASSWORD";
8const char* apiKey   = "YOUR_API_KEY";
9const char* device   = "esp32_tracker";
10
11TinyGPSPlus gps;
12HardwareSerial SerialGPS(1);
13
14void setup() {
15  Serial.begin(115200);
16  SerialGPS.begin(9600, SERIAL_8N1, 16, 17);
17  WiFi.begin(ssid, password);
18  while (WiFi.status() != WL_CONNECTED) delay(500);
19  Serial.println("WiFi connected!");
20}
21
22void loop() {
23  while (SerialGPS.available()) gps.encode(SerialGPS.read());
24  if (gps.location.isUpdated()) {
25    sendLocation(gps.location.lat(), gps.location.lng(),
26                 gps.speed.kmph(), gps.altitude.meters());
27    delay(10000); // every 10 s
28  }
29}
30
31void sendLocation(float lat, float lng, float spd, float alt) {
32  HTTPClient http;
33  http.begin("https://circuitdigest.cloud/api/v1/geolinker");
34  http.addHeader("Content-Type", "application/json");
35  http.addHeader("Authorization", "Bearer " + String(apiKey));
36
37  char ts[20];  // UTC from the GPS, "YYYY-MM-DD HH:MM:SS"
38  snprintf(ts, sizeof(ts), "%04d-%02d-%02d %02d:%02d:%02d",
39           gps.date.year(), gps.date.month(), gps.date.day(),
40           gps.time.hour(), gps.time.minute(), gps.time.second());
41
42  String body = "{";
43  body += "\"device_id\":\"" + String(device) + "\",";
44  body += "\"timestamp\":[\"" + String(ts) + "\"],";
45  body += "\"lat\":[" + String(lat, 6) + "],";
46  body += "\"long\":[" + String(lng, 6) + "],";
47  body += "\"speed\":[" + String(spd, 1) + "],";
48  body += "\"altitude\":[" + String(alt, 1) + "],";
49  body += "\"satellites\":[" + String(gps.satellites.value()) + "],";
50  // Anything else goes in payload: up to 5 custom names per device
51  body += "\"payload\":[{\"hdop\":" + String(gps.hdop.hdop(), 1) + "}]";
52  body += "}";
53
54  int code = http.POST(body);
55  Serial.println(code == 200 ? "Sent!" : "Error: " + String(code));
56  http.end();
57}