# Changelog
All notable changes to this project are documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.0.0] - 2026-07-05
### Added
- Initial release of the official Erlang client library for the Ipregistry API.
- `ipregistry:lookup/2,3` for single IP address lookups, `ipregistry:origin_lookup/1,2` for origin (requester)
lookups returning parsed User-Agent data, and `ipregistry:batch_lookup/2,3` for resolving many IP addresses at
once. Batch lookups transparently split lists larger than the API's 1024-address limit into concurrently dispatched
sub-requests (configurable via the `max_batch_size` and `batch_concurrency` client options) and reassemble results
in input order.
- `ipregistry:parse_user_agents/2` for parsing raw User-Agent strings into structured data.
- IP addresses are accepted as binaries, strings, or `inet:ip_address()` tuples.
- Responses are maps with binary keys mirroring the API's JSON; `ipregistry:get/2,3` walks nested fields with atom,
binary, or string path elements.
- Clients are plain immutable maps created with `ipregistry:new/1,2`, safe to share between processes. Options:
`base_url`, `timeout`, `max_retries`, `retry_interval`, `retry_on_server_error`, `retry_on_too_many_requests`,
`max_batch_size`, `batch_concurrency`, `cache`, and `user_agent`. `ipregistry:eu_base_url/0` returns the EU base
URL for EU-only data processing.
- Optional in-memory caching via the `ipregistry_cache` gen_server (ETS-backed, TTL plus bounded size with
oldest-first eviction), embeddable in a supervision tree with `ipregistry_cache:child_spec/1`. Caching is disabled
by default; origin lookups are never cached and batch lookups reuse cached entries. Cache reads bypass the server
process and writes degrade gracefully when the cache is down.
- Automatic retries with exponential backoff for transient transport errors and 5xx responses, honoring the
`Retry-After` header. Retries on 429 Too Many Requests are disabled by default.
- Errors as tagged tuples: `{api_error, #{code, message, resolution, status}}` for API-reported failures and
`{client_error, Reason}` for client-side ones.
- HTTPS with explicit TLS peer verification (`verify_peer`, OS trust store, hostname checking).
- Offline unit tests (EUnit) and behavior tests (Common Test) against a local mock API server, plus opt-in live
system tests that run when `IPREGISTRY_API_KEY` is set.
- Zero external dependencies (Erlang/OTP standard library only); requires OTP 27+.
[Unreleased]: https://github.com/ipregistry/ipregistry-erlang/compare/v1.0.0...HEAD
[1.0.0]: https://github.com/ipregistry/ipregistry-erlang/releases/tag/v1.0.0