getdr: controllo in blocco del DR di Ahrefs
01 Cosa fa
getdr controlla il Domain Rating (DR) di Ahrefs per un dominio, una lista, un file o lo stdin. È un unico binario statico per Linux, macOS e Windows, open source con licenza MIT. Il DR arriva dall'endpoint gratuito ufficiale di Ahrefs: i controlli non costano nulla e non consumano unità API, ti basta una chiave API Ahrefs gratuita.
█ █ ▄▀▀▄ 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 PagesOgni controllo viene salvato con la sua data in una cache SQLite locale. Una ricerca ripetuta non costa nessuna richiesta, e la scheda mostra di quanto si è mosso il DR dall'ultimo controllo. Lancia getdr serve e lo stesso binario diventa una piccola API HTTP: una macchina tiene la chiave e la cache, e ogni script, portatile e agente della tua rete interroga lei.
getdr è fatto di tre parti, e tutte restituiscono lo stesso record JSON:
- getdr – lo strumento a riga di comando e l'API
getdr serve. - getdr-mcp – un server MCP con un solo strumento,
get_dr, per Claude, Cursor e altri client MCP. - getdr-skill – una skill per agenti. Il suo script bash funziona anche dove il binario non è installato.
02 Installazione
Con Go 1.24 o successivo:
go install -trimpath github.com/index-pages/getdr@latestIl binario finisce in $(go env GOPATH)/bin; controlla che quella directory sia nel tuo PATH.
Senza Go, scarica un archivio da GitHub Releases. Ogni release contiene build per Linux, macOS e Windows, per amd64 e arm64, più il file 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 -VIl binario è statico: niente cgo, SQLite è compilato dentro, non c'è altro da installare. Per compilarlo da te:
git clone https://github.com/index-pages/getdr
cd getdr
CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o getdr .Per getdr serve c'è un Dockerfile. L'immagine è costruita FROM scratch e contiene solo il binario e un bundle di CA. Gira come utente non privilegiato e tiene la cache in /data:
docker build -t getdr .
docker run -d -p 8080:8080 -e GETDR_KEY=your-key -v getdr-data:/data getdrSono previsti pacchetti Homebrew, npm e PyPI, ma non sono ancora pubblicati.
03 Chiave Ahrefs gratuita
Le richieste all'endpoint Domain Rating di Ahrefs sono gratuite e non consumano unità API. Ogni richiesta deve però portare una chiave API, e anche la chiave è gratuita:
- Registra un account gratuito su ahrefs.com, se non ne hai già uno.
- Apri Account settings → API keys.
- Crea una chiave e copiala.
getdr cerca la chiave in quattro posti e usa la prima che trova:
| Dove | Esempio |
|---|---|
| flag | getdr --key KEY saas.com |
GETDR_KEY | export GETDR_KEY=KEY |
AHREFS_KEY | export AHREFS_KEY=KEY |
| file di configurazione | key = "KEY" in ~/.config/getdr/config.toml |
Verifica che funzioni con getdr key check. getdr config show ti dice da quale fonte arriva la chiave e ne stampa solo gli ultimi 4 caratteri. La chiave serve solo quando c'è qualcosa da scaricare: i valori ancora freschi in cache vengono mostrati anche senza.
Il codice di uscita 3 indica sempre un problema con la chiave. Se il messaggio è "no Ahrefs API key", nessuna delle fonti qui sopra ne contiene una. Se è "rejected by Ahrefs (HTTP 401)", la chiave è sbagliata o revocata, quindi creane una nuova. Con --api vuol dire che il server getdr non ha una chiave o che Ahrefs l'ha rifiutata, e il problema va risolto sul server.
Ahrefs non pubblica un rate limit per questo endpoint. In pratica passano circa 40–60 richieste al minuto. getdr mette fino a 1000 target in una sola richiesta, non invia più di rpm richieste al minuto (40 di default) e ripete con backoff esponenziale le richieste che ricevono 429 o 5xx.
Per usare una sola chiave su più macchine, lancia getdr serve su una di esse e indica alle altre il suo indirizzo con api (vedi API HTTP). Ai client, a quel punto, non serve nessuna chiave.
04 Utilizzo
| Comando | Cosa ottieni |
|---|---|
getdr saas.com | La scheda, in un terminale. |
getdr https://www.example.com/page | Un URL viene ridotto al suo host. |
getdr a.com b.com c.com | Più target, ordinati per DR. |
getdr -f domains.txt | Un target per riga; i commenti con # sono ammessi. |
cat domains.txt | getdr > dr.tsv | In una pipe: dominio e DR, separati da tab. |
getdr -f domains.txt --format json | NDJSON, un oggetto per riga. |
getdr -b a.com b.com | Solo i valori. |
getdr -f domains.txt --min 30 -q | Tiene i DR da 30 in su; codice di uscita 1 se qualche target resta fuori. |
getdr saas.com --version dr4 | La nuova formula del DR. |
getdr saas.com --fresh | Salta la cache e scarica di nuovo. |
I target vengono normalizzati prima di qualsiasi invio. Un URL diventa il suo host, www. viene tolto, tutto passa in minuscolo, le etichette punycode (xn--…) vengono decodificate in Unicode e i duplicati spariscono. Così xn--e1afmkfd.xn--p1ai e ПРИМЕР.РФ vengono controllati entrambi come пример.рф. Con --raw i target partono esattamente come sono scritti.
Una riga sbagliata non rovina la lista. Un input senza host, con spazi o con caratteri di controllo viene scartato prima dell'invio. Quando Ahrefs rifiuta un target (localhost, a..com), getdr lo toglie dal batch e reinvia il resto. Per ognuno di questi target compare getdr: invalid target: X su stderr e il risultato resta vuoto; l'esecuzione termina con codice di uscita 2 e niente di tutto questo finisce in cache.
-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 versionComandi: getdr serve, getdr cache stats | clear | purge, getdr config show, getdr key check.
| Codice di uscita | Significato |
|---|---|
| 0 | Tutto controllato. |
| 1 | Un target è fuori da --min / --max. |
| 2 | Un errore, target non validi o target che non hanno ricevuto risposta (timeout, rate limit). |
| 3 | La chiave API Ahrefs manca o è stata rifiutata. |
05 Output
In un terminale getdr stampa la scheda. Quando stdout è una pipe o un file, passa a tsv. --format e -b hanno la precedenza in entrambi i casi.
| Formato | Cosa ottieni |
|---|---|
card | Un numero grande, una barra, il trend e un riepilogo, pensati per le persone. Il colore segue il DR: 0–19 grigio, 20–39 giallo, 40–69 verde, 70+ blu. |
tsv | domain<TAB>dr, senza intestazione; il DR è vuoto quando non ci sono dati. |
csv | Le stesse colonne, con una riga di intestazione. |
json | NDJSON, un record per target. |
-b | Solo i valori DR, uno per riga, con una riga vuota dove mancano i dati. |
--fields sceglie le colonne di tsv e csv tra domain,dr,version,checked_at,delta,cached; il default è domain,dr. Un record json è sempre completo, e delta si aggiunge quando lo indichi. Il record JSON è lo stesso nella CLI, nel server, nello strumento MCP e nella skill:
{"target":"saas.com","dr":49,"version":"dr3","checked_at":"2026-10-28T12:00:00Z","cached":true}| Campo | Significato |
|---|---|
target | Il target normalizzato, oppure il target così come è scritto se usi --raw. |
dr | Domain Rating, 0–100. null quando il target non era valido, Ahrefs non ha risposto oppure (di rado) Ahrefs non ha dati. |
version | dr3 o dr4. Le due formule danno valori non confrontabili tra loro. |
checked_at | Quando è stato misurato il valore, in RFC 3339 UTC. null per un target non valido o rimasto senza risposta. |
cached | true quando il valore viene dalla cache. |
Per i domini che non conosce Ahrefs risponde 0, quindi 0 è un valore normale. Un DR null con una data null significa che il target non era valido o che questa volta non ha avuto risposta. Un DR null accompagnato da una data significa che Ahrefs ha dichiarato esplicitamente di non avere dati.
La scheda rispetta NO_COLOR. Con TERM=dumb o con un locale senza UTF-8 ripiega su ASCII semplice, senza cifre grandi né barre. Una lista di più di 200 righe mostra le prime 200; --all le mostra tutte.
06 Configurazione
Ogni impostazione viene presa dal primo posto che la contiene: un flag da riga di comando, poi una variabile d'ambiente GETDR_*, poi il file di configurazione, infine il default integrato. La chiave si legge anche da AHREFS_KEY, che ha priorità più bassa di GETDR_KEY. Una variabile d'ambiente vuota conta come non impostata.
getdr usa il primo file di configurazione che trova: --config PATH, poi $GETDR_CONFIG, poi $XDG_CONFIG_HOME/getdr/config.toml (~/.config/getdr/config.toml se XDG_CONFIG_HOME non è impostata), poi /etc/getdr/config.toml. Un file indicato con --config o GETDR_CONFIG deve esistere. Un'impostazione sconosciuta è un errore, così un refuso non passa inosservato. ~/ all'inizio di un percorso viene espanso.
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| Impostazione | Env | Flag | Default | Significato |
|---|---|---|---|---|
key | GETDR_KEY, AHREFS_KEY | --key | – | Chiave API Ahrefs. |
api | GETDR_API | --api | – | URL di un server getdr. Se è impostato, la CLI interroga quello invece di Ahrefs. |
version | GETDR_VERSION | --version | dr3 | Versione del DR, dr3 o dr4. |
cache.path | GETDR_CACHE_PATH | – | ~/.cache/getdr/cache.db | File della cache SQLite; $XDG_CACHE_HOME/getdr/ se quella variabile è impostata. |
cache.ttl | GETDR_CACHE_TTL | --ttl | 7d | Per quanto tempo un valore resta fresco. |
cache.ttl_none | GETDR_CACHE_TTL_NONE | – | 1d | Per quanto tempo resta fresco un "nessun dato". |
cache.max_age | GETDR_CACHE_MAX_AGE | – | 30d | Finestra del trend; cache purge elimina i controlli più vecchi. |
ahrefs.batch | GETDR_AHREFS_BATCH | – | 1000 | Target per richiesta ad Ahrefs, 1–1000. |
ahrefs.rpm | GETDR_AHREFS_RPM | – | 40 | Richieste ad Ahrefs al minuto. |
ahrefs.timeout | GETDR_AHREFS_TIMEOUT | – | 30s | Timeout di una singola richiesta ad Ahrefs. |
ahrefs.retries | GETDR_AHREFS_RETRIES | – | 3 | Nuovi tentativi su 429, 5xx ed errori di rete. |
serve.listen | GETDR_SERVE_LISTEN | --listen | 127.0.0.1:8080 | Indirizzo su cui ascolta getdr serve. |
serve.token | GETDR_SERVE_TOKEN | --token | – | Token Bearer richiesto dal server. La CLI lo invia quando api è impostato. |
serve.max_targets | GETDR_SERVE_MAX_TARGETS | – | 10000 | Target per POST /dr. |
Le durate accettano i giorni con il suffisso d (7d, 1.5d) e le durate di Go (36h, 90m, 30s). getdr config show stampa tutti i valori risultanti e da dove arriva ciascuno. Dei segreti (key, serve.token) mostra solo gli ultimi 4 caratteri.
Altre variabili d'ambiente che getdr legge:
NO_COLORdisattiva i colori nella scheda.TERM=dumb, oppure un locale senza UTF-8 inLC_ALL,LC_CTYPEoLANG, dà una scheda in ASCII semplice.COLUMNSfissa la larghezza della scheda quando il terminale non la comunica.HOME,XDG_CONFIG_HOMEeXDG_CACHE_HOMEdeterminano dove stanno i file per default.HTTP_PROXY,HTTPS_PROXYeNO_PROXYvengono rispettate. Se passi da un proxy e usi comeapiun server getdr nella tua LAN, aggiungi quel server aNO_PROXY.
07 Cache e storico
Ogni controllo viene salvato come riga a sé (dominio, versione, DR, data). Da questo storico la scheda disegna il trend e getdr calcola delta. Un valore resta fresco finché l'ultimo controllo è più recente di ttl, o di ttl_none per "nessun dato"; dopo, getdr lo scarica di nuovo. I valori dr3 e dr4 sono tenuti separati. I target rimasti senza risposta non finiscono in cache.
getdr cache purge elimina i controlli più vecchi di max_age e conserva sempre l'ultimo di ogni dominio. getdr cache stats mostra percorso e dimensione del file, quanti controlli e quanti domini contiene, il controllo più vecchio e il più recente. getdr cache clear elimina tutti i controlli. La CLI e il server possono lavorare sullo stesso file di cache nello stesso momento.
08 API HTTP
getdr serve è una piccola API HTTP davanti ad Ahrefs, con una cache condivisa. La avvii una volta con una chiave Ahrefs e poi ci colleghi CLI, script e agenti. A loro non serve una chiave propria, e i controlli ripetuti arrivano dalla 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'Ogni risposta porta l'header Server: getdr/<version> (index-pages.com). Gli errori sono in JSON: {"error":"…"}. Se è impostato un token, /dr e /stats richiedono Authorization: Bearer <token> e senza di esso rispondono 401. /, /healthz e /teapot sono sempre aperti.
| Metodo | Percorso | Cosa fa |
|---|---|---|
| GET | /dr?target=x.com | Un record di risultato. Facoltativi version=dr3, fresh=1 (salta la cache), raw=1 (nessuna normalizzazione). |
| POST | /dr | Molti target in una sola richiesta, con risposta {"results":[…]}. |
| GET | /healthz | 200 ok, testo semplice. |
| GET | /stats | Dimensione della cache, hit rate, richieste ad Ahrefs nell'ultima ora. |
| GET | / | Nome, versione e link a questa documentazione. |
POST /dr accetta esattamente quattro campi:
{"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}
]}I target vengono normalizzati e deduplicati, e i risultati seguono il loro ordine. Il server divide il lavoro in batch Ahrefs fino a 1000 target e rispetta il rate limit. Un client può chiedere fresh, ma non può cambiare il TTL del server. I target non validi non fanno mai fallire la richiesta: tornano dentro un normale 200 con dr e checked_at a null.
| HTTP | Quando |
|---|---|
| 400 | Manca target, version non è valida, il JSON non è valido, c'è un campo sconosciuto o ci sono dati dopo l'oggetto JSON, nessun target è valido. |
| 401 | Il token è richiesto e manca o è sbagliato. |
| 404 | Percorso sconosciuto. |
| 405 | Metodo sbagliato, compreso HEAD /dr, che non avvia mai una ricerca. |
| 413 | Più di max_targets target (10000 di default). |
| 503 | Il server non ha una chiave Ahrefs, oppure Ahrefs l'ha rifiutata. |
/stats risponde così; lookups conta i target dall'avvio del server, rows sono i controlli salvati e domains i domini distinti:
{
"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
}Se più client chiedono nello stesso momento lo stesso dominio con la stessa versione, il server fa una sola richiesta ad Ahrefs per tutti. La CLI si collega a un server così:
getdr --api http://lan-host:8080 --token s3cret -f domains.txtFunziona allo stesso modo con api e serve.token nel file di configurazione, oppure con GETDR_API e GETDR_SERVE_TOKEN. La CLI invia un solo POST /dr per i target che la sua cache non copre e inoltra --fresh. Anche questa richiesta segue le variabili del proxy, quindi aggiungi a NO_PROXY un server che sta nella LAN.
09 Agenti AI
getdr-mcp è un server MCP con un solo strumento, get_dr. Non fa richieste ad Ahrefs per conto suo: interroga un server getdr o il binario getdr. Funziona su stdio, non ha dipendenze a runtime e richiede Node.js 18 o successivo. Aggiungilo a Claude Desktop, Claude Code, Cursor o a un altro client MCP:
{
"mcpServers": {
"getdr": {
"command": "npx",
"args": ["-y", "getdr-mcp"]
}
}
}Con questa configurazione usa il binario getdr nel tuo PATH, con la sua configurazione, la sua cache e la sua chiave. Per usare invece un server getdr della tua rete, aggiungi "env": {"GETDR_API": "http://lan-host:8080", "GETDR_SERVE_TOKEN": "s3cret"}. Il server MCP guarda prima GETDR_API, poi il binario; se non trova nessuno dei due, lo strumento restituisce un errore con le istruzioni per configurarlo.
| Argomento | Tipo | Significato |
|---|---|---|
targets | string[] | Obbligatorio, non vuoto. Domini o URL. |
version | "dr3" | "dr4" | Formula del DR, dr3 di default. Viene sempre inviata in modo esplicito, quindi un server o una configurazione impostati su dr4 non la cambiano. |
fresh | boolean | Ignora la cache e scarica di nuovo. |
Lo strumento restituisce un array JSON di record seguito dalla riga di attribuzione. I client con protocollo MCP 2025-06-18 o successivo ricevono anche structuredContent con un outputSchema. Se alcuni target non hanno avuto risposta, il risultato arriva comunque, con tutti i record e una nota che elenca quei target.
getdr-skill è una cartella con un SKILL.md e uno script bash, per qualsiasi agente che carichi le Agent Skills. Per Claude Code:
git clone https://github.com/index-pages/getdr-skill ~/.claude/skills/getdrLo script scripts/dr.sh usa il primo backend disponibile: un server getdr in GETDR_API, poi il binario getdr nel PATH, poi direttamente l'endpoint gratuito di Ahrefs con GETDR_KEY o AHREFS_KEY. Se non ne trova nessuno, esce con codice 3 e rimanda a come ottenere una chiave gratuita. Richiede bash, curl e jq 1.6 o successivo; con il binario installato basta bash. Qualunque strada prenda, l'output è lo stesso NDJSON.
10 Attribuzione e privacy
I dati Domain Rating provengono da Ahrefs e sono soggetti alla Domain Rating License, che richiede l'attribuzione "Domain Rating by Ahrefs". getdr la stampa nel piè di pagina della scheda e, con i formati per le macchine, una volta per esecuzione su stderr, mai su stdout (-q la disattiva). Mantienila quando pubblichi i numeri. getdr non è affiliato ad Ahrefs.
getdr si collega solo a due destinazioni: api.ahrefs.com e il server getdr che imposti in api. Non ha telemetria, controlli degli aggiornamenti o analytics, e rifiuta i redirect verso qualsiasi altro host. Ogni richiesta porta questo User-Agent:
getdr/<version> (+https://index-pages.com/getdr)
Puoi verificarlo nel codice sorgente: tutte le richieste in uscita partono da internal/ahrefs e internal/remote. getdr-mcp si collega solo al server in GETDR_API, altrimenti avvia il binario. Lo script della skill comunica con GETDR_API o con api.ahrefs.com e passa le chiavi a curl in un file temporaneo con permessi 600, mai sulla riga di comando.
11 Chi lo sviluppa
getdr è sviluppato da Index Pages. Il nostro prodotto principale è un servizio di indicizzazione degli URL: spinge le pagine in Google, Bing, Yandex e in più di 10 altri motori, cioè negli indici da cui attingono le risposte di ChatGPT, Claude, Perplexity e AI Overviews. Un controllo del DR ti dice su quali domini conviene avere un link. Index Pages fa indicizzare le pagine che contengono quei link.
Il servizio è descritto nella home page, e la sua API REST per script e agenti nella pagina API. Bug e idee per getdr vanno nelle issue su GitHub.