Skip to Content
API-ReferenzÜbersicht

API-Referenz Übersicht

Vollständige Referenz für die SharpAPI v1 REST API. Alle Endpoints geben JSON zurück und folgen einheitlichen Konventionen für Authentifizierung, Filterung, Paginierung und Fehlerbehandlung.

Basis-URL

https://api.sharpapi.io/api/v1

Verwenden Sie immer api.sharpapi.io als Basis-URL, nicht sharpapi.io.

OpenAPI-Spezifikation

Die vollständige OpenAPI 3.1-Spezifikation steht zum Import in Tools wie Postman, Insomnia oder Code-Generatoren zur Verfügung:

Diese Spezifikation deckt alle Endpoints, Request-/Response-Schemas und Authentifizierungsanforderungen ab.

Request-Format

  • Alle Anfragen verwenden HTTPS
  • Authentifizierung über X-API-Key-Header, Authorization: Bearer-Header oder api_key-Query-Parameter
  • Request-Bodies (sofern zutreffend) verwenden JSON mit Content-Type: application/json
  • Alle Feldnamen sind in snake_case

Endpoint-Übersicht

SharpAPI bietet 35 Routen über 7 Namespaces hinweg, zuzüglich Referenz- und Health-Endpoints.

Odds

MethodePfadAuthMin. Tier
GET/api/v1/oddsJaFree
GET/api/v1/odds/deltaJaFree
GET/api/v1/odds/bestJaFree
GET/api/v1/odds/comparisonJaFree
POST/api/v1/odds/batchJaFree

Events

MethodePfadAuthMin. Tier
GET/api/v1/eventsJaFree
GET/api/v1/events/:eventIdJaFree
GET/api/v1/events/:eventId/oddsJaFree
GET/api/v1/events/:eventId/marketsJaFree

Opportunities

MethodePfadAuthMin. Tier
GET/api/v1/opportunities/evJaPro
GET/api/v1/opportunities/arbitrageJaHobby
GET/api/v1/opportunities/middlesJaPro

Splits

MethodePfadAuthMin. Tier
GET/api/v1/splitsJaPro
GET/api/v1/splits/historyJaPro

Streaming

MethodePfadAuthMin. Tier
GET/api/v1/streamJaAdd-on

Account

MethodePfadAuthMin. Tier
GET/api/v1/accountJaFree
GET/api/v1/account/usageJaFree
GET/api/v1/account/keysJaFree
POST/api/v1/account/keysJaFree
DELETE/api/v1/account/keys/:keyIdJaFree
POST/api/v1/account/keys/:keyId/rotateJaFree

Referenzdaten (öffentlich)

MethodePfadAuthMin. Tier
GET/api/v1/sportsNein-
GET/api/v1/leaguesNein-
GET/api/v1/sportsbooksNein-
GET/api/v1/marketsNein-
GET/api/v1/teamsNein-

Enterprise

MethodePfadAuthMin. Tier
GET/api/v1/futuresJaEnterprise
GET/api/v1/futures/oddsJaEnterprise

Health

MethodePfadAuthMin. Tier
GET/api/v1/healthNein-

Response-Format

Erfolgs-Envelope

Alle erfolgreichen Antworten verpacken Daten in einem konsistenten Envelope:

{ "success": true, "data": [ { "id": "draftkings_33483153_moneyline_PHO", "sportsbook": "draftkings", "sport": "basketball", "home_team": "PHI 76ers", "away_team": "PHO Suns", "market_type": "moneyline", "selection": "PHO Suns", "odds_american": -150, "odds_decimal": 1.667, "odds_probability": 0.60, "is_live": false } ], "pagination": { "limit": 50, "offset": 0, "has_more": true, "next_offset": 50, "next_cursor": "eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0" }, "meta": { "count": 1, "total": 3095, "pagination": { "limit": 50, "offset": 0, "has_more": true, "next_offset": 50, "next_cursor": "eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0" }, "updated_at": "2026-01-26T02:10:37.846Z", "filters": { "sportsbook": "draftkings", "league": "nba" } } }
FeldBeschreibung
successtrue für alle erfolgreichen Antworten
dataArray von Ergebnissen (oder einzelnes Objekt für Detail-Endpoints)
pagination.limitMaximale Anzahl von Elementen pro Seite (Standard: 50, Max: 200)
pagination.offsetAktueller Offset in den Ergebnissen
pagination.has_moreOb weitere Ergebnisse über diese Seite hinaus existieren
pagination.next_offsetOffset-Wert für die nächste Seite (veraltet — verwenden Sie next_cursor für Live-Daten-Endpoints)
pagination.next_cursorOpaker Cursor für die nächste Seite. Übergeben als ?cursor= — stabil gegenüber Live-Datenänderungen. Empfohlen für mehrseitige Scans.
meta.countAnzahl der in dieser Antwort zurückgegebenen Elemente
meta.totalGesamtanzahl übereinstimmender Elemente über alle Seiten hinweg
meta.paginationIdentisch mit dem pagination auf oberster Ebene (zur Abwärtskompatibilität enthalten)
meta.updated_atISO 8601-Zeitstempel der letzten Datenaktualisierung
meta.filtersEcho der auf diese Anfrage angewendeten Filter

