kostenloses tool · getdr

getdr: Ahrefs-DR für ganze Domainlisten prüfen

Version 0.1.0Lizenz MITLäuft auf Linux · macOS · WindowsPreis kostenlos

01 Was getdr macht

getdr prüft das Ahrefs Domain Rating (DR) für eine Domain, eine Liste, eine Datei oder stdin. Es ist ein einzelnes statisches Binary für Linux, macOS und Windows, Open Source unter der MIT-Lizenz. Das DR kommt vom offiziellen kostenlosen Ahrefs-Endpunkt. Abfragen kosten nichts und verbrauchen keine API-Units, du brauchst nur einen kostenlosen Ahrefs-API-Schlüssel.

  █  █ ▄▀▀▄     domain     saas.com
  █  █ █  █     rating     49 ▐█████████▌░░░░░░░░░░  /100
  ▀▀▀█  ▀▀█     trend      ▁▅█  +4 since Sep 17
     █    █     checked    2026-10-28 · 12 min ago, cached
     █  ▄▄▀     version    dr3

  Domain Rating by Ahrefs · getdr by Index Pages

Jede Prüfung landet mit Datum in einem lokalen SQLite-Cache. Eine erneute Abfrage kommt ohne Anfrage aus, und die Karte zeigt, wie sich das DR seit der letzten Prüfung bewegt hat. Mit getdr serve wird dasselbe Binary zu einer kleinen HTTP-API: Ein Rechner verwaltet Schlüssel und Cache, und alle Skripte, Laptops und Agenten in deinem Netz fragen bei ihm an.

getdr besteht aus drei Teilen, und alle liefern denselben JSON-Datensatz:

  • getdr – das Kommandozeilen-Tool und die API getdr serve.
  • getdr-mcp – ein MCP-Server mit einem einzigen Tool, get_dr, für Claude, Cursor und andere MCP-Clients.
  • getdr-skill – ein Agent-Skill. Sein Bash-Skript funktioniert auch dort, wo das Binary nicht installiert ist.

02 Installation

Mit Go 1.24 oder neuer:

go install -trimpath github.com/index-pages/getdr@latest

Das Binary landet in $(go env GOPATH)/bin. Achte darauf, dass dieses Verzeichnis in deinem PATH liegt.

Ohne Go nimmst du ein Archiv aus den GitHub Releases. Jedes Release enthält Builds für Linux, macOS und Windows, jeweils für amd64 und arm64, dazu checksums.txt:

tar -xzf getdr_0.1.0_linux_amd64.tar.gz
sha256sum -c --ignore-missing checksums.txt
sudo install getdr /usr/local/bin/
getdr -V

Das Binary ist statisch: kein cgo, SQLite ist einkompiliert, sonst muss nichts installiert werden. So baust du es selbst:

git clone https://github.com/index-pages/getdr
cd getdr
CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o getdr .

Für getdr serve gibt es ein Dockerfile. Das Image wird FROM scratch gebaut und enthält nur das Binary und ein CA-Bundle. Es läuft als unprivilegierter Benutzer und legt den Cache in /data ab:

docker build -t getdr .
docker run -d -p 8080:8080 -e GETDR_KEY=your-key -v getdr-data:/data getdr

Pakete für Homebrew, npm und PyPI sind geplant, aber noch nicht veröffentlicht.

03 Kostenloser Ahrefs-Schlüssel

Anfragen an den Domain-Rating-Endpunkt von Ahrefs sind kostenlos und verbrauchen keine API-Units. Trotzdem muss jede Anfrage einen API-Schlüssel mitschicken, und auch den gibt es kostenlos:

getdr sucht den Schlüssel an vier Stellen und nimmt den ersten, den es findet:

WoBeispiel
Flaggetdr --key KEY saas.com
GETDR_KEYexport GETDR_KEY=KEY
AHREFS_KEYexport AHREFS_KEY=KEY
Konfigurationsdateikey = "KEY" in ~/.config/getdr/config.toml

Ob er funktioniert, prüfst du mit getdr key check. getdr config show zeigt, aus welcher Quelle der Schlüssel stammt, und gibt nur seine letzten 4 Zeichen aus. Gebraucht wird der Schlüssel nur, wenn etwas abgerufen werden muss. Werte, die im Cache noch frisch sind, zeigt getdr auch ohne ihn an.

