Defensas antibot

Cuando un objetivo ejecuta una comprobación de bots en el camino a la página que solicitaste, FourA te avisa. Cada request que encuentra una vuelve con un campo que nombra el sistema, si la comprobación fue superada y (en caso de superarla) la autorización que puedes repetir para que la siguiente llamada la omita.

Esta página es la referencia para esos campos. Para la estrategia, consulta Manejo de protección anti-bots.

Dónde vive el campo

Endpoint Campo Presente cuando
POST /api/single/ defense (objeto) Se reconoció una comprobación de bots en el response
POST /api/proxy/ defense (objeto) Igual, reportado por el intento que respondió
POST /api/browser/ defenseSolved (booleano) y defenses (objeto) Se reconoció una comprobación de bots durante la carga de la página
POST /api/auto/ meta.solved (booleano) Siempre. true cuando se superó una comprobación en algún lugar de la escalera.

Su ausencia significa que no se reconoció nada. No interpretes un defense faltante como un fallo.

El reporte necesita unblocker, que está activado por defecto. Con unblocker: false pediste la página exactamente como llegó, así que Single devuelve el desafío intacto y Browser lo renderiza sin resolver.

defense en Single y Proxy

{
  "status": 200,
  "data": "<!doctype html>...",
  "total_time": 3.61,
  "defense": {
    "vendor": "sgcaptcha",
    "solved": true,
    "present": ["sgcaptcha"],
    "ms": 3412,
    "hashes": 1048576,
    "complexity": 20,
    "cookie": "_I_=<clearance>"
  }
}
Campo Tipo Descripción
vendor string El sistema del que trata este registro: el que se resolvió o el principal que se encontró. Consulta la lista de proveedores a continuación.
solved boolean true significa que la comprobación se resolvió y data es la página real. false significa que data puede ser la página del desafío.
present string[] Todos los sistemas reconocidos en esta response. Puede contener más nombres que vendor, y puede contener nombres que todavía nadie resuelve.
ms number Milisegundos empleados en resolver la comprobación. Solo en una resolución.
hashes number Cuánto trabajo computacional solicitó el desafío. Solo en una resolución.
complexity number La dificultad que declaró el desafío. Solo en una resolución, y solo donde el desafío informa una.
answers number Cuántas respuestas aceptadas se suministraron, para desafíos que requieren varias en lugar de una. Solo en una resolución.
cookie string La autorización que obtuvo la resolución, lista para reproducirse. Solo en una resolución.

solved: false es el caso en el que vale la pena bifurcar. FourA nunca presenta un desafío sin resolver como contenido, por lo que la bandera es tu señal de que el cuerpo necesita escalarse en lugar de analizarse.

defenses en el navegador

{
  "status": 200,
  "body": "<!doctype html>...",
  "userAgent": "Mozilla/5.0...",
  "defenseSolved": true,
  "defenses": {
    "present": ["cloudflare"],
    "cleared": ["cloudflare"]
  }
}
Campo Tipo Descripción
defenseSolved boolean true cuando se encontró un sistema durante la carga y su autorización se mantiene en la página final. Esta es la bandera que decide si la llamada cuesta 15 o 30 créditos.
defenses.present string[] Cada sistema reconocido en cualquier punto durante la carga de la página, no solo en la respuesta final. Una comprobación es algo que sucedió, y para cuando llega la página real, la respuesta al desafío hace tiempo que desapareció.
defenses.cleared string[] Los sistemas cuya autorización contiene la página final.

Un nombre en present que nunca llega a cleared es un sistema que FourA puede reconocer pero aún no puede superar. Estos nunca aumentan el precio de una llamada.

Proveedores

Valor de vendor El sistema
cloudflare Desafíos de Cloudflare y gestión de bots
sgcaptcha Comprobación de sitio de SiteGround
datadome DataDome
perimeterx PerimeterX
akamai Akamai Bot Manager
incapsula Imperva Incapsula
awswaf Desafío de AWS WAF
ebay-splashui Desafío propio de eBay
hcaptcha hCaptcha
recaptcha reCAPTCHA

