Documentation
¶
Overview ¶
Package ipwhois is the official Go client for the ipwhois.io IP Geolocation API.
Quick start ¶
// Free plan (no API key, ~1 request/second per client IP).
client := ipwhois.New()
info := client.Lookup("8.8.8.8")
// Paid plan (with API key, higher limits, bulk, security data, ...).
client := ipwhois.New("YOUR_API_KEY")
info := client.Lookup("8.8.8.8", ipwhois.LookupOptions{
Language: "en",
Security: ipwhois.Bool(true),
})
// Bulk lookup — up to 100 IPs in one call (paid only).
bulk := client.BulkLookup([]string{"8.8.8.8", "1.1.1.1", "208.67.222.222"})
// HTTPS is enabled by default. Use SetSSL(false) to fall back to HTTP.
Error handling ¶
The library never returns a Go error. All errors — invalid input, network failure, API-level errors (bad IP, bad key, rate limit, …) — are returned in the response with Success=false and a Message. Just check info.Success after every call.
Index ¶
- Constants
- Variables
- func Bool(b bool) *bool
- type BulkResponse
- type Client
- func (c *Client) BulkLookup(ips []string, opts ...LookupOptions) *BulkResponse
- func (c *Client) Lookup(ip string, opts ...LookupOptions) *Response
- func (c *Client) SetConnectTimeout(d time.Duration) *Client
- func (c *Client) SetFields(fields []string) *Client
- func (c *Client) SetHTTPClient(h *http.Client) *Client
- func (c *Client) SetLanguage(lang string) *Client
- func (c *Client) SetRate(enabled bool) *Client
- func (c *Client) SetSSL(enabled bool) *Client
- func (c *Client) SetSecurity(enabled bool) *Client
- func (c *Client) SetTimeout(d time.Duration) *Client
- func (c *Client) SetUserAgent(ua string) *Client
- type Connection
- type Currency
- type Flag
- type LookupOptions
- type Rate
- type Response
- type Security
- type Timezone
Constants ¶
const ( // HostFree is the free-plan endpoint host (used when no API key is provided). HostFree = "ipwho.is" // HostPaid is the paid-plan endpoint host (used when an API key is provided). HostPaid = "ipwhois.pro" )
API endpoints.
const ( // ErrorTypeAPI marks errors returned by the ipwhois.io API itself — // HTTP 4xx / 5xx responses, malformed JSON bodies, and HTTP 2xx // responses where the API set Success=false (e.g. "Invalid IP // address", "Reserved range"). ErrorTypeAPI = "api" ErrorTypeNetwork = "network" ErrorTypeEnvironment = "environment" ErrorTypeInvalidArgument = "invalid_argument" )
Error type values used in Response.ErrorType / BulkResponse.ErrorType.
const BulkLimit = 100
BulkLimit is the maximum number of IP addresses allowed in a single bulk request.
const Version = "1.2.0"
Version is the library version, used in the default User-Agent header.
Variables ¶
var SupportedLanguages = []string{"en", "ru", "de", "es", "pt-BR", "fr", "zh-CN", "ja"}
SupportedLanguages lists languages supported by the Language option.
Functions ¶
Types ¶
type BulkResponse ¶
type BulkResponse struct {
// Success indicates whether the bulk request as a whole succeeded.
// When true, iterate Results. When false, check Message.
Success bool
// Message contains a human-readable error description on whole-batch
// failure, or is empty on success.
Message string
// ErrorType categorises the error. See Response.ErrorType for the
// full list of values.
ErrorType string
// HTTPStatus is set on HTTP 4xx / 5xx whole-batch responses.
HTTPStatus int
// RetryAfter is set on HTTP 429 responses from the free-plan endpoint
// (ipwho.is) when the API sent a Retry-After header. Value is in
// seconds. The paid endpoint (ipwhois.pro) does not send the header,
// so this field is not populated on paid-plan rate-limit responses.
RetryAfter int
// Results contains per-IP results. Populated only when Success is true.
// Each entry has its own Success flag — check it before reading the
// geolocation fields.
Results []*Response
// Raw is the unmodified response body.
Raw []byte
}
BulkResponse is the result of a multi-IP lookup.
On whole-batch failure (network error, bad API key, rate limit, …) Success is false and Message describes the failure. Otherwise Results holds one entry per requested IP, each with its own Success flag — per-IP failures (e.g. "Invalid IP address") are returned inline and the rest of the batch remains usable.
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is a thin HTTP client for the ipwhois.io API.
Construct one with New() (free plan) or New("YOUR_API_KEY") (paid plan). All Set*** methods return the receiver to allow fluent chaining.
A Client is safe for concurrent use by multiple goroutines once configured (after the last setter call).
func New ¶
New creates a new Client.
Pass nothing for the free plan (no API key required), or pass your API key for the paid plan:
free := ipwhois.New()
paid := ipwhois.New("YOUR_API_KEY")
At most one API key may be passed; additional arguments are ignored.
func (*Client) BulkLookup ¶
func (c *Client) BulkLookup(ips []string, opts ...LookupOptions) *BulkResponse
BulkLookup looks up information for multiple IP addresses in a single request.
Uses the GET / comma-separated form documented at https://ipwhois.io/documentation/bulk — up to BulkLimit (100) addresses per call. Each address counts as one credit.
Available on the Business and Unlimited plans only.
Per-IP errors are returned inline in BulkResponse.Results with their own Success=false flag; the rest of the batch is still usable. If the whole call fails (network error, bad API key, rate limit, …) BulkResponse.Success is false and BulkResponse.Results is nil.
The library never returns a Go error.
func (*Client) Lookup ¶
func (c *Client) Lookup(ip string, opts ...LookupOptions) *Response
Lookup looks up information for a single IP address.
Pass an empty string to look up the caller's own public IP, as documented at https://ipwhois.io/documentation.
The library never returns a Go error — check Response.Success after every call. On any failure (API error, network error, missing extension, bad input) Success is false and Message describes the cause.
func (*Client) SetConnectTimeout ¶
SetConnectTimeout sets the connection timeout (default: 5s).
Has no effect once SetHTTPClient has been called with a non-nil client.
func (*Client) SetFields ¶
SetFields restricts every response to a fixed set of fields by default, for example []string{"success", "country", "city", "flag.emoji"}.
Include "success" in the list if you rely on Response.Success for error checking — when Fields is set, the API only returns the fields you ask for.
func (*Client) SetHTTPClient ¶
SetHTTPClient installs a custom *http.Client for outgoing requests.
When non-nil, the provided client is used as-is and the Timeout / ConnectTimeout values configured via SetTimeout / SetConnectTimeout are ignored. Pass nil to revert to the built-in client.
func (*Client) SetLanguage ¶
SetLanguage sets the default language used when none is supplied per call. Use one of the values listed in SupportedLanguages.
func (*Client) SetRate ¶
SetRate enables or disables the rate block in responses by default. Per-call LookupOptions.Rate overrides this.
func (*Client) SetSSL ¶
SetSSL enables (default) or disables HTTPS for outgoing requests.
HTTPS is strongly recommended for production traffic — your API key is sent in the query string and would otherwise travel in clear text.
func (*Client) SetSecurity ¶
SetSecurity enables or disables threat-detection data on every call by default. Per-call LookupOptions.Security overrides this.
func (*Client) SetTimeout ¶
SetTimeout sets the per-request total timeout (default: 10s).
Has no effect once SetHTTPClient has been called with a non-nil client.
func (*Client) SetUserAgent ¶
SetUserAgent overrides the User-Agent header sent with every request.
type Connection ¶
type Connection struct {
ASN int `json:"asn,omitempty"`
Org string `json:"org,omitempty"`
ISP string `json:"isp,omitempty"`
Domain string `json:"domain,omitempty"`
}
Connection describes the network connection block.
type Currency ¶
type Currency struct {
Name string `json:"name,omitempty"`
Code string `json:"code,omitempty"`
Symbol string `json:"symbol,omitempty"`
Plural string `json:"plural,omitempty"`
ExchangeRate float64 `json:"exchange_rate,omitempty"`
}
Currency describes the currency block.
type Flag ¶
type Flag struct {
Img string `json:"img,omitempty"`
Emoji string `json:"emoji,omitempty"`
EmojiUnicode string `json:"emoji_unicode,omitempty"`
}
Flag describes the country flag block.
type LookupOptions ¶
type LookupOptions struct {
// Language restricts country/city/region names to a language.
// One of: en, ru, de, es, pt-BR, fr, zh-CN, ja.
Language string
// Fields restricts the response to specific top-level or nested fields,
// for example []string{"success", "country", "city", "flag.emoji"}.
//
// Include "success" in the list if you rely on Response.Success for
// error checking — when Fields is set, the API only returns the fields
// you ask for.
//
// nil = inherit client default; non-nil (including an empty slice)
// overrides — pass []string{} to clear a default field whitelist
// for a single call and get every field back.
Fields []string
// Security includes the security block (proxy/vpn/tor/hosting).
// Available on Business and Unlimited plans.
//
// nil = inherit client default; &true / &false = override.
Security *bool
// Rate includes the rate block (limit/remaining).
// Available on Basic and above.
//
// nil = inherit client default; &true / &false = override.
Rate *bool
}
LookupOptions are per-call (or default) options for IP lookups.
Every field is optional. When passed per call, non-zero values override the corresponding client-wide default.
Security and Rate are *bool to allow three states: nil ("inherit the default"), &true ("force on"), &false ("force off"). Use the Bool helper for ergonomics:
opts := ipwhois.LookupOptions{Security: ipwhois.Bool(false)}
type Response ¶
type Response struct {
// Success indicates whether the lookup completed successfully.
// On any failure this is false and Message describes the cause.
Success bool `json:"success"`
// Message contains a human-readable error description on failure,
// or is empty on success.
Message string `json:"message,omitempty"`
// ErrorType categorises the error so callers can branch on the cause:
// - ErrorTypeAPI — error returned by the ipwhois.io API
// (HTTP 4xx/5xx, malformed JSON, or a
// 2xx body with success=false such as
// "Invalid IP address" / "Reserved range")
// - ErrorTypeNetwork — DNS / connection / timeout
// - ErrorTypeEnvironment — missing dependency or runtime error
// - ErrorTypeInvalidArgument — bad option passed to the library
ErrorType string `json:"error_type,omitempty"`
// HTTPStatus is set on HTTP 4xx / 5xx responses from the API.
HTTPStatus int `json:"http_status,omitempty"`
// RetryAfter is set on HTTP 429 responses from the free-plan endpoint
// (ipwho.is) when the API sent a Retry-After header. Value is in
// seconds. The paid endpoint (ipwhois.pro) does not send the header,
// so this field is not populated on paid-plan rate-limit responses.
RetryAfter int `json:"retry_after,omitempty"`
IP string `json:"ip,omitempty"`
Type string `json:"type,omitempty"`
Continent string `json:"continent,omitempty"`
ContinentCode string `json:"continent_code,omitempty"`
Country string `json:"country,omitempty"`
CountryCode string `json:"country_code,omitempty"`
Region string `json:"region,omitempty"`
RegionCode string `json:"region_code,omitempty"`
City string `json:"city,omitempty"`
Latitude float64 `json:"latitude,omitempty"`
Longitude float64 `json:"longitude,omitempty"`
IsEU bool `json:"is_eu,omitempty"`
Postal string `json:"postal,omitempty"`
CallingCode string `json:"calling_code,omitempty"`
Capital string `json:"capital,omitempty"`
Borders string `json:"borders,omitempty"`
Flag *Flag `json:"flag,omitempty"`
Connection *Connection `json:"connection,omitempty"`
Timezone *Timezone `json:"timezone,omitempty"`
Currency *Currency `json:"currency,omitempty"`
Security *Security `json:"security,omitempty"`
Rate *Rate `json:"rate,omitempty"`
// Raw is the unmodified response body. Useful as an escape hatch for
// fields not yet typed by this struct, e.g. when the API adds a new
// field that hasn't made it into the Go struct definition yet.
Raw []byte `json:"-"`
}
Response is the result of a single-IP lookup.
Always check Success first. On success, the typed fields below carry the API data. On failure, Message (and optionally ErrorType, HTTPStatus, RetryAfter) describe the error.
The library never panics and never returns a Go error — every failure (API error, network error, bad input, missing dependency) comes back as a Response with Success=false and a Message.
type Security ¶
type Security struct {
Anonymous bool `json:"anonymous,omitempty"`
Proxy bool `json:"proxy,omitempty"`
VPN bool `json:"vpn,omitempty"`
Tor bool `json:"tor,omitempty"`
Hosting bool `json:"hosting,omitempty"`
}
Security describes the threat-detection block (paid plan).
type Timezone ¶
type Timezone struct {
ID string `json:"id,omitempty"`
Abbr string `json:"abbr,omitempty"`
IsDST bool `json:"is_dst,omitempty"`
Offset int `json:"offset,omitempty"`
UTC string `json:"utc,omitempty"`
CurrentTime string `json:"current_time,omitempty"`
}
Timezone describes the timezone block.