Getting Started with ResolverOne
Get IP Geolocation data over DNS in under 5 minutes. No APIs, no auth tokens, no HTTP overhead.
What is ResolverOne?
ResolverOne delivers IP geolocation data through DNS TXT records. Query 8.8.8.8.rslvr.one and get back structured location data about that IP address.
Perfect for:
- 🤖 IoT devices with limited connectivity
- 🛰️ Satellite and edge computing
- ⚡ Low-latency applications
- 🔋 Battery-powered devices
- 🌐 Any system that can do DNS (spoiler: that's everything)
Quick Test
Try this right now in your terminal:
# Standard query (via your ISP's DNS)
dig TXT 8.8.8.8.rslvr.one
# Direct query (recommended - faster & more reliable)
dig TXT 8.8.8.8.rslvr.one @rslvr.one
You'll get back something like:
"US|United States|North America|NA|AS15169|Google LLC|google.com"
Pro tip: Use @rslvr.one for direct queries to our nameservers for faster, more reliable responses under certain network conditions.
No registration, API keys, or complex setup required.
What You Get
Each response contains pipe-separated values:
country_code|country|continent|continent_code|asn|as_name|as_domain
For example:
US= Country code (ISO 3166-1 alpha-2)United States= Full country nameNorth America= ContinentNA= Continent codeAS15169= Autonomous System NumberGoogle LLC= AS organization namegoogle.com= AS domain
Your First Integration
Command Line
# Basic query (recursive)
dig TXT 1.1.1.1.rslvr.one +short
# Direct query (recommended - faster)
dig TXT 1.1.1.1.rslvr.one @rslvr.one +short
# Use TCP for unreliable networks
dig TXT 1.1.1.1.rslvr.one @rslvr.one +tcp
# Get your own IP's info
dig TXT $(curl -s ifconfig.me).rslvr.one @rslvr.one +short
Python
# /// script
# dependencies = [
# "dnspython>=2.0.0",
# ]
# ///
import dns.resolver
def get_location(ip, use_direct=True):
if use_direct:
# Direct query to our nameservers (recommended)
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')
else:
# Standard recursive query
result = dns.resolver.resolve(f"{ip}.rslvr.one", 'TXT')
return str(result[0]).strip('"')
# Usage (direct query - faster)
location = get_location("8.8.8.8")
print(location) # "US|United States|North America|NA|AS15169|Google LLC|google.com"
# Compare performance
import time
start = time.time()
get_location("8.8.8.8", use_direct=True)
direct_time = time.time() - start
start = time.time()
get_location("8.8.8.8", use_direct=False)
recursive_time = time.time() - start
print(f"Direct: {direct_time:.3f}s, Recursive: {recursive_time:.3f}s")
JavaScript (Node.js)
const dns = require('dns').promises;
async function getLocation(ip, useDirect = true) {
if (useDirect) {
// Direct query to our nameservers (recommended)
const resolver = new dns.Resolver();
// Resolve rslvr.one A records to get our nameserver IPs
const nameservers = await dns.resolve4('rslvr.one');
resolver.setServers(nameservers);
const records = await resolver.resolveTxt(`${ip}.rslvr.one`);
return records[0][0];
} else {
// Standard recursive query
const records = await dns.resolveTxt(`${ip}.rslvr.one`);
return records[0][0];
}
}
// Usage (direct query - faster)
getLocation('8.8.8.8').then(console.log);
// Compare performance
async function comparePerformance() {
const start1 = Date.now();
await getLocation('8.8.8.8', true);
const directTime = Date.now() - start1;
const start2 = Date.now();
await getLocation('8.8.8.8', false);
const recursiveTime = Date.now() - start2;
console.log(`Direct: ${directTime}ms, Recursive: ${recursiveTime}ms`);
}
comparePerformance();
Why DNS Instead of HTTP?
| DNS (ResolverOne) | Traditional HTTP API |
|---|---|
| 50-200 bytes | 1KB+ response |
| Works everywhere | Needs HTTP stack |
| No auth required | API keys, tokens |
| Sub-second latency | SSL handshake overhead |
| Battery friendly | Power hungry |
| Built-in caching | Custom caching |
Common Use Cases
1. Device Location Awareness
# Your IoT device determines its region
LOCATION=$(dig TXT $(curl -s ifconfig.me).rslvr.one +short)
COUNTRY=$(echo $LOCATION | cut -d'|' -f1)
if [ "$COUNTRY" = "US" ]; then
echo "US compliance mode activated"
fi
2. Simple Fraud Detection
# /// script
# dependencies = [
# "dnspython>=2.0.0",
# ]
# ///
def is_suspicious_ip(ip):
location = get_location(ip)
country = location.split('|')[0]
# Block certain regions
blocked_countries = ['CN', 'RU', 'KP']
return country in blocked_countries
3. Content Localization
async function getTimeZone(ip) {
const location = await getLocation(ip);
const continent = location.split('|')[2];
const timezones = {
'North America': 'America/New_York',
'Europe': 'Europe/London',
'Asia': 'Asia/Tokyo'
};
return timezones[continent] || 'UTC';
}
Next Steps
Launch Tier
- Unlimited queries during launch phase
- No rate limiting
- No registration required
See our pricing page for details.
Questions?
- Live demo - Test queries interactively
- Email us - We respond within 24 hours
- Report issues - Join our Discord
- Service status - Real-time uptime monitoring
Ready to get started? Run your first query now.