ipasis

API Docs

Two endpoints, one API key. Assess risk from IP addresses and email addresses.

Quickstart

1

Get your API Key

You'll need an API key to make requests. Sign up for a free account to get one.

2

Make your first request

Make a GET request to either endpoint. Pass your key via header or query param.

IP Lookup

curl
curl -s "https://api.ipasis.com/v1/lookup?ip=8.8.8.8" -H "X-API-Key: <your_api_key>"

Email Validation

curl
curl -s "https://api.ipasis.com/v1/validate-email?email=user@mailinator.com&ip=185.220.101.4" \
  -H "X-API-Key: <your_api_key>"

IP Lookup

GET /v1/lookup?ip=<ip>

Try It

Examples

JavaScript (fetch)
javascript
fetch('https://api.ipasis.com/v1/lookup?ip=8.8.8.8', {
  headers: { 'X-API-Key': '<your_api_key>' }
}).then(r => r.json()).then(console.log)
Python (requests)
python
import requests

r = requests.get('https://api.ipasis.com/v1/lookup', params={'ip':'8.8.8.8'}, headers={'X-API-Key':'<your_api_key>'})
print(r.json())
Go (net/http)
go
package main

import (
  "fmt"
  "io"
  "net/http"
  "net/url"
)

func main() {
  endpoint := "https://api.ipasis.com/v1/lookup"
  u, _ := url.Parse(endpoint)
  q := u.Query()
  q.Set("ip", "8.8.8.8")
  u.RawQuery = q.Encode()

  req, _ := http.NewRequest("GET", u.String(), nil)
  req.Header.Set("X-API-Key", "<your_api_key>")

  resp, err := http.DefaultClient.Do(req)
  if err != nil { panic(err) }
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}
Java (HttpClient)
java
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws Exception {
    String url = "https://api.ipasis.com/v1/lookup?ip=8.8.8.8";
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("X-API-Key", "<your_api_key>")
        .build();
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
  }
}

Response Fields

The IP lookup API returns a JSON object with the following fields:

FieldTypeDescription
ipstringThe query IP address.
citystringCity name.
regionstringRegion or state name.
countrystringTwo-letter ISO 3166-1 country code (e.g., US).
locstringLatitude and Longitude (comma separated).
postalstringPostal or ZIP code.
timezonestringTimezone (IANA format).
asn.ASNstringAutonomous System Number (e.g. AS15169).
asn.NamestringName of the ASN owner.
asn.RoutestringThe BGP route block for this IP.
asn.TypestringASN type (isp, hosting, business, etc).
asn.DomainstringDomain associated with the ASN.
company.NamestringCompany name associated with the IP range.
company.DomainstringCompany domain name.
company.TypestringCompany type.
privacy.vpnbooleanTrue if the IP belongs to a commercial VPN provider.
privacy.proxybooleanTrue if the IP is a known public proxy.
privacy.torbooleanTrue if the IP is a Tor exit node.
privacy.relaybooleanTrue if the IP is an iCloud Private Relay or similar privacy network.
privacy.hostingbooleanTrue if the IP belongs to a hosting provider/datacenter (non-residential).
privacy.AIbooleanTrue if the IP belongs to an AI provider like OpenAI etc.
privacy.abusebooleanTrue if the IP has been reported for abuse recently.
privacy.crawlerbooleanTrue if the IP is a known crawler (e.g., Googlebot, Bingbot).
privacy.ServicestringSpecific service name if identified (e.g. "NordVPN").
abuse.AddressstringAbuse contact address.
abuse.CountrystringAbuse contact country.
abuse.EmailstringAbuse contact email.
abuse.NamestringAbuse contact name.
abuse.NetworkstringNetwork CIDR involved in abuse reports.
abuse.PhonestringAbuse contact phone.
domains.TotalnumberTotal number of domains hosted on this IP.
domains.PagenumberCurrent page number for domain pagination.
domains.Domainsstring[]List of domains hosted on this IP (may be null/empty).

Email Validation

GET /v1/validate-email?email=<email>&ip=<ip>

Validate an email address and get a combined risk score. Optionally pass an IP address to include IP-based risk signals in the score.

Parameters

ParameterRequiredDescription
emailYesThe email address to validate.
ipNoAn IP address to include in the risk assessment. When provided, IP signals (VPN, Tor, proxy, etc.) are factored into the risk score.

Try It

Examples

cURL
curl
curl -s "https://api.ipasis.com/v1/validate-email?email=user@mailinator.com&ip=185.220.101.4" \
  -H "X-API-Key: <your_api_key>"
JavaScript (fetch)
javascript
fetch('https://api.ipasis.com/v1/validate-email?email=user@mailinator.com&ip=185.220.101.4', {
  headers: { 'X-API-Key': '<your_api_key>' }
}).then(r => r.json()).then(console.log)
Python (requests)
python
import requests

