SDK
Go RDAP SDK
Look up domains, IPs, and ASNs from Go. Zero external dependencies, idiomatic errors, bulk lookups.
Go 1.22 or later. Zero external dependencies.
Install
go get github.com/rdapapi/rdapapi-goFirst request in 60 seconds
Get an API key from the dashboard, then drop your key into the client and call any of the lookup methods.
package main
import (
"context"
"fmt"
"log"
rdapapi "github.com/rdapapi/rdapapi-go"
)
func main() {
client := rdapapi.NewClient("your-api-key")
ctx := context.Background()
domain, err := client.Domain(ctx, "google.com")
if err != nil {
log.Fatal(err)
}
fmt.Println(*domain.Registrar.Name) // "MarkMonitor Inc."
ip, _ := client.IP(ctx, "8.8.8.8")
fmt.Println(*ip.Name) // "GOGL"
asn, _ := client.ASN(ctx, "15169")
fmt.Println(*asn.Name) // "GOOGLE"
}Bulk domain lookups
Send up to 10 domains in one request. Available on Pro and Business plans.
resp, err := client.BulkDomains(
ctx,
[]string{"google.com", "github.com", "example.com"},
rdapapi.WithFollow(),
)
if err != nil {
log.Fatal(err)
}
for _, r := range resp.Results {
if r.Status == "success" {
fmt.Printf("%s: %s\n", r.Domain, *r.Data.Registrar.Name)
}
}Error handling
Every API error maps to a typed exception. Catch NotSupportedError before NotFoundError since it is a subclass.
domain, err := client.Domain(ctx, "example.nope")
if err != nil {
var notSupported *rdapapi.NotSupportedError
if errors.As(err, ¬Supported) {
fmt.Println("TLD not covered by RDAP")
return
}
var notFound *rdapapi.NotFoundError
if errors.As(err, ¬Found) {
fmt.Println("Domain not registered")
}
var rateLimited *rdapapi.RateLimitError
if errors.As(err, &rateLimited) {
fmt.Printf("Retry after %d seconds\n", rateLimited.RetryAfter)
}
}