Orpheus Doku API-Schlüssel holen

API-Dokumentation

Schick eine URL und deinen Proxy. Orpheus erkennt die Anti-Bot-Challenge, löst sie und gibt dir die Seite zurück — mit einer Session, die du für die nächsten Requests wiederverwenden kannst.

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

Schnellstart

  1. Melde dich in der Konsole an und erstelle im Tab API-Schlüssel einen API-Schlüssel. Kopiere ihn: Er wird nur einmal angezeigt.
  2. Halte einen Sticky-Proxy bereit, Residential oder ISP (eine Exit-IP, die mindestens 10 Minuten bleibt).
  3. Ruf POST /v1/fetch mit der URL und dem Proxy auf.
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"
  }'

Stell in deinem Client ein Timeout von etwa 70 Sekunden ein: Das Lösen einer Challenge kann ein paar Sekunden dauern, manchmal länger.

Authentifizierung

Jeder Request trägt deinen API-Schlüssel im Header Authorization:

HTTP
Authorization: Bearer lpa_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Schlüssel werden in der Konsole erstellt und widerrufen. Behandle sie wie Passwörter: Bewahre sie serverseitig auf, nie in einem Browser oder einem öffentlichen Repository. Ein widerrufener Schlüssel oder ein gesperrtes Konto bekommt sofort 401 invalid_key.

Eine Seite abrufen

POST/v1/fetch

Request-Body (JSON)

FeldTypBeschreibung
urlPflichtstringDie abzurufende Seite, http oder https.
proxystringPflicht, um eine Session zu starten. http://user:pass@host:port, https://… oder socks5://…. Lass ihn weg (oder schick denselben Wert), wenn du eine session_id mitgibst.
session_idstringVerwendet eine Session wieder, die ein früherer Aufruf zurückgegeben hat. Siehe Sessions.
methodstringGET (Standard), POST, PUT, PATCH, DELETE, HEAD oder OPTIONS.
headersobjectZusätzliche Request-Header als Strings {"Name": "value"}. Die Browser-Header (User-Agent, Client Hints…) sind bereits gesetzt.
bodystringRequest-Body für POST/PUT/PATCH.
body_encodingstringtext (Standard) oder base64 für einen binären Body.
cookiesobject · arrayCookies, die vor dem Request zur Session hinzugefügt werden. Siehe Cookies.
presetstringBrowser-Fingerprint, festgelegt beim Erstellen der Session. Standard chrome-latest-windows (behalte ihn, solange du keinen guten Grund hast).

Antwort

Die API antwortet mit 200, sobald die Zielseite geantwortet hat — egal, welchen Status die Seite selbst liefert. Diesen Status liest du in 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
}
FeldBeschreibung
statusHTTP-Status, den die Zielseite zurückgegeben hat.
headersResponse-Header; jeder Wert ist eine Liste von Strings.
body · encodingDie Seite. encoding ist text (UTF-8) oder base64 für binäre Inhalte (Bilder, PDF…).
urlFinale URL, nach Weiterleitungen.
session_idSchick sie zurück, um dieselbe Identität zu behalten. Wird auch bei den meisten Fehlern zurückgegeben.
solvedIn diesem Aufruf gelöste Schutzmechanismen: akamai, datadome, incapsula, kasada, cloudflare, ticketmaster. Leer, wenn nichts gelöst werden musste.
cookiesAlle Cookies der Session nach dem Aufruf.
elapsed_msZeit auf unserer Seite, inklusive Lösen.

Sessions

Anti-Bot-Cookies sind an die Browser-Identität gebunden, die sie erhalten hat: IP, Fingerprint, Cookie-Jar. Eine Session hält diese Identität für dich fest — eine einmal gelöste Challenge bleibt gelöst.

  • Der erste Aufruf (mit proxy, ohne session_id) erstellt eine Session und gibt ihre session_id zurück.
  • Schick diese session_id bei den nächsten Aufrufen mit: derselbe Proxy, derselbe Fingerprint, dieselben Cookies. Weitere Seiten kommen meist in wenigen hundert Millisekunden zurück, mit solved: [].
  • Eine Session läuft nach 30 Minuten ohne Requests ab. Jeder Request verlängert sie.
  • Eine Session behält ihren Proxy, solange sie lebt. Ein anderer proxy zusammen mit einer session_id ergibt 409 proxy_mismatch: Starte stattdessen eine neue Session.
  • Ein Request gleichzeitig pro Session. Ein zweiter, paralleler Request wartet bis zu 10 Sekunden und bekommt dann 409 session_busy. Für mehr Tempo lässt du mehrere Sessions parallel laufen, jede mit eigenem 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. Zuerst die Startseite: erstellt die Session und löst die Challenge
home = fetch(url="https://www.shop.example/", proxy="http://user:pass@proxy.example:8080")

# 2. Dann die Produktseite, mit derselben Identität
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

Starte eine Session mit Cookies, die du schon hast (ein Login, ein Warenkorb, eine Consent-Auswahl), oder füge später welche hinzu. Sie werden in der Session gespeichert und bei jedem folgenden Request mitgeschickt, bis die Seite sie ersetzt.

Einfache Form

Ein Objekt {"name": "value"}. Die Cookies werden für den Host der url gesetzt.

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

Ausführliche Form

Eine Liste von Objekten, um die domain (z. B. .shop.example für alle Subdomains) oder den path (Standard /) festzulegen.