Exit-Code 3 heißt immer, dass mit dem Schlüssel etwas nicht stimmt. Bei "no Ahrefs API key" hat keine der Quellen oben einen. Bei "rejected by Ahrefs (HTTP 401)" ist der Schlüssel falsch oder widerrufen, dann legst du einen neuen an. Mit --api hat der getdr-Server keinen Schlüssel, oder Ahrefs hat seinen abgelehnt, und beheben musst du das auf dem Server.

Ahrefs nennt für diesen Endpunkt kein Rate Limit. In der Praxis gehen etwa 40–60 Anfragen pro Minute durch. getdr packt bis zu 1000 Ziele in eine Anfrage, schickt höchstens rpm Anfragen pro Minute (standardmäßig 40) und wiederholt Anfragen nach 429- und 5xx-Antworten mit exponentiellem Backoff.

Um einen Schlüssel auf mehreren Rechnern zu nutzen, startest du getdr serve auf einem davon und richtest die anderen per api darauf aus (siehe HTTP-API). Die Clients brauchen dann gar keinen Schlüssel.

04 Verwendung

BefehlWas du bekommst
getdr saas.comDie Karte, im Terminal.
getdr https://www.example.com/pageEine URL wird auf ihren Host gekürzt.
getdr a.com b.com c.comMehrere Ziele, nach DR sortiert.
getdr -f domains.txtEin Ziel pro Zeile, Kommentare mit # sind erlaubt.
cat domains.txt | getdr > dr.tsvIn einer Pipe: Domain und DR, durch Tabs getrennt.
getdr -f domains.txt --format jsonNDJSON, ein Objekt pro Zeile.
getdr -b a.com b.comNur die Werte.
getdr -f domains.txt --min 30 -qBehält DR 30 und höher. Exit-Code 1, wenn ein Ziel herausfällt.
getdr saas.com --version dr4Die neue DR-Formel.
getdr saas.com --freshUmgeht den Cache und ruft neu ab.

Bevor etwas gesendet wird, normalisiert getdr die Ziele. Aus einer URL wird ihr Host, www. fällt weg, alles wird kleingeschrieben, Punycode-Labels (xn--…) werden zu Unicode dekodiert, und Duplikate fliegen raus. Deshalb werden xn--e1afmkfd.xn--p1ai und ПРИМЕР.РФ beide als пример.рф geprüft. --raw sendet Ziele genau so, wie sie geschrieben sind.

Eine kaputte Zeile verdirbt nicht die ganze Liste. Eingaben ohne Host, mit Leerzeichen oder mit Steuerzeichen weist getdr schon vor dem Senden ab. Lehnt Ahrefs ein Ziel ab (localhost, a..com), nimmt getdr es aus dem Batch und schickt den Rest erneut. Für jedes solche Ziel steht getdr: invalid target: X auf stderr und das Ergebnis bleibt leer. Der Lauf endet mit Exit-Code 2, und nichts davon wird gecacht.

-f, --file FILE        read targets from FILE ("-" for stdin)
-o, --out FILE         write the result to FILE instead of stdout
    --format F         card, tsv, csv or json
-b, --bare             only the DR values
    --fields LIST      domain,dr,version,checked_at,delta,cached
    --sort             sort by DR (card always sorts)
    --all              card: show all rows
    --min N, --max N   filter by DR; exit 1 if any target fails
    --raw              no target normalization
    --version V        dr3 (default) or dr4
    --fresh            refetch and update the cache
    --no-cache         neither read nor write the cache
    --ttl DUR          cache TTL for this run (7d, 12h, 30m)
    --api URL          use a getdr server instead of Ahrefs
    --key KEY          Ahrefs API key
    --config PATH      config file
    --listen ADDR      serve: listen address
    --token T          serve: required token; with --api: token to send
-q, --quiet            no progress, attribution or warnings on stderr
-v, --verbose          cache hits, API calls and batches on stderr
-V                     print the getdr version

Befehle: getdr serve, getdr cache stats | clear | purge, getdr config show, getdr key check.

