Go

Go Examples

Go’s standard library has everything you need. No third party packages required.

Struct Definitions

type IPLookup struct {
	IP          string  `json:"ip"`
	City        string  `json:"city"`
	Region      string  `json:"region"`
	Country     string  `json:"country"`
	CountryCode string  `json:"country_code"`
	Latitude    float64 `json:"latitude"`
	Longitude   float64 `json:"longitude"`
	PostalCode  string  `json:"postal_code"`
	Timezone    string  `json:"timezone"`
	ASN         ASNInfo `json:"asn"`
	Privacy     Privacy `json:"privacy"`
}

type ASNInfo struct {
	Number int    `json:"number"`
	Name   string `json:"name"`
	Org    string `json:"org"`
	Route  string `json:"route"`
}

type Privacy struct {
	IsVPN     bool `json:"is_vpn"`
	IsProxy   bool `json:"is_proxy"`
	IsTor     bool `json:"is_tor"`
	IsHosting bool `json:"is_hosting"`
}

Get Your Own IP

package main

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

func main() {
	resp, err := http.Get("https://whatismyip.technology/api/me")
	if err != nil {
		fmt.Printf("Request failed: %v\n", err)
		return
	}
	defer resp.Body.Close()

	var result IPLookup
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		fmt.Printf("JSON parse failed: %v\n", err)
		return
	}

	fmt.Printf("Your IP: %s\n", result.IP)
}

Full IP Lookup

func lookupIP(ip string) (*IPLookup, error) {
	resp, err := http.Get("https://whatismyip.technology/api/" + ip)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		body, _ := io.ReadAll(resp.Body)
		return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, body)
	}

	var result IPLookup
	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
		return nil, err
	}
	return &result, nil
}

// Usage
data, err := lookupIP("8.8.8.8")
if err != nil {
	log.Fatal(err)
}
fmt.Printf("%s is in %s, %s\n", data.IP, data.City, data.Country)

Geolocation Only

resp, err := http.Get("https://whatismyip.technology/api/8.8.8.8/geo")
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

var geo struct {
	City    string  `json:"city"`
	Country string  `json:"country"`
	Lat     float64 `json:"latitude"`
	Lon     float64 `json:"longitude"`
}
json.NewDecoder(resp.Body).Decode(&geo)
fmt.Printf("%s, %s (%.4f, %.4f)\n", geo.City, geo.Country, geo.Lat, geo.Lon)

Privacy Check

resp, err := http.Get("https://whatismyip.technology/api/8.8.8.8/privacy")
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

var privacy Privacy
json.NewDecoder(resp.Body).Decode(&privacy)

if privacy.IsVPN {
	fmt.Println("This IP is behind a VPN")
}
if privacy.IsTor {
	fmt.Println("This IP is a Tor exit node")
}

Bulk Lookup

ips := map[string][]string{
	"ips": {"8.8.8.8", "1.1.1.1", "208.67.222.222"},
}
body, _ := json.Marshal(ips)

resp, err := http.Post(
	"https://whatismyip.technology/api/bulk",
	"application/json",
	bytes.NewReader(body),
)
if err != nil {
	log.Fatal(err)
}
defer resp.Body.Close()

var results []IPLookup
json.NewDecoder(resp.Body).Decode(&results)

for _, r := range results {
	fmt.Printf("%s -> %s, %s\n", r.IP, r.City, r.Country)
}

Complete Program

package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

const apiBase = "https://whatismyip.technology/api/me"

func main() {
	url := apiBase
	if len(os.Args) > 1 {
		url = apiBase + "/" + os.Args[1]
	}

	resp, err := http.Get(url)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(1)
	}
	defer resp.Body.Close()

	var data map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&data)

	out, _ := json.MarshalIndent(data, "", "  ")
	fmt.Println(string(out))
}

Run it with go run main.go 8.8.8.8 or just go run main.go to look up your own IP.