r = requests.get(
    'https://api.ipasis.com/v1/validate-email',
    params={'email': 'user@mailinator.com', 'ip': '185.220.101.4'},
    headers={'X-API-Key': '<your_api_key>'}
)
print(r.json())
Go (net/http)
go
package main

import (
  "fmt"
  "io"
  "net/http"
  "net/url"
)

func main() {
  endpoint := "https://api.ipasis.com/v1/validate-email"
  u, _ := url.Parse(endpoint)
  q := u.Query()
  q.Set("email", "user@mailinator.com")
  q.Set("ip", "185.220.101.4")
  u.RawQuery = q.Encode()

  req, _ := http.NewRequest("GET", u.String(), nil)
  req.Header.Set("X-API-Key", "<your_api_key>")

  resp, err := http.DefaultClient.Do(req)
  if err != nil { panic(err) }
  defer resp.Body.Close()
  body, _ := io.ReadAll(resp.Body)
  fmt.Println(string(body))
}

Response Fields

The email validation API returns a JSON object with the following fields:

FieldTypeDescription
request_idstringUnique request identifier for debugging.
successbooleanWhether the request was processed successfully.
processed_atstringISO 8601 timestamp of when the request was processed.
risk
risk.scorenumberRisk score from 0 (safe) to 100 (dangerous).
risk.levelstringRisk level: LOW (0-30), MEDIUM (31-60), HIGH (61-85), CRITICAL (86-100).
risk.recommendationstringSuggested action: ALLOW (0-30), REVIEW (31-85), or BLOCK (86-100).
risk.primary_reasonsstring[]List of factors contributing to the risk score (e.g. email_disposable, ip_is_tor).
email
email.addressstringThe normalized email address.
email.statusstringvalid or invalid.
email.deliverabilitystringdeliverable, risky, or undeliverable.
email.typestringpersonal, disposable, role, or business.
email.domain_age_daysnumber | nullAge of the email domain in days (null if unavailable).
email.checks
email.checks.is_valid_syntaxbooleanWhether the email has valid RFC syntax.
email.checks.is_disposablebooleanTrue if the domain is a known disposable/temporary email provider (120k+ domains tracked).
email.checks.is_gibberishbooleanTrue if the local part appears bot-generated (high entropy, hex patterns, excessive digits).
email.checks.is_newborn_domainbooleanTrue if the domain was registered less than 14 days ago.
email.checks.is_role_accountbooleanTrue if the email is a role-based address (admin@, support@, info@, etc.).
email.checks.mx_records_foundboolean | nullWhether the domain has MX records. Null if DNS lookup timed out.
email.checks.is_catch_allboolean | nullWhether the domain accepts all emails. Null if not checked.
email.checks.smtp_connectboolean | nullWhether SMTP connection was successful. Null if not checked.
ip (included when ip parameter is provided)
ip.*objectFull IP lookup response (same fields as the IP Lookup endpoint above).

Risk Score Breakdown

The risk score (0-100) is calculated by combining email and IP signals:

SignalPointsReason Code
Invalid email syntax100email_invalid_syntax
No MX records100email_no_mx_records
Disposable email domain+40email_disposable
Newborn domain (<14 days)+35email_newborn_domain
Gibberish/bot-like username+25email_gibberish_username
Role account (admin@, info@)+10email_role_account
IP is Tor exit node+50ip_is_tor
IP is public proxy+40ip_is_proxy
IP is VPN+30ip_is_vpn
IP reported for abuse+25ip_abuse_reported
IP is hosting/datacenter+20ip_is_hosting

Score is capped at 100. Tor/Proxy/VPN signals are mutually exclusive (highest value wins).

Errors

Standard HTTP status codes are used to indicate success or failure.

CodeMeaningDescription
400Bad RequestMissing or invalid parameters (IP address or email).
401UnauthorizedMissing or invalid API key.
403ForbiddenQuota exceeded or account inactive.
429Too Many RequestsRate limit exceeded.
500Internal ErrorSomething went wrong on our end.

Rate Limits

We limit the number of requests you can make to ensure fair usage and stability. Limits apply across both endpoints.

  • Free Plan: 1,000 requests per day.
  • Starter: 100,000 requests per month.
  • Pro 250k: 250,000 requests per month.
  • Pro 500k: 500,000 requests per month.
  • Scale: 1,000,000 requests per month.
  • Enterprise: 2,000,000 requests per month.
  • Enterprise XL: 5,000,000 requests per month.

If you exceed the limit, you will receive a 429 Too Many Requests response. Check the X-RateLimit-Limit and X-RateLimit-Remaining response headers to track your usage.

MMDB Snapshot

We provide an ipasis.mmdb snapshot compatible with the included GeoAPI.