Skip to main content

Examples & Use Cases

Production-ready examples for integrating ResolverOne into your applications.

Direct vs Recursive Queries

ResolverOne supports two query methods. Direct queries are recommended for production use.

Performance & Reliability Comparison

AspectDirect Query (@rslvr.one)Recursive Query (default)
Speed30-70% fasterDepends on ISP DNS quality
ReliabilityDirect to our optimized serversMay fail if ISP filters DNS
LatencyMinimal hopsExtra DNS resolution overhead
CachingOur optimized cacheISP cache (variable quality)
Best forProduction, batch processingTesting, debugging

When to Use Each Method

Direct Queries (@rslvr.one) - Recommended for:

  • Production applications
  • Batch processing multiple IPs
  • IoT devices with limited resources
  • Networks with unreliable ISP DNS
  • When you need consistent performance

Recursive Queries - Use for:

  • Initial testing and validation
  • Debugging DNS propagation issues
  • Environments where direct DNS is restricted

Quick Command Line Examples

Basic Queries

Note: Use @rslvr.one for direct queries to our nameservers - typically 30-70% faster!

# Check Google's DNS (direct query - recommended)
dig TXT 8.8.8.8.rslvr.one @rslvr.one +short
# Output: "US|United States|North America|NA|AS15169|Google LLC|google.com"

# Check Cloudflare's DNS (direct query)
dig TXT 1.1.1.1.rslvr.one @rslvr.one +short
# Output: "US|United States|North America|NA|AS13335|Cloudflare, Inc.|cloudflare.com"

# Check your own public IP (direct query)
MY_IP=$(curl -s ifconfig.me)
dig TXT $MY_IP.rslvr.one @rslvr.one +short

# Compare performance: recursive vs direct
echo "=== Recursive Query (via ISP DNS) ==="
time dig TXT 8.8.8.8.rslvr.one +short

echo "=== Direct Query (to our nameservers) ==="
time dig TXT 8.8.8.8.rslvr.one @rslvr.one +short

Batch Processing

#!/usr/bin/env bash
# Process multiple IPs using ResolverOne

IPS="8.8.8.8 1.1.1.1 208.67.222.222"

for ip in $IPS; do
echo "IP: $ip"
dig TXT "$ip.rslvr.one" @rslvr.one +short
echo "---"
done

IoT & Embedded Applications

Python IoT Device Manager

#!/usr/bin/env python3
# /// script
# dependencies = [
# "dnspython>=2.0.0",
# ]
# ///

"""Simple IoT device location tracker using ResolverOne"""

import dns.resolver


def get_location(ip):
"""Get location data for an IP address"""
try:
result = dns.resolver.resolve(f"{ip}.rslvr.one", "TXT")
response = str(result[0]).strip('"')
parts = response.split("|")

return {
"country_code": parts[0],
"country": parts[1],
"asn": parts[4],
"as_name": parts[5],
}
except Exception as e:
print(f"Error: {e}")
return None


# Track some IoT devices
devices = {
"sensor_001": "144.6.0.1", # AU
"gateway_002": "125.234.160.1", # VN
"camera_003": "144.120.0.1", # FJ
}

print("IoT Device Locations:")
print("=" * 50)

for device_id, ip in devices.items():
location = get_location(ip)
if location:
print(f"{device_id} ({ip})")
print(f" Location: {location['country']} ({location['country_code']})")
print(f" Network: {location['as_name']}")
print()

Fraud Detection & Security

Simple IP Reputation Check

#!/usr/bin/env python3
# /// script
# dependencies = [
# "dnspython>=2.0.0",
# ]
# ///

"""
Simple fraud detection using ResolverOne
"""

import dns.resolver
from typing import Set, Dict, Optional
import logging


class FraudDetector:
def __init__(self):
# Define suspicious countries (adjust for your use case)
self.high_risk_countries = {"CN", "RU", "KP", "IR"}

# Define suspicious ASNs (known bad actors)
self.suspicious_asns = {
"AS8888", # Example ASN
"AS9999", # Example ASN
}

# Cloud provider ASNs (may want different handling)
self.cloud_providers = {
"AS15169": "Google",
"AS16509": "Amazon AWS",
"AS13335": "Cloudflare",
"AS8075": "Microsoft Azure",
}

def get_location(self, ip: str) -> Optional[Dict]:
"""Get location data for IP."""
try:
# Use direct queries to our nameservers for reliability in security contexts
resolver = dns.resolver.Resolver()
# Resolve rslvr.one A records to get our nameserver IPs
resolver.nameservers = [
str(ip) for ip in dns.resolver.resolve("rslvr.one", "A")
]
result = resolver.resolve(f"{ip}.rslvr.one", "TXT")
response = str(result[0]).strip('"')
parts = response.split("|")

if len(parts) == 7:
return {
"country_code": parts[0],
"country": parts[1],
"continent": parts[2],
"continent_code": parts[3],
"asn": parts[4],
"as_name": parts[5],
"as_domain": parts[6],
}
except Exception as e:
logging.error(f"Error looking up {ip}: {e}")

