Skip to main content

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 name
  • North America = Continent
  • NA = Continent code
  • AS15169 = Autonomous System Number
  • Google LLC = AS organization name
  • google.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 bytes1KB+ response
Works everywhereNeeds HTTP stack
No auth requiredAPI keys, tokens
Sub-second latencySSL handshake overhead
Battery friendlyPower hungry
Built-in cachingCustom 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?

Ready to get started? Run your first query now.