Tool voor het controleren van backlinks: scripts die je kunt plannen
Elke aanroep hier werkt met curl of elke HTTP-client. Vervang de key, behoud het patroon: aanroep, opslaan, diff.
ArchiLinks onderzoeksteam ·

Grondregels
Eén aanroep, één factuur. Elke request wordt één keer gefactureerd ongeacht het aantal rijen, en één aanroep retourneert maximaal 1.000 rijen. Diepe paginering stopt bij 50.000 rijen, en per accepteert waarden van 10 tot 5.000.
Dat verandert hoe je scripts schrijft. Vraag om per=1000 en pagina alleen wanneer je meer nodig hebt, omdat een tool voor het controleren van backlinks die op kleine pagina's is gebouwd, vermenigvuldigt je kosten met tien zonder winst. Fouten zijn duidelijk: HTTP 401 voor een ontbrekende key, 402 wanneer credit op is, en elke JSON-body bevat ok.
Voer elk script één keer handmatig uit tegen een klein domein en lees de JSON. De veldnamen, de rijcontainer en de paginatievelden moeten afkomstig zijn van een echte response, niet van onze voorbeelden, dus bevestig ze voordat een cron-job erop vertrouwt.
Python: een gedateerde snapshot opslaan
Veldnamen in de response worden als voorbeeld getoond. Print één response voordat je vertrouwt op een key.
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: bulk Domain Rating voor een lijst
bulk_dr accepteert maximaal 2.000 domeinen voor 1 credit per aanroep, via GET met een domains-parameter of via POST-body. De komma-scheiding hieronder is een voorbeeld; test eerst met twee domeinen. Node 18 of hoger heeft fetch ingebouwd.
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 en jq: wekelijkse diff
Sla een snapshot op met de datum, vergelijk dan twee bestanden. Houd de cron wekelijks of maandelijks; de index wordt ongeveer maandelijks ververst.
# 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 -50Welke actie voor welk script
| Script | Actie | Kosten per run | Output |
|---|---|---|---|
| Migratie-baseline | toppages, refdomains | 4 credits | Twee JSON-bestanden |
| Outreach-opruiming | bulk_dr | 1 credit per aanroep, tot 2.000 domeinen | DR per prospect |
| Concurrentie-overlap | intersect | 2 credits | Sites die naar 2–10 domeinen linken |
| Ankerbewaking | anchors | 2 credits | Lijst met anchor text |
| Portfoliocontrole | compare | 1 credit per aanroep, tot 20 domeinen | Metrics naast elkaar |

Randgevallen afhandelen
Scripts falen bij de randgevallen. Plan daarop in.
Wikkel elke aanroep in een retry die wacht en opgeeft na drie pogingen, behalve voor 401 en 402, die een retry nooit zal oplossen. Log het _credits-object van elke geauthenticeerde response, zodat een piek in de uitgaven zichtbaar wordt in je logs voordat deze zichtbaar wordt in je saldo, en beperk loops met een harde maximumaantal pagina's.
Bewaar snapshots in git of object storage met de datum in de bestandsnaam. Eenvoudig, saai, effectief. Voor migraties, combineer deze scripts met het redirect map recipe en de migration checklist. Gebruikers van Google Sheets kunnen dezelfde URL's aanroepen vanuit Apps Script met UrlFetchApp, en een sheet met een maandelijkse trigger is een perfect goede monitor.
Vragen over scripts
Drie vragen komen vaker voor voordat de meeste scripts live gaan, en elk heeft een kort antwoord.
Hoe controleer ik hoeveel backlinks mijn site heeft, gratis?
Roep de overview- of stats-actie aan zonder key. Beide zijn gratis en retourneren de totalen uit onze eigen link index.
Voor de lijsten achter de totalen heb je een key en 2 credits per aanroep nodig.
Wat gebeurt er als het saldo op is?
De API retourneert HTTP 402. Je script moet stoppen en alarmeren, niet blijven retryen in een loop. Laad op van de accountpagina met USDT (TRC-20) en voer opnieuw uit.
Kan ik het aanroepen vanuit een browser?
Ja. CORS is open. Zet een key echter niet in publieke front-end code, omdat iedereen deze kan lezen en je credit kan uitgeven.

