Orpheus Docs Obtener una clave de API

Documentación de la API

Envía una URL y tu proxy. Orpheus detecta el desafío anti-bot, lo supera y te devuelve la página — con una sesión que puedes reutilizar en las siguientes peticiones.

URL base https://orpheus-api.lapetiteagora.fr

Inicio rápido

  1. Inicia sesión en la consola y crea una clave de API en la pestaña Claves de API. Cópiala: solo se muestra una vez.
  2. Ten a mano un proxy residencial o ISP sticky (que mantenga la misma IP de salida al menos 10 minutos).
  3. Llama a POST /v1/fetch con la URL y el proxy.
curl -X POST https://orpheus-api.lapetiteagora.fr/v1/fetch \
  -H "Authorization: Bearer $LPA_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.example.com/",
    "proxy": "http://user:pass@proxy.example:8080"
  }'

Pon en tu cliente un timeout de unos 70 segundos: superar un desafío puede llevar unos segundos, a veces más.

Autenticación

Cada petición lleva tu clave de API en el header Authorization:

HTTP
Authorization: Bearer lpa_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Las claves se crean y se revocan en la consola. Trátalas como contraseñas: guárdalas en el servidor, nunca en un navegador ni en un repositorio público. Una clave revocada, o una cuenta suspendida, recibe 401 invalid_key de inmediato.

Obtener una página

POST/v1/fetch

Cuerpo de la petición (JSON)

CampoTipoDescripción
urlobligatoriostringLa página que quieres obtener, en http o https.
proxystringObligatorio para iniciar una sesión. http://user:pass@host:port, https://… o socks5://…. Omítelo (o envía el mismo valor) cuando pases un session_id.
session_idstringReutiliza una sesión devuelta por una llamada anterior. Consulta Sesiones.
methodstringGET (por defecto), POST, PUT, PATCH, DELETE, HEAD u OPTIONS.
headersobjectHeaders adicionales de la petición, como cadenas {"Name": "value"}. Los headers del navegador (User-Agent, client hints…) ya vienen puestos.
bodystringCuerpo de la petición para POST/PUT/PATCH.
body_encodingstringtext (por defecto) o base64 para un cuerpo binario.
cookiesobject · arrayCookies que se añaden a la sesión antes de la petición. Consulta Cookies.
presetstringHuella del navegador, fijada al crear la sesión. Por defecto chrome-latest-windows (mantenla salvo que sepas por qué cambiarla).

Respuesta

La API responde 200 en cuanto el sitio de destino ha respondido — sea cual sea el estado que devuelva el sitio. Ese estado lo lees en status.

200 OK
{
  "status": 200,
  "headers": { "content-type": ["text/html; charset=utf-8"] },
  "body": "<!doctype html>…",
  "encoding": "text",
  "url": "https://www.example.com/",
  "session_id": "s_Ij4oudr1bYPzUA8U3sdlACAf",
  "solved": ["datadome"],
  "cookies": [{ "name": "datadome", "value": "…", "domain": ".example.com", "path": "/" }],
  "elapsed_ms": 2343
}
CampoDescripción
statusEstado HTTP devuelto por el sitio de destino.
headersHeaders de la respuesta; cada valor es una lista de cadenas.
body · encodingLa página. encoding es text (UTF-8) o base64 para contenido binario (imágenes, PDF…).
urlURL final, después de las redirecciones.
session_idReenvíalo para mantener la misma identidad. También se devuelve con la mayoría de los errores.
solvedProtecciones superadas durante esta llamada: akamai, datadome, incapsula, kasada, cloudflare, ticketmaster. Vacío cuando no había nada que superar.
cookiesTodas las cookies de la sesión después de la llamada.
elapsed_msTiempo empleado por nuestra parte, incluida la resolución.

Sesiones

Las cookies anti-bot están ligadas a la identidad de navegador que las obtuvo: IP, huella, almacén de cookies. Una sesión conserva esa identidad por ti, así que un desafío superado una vez sigue superado.

  • La primera llamada (con un proxy, sin session_id) crea una sesión y devuelve su session_id.
  • Envía ese session_id en las siguientes llamadas: mismo proxy, misma huella, mismas cookies. Las páginas siguientes suelen llegar en unos cientos de milisegundos, con solved: [].
  • Una sesión caduca tras 30 minutos sin peticiones. Cada petición la prolonga.
  • Una sesión conserva su proxy toda su vida. Enviar un proxy distinto con un session_id devuelve 409 proxy_mismatch: inicia una sesión nueva en su lugar.
  • Una petición a la vez por sesión. Una segunda petición simultánea espera hasta 10 segundos y luego recibe 409 session_busy. Para ir más rápido, usa varias sesiones en paralelo, cada una con su propio proxy.
import os, requests

API = "https://orpheus-api.lapetiteagora.fr/v1/fetch"
HEADERS = {"Authorization": f"Bearer {os.environ['LPA_KEY']}"}

def fetch(**payload):
    r = requests.post(API, headers=HEADERS, json=payload, timeout=70)
    data = r.json()
    if r.status_code != 200:
        raise RuntimeError(data["error"])
    return data

# 1. Primero la página de inicio: crea la sesión y supera el desafío
home = fetch(url="https://www.shop.example/", proxy="http://user:pass@proxy.example:8080")

# 2. Luego la página del producto, con la misma identidad
product = fetch(
    url="https://www.shop.example/product/42",
    session_id=home["session_id"],
    headers={"Referer": "https://www.shop.example/"},
)
print(product["status"], product["solved"])

