- GitHub Actions CI pipeline (build + test on PRs to develop/main).
- Per-endpoint rate limiting with Bucket4j (X-RateLimit-* headers, 429 responses).
- Provider fallback chains: IP lookup (ip-api → ipinfo), reverse geocoding (Nominatim → BigDataCloud).
- In-memory response caching with Caffeine, configurable TTL per endpoint.
- Request validation for IP format, city name length, and coordinate ranges.
- Internal provider error details hidden from API responses.
- Timeout now configurable via application.yml (external.timeout-ms).
- Coordinates endpoint accepted invalid ranges (lat=999, lon=999).
- City endpoint accepted empty or excessively long strings.
- Initial stable release of GeoLocateAPI.
- IP → Location lookup.
- Coordinates → Reverse geocoding.
- City → Coordinates search.
- Clean Architecture with domain/application/infrastructure/presentation layers.
- Hexagonal adapters for provider integration.
- Swagger/OpenAPI auto-generated documentation.
- WireMock integration tests and MockMvc controller tests.
- Global exception handling with structured error responses.
- Architecture diagram (PlantUML + SVG).
- MIT License.