📡 API Dokumentation

Öffentliche REST API von PredX. Alle Antworten sind JSON. Basis-URL:

https://predx.org

🔑 Authentifizierung

Geschützte Endpoints benötigen einen JWT Bearer Token im Authorization Header.

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Token erhältst du via POST /api/auth/login.

⚡ Rate Limits

POST /auth/login10 req / 15 min
POST /auth/forgot-password5 req / 60 min
POST /trades/*60 req / min

Markets

GET/api/markets

Liste aller öffentlichen Märkte. Supports query params: category, status, sort, search, limit, offset.

Query-Parameter

?status=open&sort=volume&limit=20&offset=0

Beispiel

{
  "markets": [
    {
      "id": "uuid",
      "title_de": "Wird X gewinnen?",
      "title_en": "Will X win?",
      "category": "politics",
      "status": "open",
      "yes_probability": 0.63,
      "total_volume": 4200,
      "resolution_date": "2026-12-31T00:00:00.000Z"
    }
  ],
  "total": 42
}
GET/api/markets/:id

Marktdetails inkl. Outcomes, letzte Trades, Statistiken.

Beispiel

{
  "market": { "id": "...", "title_de": "...", "outcomes": [...] },
  "recentTrades": [...],
  "stats": { "total_trades": 123, "unique_traders": 45 }
}
GET/api/markets/featured

Gibt den aktuellen "Wette des Tages" Markt zurück.

Beispiel

{ "market": { ... } }  // or { "market": null }
GET/api/markets/trending

Top-5 Märkte nach Volumen der letzten 24h.

Beispiel

{ "markets": [...] }
POST/api/marketsauth

Neuen Markt erstellen. Body: title_de, title_en, category, resolution_date, market_type, initial_probability oder outcomes[].

Beispiel

// Request body
{
  "title_de": "Wird X gewinnen?",
  "title_en": "Will X win?",
  "category": "politics",
  "resolution_date": "2026-12-31",
  "market_type": "binary",
  "initial_probability": 0.45,
  "resolution_source": "ORF.at Wahlergebnisse"
}

Trading

POST/api/trades/buyauth

Anteile kaufen. Rate-Limit: 60 req/min.

Beispiel

// Request body
{
  "market_id": "uuid",
  "outcome_id": "uuid",  // for multi markets
  "side": "yes",         // for binary markets
  "amount": 100          // ATS to spend
}
POST/api/trades/sellauth

Anteile verkaufen. Rate-Limit: 60 req/min.

Beispiel

{ "market_id": "uuid", "outcome_id": "uuid", "shares": 50 }

Users

GET/api/users/leaderboard

Rangliste der besten Trader. Params: period (all/7d/30d), limit.

Beispiel

{ "leaderboard": [{ "username": "...", "total_profit": 2500, "win_rate": 0.72 }] }
GET/api/users/:id

Öffentliches Benutzerprofil mit Portfolio und Statistiken.

Beispiel

{ "user": { "username": "...", "balance": 1200 }, "positions": [...], "stats": {...} }
GET/api/users/meauth

Eigenes Profil (inkl. E-Mail, Guthaben, Referral-Code).

Beispiel

{ "user": { "id": "...", "balance": 1500, "referral_code": "ABC12345" } }

Auth

POST/api/auth/register

Neuen Account erstellen. Body: username, email, password, display_name, language, referral_code (optional).

Beispiel

{ "user": { "id": "...", "username": "..." }, "token": "eyJ..." }
POST/api/auth/login

Einloggen. Body: email, password. Rate-Limit: 10/15min.

Beispiel

{ "user": { ... }, "token": "eyJ..." }
POST/api/auth/forgot-password

Passwort-Reset anfordern. Gibt immer 200 zurück (Anti-Enumeration).

Beispiel

{ "message": "Wenn die E-Mail existiert, wurde ein Link gesendet." }

Embed

GET/embed/market/:id

iframe-einbettbares Market-Widget. Zeigt Titel, Wahrscheinlichkeit und Link zu PredX.

Beispiel

<iframe
  src="https://predx.org/embed/market/MARKET_ID"
  width="320"
  height="200"
  frameborder="0"
  style="border-radius:12px;"
></iframe>

🔌 Embed-Widget

Bettet einen PredX-Markt als interaktives Widget in deine Website ein.

HTML
<iframe
  src="https://predx.org/embed/market/MARKET_ID"
  width="320"
  height="200"
  frameborder="0"
  style="border-radius:12px;"
></iframe>

Ersetze MARKET_ID durch die ID des gewünschten Marktes. Die ID findest du in der URL auf predx.org/market/:id.

Fragen oder Feedback? Erstelle einen GitHub Issue.