Game API v1
Die Game API ist die Schnittstelle zwischen lexo_bridge auf deinem FiveM-Server und LexoNET. Die Bridge baut alle Verbindungen selbst auf. LexoNET muss deinen Spielserver nie direkt erreichen; du brauchst keine offenen Ports.
#Authentifizierung
- Pro Spielserver legst du im Kundenbereich unter Spielanbindung einen Server-Schlüssel an. Er gehört zu deinem Workspace und wird nur einmal angezeigt.
- Jede Anfrage sendet
Authorization: Bearer <key>und läuft ausschließlich über HTTPS. - Der Kopf
X-Lexo-Bridge: <version>meldet die Bridge-Version für Support und Statusanzeige. - Unbekannter Schlüssel:
401. Gesperrter Schlüssel oder Mandant:403.
set lexonet_url "https://lexonet.de"
set lexonet_key "DEIN-SERVER-SCHLUESSEL"
ensure lexo_bridgeDen Schlüssel immer mit set eintragen, nie mit setr. Mit setr würde er an alle Clients verteilt.
#Ereignisse senden
POST /api/v1/game/events überträgt bis zu 50 Ereignisse je Anfrage.
{
"events": [
{ "id": 1042, "type": "citizen.online", "ts": 1760338800, "data": { } }
]
}Antwort 200:
{ "accepted": [1042] }idist je Server eindeutig und aufsteigend. LexoNET erkennt Duplikate über Server-Schlüssel undid; erneutes Senden ist unschädlich.- Die Bridge löscht nur IDs aus
acceptedaus ihrer Outbox (lexo_bridge_outbox). Fehlerhafte Einzelereignisse fehlen inacceptedund werden protokolliert. - Unbekannte Ereignistypen nimmt LexoNET an und speichert sie. Eigene Module können so senden, ohne dass sich die API ändert.
#Ereignistypen
| Typ | Daten |
|---|---|
server.started | { players } |
citizen.online | { identifier, firstname, lastname, dateofbirth, sex, phone, job } |
citizen.offline | { identifier } |
job.changed | { identifier, job, previous } |
vehicle.upsert | { plate, owner, model, label } |
duty.started, duty.ended | Dienstbeginn und Dienstende |
job.staff | Personalstand eines Jobs |
police.fine, police.jail, police.release, police.jail_failed | Ereignisse aus lexo_police |
job enthält name, label, grade, grade_label und duty. identifier ist der Framework-Identifier des Charakters, bei ESX zum Beispiel char1:….
Eigene Typen sendest du mit exports.lexo_bridge:Send(type, data). Verwende ein Präfix je Modul, zum Beispiel police. oder medic..
#Befehle abholen
Die Bridge fragt alle 3 Sekunden offene Befehle ab.
GET /api/v1/game/commands
{
"commands": [
{ "id": "c_81f2", "type": "fine", "data": { "identifier": "char1:…", "amount": 500, "reason": "Rotlicht", "job": "police" } }
]
}- Es kommen nur nicht quittierte Befehle, höchstens 50, die ältesten zuerst.
- Ein Befehl, der 60 Sekunden nach Ausgabe nicht quittiert ist, wird erneut ausgegeben.
#Befehle quittieren
POST /api/v1/game/commands/ack
{ "results": [ { "id": "c_81f2", "ok": true, "result": null } ] }Bei ok: false steht in result der Grund, zum Beispiel offline, insufficient_funds oder unknown_command. Das MDT zeigt den Status am Vorgang an.
#Befehlstypen
| Typ | Daten | Mögliche Gründe bei Fehler |
|---|---|---|
notify | { identifier, message } | offline |
fine | { identifier, amount, reason, job } | offline, insufficient_funds, invalid_amount |
jail | { identifier, units, reason }, ausgeführt von lexo_police | invalid; bei Erfolg jailed oder queued_offline |
unjail | { identifier }, ausgeführt von lexo_police | invalid |
Eigene Befehle registrierst du mit exports.lexo_bridge:OnCommand(type, handler). Der Handler darf nicht warten und gibt sofort true oder false, 'grund' zurück.
#Fahrzeuge abgleichen
POST /api/v1/game/sync/vehicles
{ "vehicles": [ { "plate": "LX 123", "owner": "char1:…", "model": 1234567 } ], "final": false }Der Abgleich startet mit dem Konsolenbefehl lexo_syncvehicles und sendet Pakete zu 200 Fahrzeugen. Mit final: true im letzten Paket entfernt LexoNET Fahrzeuge dieses Servers, die im Lauf nicht vorkamen.
#Statuscodes und Verhalten der Bridge
| Code | Bedeutung | Verhalten der Bridge |
|---|---|---|
200 | OK | weiter |
401 / 403 | Schlüssel ungültig oder gesperrt | 60 Sekunden Pause, Meldung in der Konsole |
429 | Rate-Limit | Wartezeit verdoppelt sich bis 60 Sekunden |
5xx / Timeout | LexoNET gestört | Ereignisse bleiben in der Outbox, Wartezeit verdoppelt sich bis 60 Sekunden |
Fällt LexoNET aus, geht nichts verloren. Die Outbox wird nach der Störung in Reihenfolge abgearbeitet.
#Wer darf das?
Server-Schlüssel erzeugen und sperren dürfen berechtigte Mitglieder des Kundenteams. Die Serveradministration trägt den Schlüssel ein. Den Schlüssel nie in Screenshots, Tickets oder Repositories weitergeben.
Unklare Stellen oder fehlende Schritte meldest du im LexoNET-Discord oder als Ticket im Kundenbereich.