бесплатный инструмент · getdr

getdr: массовая проверка Ahrefs DR

Версия 0.1.0Лицензия MITПлатформы Linux · macOS · WindowsЦена бесплатно

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_KEYexport GETDR_KEY=KEY
AHREFS_KEYexport 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/pageURL сокращается до хоста.
getdr a.com b.com c.comНесколько целей, отсортированных по DR.
getdr -f domains.txtПо одной цели на строку; комментарии с # допускаются.
cat domains.txt | getdr > dr.tsvВ пайпе: домен и DR через табуляцию.
getdr -f domains.txt --format jsonNDJSON, по объекту на строку.
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Ошибка, невалидные цели или цели, по которым не пришёл ответ (таймаут, лимит запросов).
3API-ключа Ahrefs нет, или Ahrefs его отклонил.

05 Вывод

В терминале getdr выводит карточку. Если stdout направлен в пайп или файл, вывод переключается на tsv. --format и -b перекрывают оба варианта.

ФорматЧто получите
cardКрупное число, шкалу, тренд и сводку, для чтения человеком. Цвет зависит от DR: 0–19 серый, 20–39 жёлтый, 40–69 зелёный, 70+ синий.
tsvdomain<TAB>dr, без заголовка; если данных нет, DR пустой.
csvТе же колонки плюс строка заголовка.
jsonNDJSON, по записи на каждую цель.
-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, цель в том виде, в каком записана.
drDomain Rating, 0–100. null, если цель невалидна, Ahrefs не ответил или (редко) у Ahrefs нет данных.
versiondr3 или dr4. Значения двух формул между собой не сравнить.
checked_atКогда значение было получено, RFC 3339 UTC. null для невалидной цели или если ответа не было.
cachedtrue, если значение взято из кеша.

На домены, которых 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
НастройкаПеременнаяФлагПо умолчаниюОписание
keyGETDR_KEY, AHREFS_KEY--key–API-ключ Ahrefs.
apiGETDR_API--api–URL сервера getdr. Если задан, CLI обращается к нему, а не к Ahrefs.
versionGETDR_VERSION--versiondr3Версия DR, dr3 или dr4.
cache.pathGETDR_CACHE_PATH–~/.cache/getdr/cache.dbФайл кеша SQLite; $XDG_CACHE_HOME/getdr/, если эта переменная задана.
cache.ttlGETDR_CACHE_TTL--ttl7dСколько значение остаётся свежим.
cache.ttl_noneGETDR_CACHE_TTL_NONE–1dСколько остаётся свежим ответ «нет данных».
cache.max_ageGETDR_CACHE_MAX_AGE–30dОкно тренда; cache purge удаляет проверки старше.
ahrefs.batchGETDR_AHREFS_BATCH–1000Целей в одном запросе к Ahrefs, 1–1000.
ahrefs.rpmGETDR_AHREFS_RPM–40Запросов к Ahrefs в минуту.
ahrefs.timeoutGETDR_AHREFS_TIMEOUT–30sТаймаут одного запроса к Ahrefs.
ahrefs.retriesGETDR_AHREFS_RETRIES–3Повторы при 429, 5xx и сетевых ошибках.
serve.listenGETDR_SERVE_LISTEN--listen127.0.0.1:8080Адрес, на котором слушает getdr serve.
serve.tokenGETDR_SERVE_TOKEN--token–Bearer-токен, который требует сервер. CLI отправляет его, когда задан api.
serve.max_targetsGETDR_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/healthz200 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, потом бинарник; если нет ни того, ни другого, инструмент возвращает ошибку с инструкцией по настройке.

АргументТипОписание
targetsstring[]Обязательный, непустой. Домены или URL.
version"dr3" | "dr4"Формула DR, по умолчанию dr3. Всегда передаётся явно, поэтому сервер или конфиг с dr4 на неё не влияют.
freshbooleanНе смотреть в кеш и запросить заново.

Инструмент возвращает 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:

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.