Herramienta para verificar backlinks: scripts que puedes programar
Cada llamada aquí funciona con curl o cualquier cliente HTTP. Reemplaza la clave, mantén el patrón: llamar, guardar, diff.
Equipo de investigación de ArchiLinks ·

Normas básicas
Una llamada, una factura. Cada solicitud se cobra una vez sin importar el número de filas, y una sola llamada devuelve hasta 1.000 filas. La paginación profunda se detiene en 50.000 filas, y per acepta valores de 10 a 5.000.
Esto cambia cómo escribes los scripts. Pide per=1000 y pagina solo cuando necesites más, porque una herramienta de verificación de backlinks basada en páginas pequeñas multiplica tu coste por diez sin ningún beneficio. Los errores son claros: HTTP 401 por falta de clave, 402 cuando se agotan los créditos, y cada cuerpo JSON incluye ok.
Ejecuta cada script una vez manualmente contra un dominio pequeño y lee el JSON. Los nombres de los campos, el contenedor de filas y los campos de paginación deben provenir de una respuesta real, no de nuestros ejemplos, así que confírmalos antes de que un trabajo cron dependa de ellos.
Python: guardar una instantánea con fecha
Los nombres de los campos en la respuesta se muestran como ejemplo. Imprime una respuesta antes de confiar en una clave.
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 en masa para una lista
bulk_dr acepta hasta 2.000 dominios por 1 crédito por llamada, mediante GET con un parámetro de dominios o mediante cuerpo POST. El separador de coma a continuación es un ejemplo; prueba primero con dos dominios. Node 18 o posterior tiene fetch integrado.
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 y jq: diff semanal
Guarda una instantánea con la fecha, luego compara dos archivos. Mantén el cron semanal o mensual; el índice se actualiza aproximadamente cada mes.
# 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 -50Qué acción para cada script
| Script | Acción | Coste por ejecución | Salida |
|---|---|---|---|
| Línea base de migración | toppages, refdomains | 4 créditos | Dos archivos JSON |
| Limpieza de outreach | bulk_dr | 1 crédito por llamada, hasta 2.000 dominios | DR por prospecto |
| Superposición de competidores | intersect | 2 créditos | Sitios que enlazan a 2–10 dominios |
| Vigilancia de anchors | anchors | 2 créditos | Lista de anchor text |
| Verificación de portfolio | compare | 1 crédito por llamada, hasta 20 dominios | Métricas lado a lado |

Manejo de los casos extremos
Los scripts fallan en los casos extremos. Planifícalos.
Envuelve cada llamada en un reintento que espere y se rinda después de tres intentos, excepto para 401 y 402, que un reintento nunca solucionará. Registra el objeto _credits de cada respuesta autenticada, para que un pico en el gasto aparezca en tus registros antes de que aparezca en tu saldo, y limita los bucles con un número máximo de páginas.
Guarda las instantáneas en git o almacenamiento de objetos con la fecha en el nombre del archivo. Simple, aburrido, efectivo. Para migraciones, combina estos scripts con la receta de mapa de redirecciones y la lista de verificación de migración. Los usuarios de Google Sheets pueden llamar a las mismas URLs desde Apps Script con UrlFetchApp, y una hoja con un activador mensual es un monitor perfectamente válido.
Preguntas sobre scripts
Tres preguntas surgen antes de que la mayoría de los scripts se pongan en producción, y cada una tiene una respuesta corta.
¿Cómo verifico cuántos backlinks tiene mi sitio, gratis?
Llama a la acción de resumen o estadísticas sin clave. Ambas son gratuitas y devuelven los totales de nuestro propio índice de enlaces.
Para las listas detrás de los totales, necesitas una clave y 2 créditos por llamada.
¿Qué sucede cuando se agota el saldo?
La API devuelve HTTP 402. Tu script debe detenerse y alertar, no reintentar en un bucle. Recarga desde la página de la cuenta con USDT (TRC-20) y vuelve a ejecutar.
¿Puedo llamarlo desde un navegador?
Sí. CORS está abierto. Sin embargo, no pongas una clave en el código front-end público, ya que cualquiera puede leerla y gastar tus créditos.

