getdr: comprobador masivo del DR de Ahrefs
01 Qué hace
getdr consulta el Domain Rating (DR) de Ahrefs de un dominio, una lista, un archivo o stdin. Es un único binario estático para Linux, macOS y Windows, de código abierto con licencia MIT. El DR sale del endpoint gratuito oficial de Ahrefs, así que las consultas no cuestan nada ni gastan unidades de API. Solo necesitas una clave de API gratuita de Ahrefs.
█ █ ▄▀▀▄ 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 PagesCada consulta se guarda con su fecha en una caché SQLite local. Repetirla no cuesta ninguna petición, y la tarjeta muestra cuánto se ha movido el DR desde la comprobación anterior. Con getdr serve, el mismo binario se convierte en una pequeña API HTTP: una máquina guarda la clave y la caché, y todos los scripts, portátiles y agentes de tu red le preguntan a ella.
getdr tiene tres partes, y las tres devuelven el mismo registro JSON:
- getdr – la herramienta de línea de comandos y la API de
getdr serve. - getdr-mcp – un servidor MCP con una sola herramienta,
get_dr, para Claude, Cursor y otros clientes MCP. - getdr-skill – una skill para agentes. Su script de bash funciona incluso donde el binario no está instalado.
02 Instalación
Con Go 1.24 o posterior:
go install -trimpath github.com/index-pages/getdr@latestEl binario queda en $(go env GOPATH)/bin; asegúrate de que ese directorio esté en tu PATH.
Sin Go, descarga un archivo de GitHub Releases. Cada versión trae compilaciones para Linux, macOS y Windows en amd64 y arm64, además de 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 -VEl binario es estático: no usa cgo, lleva SQLite compilado dentro y no hay que instalar nada más. Para compilarlo tú mismo:
git clone https://github.com/index-pages/getdr
cd getdr
CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o getdr .Para getdr serve hay un Dockerfile. La imagen se construye FROM scratch y solo contiene el binario y un bundle de certificados CA. Se ejecuta con un usuario sin privilegios y guarda la caché en /data:
docker build -t getdr .
docker run -d -p 8080:8080 -e GETDR_KEY=your-key -v getdr-data:/data getdrHay paquetes previstos para Homebrew, npm y PyPI, pero todavía no están publicados.
03 Clave gratuita de Ahrefs
Las peticiones al endpoint de Domain Rating de Ahrefs son gratuitas y no gastan unidades de API. Aun así, cada petición tiene que llevar una clave de API, que también es gratuita:
- Crea una cuenta gratuita en ahrefs.com, si todavía no tienes una.
- Abre Account settings → API keys.
- Crea una clave y cópiala.
getdr busca la clave en cuatro sitios y usa la primera que encuentra:
| Dónde | Ejemplo |
|---|---|
| opción | getdr --key KEY saas.com |
GETDR_KEY | export GETDR_KEY=KEY |
AHREFS_KEY | export AHREFS_KEY=KEY |
| archivo de configuración | key = "KEY" en ~/.config/getdr/config.toml |
Comprueba que funciona con getdr key check. getdr config show indica de qué fuente salió la clave y muestra solo sus 4 últimos caracteres. La clave solo hace falta cuando hay que traer datos: los valores que siguen vigentes en la caché se muestran sin ella.
El código de salida 3 siempre indica un problema con la clave. Si el mensaje es "no Ahrefs API key", ninguna de las fuentes anteriores tiene clave. Si es "rejected by Ahrefs (HTTP 401)", la clave es incorrecta o está revocada, así que crea otra. Con --api, el servidor getdr no tiene clave o Ahrefs la ha rechazado, y hay que arreglarlo en el servidor.
Ahrefs no publica ningún límite de peticiones para este endpoint. En la práctica pasan unas 40–60 peticiones por minuto. getdr agrupa hasta 1000 objetivos en una sola petición, no envía más de rpm peticiones por minuto (40 por defecto) y reintenta las respuestas 429 y 5xx con espera exponencial.
Para usar una sola clave en varias máquinas, ejecuta getdr serve en una de ellas y apunta las demás hacia ella con api (consulta API HTTP). Así los clientes no necesitan ninguna clave.
04 Uso
| Comando | Qué obtienes |
|---|---|
getdr saas.com | La tarjeta, en el terminal. |
getdr https://www.example.com/page | Una URL se reduce a su host. |
getdr a.com b.com c.com | Varios objetivos, ordenados por DR. |
getdr -f domains.txt | Un objetivo por línea; se admiten comentarios con #. |
cat domains.txt | getdr > dr.tsv | En una tubería: dominio y DR separados por tabulador. |
getdr -f domains.txt --format json | NDJSON, un objeto por línea. |
getdr -b a.com b.com | Solo los valores. |
getdr -f domains.txt --min 30 -q | Deja solo DR 30 o superior; código de salida 1 si algún objetivo queda fuera. |
getdr saas.com --version dr4 | La nueva fórmula de DR. |
getdr saas.com --fresh | Ignora la caché y vuelve a consultar. |
Los objetivos se normalizan antes de enviar nada. De una URL queda solo el host, se quita www., todo pasa a minúsculas, las etiquetas punycode (xn--…) se decodifican a Unicode y se eliminan los duplicados. Por eso xn--e1afmkfd.xn--p1ai y ПРИМЕР.РФ se consultan los dos como пример.рф. --raw envía los objetivos tal como están escritos.
Una línea mala no estropea la lista. Las entradas sin host, con espacios en blanco o con caracteres de control se rechazan antes del envío. Cuando Ahrefs rechaza un objetivo (localhost, a..com), getdr lo saca del lote y reenvía el resto. Por cada uno de esos objetivos aparece getdr: invalid target: X en stderr y un resultado vacío, la ejecución termina con código de salida 2 y no se guarda nada de él en la caché.
-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 versionComandos: getdr serve, getdr cache stats | clear | purge, getdr config show, getdr key check.
| Código de salida | Significado |
|---|---|
| 0 | Todo comprobado. |
| 1 | Algún objetivo queda fuera de --min / --max. |
| 2 | Un error, objetivos no válidos u objetivos que no obtuvieron respuesta (tiempo de espera agotado, límite de peticiones). |
| 3 | Falta la clave de API de Ahrefs o ha sido rechazada. |
05 Salida
En el terminal, getdr muestra la tarjeta. Cuando stdout es una tubería o un archivo, cambia a tsv. --format y -b se imponen en ambos casos.
| Formato | Qué obtienes |
|---|---|
card | Un número grande, una barra, la tendencia y un resumen, para leerlo una persona. El color depende del DR: 0–19 gris, 20–39 amarillo, 40–69 verde, 70+ azul. |
tsv | domain<TAB>dr, sin cabecera; el DR queda vacío cuando no hay datos. |
csv | Las mismas columnas, con una fila de cabecera. |
json | NDJSON, un registro por objetivo. |
-b | Solo los valores de DR, uno por línea, con una línea vacía cuando no hay datos. |
--fields elige las columnas de tsv y csv entre domain,dr,version,checked_at,delta,cached; por defecto son domain,dr. Un registro json siempre va completo, y delta se añade si lo incluyes en la lista. El registro JSON es el mismo en la CLI, el servidor, la herramienta MCP y la skill:
{"target":"saas.com","dr":49,"version":"dr3","checked_at":"2026-10-28T12:00:00Z","cached":true}| Campo | Significado |
|---|---|
target | El objetivo normalizado, o tal como se escribió si se usa --raw. |
dr | Domain Rating, 0–100. null si el objetivo no era válido, si Ahrefs no respondió o (rara vez) si Ahrefs no tiene datos. |
version | dr3 o dr4. Las dos fórmulas dan valores que no se pueden comparar entre sí. |
checked_at | Cuándo se midió el valor, en RFC 3339 y UTC. null si el objetivo no es válido o no hubo respuesta. |
cached | true si el valor salió de la caché. |
Ahrefs responde 0 para los dominios que no conoce, así que 0 es un valor normal. Un DR null con fecha null significa que el objetivo no era válido o que esta vez no hubo respuesta. Un DR null con fecha significa que Ahrefs ha dicho de forma explícita que no tiene datos.
La tarjeta respeta NO_COLOR. Con TERM=dumb o con un locale sin UTF-8 pasa a ASCII simple, sin dígitos grandes ni barras. Si la lista tiene más de 200 filas, se muestran las 200 primeras; --all las muestra todas.
06 Configuración
Cada ajuste se toma del primer sitio donde aparece: una opción de la línea de comandos, después una variable de entorno GETDR_*, después el archivo de configuración y, por último, el valor por defecto integrado. La clave también se lee de AHREFS_KEY, que tiene menos prioridad que GETDR_KEY. Una variable de entorno vacía cuenta como no definida.
getdr usa el primer archivo de configuración que encuentra: --config PATH, después $GETDR_CONFIG, después $XDG_CONFIG_HOME/getdr/config.toml (~/.config/getdr/config.toml si XDG_CONFIG_HOME no está definida) y, por último, /etc/getdr/config.toml. Un archivo indicado con --config o GETDR_CONFIG tiene que existir. Un ajuste desconocido da error, así que una errata no pasa desapercibida. ~/ al principio de una ruta se expande.
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| Ajuste | Variable | Opción | Por defecto | Significado |
|---|---|---|---|---|
key | GETDR_KEY, AHREFS_KEY | --key | – | Clave de API de Ahrefs. |
api | GETDR_API | --api | – | URL de un servidor getdr. Si está definida, la CLI le pregunta a él en lugar de a Ahrefs. |
version | GETDR_VERSION | --version | dr3 | Versión de DR, dr3 o dr4. |
cache.path | GETDR_CACHE_PATH | – | ~/.cache/getdr/cache.db | Archivo de caché SQLite; $XDG_CACHE_HOME/getdr/ si esa variable está definida. |
cache.ttl | GETDR_CACHE_TTL | --ttl | 7d | Cuánto tiempo sigue vigente un valor. |
cache.ttl_none | GETDR_CACHE_TTL_NONE | – | 1d | Cuánto tiempo sigue vigente un "sin datos". |
cache.max_age | GETDR_CACHE_MAX_AGE | – | 30d | Ventana de la tendencia; cache purge borra las comprobaciones más antiguas. |
ahrefs.batch | GETDR_AHREFS_BATCH | – | 1000 | Objetivos por petición a Ahrefs, 1–1000. |
ahrefs.rpm | GETDR_AHREFS_RPM | – | 40 | Peticiones a Ahrefs por minuto. |
ahrefs.timeout | GETDR_AHREFS_TIMEOUT | – | 30s | Tiempo de espera de una petición a Ahrefs. |
ahrefs.retries | GETDR_AHREFS_RETRIES | – | 3 | Reintentos ante 429, 5xx y errores de red. |
serve.listen | GETDR_SERVE_LISTEN | --listen | 127.0.0.1:8080 | Dirección en la que escucha getdr serve. |
serve.token | GETDR_SERVE_TOKEN | --token | – | Token Bearer que exige el servidor. La CLI lo envía cuando api está definida. |
serve.max_targets | GETDR_SERVE_MAX_TARGETS | – | 10000 | Objetivos por POST /dr. |
Las duraciones admiten días con el sufijo d (7d, 1.5d) y duraciones de Go (36h, 90m, 30s). getdr config show muestra todos los valores ya combinados y de dónde salió cada uno. Los secretos (key, serve.token) solo enseñan sus 4 últimos caracteres.
Otras variables de entorno que lee getdr:
NO_COLORdesactiva los colores de la tarjeta.TERM=dumb, o un locale sin UTF-8 enLC_ALL,LC_CTYPEoLANG, da una tarjeta en ASCII simple.COLUMNSfija el ancho de la tarjeta cuando el terminal no lo indica.HOME,XDG_CONFIG_HOMEyXDG_CACHE_HOMEdeterminan dónde van los archivos por defecto.- Se respetan
HTTP_PROXY,HTTPS_PROXYyNO_PROXY. Si sales por un proxy y usas comoapiun servidor getdr de tu red local, añade ese servidor aNO_PROXY.
07 Caché e historial
Cada comprobación se guarda en su propia fila (dominio, versión, DR, fecha). De ese historial sale la tendencia que dibuja la tarjeta y con él se calcula delta. Un valor se considera vigente mientras la última comprobación tenga menos antigüedad que ttl, o que ttl_none en el caso de "sin datos"; pasado ese plazo, getdr vuelve a consultarlo. Los valores dr3 y dr4 se guardan por separado. Los objetivos que no obtuvieron respuesta no entran en la caché.
getdr cache purge borra las comprobaciones más antiguas que max_age y siempre conserva la última de cada dominio. getdr cache stats muestra la ruta y el tamaño del archivo, cuántas comprobaciones y dominios contiene, y la comprobación más antigua y la más reciente. getdr cache clear borra todas las comprobaciones. La CLI y el servidor pueden trabajar a la vez con el mismo archivo de caché.
08 API HTTP
getdr serve es una pequeña API HTTP delante de Ahrefs, con caché compartida. Arráncala una vez con una clave de Ahrefs y apunta hacia ella las CLI, los scripts y los agentes. No necesitan clave propia, y las consultas repetidas salen de la caché.
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'Todas las respuestas llevan la cabecera Server: getdr/<version> (index-pages.com). Los errores van en JSON: {"error":"…"}. Si hay un token configurado, /dr y /stats exigen Authorization: Bearer <token> y sin él responden 401. /, /healthz y /teapot siempre están abiertos.
| Método | Ruta | Qué hace |
|---|---|---|
| GET | /dr?target=x.com | Un registro de resultado. Opcionales: version=dr3, fresh=1 (ignorar la caché), raw=1 (sin normalización). |
| POST | /dr | Muchos objetivos en una sola petición; la respuesta llega como {"results":[…]}. |
| GET | /healthz | 200 ok, en texto plano. |
| GET | /stats | Tamaño de la caché, tasa de aciertos y peticiones a Ahrefs en la última hora. |
| GET | / | Nombre, versión y enlaces a esta documentación. |
POST /dr acepta exactamente cuatro campos:
{"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}
]}Los objetivos se normalizan y se deduplican, y los resultados siguen su orden. El servidor reparte el trabajo en lotes de Ahrefs de hasta 1000 y respeta el límite de peticiones. Un cliente puede pedir fresh, pero no puede cambiar el TTL del servidor. Los objetivos no válidos nunca hacen fallar la petición: vuelven dentro de un 200 normal, con dr y checked_at a null.
| HTTP | Cuándo |
|---|---|
| 400 | Falta target, version no válida, JSON no válido, un campo desconocido o datos después del objeto JSON, ningún objetivo válido. |
| 401 | Se exige un token y falta o es incorrecto. |
| 404 | Ruta desconocida. |
| 405 | Método incorrecto, incluido HEAD /dr, que nunca lanza una consulta. |
| 413 | Más de max_targets objetivos (10000 por defecto). |
| 503 | El servidor no tiene clave de Ahrefs, o Ahrefs la ha rechazado. |
/stats responde así; lookups cuenta los objetivos desde que arrancó el servidor, rows son las comprobaciones guardadas y domains, los dominios distintos:
{
"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
}Si varios clientes piden a la vez el mismo dominio y la misma versión, el servidor hace una sola petición a Ahrefs para todos. La CLI se conecta a un servidor así:
getdr --api http://lan-host:8080 --token s3cret -f domains.txtTambién funciona con api y serve.token en el archivo de configuración, o con GETDR_API y GETDR_SERVE_TOKEN. La CLI envía un único POST /dr con los objetivos que no cubre su propia caché y le pasa --fresh al servidor. Las variables de proxy también se aplican a esta petición, así que añade a NO_PROXY el servidor de tu red local.
09 Agentes de IA
getdr-mcp es un servidor MCP con una sola herramienta, get_dr. No hace peticiones propias a Ahrefs: le pregunta a un servidor getdr o al binario getdr. Funciona sobre stdio, no tiene dependencias en tiempo de ejecución y necesita Node.js 18 o posterior. Añádelo a Claude Desktop, Claude Code, Cursor u otro cliente MCP:
{
"mcpServers": {
"getdr": {
"command": "npx",
"args": ["-y", "getdr-mcp"]
}
}
}Así se usa el binario getdr de tu PATH, con su propia configuración, caché y clave. Para usar en su lugar un servidor getdr de tu red, añade "env": {"GETDR_API": "http://lan-host:8080", "GETDR_SERVE_TOKEN": "s3cret"}. getdr-mcp mira primero GETDR_API y después el binario; si no hay ninguno de los dos, la herramienta devuelve un error con instrucciones de configuración.
| Argumento | Tipo | Significado |
|---|---|---|
targets | string[] | Obligatorio y no vacío. Dominios o URLs. |
version | "dr3" | "dr4" | Fórmula de DR, dr3 por defecto. Siempre se envía de forma explícita, así que un servidor o una configuración con dr4 no la cambian. |
fresh | boolean | Ignorar la caché y volver a consultar. |
La herramienta devuelve un array JSON de registros seguido de la línea de atribución. Los clientes con el protocolo MCP 2025-06-18 o posterior reciben además structuredContent con un outputSchema. Si algunos objetivos no obtuvieron respuesta, el resultado llega igualmente con todos los registros y una nota que nombra esos objetivos.
getdr-skill es una carpeta con un SKILL.md y un script de bash, para cualquier agente que cargue Agent Skills. Para Claude Code:
git clone https://github.com/index-pages/getdr-skill ~/.claude/skills/getdrEl script scripts/dr.sh usa el primer backend disponible: un servidor getdr en GETDR_API, después el binario getdr del PATH y, por último, el endpoint gratuito de Ahrefs directamente con GETDR_KEY o AHREFS_KEY. Si no encuentra ninguno, sale con código 3 y enlaza a cómo conseguir una clave gratuita. Necesita bash, curl y jq 1.6 o posterior; con el binario instalado basta con bash. Por cualquiera de las tres vías, la salida es el mismo NDJSON.
10 Atribución y privacidad
Los datos de Domain Rating proceden de Ahrefs y están sujetos a la Domain Rating License, que exige la atribución "Domain Rating by Ahrefs". getdr la muestra en el pie de la tarjeta y, con los formatos para máquinas, una vez por ejecución en stderr, nunca en stdout (-q la silencia). Mantenla cuando publiques las cifras. getdr no está afiliado a Ahrefs.
getdr solo se conecta a dos sitios: api.ahrefs.com y el servidor getdr que configures en api. No tiene telemetría, ni comprobación de actualizaciones, ni analítica, y rechaza las redirecciones a cualquier otro host. Todas las peticiones llevan este User-Agent:
getdr/<version> (+https://index-pages.com/getdr)
Puedes comprobarlo en el código fuente: todas las peticiones salientes se hacen en internal/ahrefs y internal/remote. getdr-mcp solo se conecta al servidor de GETDR_API y, si no lo hay, arranca el binario. El script de la skill habla con GETDR_API o con api.ahrefs.com y le pasa las claves a curl en un archivo temporal con permisos 600, nunca en la línea de comandos.
11 Quién lo hace
getdr lo hace Index Pages. Nuestro producto principal es un servicio de indexación de URLs: envía páginas a Google, Bing, Yandex y más de 10 motores más: los índices de los que responden ChatGPT, Claude, Perplexity y AI Overviews. La comprobación de DR te dice qué dominios merecen un enlace, e Index Pages consigue que se indexen las páginas que llevan esos enlaces.
El servicio está en la página principal, y su API REST para scripts y agentes, en la página de la API. Los errores y las ideas para getdr van a los issues de GitHub.