return None

def check_ip(self, ip: str) -> Dict:
"""Perform fraud check on IP address."""
location = self.get_location(ip)
if not location:
return {
"ip": ip,
"risk_level": "unknown",
"reason": "Could not resolve location",
"action": "allow_with_caution",
}

risk_factors = []
risk_level = "low"

# Check country risk
if location["country_code"] in self.high_risk_countries:
risk_factors.append(f"High-risk country: {location['country']}")
risk_level = "high"

# Check ASN
if location["asn"] in self.suspicious_asns:
risk_factors.append(f"Suspicious ASN: {location['asn']}")
risk_level = "high"

# Check if it's a cloud provider
if location["asn"] in self.cloud_providers:
risk_factors.append(
f"Cloud provider: {self.cloud_providers[location['asn']]}"
)
if risk_level == "low":
risk_level = "medium"

# Determine action
if risk_level == "high":
action = "block"
elif risk_level == "medium":
action = "require_additional_verification"
else:
action = "allow"

return {
"ip": ip,
"location": location,
"risk_level": risk_level,
"risk_factors": risk_factors,
"action": action,
}


# Example usage
if __name__ == "__main__":
detector = FraudDetector()

test_ips = [
"175.45.176.1", # North Korea
"1.1.1.1", # Cloudflare (US)
"208.67.222.222", # OpenDNS (US)
]

for ip in test_ips:
result = detector.check_ip(ip)
print(f"IP: {ip}")
print(
f"Country: {result['location']['country']} ({result['location']['country_code']})"
)
print(f"Risk Level: {result['risk_level']}")
print(f"Action: {result['action']}")
if result["risk_factors"]:
print(f"Risk Factors: {', '.join(result['risk_factors'])}")
print("---")

Web Application Integration (Flask)

Test with curl -s -H "X-Forwarded-For: 1.1.1.1" http://127.0.0.1:5000/ | jq .

# /// script
# dependencies = [
# "flask>=2.0.0",
# "dnspython>=2.0.0",
# ]
# ///

from flask import Flask, request, jsonify
import dns.resolver

app = Flask(__name__)


def get_location(ip):
"""Get location data for an IP address."""
try:
result = dns.resolver.resolve(f"{ip}.rslvr.one", "TXT")
response = str(result[0]).strip('"')
parts = response.split("|")

return {
"country_code": parts[0],
"country": parts[1],
"asn": parts[4],
"as_name": parts[5],
}
except Exception:
return None


@app.route("/")
def home():
"""Check your location."""
client_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
location = get_location(client_ip)

if location:
return jsonify(
{
"ip": client_ip,
"country": location["country"],
"country_code": location["country_code"],
"network": location["as_name"],
}
)
else:
return jsonify({"error": "Could not determine location"}), 400


if __name__ == "__main__":
app.run(debug=True)

Content Delivery & Optimization

Nginx Log Enrichment with GeoIP

Enhance your nginx access logs with geographic data for better analytics and monitoring.

#!/usr/bin/env bash
# Enrich nginx access logs with GeoIP data in real-time

get_location() {
local ip=$1
dig TXT "$ip.rslvr.one" @rslvr.one +short 2>/dev/null | tr -d '"'
}

# Process nginx access log and add GeoIP data
tail -f /var/log/nginx/access.log | while read -r line; do
# Extract IP address (first field in nginx access log)
ip=$(echo "$line" | awk '{print $1}')

# Skip private IPs
if [[ $ip =~ ^(127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[01])\.) ]]; then
echo "$line [LOCAL]"
continue
fi

# Get location data
location=$(get_location "$ip")

if [[ -n "$location" ]]; then
country=$(echo "$location" | cut -d'|' -f2)
country_code=$(echo "$location" | cut -d'|' -f1)
echo "$line [$country_code|$country]"
else
echo "$line [UNKNOWN]"
fi
done

Example output:

1.1.1.1 - - [16/Oct/2025:10:15:33] "GET /api HTTP/1.1" 200 [AU|Australia]
8.8.8.8 - - [16/Oct/2025:10:15:34] "GET / HTTP/1.1" 200 [US|United States]

For batch processing existing logs:

#!/usr/bin/env bash
# Process existing nginx log file

while read -r line; do
ip=$(echo "$line" | awk '{print $1}')

if [[ $ip =~ ^(127\.|192\.168\.|10\.) ]]; then
echo "$line [LOCAL]"
else
location=$(dig TXT "$ip.rslvr.one" @rslvr.one +short 2>/dev/null | tr -d '"')
country=$(echo "$location" | cut -d'|' -f1-2 | tr '|' ':')
echo "$line [$country]"
fi
done < /var/log/nginx/access.log > /var/log/nginx/access-geo.log

Dynamic Content Localization