JSON
{
  "url": "https://www.shop.example/",
  "session_id": "s_…",
  "cookies": [
    { "name": "auth", "value": "eyJ…", "domain": ".shop.example", "path": "/" }
  ]
}
  • Bis zu 50 Cookies pro Request, 4.096 Zeichen pro Wert, kein ; und keine Zeilenumbrüche in Werten.
  • Ein Cookie mit gleichem Namen, gleicher Domain und gleichem Pfad ersetzt das vorherige.
  • Jede Antwort liefert die Cookies der Session in cookies zurück, damit du sie anderswo wiederverwenden kannst.
  • Cookie-Werte werden nie in deine Request-Logs geschrieben.
!

Anti-Bot-Cookies sind an eine Identität gebunden. Ein datadome- oder cf_clearance-Cookie, das von einer anderen IP oder einem anderen Browser stammt, wird meist abgelehnt. Lass Orpheus sie stattdessen in der Session holen.

Fehler

Fehler haben einen Status ungleich 200 und immer dieselbe Form. Wenn eine Session existiert, ist ihre session_id enthalten.

422
{
  "error": { "code": "proxy_blocked", "message": "…" },
  "session_id": "s_…"
}
StatusCodeWas tun
400invalid_requestKorrigiere den Request: url fehlt, proxy fehlt für eine neue Session, ungültiges Feld, private oder nicht erreichbare Adresse.
401invalid_keySchlüssel fehlt, ist falsch oder widerrufen, oder das Konto ist gesperrt.
402quota_exceededMonatskontingent erreicht. Es wird am 1. des Monats (UTC) zurückgesetzt.
404session_not_foundDie Session ist abgelaufen (30 Min. inaktiv) oder wurde geschlossen. Starte eine neue.
409proxy_mismatchEine Session behält ihren Proxy. Starte für einen anderen Proxy eine neue Session.
409session_busyEin anderer Request nutzt diese Session. Warte oder nimm eine andere Session.
413response_too_largeDie Seite ist größer als 5 MB.
422proxy_blockedDie Seite hat diese IP gesperrt. Wechsle den Proxy und starte eine neue Session.
429too_many_concurrentZu viele laufende Requests für dein Konto. Versuch es erneut, sobald einer fertig ist.
502challenge_failedDie Challenge konnte nicht gelöst werden. Versuch es einmal erneut; wenn es bleibt, wechsle den Proxy.
502solver_error · transport_errorVorübergehendes Problem beim Solver oder im Netzwerk (oft der Proxy). Versuch es nach kurzer Pause erneut.
504timeoutKeine Antwort in der vorgesehenen Zeit. Versuch es erneut; die Session bleibt nutzbar.
500internal_errorProblem auf unserer Seite. Versuch es erneut und sag uns Bescheid, wenn es bleibt.
✓

Faustregel für Retries: Wiederhole 429, 502, 504 und 500 mit kurzem Backoff. Wiederhole nie einen 422 in derselben Session: Wechsle den Proxy.

Limits

LimitWert
Requests pro Monat (Beta)20.000 pro Konto, Reset am 1. des Monats (UTC). Jeder Aufruf von /v1/fetch, der die Seite erreicht, zählt — auch wenn das Lösen danach scheitert; vorab abgelehnte Aufrufe (400, 401, 402, 404, 409, 429) zählen nicht.
Parallele RequestsStandardmäßig 5 pro Konto (siehe deinen Tab Konto).
Zeit pro RequestEtwa 55 Sekunden, inklusive Lösen.
Größe der Antwort5 MB Seiteninhalt.
Lebensdauer einer Session30 Minuten nach dem letzten Request.
Cookies50 pro Request, 4.096 Zeichen pro Wert.

Verbrauch, gelöste Challenges und deine letzten Requests findest du in der Konsole.

Weitere Endpoints

GET/v1/usage

Die in diesem Monat verbrauchten Requests, dein Kontingent und die tägliche Aufschlüsselung der letzten 30 Tage (Requests, Erfolge, Fehler, Bytes, Lösungen pro Schutzmechanismus).

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

Schließt eine Session sofort (sonst läuft sie von selbst ab). Gibt {"deleted": true} zurück, oder 404, wenn sie nicht mehr existiert.

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

Best Practices

  • Nur Sticky-Proxys. Ein rotierender Proxy wechselt die IP zwischen Requests und macht die gerade erhaltenen Cookies ungültig. Plane Sessions von 10 Minuten oder mehr ein.
  • Eine Session pro Identität. Nutze sie für alle Seiten eines Ablaufs; öffne zum Skalieren mehr Sessions (mit mehr Proxys).
  • Surf natürlich. Lade zuerst die Start- oder Kategorieseite, dann die Produktseite mit einem Referer-Header. Direkte Aufrufe tiefer Seiten werden häufiger markiert.
  • Hämmer nicht auf eine Session ein. Löse die Challenge mit einem Request und mach dann weiter; vermeide Bursts von derselben IP.
  • Bei proxy_blocked leg die Session und ihren Proxy eine Weile beiseite; eine verbrannte IP bleibt verbrannt.
  • Respektiere die Seiten, die du aufrufst. Du bist dafür verantwortlich, ihre Nutzungsbedingungen und die für dich geltenden Gesetze einzuhalten.