Qué se supera hoy

Endpoint Supera
Single, Proxy sgcaptcha, ebay-splashui. Ambos son computacionales en lugar de visuales, por lo que no interviene un navegador.
Browser cloudflare, sgcaptcha

Todo lo demás en la lista se reconoce e informa, y nada más. Esa división cambia a medida que FourA aprende a superar más de ellos, así que lee solved en lugar de asumir a partir de esta tabla.

Dos notas sobre casos extremos:

  • hcaptcha y recaptcha también son widgets de formulario comunes. Solo se informan cuando la respuesta realmente te bloqueó (403, 429 o 503), por lo que una página de pago con un campo CAPTCHA en un formulario no informa de una defensa.
  • Estar detrás de Cloudflare no es una defensa. cloudflare aparece cuando hay un desafío real o un artefacto de gestión de bots en la respuesta, no porque un sitio use Cloudflare.

Reproducir una autorización

defense.cookie es el propósito principal del campo. Una autorización está vinculada a la salida que la obtuvo y al User-Agent que la obtuvo, por lo que si la reproduces a través del mismo par, la comprobación no se vuelve a ejecutar.

import requests

API = "https://eu.api.foura.ai"
H = {"X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json"}

# 1) First call pays for the clear.
first = requests.post(f"{API}/api/proxy/", headers=H, json={
    "maxTries": 5,
    "request": {"method": "GET", "url": "https://example.com/catalog"},
}).json()

defense = first.get("defense", {})
if defense.get("solved"):
    clearance = defense["cookie"]
    exit_id = first["proxy"]

    # 2) Follow-up pages skip the check: same exit, same clearance.
    for page in range(2, 6):
        r = requests.post(f"{API}/api/single/", headers=H, json={
            "method": "GET",
            "url": f"https://example.com/catalog?page={page}",
            "proxy": exit_id,
            "headers": [["Cookie", clearance]],
        }).json()
        print(page, r["status"])

La primera llamada asume el costo del desbloqueo. Cada repetición es una request normal al precio normal.

Tres cosas rompen una repetición:

  1. Una salida diferente. Fija el ID del proxy que devolvió la respuesta de desbloqueo. Consulta Reutilizar un proxy en varias solicitudes.
  2. Un User-Agent diferente. Las respuestas de Browser devuelven el userAgent que usaron. Envíalo de vuelta con la cookie.
  3. Caducidad. Los desbloqueos tienen sus propios tiempos de vida, establecidos por el objetivo. El de SiteGround dura alrededor de 30 días para todo el sitio; un desbloqueo de Cloudflare suele ser mucho más corto. Trata un desbloqueo como una caché: cuando las repeticiones empiecen a devolver desafíos de nuevo, ejecuta una nueva llamada y toma el nuevo.

Cuánto cuesta

Un desafío desbloqueado cambia el precio solo en Browser:

Motor Base Defensa desbloqueada
Single 1 (2 con unblocker) Sin cambios
Proxy 5 (10 con unblocker) Sin cambios
Browser 15 30

Browser cobra 30 solo cuando el solver estaba activado y un sistema fue genuinamente desbloqueado. Un sistema que fue reconocido y no desbloqueado cuesta 15, lo mismo que una página sin ningún desafío.

Combínalo con validate

defense te dice que se encontró un desafío. validate le dice a FourA cómo se ve la página real, que es lo que permite que una request falle en lugar de entregarte un intersticial que casualmente tiene HTTP 200.

{
  "method": "GET",
  "url": "https://example.com/product/42",
  "validate": {
    "data": {"accept": ["Add to cart"], "fail": ["Just a moment"]}
  }
}

En POST /api/auto/, validate es lo que evita que la escalera acepte una página de desafío y dé el proceso por terminado.

Relacionado

Actualizado: 12 de agosto de 2026