const express = require('express');
const dns = require('dns').promises;

const app = express();

async function getLocation(ip) {
try {
const records = await dns.resolveTxt(`${ip}.rslvr.one`);
const parts = records[0][0].split('|');

return {
country_code: parts[0],
country: parts[1],
continent: parts[2]
};
} catch (error) {
return null;
}
}

// Middleware to add location to request
app.use(async (req, res, next) => {
const clientIP = req.headers['x-forwarded-for'] || req.socket.remoteAddress;

// Default for localhost
if (!clientIP || clientIP === '127.0.0.1' || clientIP.includes('::1')) {
req.location = { country_code: 'US', country: 'United States' };
return next();
}

req.location = await getLocation(clientIP) || { country_code: 'US', country: 'United States' };
next();
});

// Return localized configuration
app.get('/api/config', (req, res) => {
const { country_code } = req.location;

const localization = {
'US': { currency: 'USD', language: 'en-US', phone: '+1-800-555-0123' },
'GB': { currency: 'GBP', language: 'en-GB', phone: '+44-20-7946-0958' },
'JP': { currency: 'JPY', language: 'ja-JP', phone: '+81-3-1234-5678' },
'DE': { currency: 'EUR', language: 'de-DE', phone: '+49-30-1234-5678' }
};

res.json({
location: req.location,
config: localization[country_code] || localization['US']
});
});

// Regional pricing
app.get('/pricing', (req, res) => {
const { country_code } = req.location;

const pricing = {
'US': { basic: '$9.99', pro: '$29.99' },
'GB': { basic: '£7.99', pro: '£24.99' },
'IN': { basic: '₹299', pro: '₹899' },
'BR': { basic: 'R$19.99', pro: 'R$59.99' }
};

res.json(pricing[country_code] || pricing['US']);
});

app.listen(3000, () => console.log('Server running on port 3000'));

Monitoring & Analytics

Simple Analytics Script

#!/usr/bin/env python3
# /// script
# dependencies = [
# "dnspython>=2.0.0",
# ]
# ///

"""
Analyze visitor locations from log files
"""

import re
import dns.resolver
from collections import defaultdict, Counter
import sys


def parse_nginx_log(log_line):
"""Parse nginx access log line to extract IP."""
# Standard nginx log format
pattern = r'^(\S+) - - \[(.*?)\] "(.*?)" (\d+) (\d+) "(.*?)" "(.*?)"'
match = re.match(pattern, log_line)

if match:
return {
"ip": match.group(1),
"timestamp": match.group(2),
"request": match.group(3),
"status": int(match.group(4)),
"size": int(match.group(5)),
}
return None


def get_location(ip):
"""Get location for IP using ResolverOne."""
try:
# Use direct queries for log analysis to ensure reliable batch processing
resolver = dns.resolver.Resolver()
# Resolve rslvr.one A records to get our nameserver IPs
resolver.nameservers = [
str(ip) for ip in dns.resolver.resolve("rslvr.one", "A")
]
result = resolver.resolve(f"{ip}.rslvr.one", "TXT")
response = str(result[0]).strip('"')
parts = response.split("|")

if len(parts) == 7:
return {
"country_code": parts[0],
"country": parts[1],
"continent": parts[2],
}
except:
pass

return None


def analyze_logs(log_file):
"""Analyze access logs for geographic distribution."""
countries = Counter()
continents = Counter()
unique_ips = set()
processed_ips = {}

with open(log_file, "r") as f:
for line_num, line in enumerate(f, 1):
if line_num % 1000 == 0:
print(f"Processed {line_num} lines...", file=sys.stderr)

entry = parse_nginx_log(line.strip())
if not entry:
continue

ip = entry["ip"]

# Skip private IPs
if ip.startswith(("127.", "192.168.", "10.", "172.")):
continue

unique_ips.add(ip)

# Cache location lookups
if ip not in processed_ips:
location = get_location(ip)
processed_ips[ip] = location

location = processed_ips[ip]
if location:
countries[location["country"]] += 1
continents[location["continent"]] += 1

return {
"countries": countries,
"continents": continents,
"unique_ips": len(unique_ips),
"total_requests": line_num,
}


if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python3 analyze_logs.py /path/to/access.log")
sys.exit(1)

results = analyze_logs(sys.argv[1])

print(f"\n=== Geographic Analysis ===")
print(f"Total requests: {results['total_requests']}")
print(f"Unique IPs: {results['unique_ips']}")

print(f"\n=== Top Countries ===")
for country, count in results["countries"].most_common(10):
percentage = (count / results["total_requests"]) * 100
print(f"{country:20} {count:8d} ({percentage:5.1f}%)")

print(f"\n=== By Continent ===")
for continent, count in results["continents"].most_common():
percentage = (count / results["total_requests"]) * 100
print(f"{continent:15} {count:8d} ({percentage:5.1f}%)")

Need More Examples?

Built something with ResolverOne? Contact us to have your project featured.