Exit-CodeBedeutung
0Alles geprüft.
1Ein Ziel liegt außerhalb von --min / --max.
2Ein Fehler, ungültige Ziele oder Ziele ohne Antwort (Timeout, Rate Limit).
3Der Ahrefs-API-Schlüssel fehlt oder wurde abgelehnt.

05 Ausgabe

Im Terminal gibt getdr die Karte aus. Ist stdout eine Pipe oder eine Datei, wechselt es zu tsv. --format und -b haben in beiden Fällen Vorrang.

FormatWas du bekommst
cardEine große Zahl, ein Balken, der Trend und eine Zusammenfassung, gedacht für Menschen. Die Farbe richtet sich nach dem DR: 0–19 grau, 20–39 gelb, 40–69 grün, 70+ blau.
tsvdomain<TAB>dr, ohne Kopfzeile. DR bleibt leer, wenn es keine Daten gibt.
csvDieselben Spalten mit Kopfzeile.
jsonNDJSON, ein Datensatz pro Ziel.
-bNur DR-Werte, einer pro Zeile, eine leere Zeile, wenn keine Daten vorliegen.

--fields wählt die Spalten für tsv und csv aus domain,dr,version,checked_at,delta,cached, Standard ist domain,dr. Ein json-Datensatz ist immer vollständig, delta kommt dazu, wenn du es angibst. Der JSON-Datensatz ist im CLI, im Server, im MCP-Tool und im Skill derselbe:

{"target":"saas.com","dr":49,"version":"dr3","checked_at":"2026-10-28T12:00:00Z","cached":true}
FeldBedeutung
targetDas normalisierte Ziel, mit --raw das Ziel so, wie es geschrieben wurde.
drDomain Rating, 0–100. null, wenn das Ziel ungültig war, Ahrefs nicht geantwortet hat oder (selten) Ahrefs keine Daten hat.
versiondr3 oder dr4. Die Werte der beiden Formeln lassen sich nicht miteinander vergleichen.
checked_atZeitpunkt der Messung, RFC 3339 UTC. null bei einem ungültigen Ziel oder ohne Antwort.
cachedtrue, wenn der Wert aus dem Cache kam.

Für Domains, die Ahrefs nicht kennt, antwortet es mit 0. Eine 0 ist also ein normaler Wert. Ein DR von null mit dem Datum null heißt, dass das Ziel ungültig war oder diesmal keine Antwort bekam. Steht bei einem DR von null ein Datum, hat Ahrefs ausdrücklich gemeldet, dass es keine Daten hat.

Die Karte beachtet NO_COLOR. Bei TERM=dumb oder einer Locale ohne UTF-8 fällt sie auf reines ASCII zurück, ohne große Ziffern und Balken. Von einer Liste mit mehr als 200 Zeilen zeigt sie die obersten 200, mit --all alle.

06 Konfiguration

Jede Einstellung kommt von der ersten Stelle, an der sie gesetzt ist: ein Kommandozeilen-Flag, dann eine Umgebungsvariable GETDR_*, dann die Konfigurationsdatei, dann der eingebaute Standardwert. Den Schlüssel liest getdr außerdem aus AHREFS_KEY, mit niedrigerem Rang als GETDR_KEY. Eine leere Umgebungsvariable gilt als nicht gesetzt.

getdr nimmt die erste Konfigurationsdatei, die es findet: --config PATH, dann $GETDR_CONFIG, dann $XDG_CONFIG_HOME/getdr/config.toml (~/.config/getdr/config.toml, wenn XDG_CONFIG_HOME nicht gesetzt ist), dann /etc/getdr/config.toml. Eine Datei, die du mit --config oder GETDR_CONFIG angibst, muss existieren. Eine unbekannte Einstellung ist ein Fehler, damit kein Tippfehler unbemerkt durchrutscht. ~/ am Anfang eines Pfads wird expandiert.

key = ""
api = ""
version = "dr3"

[cache]
path = "~/.cache/getdr/cache.db"
ttl = "7d"
ttl_none = "1d"
max_age = "30d"

[ahrefs]
batch = 1000
rpm = 40
timeout = "30s"
retries = 3

