Инструмент проверки обратных ссылок на сайт: скрипты, которые можно запланировать
Каждый вызов здесь работает через curl или любой HTTP-клиент. Замените ключ, сохраняя шаблон: вызов, сохранение, сравнение.
Исследовательская команда ArchiLinks ·

Основные правила
Один вызов — один счет. Каждый запрос оплачивается один раз независимо от количества строк, а один вызов возвращает до 1 000 строк. Глубокая пагинация останавливается на 50 000 строках, а параметр per принимает значения от 10 до 5 000.
Это меняет подход к написанию скриптов. Запрашивайте per=1000 и переходите на следующую страницу только при необходимости, так как инструмент проверки обратных ссылок на сайт, построенный на мелких страницах, умножает ваши расходы в десять раз без какой-либо пользы. Ошибки понятны: HTTP 401 при отсутствии ключа, 402 при исчерпании кредитов, и каждый JSON-ответ содержит поле ok.
Запустите каждый скрипт вручную для небольшого домена и изучите JSON. Имена полей, контейнер строк и поля пагинации должны быть взяты из реального ответа, а не из наших примеров, поэтому подтвердите их, прежде чем полагаться на них в cron-задаче.
Python: сохранение снимка с датой
Имена полей в ответе приведены в качестве примера. Выведите один ответ, прежде чем полагаться на ключ.
import json, sys, datetime, requests
BASE = "https://archilinks.com/api.php"
KEY = "sk_live_..."
def snapshot(domain, action="refdomains"):
r = requests.get(BASE, params={"action": action, "q": domain, "per": 1000, "key": KEY}, timeout=30)
if r.status_code in (401, 402):
sys.exit(f"API said {r.status_code}: check key or balance")
r.raise_for_status()
body = r.json()
assert body.get("ok"), body
name = f"{domain}-{action}-{datetime.date.today()}.json"
json.dump(body, open(name, "w"), indent=1)
print(name, body.get("_credits"))
snapshot(sys.argv[1])Node: пакетный расчет Domain Rating для списка
bulk_dr принимает до 2 000 доменов за 1 кредит на вызов, через GET с параметром domains или через тело POST-запроса. Разделитель запятой ниже является примером; сначала протестируйте с двумя доменами. Node 18 и выше имеет встроенный fetch.
const domains = ["example.com", "example.org"];
const url = new URL("https://archilinks.com/api.php");
url.search = new URLSearchParams({
action: "bulk_dr",
domains: domains.join(","),
key: "sk_live_...",
});
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(JSON.stringify(await res.json(), null, 2));Bash и jq: еженедельное сравнение
Сохраните снимок с датой, затем сравните два файла. Делайте cron-запуск еженедельно или ежемесячно; индекс обновляется примерно раз в месяц.
# crontab: 0 6 1 * * /opt/seo/pull.sh old-shop.com
curl -s "https://archilinks.com/api.php?action=refdomains&q=$1&per=1000&key=$KEY" \
| jq -S . > "snap-$1-$(date +%F).json"
# compare two dated files
diff <(jq -S . snap-old-shop.com-2026-09-01.json) <(jq -S . snap-old-shop.com-2026-10-01.json) | head -50Какой действие для какого скрипта
| Скрипт | Действие | Стоимость за запуск | Вывод |
|---|---|---|---|
| Базовый снимок при миграции | toppages, refdomains | 4 кредита | Два JSON-файла |
| Очистка базы для аутрича | bulk_dr | 1 кредит за вызов, до 2 000 доменов | DR для каждого кандидата |
| Пересечение с конкурентами | intersect | 2 кредита | Сайты, ссылающиеся на 2–10 доменов |
| Контроль анкоров | anchors | 2 кредита | Список anchor text |
| Проверка портфолио | compare | 1 кредит за вызов, до 20 доменов | Сравнение метрик |

Обработка крайних случаев
Скрипты падают на крайних случаях. Запланируйте их обработку.
Оберните каждый вызов в повторную попытку с ожиданием и выходом после трех попыток, за исключением 401 и 402, которые повторная попытка никогда не исправит. Логируйте объект _credits из каждого аутентифицированного ответа, чтобы всплеск расходов отображался в логах до того, как проявится в балансе, и ограничивайте циклы жестким максимальным количеством страниц.
Храните снимки в git или объектном хранилище с датой в имени файла. Просто, скучно, эффективно. Для миграций используйте эти скрипты вместе с рецептом карты редиректов и чек-листом миграции. Пользователи Google Sheets могут вызывать те же URL из Apps Script с помощью UrlFetchApp, и таблица с ежемесячным триггером — вполне хороший монитор.
Вопросы по скриптам
Три вопроса возникают до того, как большинство скриптов выходят в продакшн, и на каждый есть короткий ответ.
Как бесплатно проверить количество обратных ссылок на моем сайте?
Вызовите действие overview или stats без ключа. Оба бесплатны и возвращают общие данные из нашего собственного индекса ссылок.
Для получения списков за общими данными нужен ключ и 2 кредита за вызов.
Что происходит, когда баланс исчерпан?
API возвращает HTTP 402. Ваш скрипт должен остановиться и отправить уведомление, а не пытаться снова в бесконечном цикле. Пополните баланс на странице аккаунта с помощью USDT (TRC-20) и запустите скрипт заново.
Могу ли я вызывать API из браузера?
Да. CORS открыт. Однако не помещайте ключ в публичный фронтенд-код, так как любой может его прочитать и потратить ваши кредиты.

