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-go

First 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, &notSupported) {
        fmt.Println("TLD not covered by RDAP")
        return
    }

    var notFound *rdapapi.NotFoundError
    if errors.As(err, &notFound) {
        fmt.Println("Domain not registered")
    }

    var rateLimited *rdapapi.RateLimitError
    if errors.As(err, &rateLimited) {
        fmt.Printf("Retry after %d seconds\n", rateLimited.RetryAfter)
    }
}

Resources

Other languages

Ready to integrate?

Start with a free trial. Plans from $9/mo.