[serve]
listen = "127.0.0.1:8080"
token = ""
max_targets = 10000
EinstellungEnvFlagStandardBedeutung
keyGETDR_KEY, AHREFS_KEY--key–Ahrefs-API-Schlüssel.
apiGETDR_API--api–URL eines getdr-Servers. Ist sie gesetzt, fragt das CLI ihn statt Ahrefs.
versionGETDR_VERSION--versiondr3DR-Version, dr3 oder dr4.
cache.pathGETDR_CACHE_PATH–~/.cache/getdr/cache.dbSQLite-Cache-Datei. $XDG_CACHE_HOME/getdr/, wenn diese Variable gesetzt ist.
cache.ttlGETDR_CACHE_TTL--ttl7dWie lange ein Wert frisch bleibt.
cache.ttl_noneGETDR_CACHE_TTL_NONE–1dWie lange "keine Daten" frisch bleibt.
cache.max_ageGETDR_CACHE_MAX_AGE–30dZeitfenster für den Trend. cache purge löscht ältere Prüfungen.
ahrefs.batchGETDR_AHREFS_BATCH–1000Ziele pro Ahrefs-Anfrage, 1–1000.
ahrefs.rpmGETDR_AHREFS_RPM–40Ahrefs-Anfragen pro Minute.
ahrefs.timeoutGETDR_AHREFS_TIMEOUT–30sTimeout einer einzelnen Ahrefs-Anfrage.
ahrefs.retriesGETDR_AHREFS_RETRIES–3Wiederholungen bei 429, 5xx und Netzwerkfehlern.
serve.listenGETDR_SERVE_LISTEN--listen127.0.0.1:8080Adresse, auf der getdr serve lauscht.
serve.tokenGETDR_SERVE_TOKEN--token–Bearer-Token, das der Server verlangt. Das CLI sendet es, wenn api gesetzt ist.
serve.max_targetsGETDR_SERVE_MAX_TARGETS–10000Ziele pro POST /dr.

Zeitangaben nehmen Tage mit dem Suffix d (7d, 1.5d) und Go-Durations (36h, 90m, 30s). getdr config show gibt jeden zusammengeführten Wert aus und dazu, woher er stammt. Geheime Werte (key, serve.token) erscheinen nur mit ihren letzten 4 Zeichen.

Weitere Umgebungsvariablen, die getdr liest:

  • NO_COLOR schaltet die Farben der Karte ab.
  • TERM=dumb oder eine Locale ohne UTF-8 in LC_ALL, LC_CTYPE oder LANG ergibt eine Karte in reinem ASCII.
  • COLUMNS legt die Breite der Karte fest, wenn das Terminal keine meldet.
  • HOME, XDG_CONFIG_HOME und XDG_CACHE_HOME bestimmen, wo die Dateien standardmäßig liegen.
  • HTTP_PROXY, HTTPS_PROXY und NO_PROXY werden beachtet. Wenn du über einen Proxy gehst und einen getdr-Server in deinem LAN als api nutzt, trag diesen Server in NO_PROXY ein.

07 Cache und Verlauf

Jede Prüfung wird als eigene Zeile gespeichert (Domain, Version, DR, Datum). Aus diesem Verlauf zeichnet die Karte den Trend, und daraus wird auch delta berechnet. Ein Wert gilt als frisch, solange die letzte Prüfung jünger ist als ttl, bei "keine Daten" jünger als ttl_none. Danach ruft getdr ihn neu ab. Werte für dr3 und dr4 werden getrennt gehalten. Ziele ohne Antwort landen nicht im Cache.

getdr cache purge löscht Prüfungen, die älter als max_age sind, behält pro Domain aber immer die letzte. getdr cache stats zeigt Pfad und Größe der Datei, wie viele Prüfungen und Domains sie enthält sowie die älteste und die neueste Prüfung. getdr cache clear löscht alle Prüfungen. CLI und Server können gleichzeitig mit derselben Cache-Datei arbeiten.

08 HTTP-API

getdr serve ist eine kleine HTTP-API vor Ahrefs mit gemeinsamem Cache. Du startest sie einmal mit einem Ahrefs-Schlüssel und richtest dann CLIs, Skripte und Agenten darauf aus. Die brauchen keinen eigenen Schlüssel, und wiederholte Prüfungen kommen aus dem Cache.

