spatie/laravel-rdap
Laravel package for performing RDAP lookups (WHOIS successor) to fetch domain registration data as structured JSON. Includes built-in caching for TLD server discovery and RDAP responses, plus configurable retries/timeouts for unreliable endpoints.
Installation
composer require spatie/laravel-rdap
Publish the config file (optional, but recommended for customization):
php artisan vendor:publish --provider="Spatie\Rdap\RdapServiceProvider"
First Query
Use the Rdap facade to fetch domain data:
use Spatie\Rdap\Facades\Rdap;
$domainData = Rdap::query('example.com');
This returns a Spatie\Rdap\Domain object containing structured RDAP data (e.g., registrant, nameservers, events).
Where to Look First
Spatie\Rdap\Facades\Rdap (primary entry point).config/rdap.php (caching, HTTP client, and timeout settings).Spatie\Rdap\Domain (understand the structure of returned data).Basic Domain Lookup
$domain = Rdap::query('google.com');
$registrant = $domain->registrant->name; // Access nested properties
Caching Responses The package caches responses by default (TTL: 24 hours). Override in config:
'cache_ttl_in_minutes' => 60, // Cache for 1 hour
Handling Errors RDAP queries may fail (e.g., unsupported TLDs). Use try-catch:
try {
$domain = Rdap::query('nonexistent.tld');
} catch (\Spatie\Rdap\Exceptions\RdapException $e) {
// Handle unsupported TLDs or network errors
}
Custom HTTP Client Extend the default Guzzle client by binding a custom one in the service provider:
$this->app->bind(\Spatie\Rdap\RdapClient::class, function ($app) {
return new \GuzzleHttp\Client(['timeout' => 10]);
});
Bulk Queries For multiple domains, loop and cache individually:
$domains = ['example.com', 'google.com'];
$results = collect($domains)->map(fn ($domain) => Rdap::query($domain));
public function getRegistrantAttribute() {
return Rdap::query($this->domain)->registrant->name;
}
Rdap::dispatch('example.com')->onQueue('rdap');
return response()->json([
'domain' => Rdap::query($request->domain)->toArray(),
]);
Unsupported TLDs
.com works, but some newer TLDs may not).Rate Limiting
Data Structure Variability
if ($domain->registrant) {
$name = $domain->registrant->name;
}
Caching Quirks
Cache::forget("rdap:example.com");
debug to true in config/rdap.php to log raw RDAP responses:
'debug' => env('RDAP_DEBUG', false),
RdapClient::get() directly to inspect raw responses:
$response = app(\Spatie\Rdap\RdapClient::class)->get('example.com');
Custom RDAP Endpoints
Override the default endpoint (https://rdap.verisign.com/com/v1/domain) in config:
'endpoints' => [
'com' => 'https://custom-rdap.example.com/com/v1/domain',
],
Extend Domain Model
Add custom methods to Spatie\Rdap\Domain via traits or inheritance:
trait DomainExtensions {
public function isRecentlyRegistered() {
return $this->events->contains('eventAction', 'registration') &&
$this->events->last()->eventDate->diffInDays() < 30;
}
}
Mock RDAP for Testing Use Laravel’s HTTP mocking:
Http::fake([
'https://rdap.example.com/*' => Http::response(['data' => 'mock'], 200),
]);
Handle Pagination
Some RDAP responses paginate results. Use RdapClient::get() with custom logic:
$client = app(\Spatie\Rdap\RdapClient::class);
$response = $client->get('example.com', ['size' => 100]);
How can I help you explore Laravel packages today?