Antwort für einzelne Ressource

{ "success": true, "data": { "id": "evt_abc123", "sport": "nba", "home_team": "PHI 76ers", "away_team": "PHO Suns", "start_time": "2026-01-26T19:00:00Z" }, "meta": { "updated_at": "2026-01-26T02:10:37.846Z" } }

Fehler-Envelope

Alle Fehler folgen einem einheitlichen Format:

{ "error": { "code": "rate_limited", "message": "Rate limit exceeded. Upgrade your plan or wait 45 seconds.", "docs": "https://docs.sharpapi.io/en/authentication#rate-limits" } }
FeldBeschreibung
error.codeMaschinenlesbarer Fehlercode
error.messageMenschenlesbare Beschreibung
error.docsLink zur relevanten Dokumentation (optional — enthalten bei Auth-, Tier-, Rate-Limit- und Streaming-Fehlern)
error.correct_endpointDer korrekte zu verwendende Endpoint (optional — enthalten bei unknown_endpoint-Fehlern, wenn die API den Pfad als bekannte falsche Route erkennt)
error.retry_afterSekunden bis ein Wiederholungsversuch erlaubt ist (optional — enthalten bei rate_limited-Fehlern)

Standard-Response-Header

Jede API-Antwort enthält diese Header:

HeaderBeispielBeschreibung
X-RateLimit-Limit300Maximale Anfragen pro Minute für Ihr Tier
X-RateLimit-Remaining299Verbleibende Anfragen im aktuellen Zeitfenster
X-RateLimit-Reset1705804800Unix-Zeitstempel, wann das Rate Limit zurückgesetzt wird
X-Data-Delay0Datenverzögerung in Sekunden (60 für Free, 0 für kostenpflichtige Tiers)
X-Request-Idreq_a1b2c3d4Eindeutige Anfrage-ID für Debugging und Support

Geben Sie den X-Request-Id-Wert an, wenn Sie sich bezüglich einer bestimmten Anfrage an den Support wenden.

Tier-Vergleich

FunktionFreeHobbyProSharpEnterprise
Sportsbooks2 (DK, FD)515Alle 32Alle 32
Datenverzögerung60s0s0s0s0s
Anfragen/Min121203001.000Individuell
PinnacleNeinNeinJaJaJa
EV / Arb / MiddlesNeinNeinJaJaJa
StreamingNeinAdd-onAdd-onAdd-onInklusive
Batch max. Events10105050100

Streaming erfordert das WebSocket-Add-on (99 USD/Monat) bei kostenpflichtigen Tiers. Enterprise enthält Streaming ohne Aufpreis.

Filterung

Alle Listen-Endpoints unterstützen Filterung über Query-Parameter. Filter verwenden singuläre Parameternamen und akzeptieren kommagetrennte Werte für Mehrfachauswahl.

Filter-Parameter

ParameterTypBeispielBeschreibung
sportsbookstringdraftkings,fanduelNach einem oder mehreren Sportsbooks filtern
sportstringbasketball,footballNach Sportart filtern
leaguestringnba,nflNach Liga filtern
marketstringmoneyline,spreadNach Markttyp filtern
eventstringevt_abc123Nach Event-ID filtern
livebooleantrueNur laufende Live-Events
sortstring-odds_americanSortierfeld mit optionalem --Präfix für absteigend
fieldsstringid,sportsbook,odds_americanKommagetrennte Felder, die in die Antwort aufgenommen werden sollen
min_oddsnumber-110Minimaler American-Odds-Filter
max_oddsnumber200Maximaler American-Odds-Filter
group_bystringeventErgebnisse nach Feld gruppieren
limitnumber25Ergebnisse pro Seite (Standard: 50, Max: 200)
offsetnumber50Paginierungs-Offset. Kann bei Live-Endpoints zu doppelten Zeilen führen, wenn sich Daten zwischen Anfragen ändern.
cursorstringOpaker Cursor aus next_cursor. Empfohlen für mehrseitige Scans über Live-Daten — beseitigt Offset-Drift.

Beispiele

# Multiple sportsbooks (comma-separated) curl "https://api.sharpapi.io/api/v1/odds?sportsbook=draftkings,fanduel" \ -H "X-API-Key: YOUR_KEY" # Combine filters curl "https://api.sharpapi.io/api/v1/odds?league=nba,nhl&sportsbook=pinnacle&live=true" \ -H "X-API-Key: YOUR_KEY" # Paginate through results curl "https://api.sharpapi.io/api/v1/odds?limit=25&offset=50" \ -H "X-API-Key: YOUR_KEY"