GETDR_KEY=your-key getdr serve --listen 0.0.0.0:8080 --token s3cret
curl -H 'Authorization: Bearer s3cret' 'http://lan-host:8080/dr?target=saas.com'

Jede Antwort trägt den Header Server: getdr/<version> (index-pages.com). Fehler kommen als JSON: {"error":"…"}. Ist ein Token gesetzt, verlangen /dr und /stats den Header Authorization: Bearer <token> und antworten ohne ihn mit 401. /, /healthz und /teapot sind immer offen.

MethodePfadWas sie tut
GET/dr?target=x.comEin Ergebnisdatensatz. Optional version=dr3, fresh=1 (Cache umgehen), raw=1 (keine Normalisierung).
POST/drViele Ziele in einer Anfrage, Antwort als {"results":[…]}.
GET/healthz200 ok, als reiner Text.
GET/statsCache-Größe, Trefferquote, Ahrefs-Anfragen der letzten Stunde.
GET/Name, Version und Links zu dieser Dokumentation.

POST /dr akzeptiert genau vier Felder:

{"targets":["saas.com","https://www.example.com/page"],"version":"dr3","fresh":false,"raw":false}
{"results":[
  {"target":"saas.com","dr":49,"version":"dr3","checked_at":"2026-10-28T12:00:00Z","cached":true},
  {"target":"example.com","dr":93,"version":"dr3","checked_at":"2026-10-28T12:03:11Z","cached":false}
]}

Die Ziele werden normalisiert und dedupliziert, die Ergebnisse folgen ihrer Reihenfolge. Der Server teilt die Arbeit in Ahrefs-Batches von bis zu 1000 auf und hält das Rate Limit ein. Ein Client kann fresh anfordern, die TTL des Servers aber nicht ändern. An ungültigen Zielen scheitert die Anfrage nie: Sie kommen in einer normalen 200-Antwort zurück, mit dr und checked_at auf null.

HTTPWann
400target fehlt, ungültige version, ungültiges JSON, ein unbekanntes Feld oder Daten nach dem JSON-Objekt, keine gültigen Ziele.
401Ein Token ist erforderlich und fehlt oder ist falsch.
404Unbekannter Pfad.
405Falsche Methode, auch HEAD /dr, das nie eine Abfrage auslöst.
413Mehr als max_targets Ziele (standardmäßig 10000).
503Der Server hat keinen Ahrefs-Schlüssel, oder Ahrefs hat ihn abgelehnt.

/stats antwortet so. lookups zählt Ziele seit dem Start des Servers, rows sind gespeicherte Prüfungen, domains die Zahl verschiedener Domains:

{
  "cache": {"size_bytes":45328,"rows":1200,"domains":950,
            "versions":{"dr3":900,"dr4":50},"oldest":"2026-10-01T09:00:00Z","newest":"2026-10-28T12:03:11Z"},
  "lookups": {"hits":1830,"misses":120,"hit_rate":0.9385},
  "ahrefs_requests_last_hour": 3
}

Fragen mehrere Clients gleichzeitig nach derselben Domain und Version, stellt der Server für alle zusammen eine einzige Ahrefs-Anfrage. So spricht das CLI mit einem Server:

getdr --api http://lan-host:8080 --token s3cret -f domains.txt

Dasselbe geht mit api und serve.token in der Konfigurationsdatei oder mit GETDR_API und GETDR_SERVE_TOKEN. Das CLI schickt ein einziges POST /dr für die Ziele, die sein eigener Cache nicht abdeckt, und reicht --fresh weiter. Die Proxy-Variablen gelten auch für diese Anfrage, trag einen LAN-Server also in NO_PROXY ein.

09 KI-Agenten

getdr-mcp ist ein MCP-Server mit einem einzigen Tool, get_dr. Eigene Anfragen an Ahrefs stellt er nicht. Er fragt einen getdr-Server oder das Binary getdr. Er läuft über stdio, hat keine Laufzeitabhängigkeiten und braucht Node.js 18 oder neuer. Du fügst ihn in Claude Desktop, Claude Code, Cursor oder einem anderen MCP-Client hinzu:

