Getting started with the DigStory API
Create an API key, make your first request, page through large results and stay inside your daily quota, with the endpoints you will use most.
Everything you can see on DigStory's pages is also available as JSON. This guide gets you from zero to a working integration.
1. Create a key
Open Team → API keys and create a key. It starts with dg_ and is shown once, so store it somewhere safe. Keys belong to your team; requests made with them count against the team's plan.
2. Make a request
Send the key as a bearer token:
curl -H "Authorization: Bearer dg_…" "https://localhost/api/v1/me"
/me tells you which team the key belongs to and how much of today's quota is left, which makes it a good first call for checking your setup.
Then look up a domain:
curl -H "Authorization: Bearer dg_…" "https://localhost/api/v1/domains/example.com"
3. The endpoints you will use most
| Endpoint | What it returns |
|---|---|
GET /api/v1/domains/{name} |
The domain's current records, registration and technologies |
GET /api/v1/domains/{name}/history |
Every DNS, WHOIS, availability and technology change |
GET /api/v1/domains/{name}/whois |
WHOIS history and the original record text |
GET /api/v1/domains/{name}/subdomains |
Known hostnames under the domain |
GET /api/v1/ips/{ip} |
What is known about an address |
GET /api/v1/reverse/ip/{ip} |
Every hostname on an IP address |
GET /api/v1/reverse/{cname|ns|mx}/{name} |
Every hostname pointing at a CNAME, NS or MX target |
GET /api/v1/technologies and /technologies/{slug} |
Technologies with counts, and one technology's domains |
GET /api/v1/collections and /collections/{slug} |
Curated domain sets and their members |
GET /api/v1/nod |
Newly observed domains |
GET /api/v1/whois/{list} |
The expiring, lapsing, dropped and new-registration lists |
GET /api/v1/watching and /watching/events |
Your team's watched domains and their change events |
4. Page through large results
Lists return a page of data and a next cursor. Pass it back as after to get the following page, and stop when next is null:
import requests
BASE = "https://localhost/api/v1"
HEADERS = {"Authorization": "Bearer dg_…"}
def reverse_mx(target):
after = None
while True:
params = {"limit": 1000}
if after:
params["after"] = after
page = requests.get(f"{BASE}/reverse/mx/{target}", headers=HEADERS, params=params).json()
yield from page["data"]
after = page.get("next")
if not after:
break
for row in reverse_mx("aspmx.l.google.com"):
print(row["domain"], row["since"])
limit sets the page size, up to 5,000. Fewer, larger pages use less of your quota.
5. Stay inside your quota
Each team has a daily request quota: 50 requests on the free plan, 2,000 on Pro and 20,000 on Business. Every response carries two headers:
x-ratelimit-limit: your daily quotax-ratelimit-remaining: what is left today
When the quota runs out, the API answers 429 with a retry-after header giving the seconds until it resets at midnight UTC. A missing, wrong or revoked key gets 401. Both come with a JSON body:
{"error": {"code": "quota_exceeded", "message": "daily quota exceeded; it resets at midnight UTC"}}
6. Prefer webhooks for changes
If you are polling /domains/{name}/history to notice changes, watch the domains instead and set a webhook: DigStory will send you each change as it is seen, at no cost to your quota. See Watch domains and get every change as a webhook.
You can also see every request your team has made under Team → Requests, which helps when a quota runs out sooner than expected.