Skip to content

DNS (DoH) Resolver

As part of our platform we offer a completely free DNS over HTTPS resolver (subject to limits for abuse, read below). This is a primitive we use within our service for underlying metadata and only volume is logged not specific queries or traffic.

latency uses the public resolvers below with fallback, in order. If all three are down the api will attempt to serve the last cached result if available or a 503 Service Unavailable.

ProviderDNSPrimary
Google8.8.8.8Yes
Cloudflare1.1.1.1No
Quad99.9.9.9No

API

  • Base path: https://ws.latency.app/v1/dns
  • Auth: none (public)
  • Privacy: query names are not logged.
  • Rate limit: per client IP, default 600 requests/minute. Over the limit returns 429.

On the house

The DNS resolver is free and unmetered. Its 600/min per-IP budget exists only to keep abuse out, not to push you onto a plan: DoH queries are never counted against your monitor, function, or API quotas, on any plan or none. Point a tool, a script, or your whole browser at it and go. The other public primitives share a separate public budget (see rate limits).

Endpoints

The resolver accepts queries in two interchangeable forms at the same path. /v1/dns/query is the canonical path; /v1/dns/dns-query is an alias for clients that follow the RFC 8484 naming convention.

JSON form

The simplest way to ask. Pass a name and record type as query parameters and get JSON back.

bash
curl "https://ws.latency.app/v1/dns/query?name=example.com&type=A"
ParameterMeaningDefault
nameThe domain to resolve. Required.-
typeRecord type: A, AAAA, MX, TXT, CNAME, NS, …A

The response is application/dns-json, the same shape Google and Cloudflare return:

json
{
  "Status": 0,
  "Answer": [
    { "name": "example.com", "type": 1, "TTL": 300, "data": "93.184.216.34" }
  ]
}

type: 1 is an A record; Status: 0 means success (NOERROR).

Wire form (RFC 8484)

For DoH clients and libraries. The DNS message is carried as raw bytes and the response is a binary DNS packet (application/dns-message).

bash
# GET: base64url-encoded query in the ?dns= parameter
curl "https://ws.latency.app/v1/dns/query?dns=<base64url-encoded-query>"

# POST: the raw query as the request body
curl -H 'content-type: application/dns-message' \
     --data-binary @query.bin \
     https://ws.latency.app/v1/dns/query

Point a DoH-capable client at the endpoint directly:

https://ws.latency.app/v1/dns/query

Record types

Common types you can request with the JSON form:

TypeUse
AIPv4 address
AAAAIPv6 address
CNAMEAlias to another name
MXMail servers
TXTText records (SPF, verification, …)
NSAuthoritative name servers

Why use it

  • Confirm what a name resolves to right now, from our network's vantage point, useful when debugging a propagation delay or a split-horizon setup.
  • Feed other primitives. The inspector uses this resolver internally to turn a bare domain into an IP before geolocating it.
  • A private, uncensored resolver for scripts and tools, with no query logging.
  • Geo: locate the IP a name resolves to
  • Inspect: resolution, geo, and status in one call
© 2026 Latency Labs LLC