Інструмент перевірки беклінків: скрипти, які можна планувати
Кожен запит тут працює через 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 body. Розділяти комами нижче — це лише приклад; спочатку протестуйте з двома доменами. 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 кредити | Список анкорних текстів |
| Перевірка портфоліо | compare | 1 кредит за виклик, до 20 доменів | Порівняння метрик поруч |

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

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