Пагинация без лишних трат кредитов
Пагинация — это то место, где скрипты незаметно тратят больше, чем должны. Каждый запрос страницы — это отдельный вызов с отдельной оплатой, поэтому цикл, запрашивающий одну страницу лишний раз, платит за ничего.
Прочитайте поля пагинации из одного реального ответа перед написанием цикла. Примеры на этом сайте показывают структуру, но имена и сигнал остановки приходят из живого JSON.
Останавливайтесь, когда страница возвращается неполной
Страница с меньшим количеством строк, чем вы запросили, обычно является последней. Позвольте циклу остановиться там, вместо того чтобы запрашивать дополнительную страницу для уверенности.
Если ответ содержит поле total или next-page, используйте его как сигнал остановки. Считайте сохраненные строки и сравнивайте с этим значением, чтобы несоответствие отображалось в логах.
Ограничивайте каждый цикл
Установите жесткий максимум страниц в каждом цикле. Лимит защищает ваш баланс, если имя поля изменится и скрипт продолжит запрашивать ту же страницу.
Выбирайте лимит исходя из ожидаемого размера, затем повышайте его осознанно, когда реальный домен требует больше страниц.
Записывайте каждую страницу по мере поступления
Сохраняйте каждую страницу на диск сразу после получения, указывая номер страницы в имени файла. Скрипт, остановившийся на сороковой странице, может продолжить с последнего сохраненного файла, а не начинать заново и платить дважды.
Храните файлы в одной папке для каждого домена и даты, чтобы повторный запуск никогда не смешивал два разных запроса.
Запуск скриптов по расписанию
Подойдет любой планировщик. Важно, чтобы каждый запуск оставлял файл, а сбой уведомлял кого-то.
Выбор хоста для задачи
Cron подходит для сервера с контролируемым диском. CI-задача подходит для репозитория, который уже хранит снимки, так что история живет рядом с кодом, который ее читает.
Каким бы вы ни выбрали вариант, храните список доменов в файле, чтобы добавление домена было редактированием, а не изменением скрипта.
Оповещение о сбое, а не об успехе
Оповещайте, когда скрипт падает или когда баланс падает ниже выбранного вами уровня. Сообщение об успехе каждое утро приучает людей игнорировать канал, в котором находится реальная проблема.
Логируйте объект _credits из каждого запуска, как в примере Python, и анализируйте тренд раз в месяц.
Еженедельное сравнение за пять шагов
Выберите действия
Выберите два или три вызова, которые отвечают на ваш вопрос. Каждый из них стоит кредитов, поэтому запишите стоимость рядом с ним.
Сохраните сырой ответ
Сохраните JSON точно таким, каким он пришел, с доменом и датой в имени файла. Форматирование можно отложить до шага сравнения.
Сортируйте ключи перед сравнением
Используйте jq -S или аналог, чтобы порядок ключей не отображался как изменение. Пример выше на bash делает именно это.
Сравнивайте списки, а не файлы
Объедините два ответа по URL или домену, затем сообщите, что было добавлено, удалено и изменено. Сырая текстовая разница длинного файла трудно поддается обработке.
Проверьте разницу и действуйте
Отправьте удаленные домены-доноры тому, кто занимается аутричем, а удаленные страницы — тому, кто отвечает за редиректы.
Тестирование скрипта перед тем, как cron-задача будет на него зависеть
Скрипт, работающий без присмотра, должен сначала доказать свою надежность. Используйте один небольшой домен, прочитайте полный JSON, и только затем расширяйте список.
Быстрая проверка на здравый смысл — сравнить общие данные с бесплатным вызовом overview для того же домена. Числа не должны точно совпадать с платным списком, но должны быть сопоставимы по масштабу.
Запустите с двумя доменами
Два домена тестируют цикл, имена файлов и пути ошибок. Один домен может пройти случайно, а два покажут, сбрасывается ли цикл между доменами.
Используйте один домен, который вы хорошо знаете, и один, который не знаете, чтобы оценить, выглядит ли вывод правильно.
Держите ключ вдали от логов и тикетов
Скрипты часто выводят полный адрес запроса, и ключ находится в этом адресе как параметр. Удалите ключ из любой строки, покидающей сервер, или отправляйте его в заголовке Authorization, чтобы он не попадал в адрес.
Если ключ появился в тикете или публичном репозитории, остановите запланированную задачу, которая его использует, до следующего запуска.
Ведите краткую заметку о том, где хранится ключ, какие скрипты его читают и на какие хосты они делают запросы. Эта заметка понадобится, когда кто-то спросит, кто может потратить баланс.
Выбор действия для каждого вопроса
Начинайте с вопроса, а не со списка конечных точек. Миграции нужно знать, какие URL содержат ссылки, а списки для аутрича — оценки доменов. Один хост, два вопроса. Каждый стоит разное количество кредитов.
Записывайте стоимость рядом с вопросом перед написанием кода. Скрипт, работающий еженедельно, умножает небольшую цену на пятьдесят два, и это умножение легко забыть, пока баланс не покажет это.
Повторные попытки, которые останавливаются, когда нужно
Повторяйте запрос, который завершился ошибкой по временной причине, например таймаутом или ошибкой сервера, несколько раз с увеличивающейся задержкой между попытками. Не повторяйте 401 или 402, так как ожидание не изменит ни один из ответов.
Логируйте каждую повторную попытку с действием и доменом, чтобы паттерн ошибок проявлялся как паттерн, а не как тишина.
Установите количество повторных попыток в одном месте, чтобы каждый вызов в скрипте следовал одному правилу. Разрозненные циклы повторных попыток часто расходятся, и это расхождение трудно найти в логах.