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ètre | Type | Contrainte | Description |
|---|---|---|---|
item | string | ^[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": { ... }
}
| Champ | Type | Description |
|---|---|---|
ticker | string | Identifiant court (ex: MAZE) |
currentPrice | number | Cours actuel en $ |
isListed | boolean | false si suspendu (circuit breaker) |
suspensionUntil | string|null | Date ISO de fin de suspension |
rating | string | Notation financière : AAA → D |
volume24h | integer | Actions échangées sur 24h |
variation24h | number | Variation en % (négatif = baisse) |
GET /public/cours/:ticker
GET
/public/cours/{ticker}
| Paramètre | Contrainte | Description |
|---|---|---|
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ètre | Valeurs | Défaut |
|---|---|---|
period | 1h, 4h, 24h, 7d, 30d | 24h |
{
"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ériode | Granularité des bougies |
|---|---|
1h | 5 minutes |
4h | 15 minutes |
24h | 1 heure |
7d | 4 heures |
30d | 1 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ètre | Contrainte | Description |
|---|---|---|
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": { ... }
}
| Champ | Description |
|---|---|
shareValue | Valeur d'une part en $ (recalculée toutes les 5 min) |
commissionRate | Commission annuelle du gestionnaire (0.0 à 0.20) |
holdings | Composition 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ée | Fréquence |
|---|---|
| Prix items | Toutes les 5 minutes |
| Cours boursiers | Temps réel (à chaque ordre exécuté) |
| Notations (AAA-D) | Hebdomadaire (lundi 00h00) |
| Valeurs ETF | Toutes 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
| HTTP | Code JSON | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Paramètre invalide (regex, type, etc.) |
| 404 | NOT_FOUND | Ressource introuvable |
| 429 | RATE_LIMIT | Trop de requêtes — attendre la réinitialisation |
| 500 | INTERNAL_ERROR | Erreur serveur interne |