What Is GOIP?
GOIP is a Go-based IP geolocation service built by hezhizheng that turns a local Merged-IP-Data database into a minimal HTTP API for resolving IPs into country, region, city, ASN, and ISP fields. GOIP is one of the best IP Geolocation APIs tools for backend developers, SREs, and internal tooling teams, and the scraped project text shows support for two output modes, batch lookups, and 8 languages including zh-CN, en, de, fr, ja, pt-BR, and ru.
The design is intentionally narrow. You download an MMDB file, start the server, and query / for full records or /s/{lang} for normalized text output that is easier to wire into dashboards, bots, and internal admin panels.
Quick Overview
| Attribute | Details |
|---|---|
| Type | IP Geolocation APIs |
| Best For | backend developers, SREs, and internal tooling teams |
| Language/Stack | Go, HTTP JSON API, Merged-IP-Data MMDB |
| License | MIT |
| GitHub Stars | N/A in scraped text |
| Pricing | Open-Source |
| Last Release | N/A in scraped text |
Who Should Use GOIP?
- Backend teams that need a local IP intelligence endpoint without paying for every lookup or shipping traffic to a third-party SaaS.
- SREs and platform engineers who want a simple service that can sit behind a reverse proxy, answer fast, and keep the data store under their control.
- Indie hackers building abuse detection, signup fraud checks, or regional routing features that only need a compact geolocation payload.
- Internal tooling teams that need multilingual output for ops dashboards, support consoles, or customer service workflows.
Not ideal for:
- Teams that need a globally managed SLA with vendor support, enterprise uptime guarantees, and audited commercial data contracts.
- Products that require advanced enrichment like device fingerprinting, risk scoring, ASN history, or continuous freshness guarantees from a hosted provider.
- Organizations that do not want to manage a local database file or schedule periodic updates.
Key Features of GOIP
- Two response shapes — GOIP exposes a full JSON payload at
/and a simplified record at/sor/s/{lang}. That split is useful when one caller needs raw nested metadata and another only wants fields likecountry_code,city, andasn. - Batch IP lookup via comma-separated input — Pass multiple IPs in a single
ipquery parameter, such as?ip=8.8.8.8,1.1.1.1,114.114.114.114. That reduces request fan-out and is practical for CLI scripts, support tools, and moderation queues. - Multilingual simplified output — The service supports simplified responses in 8 languages, including English, German, French, Japanese, and Brazilian Portuguese. That matters when the consuming UI is operator-facing and you do not want to localize labels in the client.
- Local MMDB database workflow — GOIP downloads and reads a
Merged-IP.mmdbfile, which means lookup latency depends on local disk and process performance instead of network calls to a SaaS endpoint. The README also documents manual database downloads and direct URL updates. - Auto-download and update flow — On first run, GOIP can detect a missing database and fetch the default file automatically. The project also documents a
-dflag for database-only downloads and notes that the database file is saved asMerged-IP.mmdb. - Concurrent multi-IP queries — The project explicitly supports concurrent queries, which is important when a request path needs to resolve many IPs during log enrichment or abuse review. For ops teams, that is cleaner than serial lookups in a loop.
- Tiny deployment surface — The server listens on port
8066by default and can be changed with-p. That makes GOIP easy to run in a container, on a VM, or behind a lightweight internal proxy.
GOIP vs Alternatives
Before the table, one practical note: if you need to trace lookup latency, error spikes, or request volume around GOIP, pair it with OpenTrace. If your goal is IP-based access control instead of lookup and enrichment, MachineAuth is a better fit. If you want to persist resolved metadata into a broader data workflow, DataHaven is the more relevant layer.
| Tool | Best For | Key Differentiator | Pricing |
|---|---|---|---|
| GOIP | Local IP geolocation and batch enrichment | Self-hosted Go service with MMDB-backed lookups and multilingual short output | Open-Source |
| MaxMind GeoIP2 | Enterprise geolocation and commercial data pipelines | Mature paid database ecosystem with commercial support and SDKs | Paid |
| ipinfo.io | Hosted IP enrichment without self-hosting | Managed API and data pipeline with no local database upkeep | Freemium |
| ip-api.com | Simple public lookup API for lightweight use | Fast to call and easy to prototype against, but usage constraints apply | Freemium |
Pick GOIP when you want to own the lookup path, keep data local, and avoid per-request vendor dependency. Pick MaxMind GeoIP2 when the commercial data contract and ecosystem matter more than running your own service.
Choose ipinfo.io when you prefer a managed endpoint and do not want to ship the database or run a daemon. Choose ip-api.com when you need a quick prototype or a low-friction external lookup and can live with public API constraints.
How GOIP Works
GOIP is built around a very simple architecture: a Go HTTP server reads from a local MMDB file and maps incoming IP addresses to structured geolocation data. The data source is Merged-IP-Data, and the runtime behavior is intentionally boring, which is a good thing for internal infrastructure.
The server exposes a default route for full objects and a simplified route for normalized fields. The full route returns nested location objects like continent, country, city, location, subdivisions, and asn, while the simplified route flattens that structure into fields that are easier to render in logs, spreadsheets, and incident dashboards.
The main technical decision is to keep the database outside the binary. That lets you update the lookup corpus without rebuilding the executable, and it also keeps deployments small enough to ship with a single static binary and one data file.
# first run, auto-download the default database if missing
./goip.exe
# download only the database from the default source
./goip.exe -d 1
# start the service on a custom port
./goip.exe -p 8080
# query one IP and then multiple IPs
curl "http://127.0.0.1:8066/?ip=8.8.8.8"
curl "http://127.0.0.1:8066/s/en?ip=8.8.8.8,1.1.1.1,114.114.114.114"
That flow shows the full operating model. First you obtain the Merged-IP.mmdb file, then you run the service, and finally you consume it over plain HTTP with standard query strings, which means any language with a REST client can integrate with GOIP.
Pros and Cons of GOIP
Pros:
- Local-first lookup path keeps traffic off third-party APIs and removes request-by-request pricing pressure.
- Batch query support reduces overhead when processing many IPs from logs, alerts, or moderation queues.
- Multilingual simplified output is practical for operator-facing UIs and regional support workflows.
- Low deployment complexity because the service is just a Go binary plus a database file.
- Flexible update workflow allows both automatic first-run downloads and manual database refreshes.
- MIT licensed so teams can audit, fork, and ship it without vendor lock-in.
Cons:
- You own data freshness because the database needs downloads or scheduled updates.
- No enterprise SLA is visible in the scraped page text, so production guarantees are self-managed.
- Limited enrichment depth compared with premium commercial IP intelligence vendors.
- Language coverage is good but not exhaustive if you need every locale on day one.
- No documented auth or access control layer in the scraped text, so you will need to front it with your own network controls.
Getting Started with GOIP
A practical quickstart is to download the release binary, let GOIP fetch the default database on first launch, and then query the local endpoint with curl. If your environment blocks GitHub downloads, the README also documents a gh-proxy.com-based fetch path for the database file.
# start the server and auto-download the database if needed
./goip.exe
# or fetch the database only, then start the service separately
./goip.exe -d 1
./goip.exe -p 8066
# verify the API
curl "http://127.0.0.1:8066/s/zh-CN?ip=8.8.8.8"
After that, the first thing to verify is whether Merged-IP.mmdb exists in the working directory. If you plan to run GOIP in cron or a container, wire database refreshes into your deployment pipeline so the lookup corpus does not drift for weeks at a time.
Verdict
GOIP is the strongest option for self-hosted IP geolocation lookups when you need fast batch queries, local data control, and multilingual simplified output. Its biggest strength is the clean Go + MMDB architecture, and its main caveat is that you own database refreshes and operational uptime. Choose GOIP if you want a simple internal service instead of a managed enrichment API.