Parameternamen sind immer singulär (sportsbook, nicht sportsbooks). Verwenden Sie Kommas, um mehrere Werte zu übergeben: sportsbook=draftkings,fanduel.

Odds-Formate

Alle Odds werden als flache Felder auf jedem Odds-Objekt zurückgegeben:

{ "odds_american": -110, "odds_decimal": 1.909, "odds_probability": 0.5238 }
FeldBeispielBeschreibung
odds_american-110, +150Standard-US-Format
odds_decimal1.909, 2.50Multiplikator-Format
odds_probability0.5238Implizierte Wahrscheinlichkeit (0 bis 1)

Fehlercodes

Die kanonische Liste der von der API ausgegebenen Fehlercodes. Der String in error.code ist der stabile Vertrag — prüfen Sie diesen anstelle des prosaischen message-Felds.

HTTP-Fehlercodes

In REST-Antworten ausgegeben.

CodeHTTP-StatusBeschreibung
missing_api_key401Kein API-Schlüssel über X-API-Key, ?api_key= oder Authorization: Bearer übermittelt
invalid_api_key401API-Schlüssel wurde übermittelt, aber nicht erkannt
expired_api_key401API-Schlüssel ist abgelaufen — generieren Sie einen neuen im Dashboard
disabled_api_key401API-Schlüssel ist deaktiviert, üblicherweise weil das Abonnement abgelaufen ist
unauthorized401Bearer-Token-Authentifizierung fehlgeschlagen bei Admin- oder /api/v1/monitoring/*-Endpoints (unterscheidet sich von invalid_api_key)
invalid_token401Clerk-Session-Token-Verifizierung fehlgeschlagen (nur Dashboard-Endpoints)
tier_restricted403Endpoint oder Funktion ist in Ihrem Tier nicht verfügbar — Antwort enthält tier und required_tier
not_found404Ressource nicht gefunden
method_not_allowed405HTTP-Methode wird auf dieser Route nicht unterstützt
gone410Event ist beendet oder abgelaufen — verwenden Sie /api/v1/events für aktuelle Events
unknown_endpoint410Falscher API-Pfad — Antwort enthält correct_endpoint mit der richtigen Route (z. B. /api/v1/arbitrage/api/v1/opportunities/arbitrage)
validation_error400Request-Body oder Query-Parameter haben die Validierung nicht bestanden
offset_too_large400offset überschreitet das pro-Endpoint-Maximum (derzeit 500 bei /odds und /odds/delta). Wechseln Sie zu cursor-basierter Paginierung oder erhöhen Sie since
rate_limited429Anfragen-pro-Minute-Rate-Limit überschritten — Antwort enthält retry_after
concurrent_request_cap429Zu viele laufende Anfragen für Ihr Tier — reduzieren Sie die Parallelität oder upgraden Sie
too_many_streams429Maximale Anzahl gleichzeitiger SSE- oder WebSocket-Streams für diesen API-Schlüssel überschritten
backpressureWird als SSE event: error ausgegeben (kein HTTP-Status), wenn der Client nicht mithalten kann; der Server schließt anschließend den Stream
upstream_error502Vorübergehendes Problem beim Erreichen eines Upstream-Sportsbooks oder Auth-Anbieters
service_unavailable503Ein erforderlicher Dienst (z. B. Schlüsselverwaltung) ist nicht konfiguriert oder offline
not_ready503Ein vom Endpoint abhängiger Backing Store (z. B. ClickHouse, Closing-Line-Capture) ist noch nicht bereit, die Anfrage zu bedienen. Mit Backoff erneut versuchen
internal_error500Unerwarteter Serverfehler — mit Backoff erneut versuchen und bei anhaltendem Problem den Support mit X-Request-Id kontaktieren

bad_request und invalid_request sind veraltet — beide wurden in validation_error zusammengeführt. Clients, die auf die alten Strings prüfen, sollten validation_error zu ihrer Fehlerzuordnung hinzufügen.

WebSocket-Frame-Fehlercodes

Werden ausschließlich innerhalb von {"type": "error", "code": "..."}-Frames auf einer offenen WebSocket-Verbindung ausgegeben. Sie beschreiben Client-Protokoll-Fehler und entsprechen keinem HTTP-Status.

CodeBedeutung
invalid_messageFrame konnte nicht als JSON geparst werden oder entsprach nicht der erwarteten Struktur
unknown_message_typetype-Feld ist keiner der dokumentierten Werte (auth, subscribe, filter, refresh_token, ping)
missing_tokenauth- oder refresh_token-Frame enthielt kein token-Feld
missing_channelssubscribe-Frame enthielt kein nicht-leeres channels-Array
not_authenticatedFrame erfordert eine authentifizierte Session (subscribe, filter oder refresh_token vor auth gesendet)
already_authenticatedClient hat einen zweiten auth-Frame nach erfolgreichem ersten gesendet
Last updated on