Cookies

Inicia una sesión con cookies que ya tengas (un login, un carrito, una elección de consentimiento), o añádelas más tarde. Se guardan en la sesión y se envían en cada petición siguiente hasta que el sitio las sustituya.

Forma simple

Un objeto {"name": "value"}. Las cookies se asignan al host de la url.

JSON
{
  "url": "https://www.shop.example/cart",
  "proxy": "http://user:pass@proxy.example:8080",
  "cookies": { "cart_id": "42", "lang": "fr" }
}

Forma detallada

Una lista de objetos, para elegir el domain (p. ej. .shop.example para todos los subdominios) o el path (por defecto /).

JSON
{
  "url": "https://www.shop.example/",
  "session_id": "s_…",
  "cookies": [
    { "name": "auth", "value": "eyJ…", "domain": ".shop.example", "path": "/" }
  ]
}
  • Hasta 50 cookies por petición, 4096 caracteres por valor, sin ; ni saltos de línea en los valores.
  • Una cookie con el mismo nombre, dominio y ruta sustituye a la anterior.
  • Cada respuesta devuelve las cookies de la sesión en cookies, para que puedas reutilizarlas en otro sitio.
  • Los valores de las cookies nunca se escriben en tu registro de peticiones.
!

Las cookies anti-bot están ligadas a una identidad. Una cookie datadome o cf_clearance obtenida desde otra IP u otro navegador normalmente será rechazada. Deja que Orpheus las obtenga en la sesión.

Errores

Los errores usan un estado distinto de 200 y siempre la misma forma. Cuando existe una sesión, se incluye su session_id.

422
{
  "error": { "code": "proxy_blocked", "message": "…" },
  "session_id": "s_…"
}
EstadoCódigoQué hacer
400invalid_requestCorrige la petición: falta url, falta proxy para una sesión nueva, campo no válido, dirección privada o inaccesible.
401invalid_keyClave ausente, incorrecta o revocada, o cuenta suspendida.
402quota_exceededCuota mensual alcanzada. Se reinicia el día 1 (UTC).
404session_not_foundLa sesión caducó (30 min de inactividad) o se cerró. Inicia una nueva.
409proxy_mismatchUna sesión conserva su proxy. Inicia una sesión nueva para otro proxy.
409session_busyOtra petición está usando esta sesión. Espera o usa otra sesión.
413response_too_largeLa página supera los 5 MB.
422proxy_blockedEl sitio ha bloqueado esta IP. Cambia de proxy e inicia una sesión nueva.
429too_many_concurrentDemasiadas peticiones en curso para tu cuenta. Reintenta cuando termine alguna.
502challenge_failedNo se pudo superar el desafío. Reintenta una vez; si persiste, cambia de proxy.
502solver_error · transport_errorProblema temporal del solver o de la red (a menudo el proxy). Reintenta tras una breve espera.
504timeoutNo hubo respuesta a tiempo. Reintenta; la sesión sigue siendo utilizable.
500internal_errorProblema nuestro. Reintenta y avísanos si persiste.
✓

Regla práctica para reintentar: reintenta los 429, 502, 504 y 500 con un backoff corto. Nunca reintentes un 422 en la misma sesión: cambia de proxy.

Límites

LímiteValor
Peticiones mensuales (beta)20.000 por cuenta, se reinician el día 1 (UTC). Cuenta toda llamada a /v1/fetch que llegue al sitio, aunque luego falle la resolución; las llamadas rechazadas de entrada (400, 401, 402, 404, 409, 429) no cuentan.
Peticiones simultáneas5 por cuenta por defecto (consulta tu pestaña Cuenta).
Tiempo por peticiónUnos 55 segundos, resolución incluida.
Tamaño de la respuesta5 MB de contenido de la página.
Duración de una sesión30 minutos después de la última petición.
Cookies50 por petición, 4096 caracteres por valor.

El consumo, los desafíos superados y tus últimas peticiones están en la consola.

Otros endpoints

GET/v1/usage

Peticiones usadas este mes, tu cuota y el desglose diario de los últimos 30 días (peticiones, éxitos, errores, bytes, resoluciones por protección).

curl
curl -s https://orpheus-api.lapetiteagora.fr/v1/usage -H "Authorization: Bearer $LPA_KEY"
DELETE/v1/sessions/{session_id}

Cierra una sesión de inmediato (si no, caduca sola). Devuelve {"deleted": true}, o 404 si ya no existe.

curl
curl -s -X DELETE https://orpheus-api.lapetiteagora.fr/v1/sessions/s_… -H "Authorization: Bearer $LPA_KEY"

Buenas prácticas

  • Solo proxies sticky. Un proxy rotativo cambia de IP entre peticiones e invalida las cookies que acabas de obtener. Apunta a sesiones de 10 minutos o más.
  • Una sesión por identidad. Reutilízala para todas las páginas de un mismo recorrido; abre más sesiones (con más proxies) para escalar.
  • Navega con naturalidad. Carga primero la página de inicio o de categoría y luego la del producto con un header Referer. Los accesos directos a páginas profundas se marcan más a menudo.
  • No machaques una sola sesión. Supera el desafío con una petición y sigue; evita ráfagas desde la misma IP.
  • Ante proxy_blocked, aparca la sesión y su proxy durante un tiempo; una IP quemada sigue quemada.
  • Respeta los sitios a los que accedes. Eres responsable de cumplir sus condiciones y las leyes que te aplican.