getdr: массовая проверка Ahrefs DR
01 Что он делает
getdr проверяет Ahrefs Domain Rating (DR) для одного домена, списка, файла или stdin. Это один статический бинарник для Linux, macOS и Windows с открытым кодом под лицензией MIT. DR берётся из официального бесплатного эндпоинта Ahrefs: проверки ничего не стоят и не расходуют API-юниты, нужен только бесплатный API-ключ 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 PagesКаждая проверка сохраняется с датой в локальный кеш SQLite. Повторная проверка обходится без запроса, а карточка показывает, как изменился DR с прошлой проверки. Запустите getdr serve, и тот же бинарник станет небольшим HTTP API: ключ и кеш хранятся на одной машине, а все скрипты, ноутбуки и агенты в вашей сети обращаются к ней.
getdr состоит из трёх частей, и все они возвращают одну и ту же JSON-запись:
- getdr: инструмент командной строки и API
getdr serve. - getdr-mcp: MCP-сервер с одним инструментом,
get_dr, для Claude, Cursor и других MCP-клиентов. - getdr-skill: скилл для агентов. Его bash-скрипт работает даже там, где бинарник не установлен.
02 Установка
С Go 1.24 или новее:
go install -trimpath github.com/index-pages/getdr@latestБинарник попадает в $(go env GOPATH)/bin; убедитесь, что этот каталог есть в PATH.
Без Go возьмите архив из GitHub Releases. В каждом релизе есть сборки для Linux, macOS и Windows под amd64 и arm64, а также 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Бинарник статический: без cgo, SQLite вкомпилирован, больше ничего ставить не нужно. Чтобы собрать его самостоятельно:
git clone https://github.com/index-pages/getdr
cd getdr
CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o getdr .Для getdr serve есть Dockerfile. Образ собирается FROM scratch и содержит только бинарник и набор корневых сертификатов. Контейнер работает от непривилегированного пользователя и хранит кеш в /data:
docker build -t getdr .
docker run -d -p 8080:8080 -e GETDR_KEY=your-key -v getdr-data:/data getdrПакеты для Homebrew, npm и PyPI запланированы, но пока не опубликованы.
03 Бесплатный ключ Ahrefs
Запросы к эндпоинту Domain Rating в Ahrefs бесплатны и не расходуют API-юниты. Но в каждом запросе всё равно должен быть API-ключ, и ключ тоже бесплатный:
- Зарегистрируйте бесплатный аккаунт на ahrefs.com, если его ещё нет.
- Откройте Account settings → API keys.
- Создайте ключ и скопируйте его.
getdr ищет ключ в четырёх местах и берёт первый найденный:
| Где | Пример |
|---|---|
| флаг | getdr --key KEY saas.com |
GETDR_KEY | export GETDR_KEY=KEY |
AHREFS_KEY | export AHREFS_KEY=KEY |
| файл конфигурации | key = "KEY" в ~/.config/getdr/config.toml |
Проверить, что ключ работает, можно командой getdr key check. getdr config show показывает, из какого источника взят ключ, и выводит только его последние 4 символа. Ключ нужен, только когда что-то приходится запрашивать: значения, которые ещё свежи в кеше, показываются и без него.
Код выхода 3 всегда означает проблему с ключом. Сообщение «no Ahrefs API key» значит, что ключа нет ни в одном из источников выше. «rejected by Ahrefs (HTTP 401)» значит, что ключ неверный или отозван: создайте новый. С --api этот код значит, что у сервера getdr нет ключа или Ahrefs его отклонил, и исправлять нужно на сервере.
Ahrefs не публикует лимит запросов для этого эндпоинта. На практике проходит около 40–60 запросов в минуту. getdr упаковывает до 1000 целей в один запрос, отправляет не больше rpm запросов в минуту (по умолчанию 40) и повторяет запросы после ответов 429 и 5xx с экспоненциальной задержкой.
Чтобы пользоваться одним ключом на нескольких машинах, запустите getdr serve на одной из них, а остальные направьте на неё через api (см. HTTP API). Тогда клиентам ключ вообще не нужен.
04 Использование
| Команда | Что получите |
|---|---|
getdr saas.com | Карточку в терминале. |
getdr https://www.example.com/page | URL сокращается до хоста. |
getdr a.com b.com c.com | Несколько целей, отсортированных по DR. |
getdr -f domains.txt | По одной цели на строку; комментарии с # допускаются. |
cat domains.txt | getdr > dr.tsv | В пайпе: домен и DR через табуляцию. |
getdr -f domains.txt --format json | NDJSON, по объекту на строку. |
getdr -b a.com b.com | Только значения. |
getdr -f domains.txt --min 30 -q | Оставляет DR 30 и выше; код выхода 1, если хоть одна цель не проходит фильтр. |
getdr saas.com --version dr4 | Новую формулу DR. |
getdr saas.com --fresh | Запрос мимо кеша, значение берётся заново. |
Перед отправкой цели нормализуются. URL превращается в хост, www. отбрасывается, всё приводится к нижнему регистру, punycode-метки (xn--…) декодируются в Unicode, дубликаты удаляются. Поэтому xn--e1afmkfd.xn--p1ai и ПРИМЕР.РФ проверяются как пример.рф. С --raw цели уходят ровно в том виде, в каком записаны.
Одна плохая строка не портит список. Ввод без хоста, с пробелами или управляющими символами отклоняется до отправки. Если Ahrefs не принимает цель (localhost, a..com), getdr убирает её из пакета и отправляет остальные заново. Для каждой такой цели в stderr пишется getdr: invalid target: X, результат у неё пустой, прогон завершается с кодом выхода 2, и ничего из этого не попадает в кеш.
-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Команды: getdr serve, getdr cache stats | clear | purge, getdr config show, getdr key check.
| Код выхода | Значение |
|---|---|
| 0 | Всё проверено. |
| 1 | Какая-то цель вне --min / --max. |
| 2 | Ошибка, невалидные цели или цели, по которым не пришёл ответ (таймаут, лимит запросов). |
| 3 | API-ключа Ahrefs нет, или Ahrefs его отклонил. |
05 Вывод
В терминале getdr выводит карточку. Если stdout направлен в пайп или файл, вывод переключается на tsv. --format и -b перекрывают оба варианта.
| Формат | Что получите |
|---|---|
card | Крупное число, шкалу, тренд и сводку, для чтения человеком. Цвет зависит от DR: 0–19 серый, 20–39 жёлтый, 40–69 зелёный, 70+ синий. |
tsv | domain<TAB>dr, без заголовка; если данных нет, DR пустой. |
csv | Те же колонки плюс строка заголовка. |
json | NDJSON, по записи на каждую цель. |
-b | Только значения DR, по одному на строку; если данных нет, строка пустая. |
--fields выбирает колонки tsv и csv из domain,dr,version,checked_at,delta,cached; по умолчанию domain,dr. Запись в json всегда полная, а delta добавляется, если указать его в списке. JSON-запись одна и та же в CLI, на сервере, в MCP-инструменте и в скилле:
{"target":"saas.com","dr":49,"version":"dr3","checked_at":"2026-10-28T12:00:00Z","cached":true}| Поле | Описание |
|---|---|
target | Нормализованная цель или, с --raw, цель в том виде, в каком записана. |
dr | Domain Rating, 0–100. null, если цель невалидна, Ahrefs не ответил или (редко) у Ahrefs нет данных. |
version | dr3 или dr4. Значения двух формул между собой не сравнить. |
checked_at | Когда значение было получено, RFC 3339 UTC. null для невалидной цели или если ответа не было. |
cached | true, если значение взято из кеша. |
На домены, которых Ahrefs не знает, он отвечает 0, так что 0 здесь нормальное значение. DR null с датой null означает, что цель невалидна или в этот раз не получила ответа. DR null с датой означает, что Ahrefs прямо ответил: данных у него нет.
Карточка учитывает NO_COLOR. При TERM=dumb или локали без UTF-8 она переходит на простой ASCII, без крупных цифр и шкал. Если в списке больше 200 строк, показываются первые 200; --all показывает все.
06 Настройка
Каждая настройка берётся из первого места, где она задана: флаг командной строки, затем переменная окружения GETDR_*, затем файл конфигурации, затем встроенное значение по умолчанию. Ключ читается ещё и из AHREFS_KEY, у этой переменной приоритет ниже, чем у GETDR_KEY. Пустая переменная окружения считается незаданной.
getdr берёт первый найденный файл конфигурации: --config PATH, затем $GETDR_CONFIG, затем $XDG_CONFIG_HOME/getdr/config.toml (~/.config/getdr/config.toml, если XDG_CONFIG_HOME не задана), затем /etc/getdr/config.toml. Файл, указанный через --config или GETDR_CONFIG, должен существовать. Неизвестная настройка считается ошибкой, так что опечатка не пройдёт незамеченной. ~/ в начале пути раскрывается.
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| Настройка | Переменная | Флаг | По умолчанию | Описание |
|---|---|---|---|---|
key | GETDR_KEY, AHREFS_KEY | --key | – | API-ключ Ahrefs. |
api | GETDR_API | --api | – | URL сервера getdr. Если задан, CLI обращается к нему, а не к Ahrefs. |
version | GETDR_VERSION | --version | dr3 | Версия DR, dr3 или dr4. |
cache.path | GETDR_CACHE_PATH | – | ~/.cache/getdr/cache.db | Файл кеша SQLite; $XDG_CACHE_HOME/getdr/, если эта переменная задана. |
cache.ttl | GETDR_CACHE_TTL | --ttl | 7d | Сколько значение остаётся свежим. |
cache.ttl_none | GETDR_CACHE_TTL_NONE | – | 1d | Сколько остаётся свежим ответ «нет данных». |
cache.max_age | GETDR_CACHE_MAX_AGE | – | 30d | Окно тренда; cache purge удаляет проверки старше. |
ahrefs.batch | GETDR_AHREFS_BATCH | – | 1000 | Целей в одном запросе к Ahrefs, 1–1000. |
ahrefs.rpm | GETDR_AHREFS_RPM | – | 40 | Запросов к Ahrefs в минуту. |
ahrefs.timeout | GETDR_AHREFS_TIMEOUT | – | 30s | Таймаут одного запроса к Ahrefs. |
ahrefs.retries | GETDR_AHREFS_RETRIES | – | 3 | Повторы при 429, 5xx и сетевых ошибках. |
serve.listen | GETDR_SERVE_LISTEN | --listen | 127.0.0.1:8080 | Адрес, на котором слушает getdr serve. |
serve.token | GETDR_SERVE_TOKEN | --token | – | Bearer-токен, который требует сервер. CLI отправляет его, когда задан api. |
serve.max_targets | GETDR_SERVE_MAX_TARGETS | – | 10000 | Целей в одном POST /dr. |
Длительности задаются в днях с суффиксом d (7d, 1.5d) или в формате Go (36h, 90m, 30s). getdr config show выводит все итоговые значения и для каждого источник. У секретов (key, serve.token) видны только последние 4 символа.
Другие переменные окружения, которые читает getdr:
NO_COLORотключает цвета в карточке.TERM=dumbили локаль без UTF-8 вLC_ALL,LC_CTYPEилиLANGдают карточку в простом ASCII.COLUMNSзадаёт ширину карточки, если терминал её не сообщает.HOME,XDG_CONFIG_HOMEиXDG_CACHE_HOMEзадают, где по умолчанию лежат файлы.HTTP_PROXY,HTTPS_PROXYиNO_PROXYучитываются. Если вы работаете через прокси и указали вapiсервер getdr из локальной сети, добавьте этот сервер вNO_PROXY.
07 Кеш и история
Каждая проверка хранится отдельной строкой (домен, версия, DR, дата). По этой истории карточка рисует тренд, и по ней же считается delta. Значение считается свежим, пока последней проверке меньше ttl (для ответа «нет данных» меньше ttl_none); потом getdr запрашивает его заново. Значения dr3 и dr4 хранятся раздельно. Цели, по которым не пришёл ответ, в кеш не попадают.
getdr cache purge удаляет проверки старше max_age, но последнюю по каждому домену оставляет всегда. getdr cache stats показывает путь и размер файла, сколько в нём проверок и доменов, самую старую и самую новую проверку. getdr cache clear удаляет все проверки. CLI и сервер могут одновременно работать с одним файлом кеша.
08 HTTP API
getdr serve поднимает перед Ahrefs небольшой HTTP API с общим кешем. Запустите его один раз с ключом Ahrefs и направьте на него CLI, скрипты и агентов. Свой ключ им не нужен, а повторные проверки отдаются из кеша.
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'Каждый ответ содержит заголовок Server: getdr/<version> (index-pages.com). Ошибки приходят в JSON: {"error":"…"}. Если задан токен, /dr и /stats требуют Authorization: Bearer <token> и без него отвечают 401. /, /healthz и /teapot открыты всегда.
| Метод | Путь | Что делает |
|---|---|---|
| GET | /dr?target=x.com | Одна запись с результатом. Необязательные параметры: version=dr3, fresh=1 (мимо кеша), raw=1 (без нормализации). |
| POST | /dr | Много целей в одном запросе, ответ в виде {"results":[…]}. |
| GET | /healthz | 200 ok простым текстом. |
| GET | /stats | Размер кеша, доля попаданий, запросы к Ahrefs за последний час. |
| GET | / | Название, версия и ссылки на эту документацию. |
POST /dr принимает ровно четыре поля:
{"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}
]}Цели нормализуются, дубликаты убираются, результаты идут в порядке целей. Сервер разбивает работу на пакеты для Ahrefs, до 1000 целей в каждом, и соблюдает лимит запросов. Клиент может попросить fresh, но TTL сервера изменить не может. Из-за невалидных целей запрос не падает: они возвращаются в обычном ответе 200, где dr и checked_at равны null.
| HTTP | Когда |
|---|---|
| 400 | Нет target, невалидный version, невалидный JSON, неизвестное поле или данные после JSON-объекта, нет ни одной валидной цели. |
| 401 | Токен обязателен, а его нет или он неверный. |
| 404 | Неизвестный путь. |
| 405 | Неверный метод, в том числе HEAD /dr, который никогда не запускает проверку. |
| 413 | Больше max_targets целей (по умолчанию 10000). |
| 503 | У сервера нет ключа Ahrefs, или Ahrefs его отклонил. |
Ответ /stats выглядит так. lookups считает цели с момента запуска сервера, rows равно числу сохранённых проверок, 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
}Если несколько клиентов одновременно запрашивают один и тот же домен и версию, сервер делает для всех один запрос к Ahrefs. CLI обращается к серверу так:
getdr --api http://lan-host:8080 --token s3cret -f domains.txtТо же работает через api и serve.token в файле конфигурации или через GETDR_API и GETDR_SERVE_TOKEN. CLI отправляет один POST /dr с целями, которых не покрывает его собственный кеш, и передаёт --fresh дальше. Переменные прокси действуют и на этот запрос, поэтому сервер из локальной сети добавьте в NO_PROXY.
09 AI-агенты
MCP-сервер getdr-mcp даёт один инструмент, get_dr. Сам он к Ahrefs не обращается, а спрашивает сервер getdr или бинарник getdr. Он работает через stdio, не имеет зависимостей во время выполнения и требует Node.js 18 или новее. Добавьте его в Claude Desktop, Claude Code, Cursor или другой MCP-клиент:
{
"mcpServers": {
"getdr": {
"command": "npx",
"args": ["-y", "getdr-mcp"]
}
}
}В таком виде используется бинарник getdr из вашего PATH с его собственными конфигом, кешем и ключом. Чтобы вместо него обращаться к серверу getdr в вашей сети, добавьте "env": {"GETDR_API": "http://lan-host:8080", "GETDR_SERVE_TOKEN": "s3cret"}. MCP-сервер сначала проверяет GETDR_API, потом бинарник; если нет ни того, ни другого, инструмент возвращает ошибку с инструкцией по настройке.
| Аргумент | Тип | Описание |
|---|---|---|
targets | string[] | Обязательный, непустой. Домены или URL. |
version | "dr3" | "dr4" | Формула DR, по умолчанию dr3. Всегда передаётся явно, поэтому сервер или конфиг с dr4 на неё не влияют. |
fresh | boolean | Не смотреть в кеш и запросить заново. |
Инструмент возвращает JSON-массив записей и после него строку атрибуции. Клиенты на протоколе MCP 2025-06-18 или новее получают ещё и structuredContent с outputSchema. Если по части целей ответ не пришёл, результат всё равно возвращается со всеми записями и примечанием, где эти цели перечислены.
В getdr-skill лежат SKILL.md и bash-скрипт, они подойдут любому агенту, который загружает Agent Skills. Для Claude Code:
git clone https://github.com/index-pages/getdr-skill ~/.claude/skills/getdrСкрипт scripts/dr.sh берёт первый доступный бэкенд: сервер getdr из GETDR_API, затем бинарник getdr из PATH, затем напрямую бесплатный эндпоинт Ahrefs с GETDR_KEY или AHREFS_KEY. Если нет ничего из этого, он завершается с кодом 3 и даёт ссылку на получение бесплатного ключа. Ему нужны bash, curl и jq 1.6 или новее; если бинарник установлен, хватит одного bash. Какой бы бэкенд ни сработал, на выходе тот же NDJSON.
10 Атрибуция и приватность
Данные Domain Rating предоставляет Ahrefs, и на них распространяется Domain Rating License, которая требует атрибуцию «Domain Rating by Ahrefs». getdr выводит её в подвале карточки, а для машинных форматов один раз за запуск в stderr, но никогда в stdout (-q её отключает). Сохраняйте её, когда публикуете цифры. getdr не связан с Ahrefs.
getdr подключается только к двум адресам: api.ahrefs.com и серверу getdr, указанному в api. В нём нет телеметрии, проверки обновлений и аналитики, а редиректы на любые другие хосты он отклоняет. Каждый запрос уходит с таким User-Agent:
getdr/<version> (+https://index-pages.com/getdr)
Это можно проверить по исходникам: все исходящие запросы делаются в internal/ahrefs и internal/remote. getdr-mcp подключается только к серверу из GETDR_API, а иначе запускает бинарник. Скрипт скилла обращается к GETDR_API или api.ahrefs.com и передаёт ключи в curl через временный файл с правами 600, никогда через командную строку.
11 Кто его делает
getdr делает Index Pages. Наш основной продукт, сервис индексации URL, отправляет страницы в Google, Bing, Yandex и ещё 10+ поисковых систем, а из этих индексов берут ответы ChatGPT, Claude, Perplexity и AI Overviews. Проверка DR подсказывает, с каких доменов стоит получать ссылки. Index Pages доводит до индекса страницы, на которых эти ссылки стоят.
О сервисе рассказывает главная страница, а его REST API для скриптов и агентов описан на странице API. Об ошибках и идеях для getdr пишите в GitHub issues.