Paginación sin desperdiciar créditos
La paginación es donde los scripts cuestan silenciosamente más de lo debido. Cada solicitud de página es una llamada separada con su propio cargo, por lo que un bucle que pide una página de más paga por nada.
Lee los campos de paginación en una respuesta real antes de escribir el bucle. Los ejemplos en este sitio muestran la forma, pero los nombres y la señal de parada provienen del JSON en vivo.
Detente cuando una página devuelva menos filas
Una página con menos filas de las que pediste suele ser la última. Deja que el bucle se detenga allí en lugar de solicitar una página extra para estar seguro.
Si la respuesta contiene un total o un campo de página siguiente, úsalo como señal de parada. Cuenta las filas que has guardado contra él, para que una discrepancia aparezca en el registro.
Limita cada bucle
Establece un máximo estricto de páginas en cada bucle. Un límite protege tu saldo si un nombre de campo cambia y el script sigue pidiendo la misma página.
Elige el límite según el tamaño que esperas, luego súbelo deliberadamente cuando un dominio real necesite más páginas.
Escribe cada página a medida que llega
Guarda cada página en disco tan pronto como llegue, con el número de página en el nombre del archivo. Un script que se detiene en la página cuarenta puede reanudar desde el último archivo guardado en lugar de empezar de nuevo y pagar dos veces.
Mantén los archivos en una carpeta por dominio y por fecha, para que una reejecución nunca mezcle dos extracciones.
Ejecutar los scripts en un horario
Cualquier programador servirá. Lo importante es que cada ejecución deje un archivo atrás, y que una ejecución fallida avise a alguien.
Elegir un host para la tarea
Cron se adapta a un servidor con un disco que controlas. Un trabajo de CI se adapta a un repositorio que ya guarda las instantáneas, para que el historial viva junto al código que lo lee.
Independientemente de lo que elijas, mantén la lista de dominios en un archivo, para que añadir un dominio sea una edición en lugar de un cambio en el script.
Alertar en caso de fallo, no en cada éxito
Alerta cuando el script falle, o cuando el saldo caiga por debajo de un nivel que hayas elegido. Un mensaje de éxito cada mañana entrena a las personas para ignorar el canal que contiene el problema real.
Registra el objeto _credits de cada ejecución, como hace el ejemplo de Python, y revisa la tendencia una vez al mes.
Un diff semanal en cinco pasos
Elige las acciones
Elige las dos o tres llamadas que respondan a tu pregunta. Cada una cuesta créditos, así que escribe el coste junto a ella.
Guarda la respuesta cruda
Almacena el JSON exactamente como llegó, con el dominio y la fecha en el nombre del archivo. El formateo puede esperar hasta el paso de diff.
Ordena las claves antes de comparar
Usa jq -S o un equivalente, para que el orden de las claves no aparezca como un cambio. El ejemplo de bash anterior hace esto.
Compara las listas, no los archivos
Une las dos respuestas en la URL o dominio, luego reporta lo que se añadió, eliminó y cambió. Un diff de texto crudo de un archivo largo es difícil de actuar.
Revisa el diff y actúa
Envía los dominios que enlazan eliminados a quien gestione el outreach, y las páginas eliminadas a quien gestione las redirecciones.
Probar un script antes de que un trabajo cron dependa de él
Un script que se ejecute sin supervisión debe demostrarse primero. Usa un dominio pequeño, lee el JSON completo, y solo entonces amplía la lista.
Una verificación rápida de integridad es comparar los totales con la llamada de resumen gratuita para el mismo dominio. Los números no necesitan coincidir exactamente con una lista pagada, pero deben concordar en escala.
Ejecuta con dos dominios
Dos dominios prueban el bucle, los nombres de archivo y las rutas de error. Un dominio puede pasar por suerte, mientras que dos muestran si el bucle se reinicia entre dominios.
Usa un dominio que conozcas bien y uno que no conozcas, para que puedas juzgar si la salida parece correcta.
Mantén la clave fuera de los registros y tickets
Los scripts a menudo imprimen la dirección completa de la solicitud, y la clave está en esa dirección como parámetro. Elimina la clave de cualquier línea que salga del servidor, o envíala en el encabezado Authorization, lo que la mantiene fuera de la dirección.
Si una clave aparece en un ticket o un repositorio público, detén el trabajo programado que la usa antes de la próxima ejecución.
Mantén una nota breve de dónde vive la clave, qué scripts la leen y qué hosts llaman. Esa nota es lo que necesitas cuando alguien pregunte quién puede gastar el saldo.
Elegir la acción para cada pregunta
Empieza por la pregunta, no por la lista de endpoints. Una migración necesita saber qué URLs llevan enlaces, mientras que una lista de outreach necesita puntuaciones de dominio. Un host, dos preguntas. Cada una cuesta un número diferente de créditos.
Escribe el coste junto a la pregunta antes de escribir cualquier código. Un script que se ejecuta semanalmente multiplica un pequeño precio por cincuenta y dos, y esa multiplicación es fácil de olvidar hasta que el saldo lo muestre.
Reintentos que se detienen cuando deben
Reintenta una solicitud que falló por una razón temporal, como un tiempo de espera o un error del servidor, un número pequeño de veces con una pausa creciente entre intentos. No reintentes un 401 o un 402, ya que esperar no cambiará ninguna de las respuestas.
Registra cada reintento con la acción y el dominio, para que un patrón de fallos aparezca como un patrón en lugar de como silencio.
Establece el número de reintentos en un solo lugar, para que cada llamada en el script siga la misma regla. Los bucles de reintento dispersos tienden a discrepar entre sí, y la discrepancia es difícil de encontrar en un registro.