{
  "mcpServers": {
    "getdr": {
      "command": "npx",
      "args": ["-y", "getdr-mcp"]
    }
  }
}

So nutzt er das Binary getdr aus deinem PATH, mit dessen eigener Konfiguration, eigenem Cache und Schlüssel. Willst du stattdessen einen getdr-Server in deinem Netz nutzen, ergänze "env": {"GETDR_API": "http://lan-host:8080", "GETDR_SERVE_TOKEN": "s3cret"}. Der Server prüft zuerst GETDR_API, dann das Binary. Gibt es keins von beiden, liefert das Tool einen Fehler mit einer Anleitung zur Einrichtung.

ArgumentTypBedeutung
targetsstring[]Pflicht, nicht leer. Domains oder URLs.
version"dr3" | "dr4"DR-Formel, standardmäßig dr3. Sie wird immer explizit gesendet, deshalb ändert ein Server oder eine Konfiguration mit dr4 nichts daran.
freshbooleanCache ignorieren und neu abrufen.

Das Tool liefert ein JSON-Array mit Datensätzen, gefolgt von der Zeile mit der Namensnennung. Clients ab MCP-Protokoll 2025-06-18 bekommen zusätzlich structuredContent mit einem outputSchema. Haben einige Ziele keine Antwort bekommen, kommt das Ergebnis trotzdem mit allen Datensätzen zurück, dazu ein Hinweis, der diese Ziele nennt.

getdr-skill ist ein Ordner mit einer SKILL.md und einem Bash-Skript, für jeden Agenten, der Agent Skills lädt. Für Claude Code:

git clone https://github.com/index-pages/getdr-skill ~/.claude/skills/getdr

Das Skript scripts/dr.sh nimmt das erste verfügbare Backend: einen getdr-Server in GETDR_API, dann das Binary getdr im PATH, dann direkt den kostenlosen Ahrefs-Endpunkt mit GETDR_KEY oder AHREFS_KEY. Fehlt alles davon, beendet es sich mit Code 3 und verweist darauf, wie du einen kostenlosen Schlüssel bekommst. Es braucht bash, curl und jq 1.6 oder neuer. Ist das Binary installiert, reicht bash allein. Auf jedem Weg kommt dasselbe NDJSON heraus.

10 Namensnennung und Datenschutz

Die Domain-Rating-Daten stammen von Ahrefs und unterliegen der Domain Rating License, die die Namensnennung "Domain Rating by Ahrefs" vorschreibt. getdr gibt sie in der Fußzeile der Karte aus, bei Maschinenformaten einmal pro Lauf auf stderr und nie auf stdout (-q unterdrückt sie). Wenn du die Zahlen veröffentlichst, behalte sie bei. getdr steht in keiner Verbindung zu Ahrefs.

getdr verbindet sich nur mit zwei Stellen: api.ahrefs.com und dem getdr-Server, den du in api einträgst. Es hat keine Telemetrie, keine Update-Prüfung und keine Analytics, und Weiterleitungen auf andere Hosts lehnt es ab. Jede Anfrage trägt diesen User-Agent:

user agent

getdr/<version> (+https://index-pages.com/getdr)

Das kannst du im Quellcode nachprüfen: Alle ausgehenden Anfragen entstehen in internal/ahrefs und internal/remote. getdr-mcp verbindet sich nur mit dem Server in GETDR_API und startet sonst das Binary. Das Skript des Skills spricht mit GETDR_API oder api.ahrefs.com und übergibt Schlüssel an curl in einer temporären Datei mit Modus 600, nie auf der Kommandozeile.

11 Wer dahintersteht

getdr kommt von Index Pages. Unser Hauptprodukt ist ein Dienst zur URL-Indexierung. Er bringt Seiten in Google, Bing, Yandex und 10+ weitere Suchmaschinen, also in die Indizes, aus denen ChatGPT, Claude, Perplexity und AI Overviews antworten. Ein DR-Check zeigt dir, welche Domains einen Link wert sind, und Index Pages sorgt dafür, dass die Seiten mit diesen Links indexiert werden.

Den Dienst findest du auf der Startseite, seine REST-API für Skripte und Agenten auf der API-Seite. Bugs und Ideen zu getdr gehören in die GitHub Issues.