Anomalie API — API Publique

Documentation complète de l'API REST et WebSocket en lecture seule.

Version 1.0.0 JSON uniquement Lecture seule

Démarrage rapide

Base URL
Toutes les routes commencent par https://api.anomalie.eu/public

Tester en 30 secondes

# Vérifier que l'API est en ligne
curl https://api.anomalie.eu/public/status

# Obtenir tous les cours boursiers
curl https://api.anomalie.eu/public/cours

# Obtenir le portfolio d'un joueur
curl https://api.anomalie.eu/public/portfolio/ABC123XY

Structure d'une réponse

// Succès
{
  "success": true,
  "cours": [ ... ],
  "_meta": {
    "timestamp": "2024-01-15T14:30:00.000Z",
    "documentation": "/wiki"
  }
}

// Erreur
{
  "error": "Description de l'erreur",
  "code": "ERROR_CODE"
}
Développeurs & intégrations
Vous développez un bot ou un dashboard externe ? La documentation avancée (clés API, WebSocket, exemples de code) est disponible sur la page /docs (accès restreint — contactez un admin).

Prix Items

GET /public/prices Lecture seule

Retourne tous les prix d'items actuels avec leur date de mise à jour.

{
  "success": true,
  "count": 42,
  "prices": {
    "bread":             { "price": 12.50,  "updatedAt": "2024-01-15T14:25:00.000Z" },
    "iron_ore":          { "price": 87.30,  "updatedAt": "2024-01-15T14:25:00.000Z" },
    "electronic_parts":  { "price": 234.80, "updatedAt": "2024-01-15T14:25:00.000Z" }
  },
  "_meta": { ... }
}

GET /public/prices/:item

GET /public/prices/{item}

Prix d'un item spécifique + variation sur 24h.

ParamètreTypeContrainteDescription
itemstring^[a-zA-Z0-9_]{1,64}$Nom de l'item
{
  "success": true,
  "item": "iron_ore",
  "price": 87.30,
  "variation24h": "-2.45",
  "_meta": { ... }
}

variation24h est null si l'item a moins de 24h d'historique.

Bourse

GET /public/cours Lecture seule

Tous les cours boursiers en temps réel.

{
  "success": true,
  "count": 8,
  "cours": [
    {
      "id": 1,
      "ticker": "MAZE",
      "name": "Maze Bank Corp",
      "currentPrice": 1250.00,
      "openPrice": 1200.00,
      "highPrice": 1280.00,
      "lowPrice": 1190.00,
      "totalShares": 10000,
      "isListed": true,
      "suspensionUntil": null,
      "rating": "AA",
      "volume24h": 342,
      "priceYesterday": 1180.00,
      "variation24h": 5.93
    }
  ],
  "_meta": { ... }
}
ChampTypeDescription
tickerstringIdentifiant court (ex: MAZE)
currentPricenumberCours actuel en $
isListedbooleanfalse si suspendu (circuit breaker)
suspensionUntilstring|nullDate ISO de fin de suspension
ratingstringNotation financière : AAA → D
volume24hintegerActions échangées sur 24h
variation24hnumberVariation en % (négatif = baisse)

GET /public/cours/:ticker

GET /public/cours/{ticker}
ParamètreContrainteDescription
ticker^[A-Z0-9]{1,8}$Ticker en majuscules
{ "success": true, "company": { /* même structure que /cours */ }, "_meta": { ... } }

GET /public/cours/:ticker/history

GET /public/cours/{ticker}/history?period=24h

Historique OHLC (bougies japonaises) d'une entreprise.

ParamètreValeursDéfaut
period1h, 4h, 24h, 7d, 30d24h
{
  "success": true,
  "ticker": "MAZE",
  "period": "24h",
  "history": [
    { "time": "2024-01-15T12:00:00.000Z", "open": 1200, "high": 1250, "low": 1190, "close": 1230, "volume": 45 }
  ],
  "_meta": { ... }
}
PériodeGranularité des bougies
1h5 minutes
4h15 minutes
24h1 heure
7d4 heures
30d1 jour

Portfolio Joueur

GET /public/portfolio/{citizenId} Lecture seule
Données publiques
Le portfolio est accessible à tous : n'importe qui connaissant le CitizenID peut consulter les positions et dividendes d'un joueur.
ParamètreContrainteDescription
citizenId^[a-zA-Z0-9]{1,64}$CitizenID QBCore
{
  "success": true,
  "portfolio": {
    "summary": {
      "totalCurrentValue": 15750.00,
      "totalInvested":     12000.00,
      "totalPnl":           3750.00,
      "totalPnlPercent":      31.25
    },
    "positions": [
      {
        "ticker":       "MAZE",
        "name":         "Maze Bank Corp",
        "sharesHeld":   10,
        "avgBuyPrice":  1200.00,
        "currentPrice": 1250.00,
        "currentValue": 12500.00,
        "pnl":           500.00,
        "pnlPercent":      4.17,
        "rating":       "AA"
      }
    ],
    "dividendsHistory": [
      {
        "paid_at":         "2024-01-10T09:00:00.000Z",
        "ticker":          "MAZE",
        "shares_at_time":  10,
        "amount_per_share": 50.00,
        "amount_received":  500.00
      }
    ]
  },
  "_meta": { ... }
}

Fonds ETF

GET /public/etf Lecture seule
{
  "success": true,
  "count": 3,
  "funds": [
    {
      "id": 1,
      "name":             "Fonds LS Diversifié",
      "description":      "Portefeuille équilibré des grandes entreprises",
      "managerCitizenId": "ABC123XY",
      "shareValue":       850.00,
      "totalShares":      500,
      "commissionRate":   0.02,
      "isActive":         true,
      "holdings": [
        { "ticker": "MAZE", "weight": 0.60 },
        { "ticker": "RON",  "weight": 0.40 }
      ]
    }
  ],
  "_meta": { ... }
}
ChampDescription
shareValueValeur d'une part en $ (recalculée toutes les 5 min)
commissionRateCommission annuelle du gestionnaire (0.0 à 0.20)
holdingsComposition du fonds avec pondérations (somme = 1.0)

Statut du Serveur

GET /public/status
{
  "success":  true,
  "status":   "online",
  "uptime":   86400,
  "version":  "1.0.0",
  "endpoints": {
    "prices": "/public/prices",
    "cours":  "/public/cours",
    "etf":    "/public/etf",
    "wiki":   "/wiki"
  },
  "rateLimit": {
    "withoutKey": "60 req/min",
    "withKey":    "Voir header X-RateLimit-Limit"
  },
  "_meta": { ... }
}

FAQ & Limites

L'API est-elle en lecture seule ?
Oui, intégralement. /public/* ne permet aucune écriture. Passer des ordres ou enregistrer des transactions nécessite un accès FiveM authentifié.
Quelle est la fréquence de mise à jour des données ?
DonnéeFréquence
Prix itemsToutes les 5 minutes
Cours boursiersTemps réel (à chaque ordre exécuté)
Notations (AAA-D)Hebdomadaire (lundi 00h00)
Valeurs ETFToutes les 5 minutes
Le cache navigateur affecte-t-il mes requêtes ?
Oui. Toutes les routes retournent Cache-Control: public, max-age=10. Pour contourner le cache, utilisez Socket.io ou ajoutez ?t=Date.now() à l'URL.
Codes d'erreur JSON courants
HTTPCode JSONDescription
400VALIDATION_ERRORParamètre invalide (regex, type, etc.)
404NOT_FOUNDRessource introuvable
429RATE_LIMITTrop de requêtes — attendre la réinitialisation
500INTERNAL_ERRORErreur serveur interne