Paginering zonder credits te verspillen
Paginering is waar scripts stil meer kosten dan ze zouden moeten. Elke pagina-aanroep is een aparte aanroep met een eigen kostenpost, dus een loop die één pagina te veel vraagt, betaalt voor niets.
Lees de paginatievelden in één echte response voordat je de loop schrijft. De voorbeelden op deze site tonen de structuur, maar de namen en het stopsignaal komen uit de live JSON.
Stoppen als een pagina kort is
Een pagina met minder rijen dan je vroeg is meestal de laatste. Laat de loop daar stoppen in plaats van een extra pagina aan te vragen om zeker te zijn.
Als de response een total- of next-page-veld bevat, gebruik dat dan als stopsignaal. Tel de rijen die je hebt opgeslagen er tegen af, zodat een mismatch zichtbaar wordt in de log.
Beperk elke loop
Stel een harde maximum in voor pagina's in elke loop. Een cap beschermt je saldo als een veldnaam verandert en het script blijft dezelfde pagina aanfragen.
Kies de cap uit de grootte die je verwacht, en verhoog deze opzettelijk wanneer een echt domein meer pagina's nodig heeft.
Schrijf elke pagina zodra deze aankomt
Sla elke pagina op schijf zodra deze terugkomt, met het paginanummer in de bestandsnaam. Een script dat stopt op pagina veertig kan hervatten vanaf het laatst opgeslagen bestand in plaats van opnieuw te beginnen en dubbel te betalen.
Houd de bestanden in één map per domein en per datum, zodat een rerun nooit twee pulls mengt.
Scripts plannen uitvoeren
Elke scheduler werkt. Wat telt is dat elke run een bestand achterlaat, en dat een mislukte run iemand op de hoogte stelt.
Een host kiezen voor de taak
Cron past bij een server met een schijf die je beheert. Een CI-job past bij een repository die de snapshots al bewaart, zodat de geschiedenis naast de code leeft die deze leest.
Wat je ook kiest, bewaar de domeinlijst in een bestand, zodat het toevoegen van een domein een bewerking is in plaats van een wijziging in het script.
Alarmeren bij falen, niet bij elk succes
Alarm wanneer het script faalt, of wanneer het saldo onder een door jou gekozen niveau zakt. Een succesmelding elke ochtend leert mensen het kanaal te negeren dat het echte probleem draagt.
Log het _credits-object van elke run, zoals het Python-voorbeeld doet, en bekijk de trend één keer per maand.
Een wekelijkse diff in vijf stappen
Kies de acties
Kies de twee of drie calls die je vraag beantwoorden. Elke call kost credits, dus schrijf de kosten er naast.
Sla de raw response op
Bewaar de JSON exact zoals deze aankwam, met het domein en de datum in de bestandsnaam. Formatteren kan wachten tot de diff-stap.
Sorteer keys voordat je vergelijkt
Gebruik jq -S of een equivalent, zodat de key-volgorde niet als een wijziging wordt weergegeven. Het bash-voorbeeld hierboven doet dit.
Vergelijk de lijsten, niet de bestanden
Join de twee responses op de URL of domein, en rapporteer wat is toegevoegd, verwijderd en gewijzigd. Een raw text diff van een lang bestand is moeilijk om actie op te ondernemen.
Beoordeel de diff en handel
Stuur verwijderde linking domeinen naar degene die verantwoordelijk is voor outreach, en verwijderde pagina's naar degene die verantwoordelijk is voor redirects.
Een script testen voordat een cron-job erop vertrouwt
Een script dat onbegeleid draait, moet zichzelf eerst bewijzen. Gebruik één klein domein, lees de volledige JSON, en verbreed pas daarna de lijst.
E snelle sanity check is om de totalen te vergelijken met de gratis overview-call voor hetzelfde domein. De cijfers hoeven niet exact overeen te komen met een betaalde lijst, maar ze moeten overeenkomen in schaal.
Uitvoeren met twee domeinen
Twee domeinen testen de loop, de bestandsnamen en de foutpaden. Eén domein kan per ongeluk slagen, terwijl twee laten zien of de loop reset tussen domeinen.
Gebruik één domein dat je goed kent en één die je niet kent, zodat je kunt beoordelen of de output er goed uitziet.
Houd de key buiten logs en tickets
Scripts printen vaak het volledige request-adres, en de key zit in dat adres als parameter. Verwijder de key uit elke regel die de server verlaat, of stuur hem in de Authorization-header, wat hem buiten het adres houdt.
Als een key zichtbaar wordt in een ticket of een openbare repository, stop dan de geplande job die deze gebruikt voordat de volgende run.
Bewaar een korte notitie van waar de key leeft, welke scripts deze lezen en welke hosts ze aanroepen. Die notitie heb je nodig als iemand vraagt wie het saldo kan uitgeven.
De actie kiezen voor elke vraag
Begin bij de vraag, niet bij de endpoint-lijst. Een migratie moet weten welke URLs links bevatten, terwijl een outreach-lijst domeinscores nodig heeft. Één host, twee vragen. Elke kost een ander aantal credits.
Schrijf de kosten naast de vraag voordat je code schrijft. Een script dat wekelijks draait, vermenigvuldigt een kleine prijs met vijfenvijftig, en die vermenigvuldiging is makkelijk vergeten totdat het saldo het laat zien.
Retries die stoppen wanneer ze moeten
Probeer een request die faalde om een tijdelijke reden, zoals een timeout of een serverfout, een klein aantal keren opnieuw met een groeiende pauze tussen pogingen. Probeer een 401 of 402 niet opnieuw, omdat wachten geen van beide antwoorden zal veranderen.
Log elke retry met de actie en het domein, zodat een patroon van fouten zichtbaar wordt als een patroon in plaats van stilte.
Stel het retry-aantal op één plek in, zodat elke call in het script dezelfde regel volgt. Verspreide retry-loops tend to het oneens met elkaar, en het oneens is moeilijk te vinden in een log.