Prognosemärkte gehören zu den technisch anspruchsvollsten Bereichen der API-Entwicklung. Sie kombinieren ablaufende Finanzinstrumente, Wahrscheinlichkeiten mit Echtzeit-Preisbildung, Ereignisse mit mehreren Ergebnissen, komplexe Kapitalbeziehungen und eine Nutzerbasis aus UI-Nutzern sowie automatisierten Handelsbots mit Arbitrage-Strategien. Jede Designentscheidung wird dadurch unmittelbar auf Belastbarkeit geprüft.
Apidog noch heute ausprobieren
Polymarket, derzeit die weltweit größte Prognosemarkt-Plattform nach Volumen, hat deshalb ein API-Ökosystem aufgebaut, das sich als Referenz für API-Designer eignet. Es handelt sich nicht nur um eine CRUD-API über einer Datenbank, sondern um eine geschichtete Architektur für Offenheit und Sicherheit, Echtzeit- und historische Daten sowie traditionelle Finanzmuster und krypto-native Primitive.
Im Folgenden finden Sie acht konkrete Designmuster und Hinweise, wie Sie diese in eigenen APIs anwenden können.
Muster 1: Domänengetrennte API-Schichten
Polymarket stellt drei APIs mit klar abgegrenzten Verantwortlichkeiten bereit:
-
Gamma API (
gamma-api.polymarket.com) — Marktentdeckung, Ereignisse, Tags und Suche -
CLOB API (
clob.polymarket.com) — Orderbuchdaten, Preise und Orderplatzierung -
Data API (
data-api.polymarket.com) — Benutzerpositionen, Trades, Analysen und Bestenlisten
Diese Trennung ist mehr als eine Namenskonvention. Jede API hat eigene Authentifizierungsanforderungen, Aktualisierungsfrequenzen und Konsumenten:
| API | Primärer Zweck | Zugriff |
|---|---|---|
| Gamma API | Märkte entdecken und durchsuchen | Öffentlich |
| CLOB API | Orderbücher lesen und handeln | Öffentlich + authentifiziert |
| Data API | Wallet-bezogene Daten und Analysen | Öffentlich, über Wallet-Adresse adressiert |
Die Gamma API ist für Browsing und Entdeckung optimiert. Bei der CLOB API kann jeder das Orderbuch lesen, während das Platzieren von Orders Anmeldeinformationen erfordert. Die Data API ist öffentlich, aber ihre Abfragen beziehen sich auf Wallet-Adressen.
Umsetzungshinweis
Trennen Sie APIs nach Nutzungskontext, nicht nur nach Entitäten.
Ein naiver Entwurf bündelt alles unter einer Basis-URL:
/markets
/orders
/users
Ein domänenorientierter Entwurf stellt stattdessen diese Fragen:
- Wofür wird diese API genutzt?
- Welche Latenz benötigt dieser Anwendungsfall?
- Welche Authentifizierung ist erforderlich?
- Wie muss dieser Teil unabhängig skalieren?
Marktentdeckung hat andere Zugriffsmuster als Handel. Handel hat andere Latenzanforderungen als Analysen. Separate Basis-URLs erlauben es, diese Bereiche unabhängig weiterzuentwickeln, zu skalieren und abzusichern.
Muster 2: Öffentlichkeitsorientierter Datenzugriff
Marktdaten wie Preise, Orderbücher, Ereignismetadaten und historische Trades sind öffentlich abrufbar:
curl "https://gamma-api.polymarket.com/events?limit=5"
Kein API-Schlüssel. Kein OAuth. Keine Rate Limits auf Lese-Endpunkten. Die Daten sind direkt verfügbar.
Das ist eine bewusste Architekturentscheidung. Traditionelle Börsen behandeln Marktdaten oft als Einnahmequelle. Polymarket behandelt sie als Infrastruktur: Je mehr Entwickler Daten abrufen und darauf aufbauen können, desto liquider und nützlicher kann der Markt werden.
Umsetzungshinweis
Behandeln Sie Lese- und Schreibzugriffe als getrennte Sicherheitsprobleme.
Für datenintensive Plattformen kann diese Matrix sinnvoll sein:
| Operation | Beispiel | Authentifizierung |
|---|---|---|
| Öffentliche Daten lesen | Preise, Kataloge, Metadaten | Keine |
| Persönliche Daten lesen | Positionen, Kontostand | Nutzer- oder Wallet-Kontext |
| Zustand ändern | Order erstellen, Zahlung auslösen | Starke Authentifizierung |
| Kritische Aktion bestätigen | Schlüssel erzeugen, Auszahlung freigeben | Kryptografischer Nachweis oder MFA |
Wenn Nutzer Marktpreise ohne Anmeldeinformationen abrufen können, entfällt Reibung für den größten Teil potenzieller Konsumenten. Authentifizierung sollte dort eingesetzt werden, wo tatsächlich eine geschäftskritische Aktion stattfindet.
Muster 3: Zweistufige Authentifizierung, die echtes Vertrauen abbildet
Handels-Endpunkte erfordern Authentifizierung. Polymarket verwendet dafür zwei Ebenen mit unterschiedlichen Aufgaben.
L1-Authentifizierung verwendet eine EIP-712-Signatur mit dem privaten Schlüssel des Nutzers. Sie beweist die Kontrolle über das Wallet und wird verwendet, um API-Anmeldeinformationen abzuleiten:
// L1: API-Anmeldeinformationen mit dem privaten Schlüssel ableiten
const credentials = await client.createOrDeriveApiKey();
// → { key: "...", secret: "...", passphrase: "..." }
L2-Authentifizierung verwendet HMAC-SHA256 mit den abgeleiteten Anmeldeinformationen. Diese Header werden an jede Handelsanfrage angehängt:
// L2-Header für jede Handelsanfrage
{
"POLY_ADDRESS": "0x...",
"POLY_SIGNATURE": "<hmac-sha256>",
"POLY_TIMESTAMP": "1716000000",
"POLY_API_KEY": "550e8400-...",
"POLY_PASSPHRASE": "..."
}
Warum dieses Muster funktioniert
Verschiedene Operationen benötigen unterschiedliche Sicherheitsniveaus:
- Das Erstellen oder Ableiten eines API-Schlüssels ist eine Aktion mit hohem Risiko. Sie sollte den Nachweis der Wallet-Kontrolle verlangen.
- Routinemäßige Handelsanfragen müssen schnell und automatisierbar bleiben. Sie sollten nicht bei jedem Aufruf eine erneute Signatur mit dem privaten Schlüssel verlangen.
L1 etabliert Vertrauen. L2 nutzt dieses Vertrauen effizient für wiederkehrende Anfragen.
Übertragbares Muster
Dieses Prinzip funktioniert auch außerhalb von Krypto:
- L1: „Beweise, dass du diese Identität kontrollierst.“
- L2: „Beweise, dass diese einzelne Anfrage aus deiner autorisierten Sitzung stammt.“
Viele Anwendungen behandeln beide Probleme mit demselben Token. Eine explizite Trennung ermöglicht präzisere Sicherheitsmodelle.
Muster 4: Orders als signierte Nachrichten statt als gewöhnliche API-Aufrufe
Beim Platzieren einer Order auf Polymarket senden Sie nicht nur Daten an einen Server. Sie erstellen eine kryptografisch signierte Nachricht, die eine durchsetzbare finanzielle Verpflichtung repräsentiert:
const response = await client.createAndPostOrder(
{
tokenID: "71321045679...",
price: 0.65,
size: 100,
side: Side.BUY,
},
{
tickSize: "0.01",
negRisk: false,
},
OrderType.GTC
);
Das SDK erstellt im Hintergrund eine EIP-712-Datenstruktur, signiert sie mit dem privaten Schlüssel und übermittelt Signatur und Order an die Matching-Engine.
Die Matching-Engine arbeitet Off-Chain. Wenn Trades gematcht werden, erfolgt die Abwicklung über Polygon auf Basis dieser Signaturen. Der Operator kann keine Trades fälschen oder Gelder willkürlich bewegen: Die signierte Nachricht enthält die Autorisierung.
Umsetzungshinweis
Unterscheiden Sie zwischen zwei Semantiken:
Klassischer API-Aufruf:
"Bitte führe diese Aktion in meinem Namen aus."
Signierte Nachricht:
"Hier ist ein überprüfbares Instrument, das diese Aktion autorisiert."
Wenn die Nutzlast selbst die Autorisierung trägt, statt sich ausschließlich auf Transport-Credentials zu verlassen, entstehen wichtige Eigenschaften:
- Nichtabstreitbarkeit
- Überprüfbarkeit
- Entkopplung zwischen Autorisierung und Transport
- Nachweisbare Zustimmung für hochkritische Aktionen
Dieses Muster eignet sich besonders für Finanzsysteme, juristische Dokumente und andere Aktionen mit hohem Schadenspotenzial.
Muster 5: Explizite Ontologie im Datenmodell
Polymarket strukturiert seine Daten um zwei zentrale Objekte: Events und Markets.
Ein Event ist eine übergeordnete Frage, zum Beispiel:
„Wer gewinnt das US-Senatsrennen 2026 in Pennsylvania?“
Ein Market ist ein konkretes handelbares binäres Ergebnis innerhalb dieses Events, zum Beispiel:
„Wird Bob Casey gewinnen?“
Ein Event kann mehrere Markets enthalten:
{
"id": "501",
"title": "2026 Pennsylvania Senate Race",
"negRisk": true,
"markets": [
{
"id": "2301",
"question": "Will Bob Casey win?",
"outcomePrices": "[\"0.42\", \"0.58\"]"
},
{
"id": "2302",
"question": "Will Dave McCormick win?",
"outcomePrices": "[\"0.35\", \"0.65\"]"
},
{
"id": "2303",
"question": "Will a third candidate win?",
"outcomePrices": "[\"0.23\", \"0.77\"]"
}
]
}
Die API liefert damit nicht nur Rohdaten, sondern kodiert die konzeptuellen Beziehungen der Domäne.
Beispielsweise sind Outcomes und Preise über ihre Indexposition verbunden:
outcomes[0] === outcomePrices[0];
Zusätzlich signalisiert negRisk auf Event-Ebene, dass zwischen Märkten Kapitalbeziehungen bestehen, die bei unabhängigen Märkten nicht vorhanden sind.
Umsetzungshinweis
Machen Sie tragende Domänenbeziehungen im API-Modell sichtbar.
Verstecken Sie kritische Beziehungen nicht ausschließlich in Dokumentation oder impliziten Konventionen. Wenn ein Client negRisk: true ignoriert, kann er ein falsches Positionsmodell berechnen. Ein explizites Feld macht diese Abhängigkeit sichtbar und testbar.
Muster 6: NegRisk — Kapitalbeziehungen als erstklassiges API-Konzept
Das Feld negRisk verweist auf ein zentrales Muster: Finanzielle Äquivalenzen werden programmierbar gemacht.
In einem gewöhnlichen Multi-Outcome-Event ist jeder Market unabhängig. Bei einem NegRisk-Event, bei dem genau ein Ergebnis gewinnen kann, gilt jedoch folgende Beziehung:
1 No-Token auf Ergebnis A ≡ 1 Yes-Token auf jedem anderen Ergebnis
Wenn Sie beispielsweise eine No-Position auf „Andere“ im Senatsrennen von Pennsylvania halten, lässt sich diese Position konvertieren:
| Vorher | Nachher |
|---|---|
| 1× Nein (Andere) | 1× Ja (Casey) + 1× Ja (McCormick) |
Die API macht diese Bedingung explizit:
-
negRisk: trueim Marktobjekt -
negRisk: truein den Orderoptionen beim Handel mit solchen Märkten
Wenn dieser Wert nicht korrekt gesetzt wird, kann eine Order abgelehnt oder falsch abgewickelt werden.
Umsetzungshinweis
Kodieren Sie Domäneninvarianten als typisierte API-Felder.
Nicht ausreichend:
Siehe Dokumentation: Diese Märkte haben besondere Regeln.
Besser:
{
"marketId": "2301",
"negRisk": true,
"requiresSpecialSettlementRules": true
}
Wenn das Weglassen einer Information zu falschem Verhalten führt, gehört diese Information in die API-Oberfläche, nicht nur in einen Dokumentationsabschnitt.
Muster 7: Dynamische Tick-Größe als Marktstatus
Viele Finanz-APIs behandeln die Tick-Größe als statische Konfiguration. Polymarket behandelt sie als dynamischen Marktstatus.
Wenn ein Marktpreis an die Extreme gelangt — über 0.96 oder unter 0.04 — sinkt die minimale Tick-Größe von 0.01 auf 0.001:
{
"event_type": "tick_size_change",
"asset_id": "65818619657...",
"old_tick_size": "0.01",
"new_tick_size": "0.001",
"timestamp": "100000000"
}
Die Begründung: Bei extremen Wahrscheinlichkeiten ist ein Tick von einem Cent zu grob. Eine Änderung von 0.04 auf 0.03 entspricht bereits einer relativen Bewegung von 25 %. Kleinere Ticks ermöglichen präzisere Wahrscheinlichkeiten wie 97,3 % statt einer Rundung auf 97 %.
Umsetzungshinweis
Behandeln Sie veränderliche Konfiguration als Ereignis, nicht als einmalig abgerufenen Parameter.
Ein Client sollte nicht so implementiert werden:
const tickSize = "0.01"; // Fehleranfällig: fest codiert
Stattdessen muss er Tick-Größenänderungen verarbeiten und seinen lokalen Zustand aktualisieren:
socket.on("tick_size_change", (event) => {
tickSizes.set(event.asset_id, event.new_tick_size);
});
Der WebSocket stellt tick_size_change-Ereignisse bereit, damit Clients ihre Orderkonstruktion mit dem aktuellen Marktstatus synchron halten können. Wer die Tick-Größe fest codiert, riskiert abgelehnte Orders.
Das allgemeine Prinzip lautet:
Finanz-APIs müssen Zustand als erstklassiges Konzept behandeln.
Marktparameter können sich ändern. Auflösungsregeln können angepasst werden. Ergebnisse können präzisiert werden. APIs sollten solche Zustandsübergänge aktiv kommunizieren, statt Clients sie erst über Fehlermeldungen entdecken zu lassen.
Muster 8: Zwei WebSocket-Schichten für unterschiedliche Konsumentenprofile
Polymarket betreibt zwei getrennte WebSocket-Systeme. Der Grund liegt in unterschiedlichen Anforderungen der Konsumenten.
Der Markt-Kanal (wss://ws-subscriptions-clob.polymarket.com/ws/market) richtet sich an Handelsanwendungen. Clients abonnieren Token-IDs und erhalten Orderbuch-Snapshots, Preisänderungen, Handelsausführungen und Tick-Größenänderungen.
{
"assets_ids": [
"65818619657568813474341868652308942079804919287380422192892211131408793125422"
],
"type": "market"
}
Der Echtzeit-Daten-Socket (wss://ws-live-data.polymarket.com) adressiert ein anderes Profil. Er streamt Kommentare, Krypto-Preise von Binance und Chainlink, Aktienkurse sowie soziale Interaktionsereignisse.
{
"action": "subscribe",
"subscriptions": [
{
"topic": "crypto_prices",
"type": "update",
"filters": "btcusdt,ethusd"
}
]
}
Umsetzungshinweis
Trennen Sie Echtzeit-Infrastruktur, wenn sich diese Faktoren stark unterscheiden:
- Latenztoleranz
- Datenvolumen
- Fehlerverhalten
- Zuverlässigkeitsanforderungen
- Abonnementmodell
- Zielgruppe
Ein Market Maker benötigt Orderbuch-Deltas mit minimaler Latenz. Eine Benutzeroberfläche für aktuelle Plattformaktivitäten benötigt dagegen Kommentare, soziale Ereignisse und breitere Feeds.
Ein gemeinsamer WebSocket-Endpunkt für beide Fälle führt oft zu einem ungünstigen Kompromiss:
- Der Social Feed wird unnötig komplex und teuer.
- Der Handels-Feed erfüllt seine Latenz- und Zuverlässigkeitsanforderungen nicht mehr zuverlässig.
Wenn Konsumenten grundlegend unterschiedliche Anforderungen haben, sollten sie getrennte Infrastruktur erhalten.
Was diese Muster gemeinsam haben
Das API-Design von Polymarket folgt einer klaren Philosophie: Die API soll die tatsächliche Struktur der Domäne sichtbar machen, nicht sie hinter einer generischen Abstraktion verstecken.
Die drei API-Schichten bilden reale Domänengrenzen ab. Der öffentliche Zugriff auf Daten reflektiert den Nutzen offener Marktinformationen. Die zweistufige Authentifizierung trennt Identitätsnachweis und laufende Anfragesignierung. Signierte Orders kodieren eine nicht-treuhänderische Autorisierung. Die Event/Market-Hierarchie und negRisk machen finanzielle Beziehungen explizit. Dynamische Tick-Größen behandeln Marktparameter als veränderlichen Zustand. Getrennte WebSockets bedienen unterschiedliche Echtzeit-Profile.
Viele API-Design-Ratschläge konzentrieren sich auf Ergonomie:
- konsistente Benennung
- einfache Aufrufe
- vorhersehbare Fehlerbehandlung
Diese Punkte bleiben wichtig. Die interessanteren Entscheidungen liegen jedoch in der Treue zur Domäne:
- Gibt es in der Domäne eine wichtige Unterscheidung? Dann machen Sie sie als Typ, Feld oder Endpunkt sichtbar.
- Gibt es eine harte Einschränkung? Dann validieren und erzwingen Sie sie über die API.
- Gibt es veränderlichen Zustand? Dann veröffentlichen Sie Zustandsübergänge aktiv.
- Gibt es unterschiedliche Konsumentenprofile? Dann entwerfen Sie Infrastruktur gezielt für diese Profile.
Das Ergebnis ist möglicherweise eine API, die mehr Verständnis von ihren Konsumenten verlangt. Dafür verstehen Entwickler, die sie korrekt integrieren, auch die Struktur des Systems, auf dem sie arbeiten. Für Prognosemärkte, deren Zweck darin besteht, Informationen in Preisen abzubilden, ist das genau die richtige Eigenschaft.
Top comments (0)