Documentation de l'API
Envoyez une URL et votre proxy. Orpheus détecte le challenge anti-bot, le franchit et vous rend la page — avec une session réutilisable pour les requêtes suivantes.
Démarrage rapide
- Connectez-vous à la console et créez une clé d'API dans l'onglet Clés d'API. Copiez-la : elle n'est affichée qu'une seule fois.
- Prévoyez un proxy résidentiel ou ISP sticky (une même IP de sortie conservée au moins 10 minutes).
- Appelez
POST /v1/fetchavec l'URL et le 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" }'
import os, requests resp = requests.post( "https://orpheus-api.lapetiteagora.fr/v1/fetch", headers={"Authorization": f"Bearer {os.environ['LPA_KEY']}"}, json={ "url": "https://www.example.com/", "proxy": "http://user:pass@proxy.example:8080", }, timeout=70, ) page = resp.json() print(page["status"], page["solved"], page["session_id"])
const resp = await fetch("https://orpheus-api.lapetiteagora.fr/v1/fetch", { method: "POST", headers: { Authorization: `Bearer ${process.env.LPA_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ url: "https://www.example.com/", proxy: "http://user:pass@proxy.example:8080", }), }); const page = await resp.json(); console.log(page.status, page.solved, page.session_id);
Réglez le timeout de votre client à 70 secondes environ : franchir un challenge peut prendre quelques secondes, parfois plus.
Authentification
Chaque requête porte votre clé d'API dans le header Authorization :
Authorization: Bearer lpa_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Les clés se créent et se révoquent dans la console. Traitez-les comme des mots de passe : gardez-les côté serveur, jamais dans un navigateur ni dans un dépôt public. Une clé révoquée, ou un compte suspendu, reçoit immédiatement 401 invalid_key.
Récupérer une page
Corps de la requête (JSON)
| Champ | Type | Description |
|---|---|---|
urlobligatoire | string | La page à récupérer, en http ou https. |
proxy | string | Obligatoire pour démarrer une session. http://user:pass@host:port, https://… ou socks5://…. Omettez-le (ou renvoyez la même valeur) quand vous passez un session_id. |
session_id | string | Réutilise une session renvoyée par un appel précédent. Voir Sessions. |
method | string | GET (par défaut), POST, PUT, PATCH, DELETE, HEAD ou OPTIONS. |
headers | object | Headers supplémentaires, sous forme de chaînes {"Name": "value"}. Les headers du navigateur (User-Agent, client hints…) sont déjà en place. |
body | string | Corps de la requête pour POST/PUT/PATCH. |
body_encoding | string | text (par défaut) ou base64 pour un corps binaire. |
cookies | object · array | Cookies à ajouter à la session avant la requête. Voir Cookies. |
preset | string | Empreinte de navigateur, fixée à la création de la session. Par défaut chrome-latest-windows (gardez-la sauf raison précise). |
Réponse
L'API répond 200 dès que le site cible a répondu — quel que soit le statut renvoyé par le site. Lisez ce statut dans status.
{
"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
}| Champ | Description |
|---|---|
status | Statut HTTP renvoyé par le site cible. |
headers | Headers de la réponse ; chaque valeur est une liste de chaînes. |
body · encoding | La page. encoding vaut text (UTF-8) ou base64 pour un contenu binaire (images, PDF…). |
url | URL finale, après redirections. |
session_id | Renvoyez-le pour garder la même identité. Également renvoyé avec la plupart des erreurs. |
solved | Protections franchies pendant cet appel : akamai, datadome, incapsula, kasada, cloudflare, ticketmaster. Vide quand il n'y avait rien à franchir. |
cookies | Tous les cookies de la session après l'appel. |
elapsed_ms | Temps passé de notre côté, franchissement compris. |
Sessions
Les cookies anti-bot sont liés à l'identité de navigateur qui les a obtenus : IP, empreinte, jar de cookies. Une session conserve cette identité pour vous : un challenge franchi une fois le reste.
- Le premier appel (avec un
proxy, sanssession_id) crée une session et renvoie sonsession_id. - Renvoyez ce
session_idaux appels suivants : même proxy, même empreinte, mêmes cookies. Les pages suivantes reviennent généralement en quelques centaines de millisecondes, avecsolved: []. - Une session expire après 30 minutes sans requête. Chaque requête la prolonge.
- Une session garde son proxy jusqu'au bout. Envoyer un autre
proxyavec unsession_idrenvoie409 proxy_mismatch: démarrez plutôt une nouvelle session. - Une requête à la fois par session. Une deuxième requête simultanée attend jusqu'à 10 secondes, puis reçoit
409 session_busy. Pour aller plus vite, lancez plusieurs sessions en parallèle, chacune avec son propre 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. D'abord la page d'accueil : crée la session et franchit le challenge home = fetch(url="https://www.shop.example/", proxy="http://user:pass@proxy.example:8080") # 2. Puis la page produit, avec la même identité 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"])
# 1. Page d'accueil : notez le session_id de la réponse curl -s -X POST https://orpheus-api.lapetiteagora.fr/v1/fetch \ -H "Authorization: Bearer $LPA_KEY" -H "Content-Type: application/json" \ -d '{"url":"https://www.shop.example/","proxy":"http://user:pass@proxy.example:8080"}' # 2. Page produit sur la même session curl -s -X POST https://orpheus-api.lapetiteagora.fr/v1/fetch \ -H "Authorization: Bearer $LPA_KEY" -H "Content-Type: application/json" \ -d '{"url":"https://www.shop.example/product/42","session_id":"s_…", "headers":{"Referer":"https://www.shop.example/"}}'
Erreurs
Les erreurs ont un statut différent de 200 et toutes la même forme. Quand une session existe, son session_id est inclus.
{
"error": { "code": "proxy_blocked", "message": "…" },
"session_id": "s_…"
}| Statut | Code | Que faire |
|---|---|---|
| 400 | invalid_request | Corrigez la requête : url manquante, proxy manquant pour une nouvelle session, champ invalide, adresse privée ou injoignable. |
| 401 | invalid_key | Clé absente, erronée ou révoquée, ou compte suspendu. |
| 402 | quota_exceeded | Quota mensuel atteint. Il est remis à zéro le 1er du mois (UTC). |
| 404 | session_not_found | La session a expiré (30 min d'inactivité) ou a été fermée. Démarrez-en une nouvelle. |
| 409 | proxy_mismatch | Une session garde son proxy. Démarrez une nouvelle session pour un autre proxy. |
| 409 | session_busy | Une autre requête utilise cette session. Patientez, ou utilisez une autre session. |
| 413 | response_too_large | La page dépasse 5 Mo. |
| 422 | proxy_blocked | Le site a bloqué cette IP. Changez de proxy et démarrez une nouvelle session. |
| 429 | too_many_concurrent | Trop de requêtes en cours pour votre compte. Réessayez dès que l'une d'elles se termine. |
| 502 | challenge_failed | Le challenge n'a pas pu être franchi. Réessayez une fois ; si ça persiste, changez de proxy. |
| 502 | solver_error · transport_error | Problème temporaire du solveur ou du réseau (souvent le proxy). Réessayez après un court délai. |
| 504 | timeout | Pas de réponse à temps. Réessayez ; la session reste utilisable. |
| 500 | internal_error | Problème de notre côté. Réessayez, et prévenez-nous si ça persiste. |
Règle simple pour réessayer : réessayez les 429, 502, 504 et 500 avec un court backoff. Ne réessayez jamais un 422 sur la même session : changez de proxy.
Limites
| Limite | Valeur |
|---|---|
| Requêtes par mois (bêta) | 20 000 par compte, remises à zéro le 1er du mois (UTC). Tout appel à /v1/fetch qui atteint le site compte, même si le franchissement échoue ensuite ; les appels refusés d'emblée (400, 401, 402, 404, 409, 429) ne comptent pas. |
| Requêtes simultanées | 5 par compte par défaut (voir votre onglet Compte). |
| Durée par requête | Environ 55 secondes, franchissement compris. |
| Taille de la réponse | 5 Mo de contenu de page. |
| Durée de vie d'une session | 30 minutes après la dernière requête. |
| Cookies | 50 par requête, 4 096 caractères par valeur. |
Consommation, challenges franchis et dernières requêtes sont dans la console.
Autres endpoints
Requêtes consommées ce mois-ci, votre quota et le détail jour par jour des 30 derniers jours (requêtes, succès, erreurs, octets, franchissements par protection).
curl -s https://orpheus-api.lapetiteagora.fr/v1/usage -H "Authorization: Bearer $LPA_KEY"Ferme une session immédiatement (sinon elle expire d'elle-même). Renvoie {"deleted": true}, ou 404 si elle n'existe plus.
curl -s -X DELETE https://orpheus-api.lapetiteagora.fr/v1/sessions/s_… -H "Authorization: Bearer $LPA_KEY"Bonnes pratiques
- Uniquement des proxies sticky. Un proxy rotatif change d'IP entre deux requêtes et invalide les cookies que vous venez d'obtenir. Visez des sessions de 10 minutes ou plus.
- Une session par identité. Réutilisez-la pour toutes les pages d'un même parcours ; ouvrez plus de sessions (avec plus de proxies) pour monter en charge.
- Naviguez naturellement. Chargez d'abord la page d'accueil ou de catégorie, puis la page produit avec un header
Referer. Les accès directs à des pages profondes sont plus souvent signalés. - Ne martelez pas une session. Franchissez le challenge avec une requête, puis continuez ; évitez les rafales depuis la même IP.
- Sur
proxy_blocked, abandonnez la session et son proxy pendant un moment ; une IP grillée reste grillée. - Respectez les sites que vous consultez. Il vous revient de respecter leurs conditions d'utilisation et les lois qui s'appliquent à vous.