# IPData.info Rust SDK — Free IP Geolocation & Threat Intelligence API

[![Crates.io](https://img.shields.io/crates/v/ipdatainfo.svg)](https://crates.io/crates/ipdatainfo) [![docs.rs](https://docs.rs/ipdatainfo/badge.svg)](https://docs.rs/ipdatainfo) [![CI](../../actions/workflows/ci.yml/badge.svg)](../../actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)

Official Rust client for [**ipdata.info**](https://ipdata.info) — a free, fast
IP geolocation, ASN, and threat-intelligence API. Look up country, city, ASN,
timezone, currency, and security flags (proxy/VPN/Tor/hosting) for any IPv4 or
IPv6 address. Powered by [ipdata.info](https://ipdata.info).

## Get a free API key

The public endpoint is **free — 50 requests/min, no signup, no key**. For higher
rate limits and batch lookups, [**create a free API key at
ipdata.info/register**](https://ipdata.info/register) and manage it in your
[dashboard](https://ipdata.info/dashboard).

## Install

```
cargo add ipdatainfo
```

## Quickstart

```rust
use ipdatainfo::Client;

fn main() {
    let client = Client::new(); // free tier; or Client::builder().api_key("KEY").build()

    let info = client.lookup("8.8.8.8").unwrap();
    println!("{:?} {:?} {:?}", info.city, info.country, info.asn_org);
    // Some("Mountain View") Some("United States") Some("Google LLC")
}
```

## Methods

| Method | What it returns |
|--------|-----------------|
| `lookup(ip)` | Full geolocation record (`""` for own IP) |
| `geo(ip)` | Geo subset (city/region/country/lat/lon/tz) |
| `asn(ip)` | ASN + ISP/registry for an IP |
| `batch(ips)` | Many IPs at once (**requires an API key**) |
| `asn_detail(n)` | ASN detail incl. prefixes |
| `asn_whois_history(n)` | ASN whois history |
| `asn_changes()` | ASN change feed |
| `threat_domain/threat_hash/threat_url(x)` | Threat-intel lookup (domain / file hash / URL) |

Full response schema: [ipdata.info API docs](https://ipdata.info/docs) ·
[SDK contract](https://ipdata.info/docs/sdks).

## Configuration

```rust
use std::time::Duration;
use ipdatainfo::Client;

let client = Client::builder()
    .api_key("KEY")                         // sent as X-Api-Key; switches to pro.ipdata.info
    .base_url("https://ipdata.info")
    .timeout(Duration::from_secs(10))
    .build();
```

Errors from non-2xx responses are returned as `ipdatainfo::Error::Api { status, message }`.

## Rate limits

- Free (`ipdata.info`): 50 req/min, no key.
- Paid (`pro.ipdata.info`): higher limits + `batch`, with an
  [API key](https://ipdata.info/register).

## Other SDKs

12 official SDKs — see the full list at
[**ipdata.info/docs/sdks**](https://ipdata.info/docs/sdks): Python, Node.js, Go,
PHP, Java, Rust, .NET, Kotlin, Swift, Dart, Bash, Objective-C.

## License

MIT © [ipdata.info](https://ipdata.info)
