← Home
⌕
Ask on Discord
General ER:LC FiveM API
Developers
DOCUMENTATION/API v1 reference

API v1: moderation

Reference for /v1/sanctions and /v1/bans: read sanctions and bans, and issue a sanction.

Sanctions and bans. Every route hangs off https://api.blixye.com/v1 and carries the key in the Authorization header (see Keys and scopes). This page is generated from the API's OpenAPI specification; if it is not here, the API does not do it.
NOTE Sanctions and bans. Every route hangs off https://api.blixye.com/v1 and carries the key in the Authorization header (see Keys and scopes). This page is generated from the API's OpenAPI specification; if it is not here, the API does not do it.
NOTE
GET /sanctions: List sanctions (moderation:read)
POST /sanctions: Issue a sanction (moderation:write)
GET /bans: List bans (moderation:read)
List sanctions
NOTE List sanctions
GET /sanctions. Moderation sanctions. Scope: moderation:read.
NOTE GET /sanctions. Moderation sanctions. Scope: moderation:read.
Parameters:
NOTE Parameters:
NOTE
limit (query; integer, 1-100, default 25, optional): Page size (1-100).
cursor (query; string, optional): The meta.next_cursor of the previous page.
order (query; string, one of: desc, asc, default desc, optional): desc = newest first.
member_id (query; string, optional): Sanctioned member (usr_…).
status (query; string, optional): active, expired or revoked.
curl "https://api.blixye.com/v1/sanctions?limit=25" \ -H "Authorization: Bearer bx_live_…"
curl "https://api.blixye.com/v1/sanctions?limit=25" \ -H "Authorization: Bearer bx_live_…"
NOTE curl "https://api.blixye.com/v1/sanctions?limit=25" \ -H "Authorization: Bearer bx_live_…"
Response 200: A page of sanctions.
NOTE Response 200: A page of sanctions.
{ "data": [ { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
{ "data": [ { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
NOTE { "data": [ { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
Errors (the format is in Errors):
NOTE Errors (the format is in Errors):
NOTE
400: Malformed request (invalid limit, cursor, JSON, Idempotency-Key, or an API key sent in the URL).
401: Missing, invalid, revoked or expired API key (codes missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
403: The key lacks a scope (missing_scope), the IP is not allowed (ip_not_allowed), the server's plan has no API (plan_required) or an MDT module is off (module_off).
404: Not found in this server. An id from another server is always a 404.
429: Too many requests for this API key (the limit is per key and per minute, by plan). Too many failed authentications from one IP also give a 429.
Issue a sanction
NOTE Issue a sanction
POST /sanctions. Issues a sanction through the same logic as the moderation panel: the type's defaults apply unless you send the value, and the response says what the escalation policy recommends. If the server disables free-text reasons, send type_id. Scope: moderation:write.
NOTE POST /sanctions. Issues a sanction through the same logic as the moderation panel: the type's defaults apply unless you send the value, and the response says what the escalation policy recommends. If the server disables free-text reasons, send type_id. Scope: moderation:write.
Parameters:
NOTE Parameters:
NOTE
Idempotency-Key (header; string, optional): Makes the POST safe to retry: the same key returns the first response (with Idempotent-Replayed: true) for 24 h. The same key with a different body is a 422.
Body (JSON):
NOTE Body (JSON):
NOTE
member_id (usr_… id, required): Member to sanction.
character_id (chr_… id, nullable, optional): One of that member's characters.
type_id (sty_… id, nullable, optional): Configured sanction type (send this or type_label).
type_label (string, max 80, nullable, optional): Free-text type (max 80).
reason (string, max 255, nullable, optional): Reason (max 255).
description (string, max 4000, nullable, optional): Description.
notes (string, max 4000, nullable, optional): Staff notes.
warn_points (integer, 0-1000, nullable, optional): Warning points (default: the type's).
expiry_days (integer, 0-3650, nullable, optional): Days until it expires, 0 = never (default: the type's).
is_ban (boolean, nullable, optional): It is a ban (default: the type's).
curl -X POST "https://api.blixye.com/v1/sanctions" \ -H "Authorization: Bearer bx_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 5f7c1d2e-mi-reintento-1" \ -d '{"member_id":"usr_3tq0vJ1c9Ydl2Hk7WqPzEw","character_id":"chr_3tq0vJ1c9Ydl2Hk7WqPzEw","type_id":"sty_3tq0vJ1c9Ydl2Hk7WqPzEw"}'
curl -X POST "https://api.blixye.com/v1/sanctions" \ -H "Authorization: Bearer bx_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 5f7c1d2e-mi-reintento-1" \ -d '{"member_id":"usr_3tq0vJ1c9Ydl2Hk7WqPzEw","character_id":"chr_3tq0vJ1c9Ydl2Hk7WqPzEw","type_id":"sty_3tq0vJ1c9Ydl2Hk7WqPzEw"}'
NOTE curl -X POST "https://api.blixye.com/v1/sanctions" \ -H "Authorization: Bearer bx_live_…" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 5f7c1d2e-mi-reintento-1" \ -d '{"member_id":"usr_3tq0vJ1c9Ydl2Hk7WqPzEw","character_id":"chr_3tq0vJ1c9Ydl2Hk7WqPzEw","type_id":"sty_3tq0vJ1c9Ydl2Hk7WqPzEw"}'
Response 201: Created.
NOTE Response 201: Created.
{ "data": { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z", "policy": { "step": 1, "count": 1, "within_days": 1, "apply_type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "apply_type": "Temporary ban", "ban_days": 1 } } }
{ "data": { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z", "policy": { "step": 1, "count": 1, "within_days": 1, "apply_type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "apply_type": "Temporary ban", "ban_days": 1 } } }
NOTE { "data": { "id": "san_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "character_id": "chr_3tq0vJ1c9Ydl2Hk7WqPzEw", "type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "type": "Warning", "reason": "Random deathmatch", "description": "Insulted another player in OOC chat.", "notes": null, "images": [ "string" ], "warn_points": 1, "is_ban": false, "status": "active", "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "issued_by_name": "Admin", "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z", "policy": { "step": 1, "count": 1, "within_days": 1, "apply_type_id": "sty_3tq0vJ1c9Ydl2Hk7WqPzEw", "apply_type": "Temporary ban", "ban_days": 1 } } }
Errors (the format is in Errors):
NOTE Errors (the format is in Errors):
NOTE
400: Malformed request (invalid limit, cursor, JSON, Idempotency-Key, or an API key sent in the URL).
401: Missing, invalid, revoked or expired API key (codes missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
403: The key lacks a scope (missing_scope), the IP is not allowed (ip_not_allowed), the server's plan has no API (plan_required) or an MDT module is off (module_off).
404: Not found in this server. An id from another server is always a 404.
409: Conflict (for example, the same Idempotency-Key is still being processed, or a plan limit was reached).
422: A field is invalid (details.field says which).
429: Too many requests for this API key (the limit is per key and per minute, by plan). Too many failed authentications from one IP also give a 429.
List bans
NOTE List bans
GET /bans. Server bans. Scope: moderation:read.
NOTE GET /bans. Server bans. Scope: moderation:read.
Parameters:
NOTE Parameters:
NOTE
limit (query; integer, 1-100, default 25, optional): Page size (1-100).
cursor (query; string, optional): The meta.next_cursor of the previous page.
order (query; string, one of: desc, asc, default desc, optional): desc = newest first.
member_id (query; string, optional): Banned member (usr_…).
active (query; boolean, optional): true = only bans in force.
curl "https://api.blixye.com/v1/bans?limit=25" \ -H "Authorization: Bearer bx_live_…"
curl "https://api.blixye.com/v1/bans?limit=25" \ -H "Authorization: Bearer bx_live_…"
NOTE curl "https://api.blixye.com/v1/bans?limit=25" \ -H "Authorization: Bearer bx_live_…"
Response 200: A page of bans.
NOTE Response 200: A page of bans.
{ "data": [ { "id": "ban_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "reason": "Random deathmatch", "is_active": true, "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "revoked": false, "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
{ "data": [ { "id": "ban_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "reason": "Random deathmatch", "is_active": true, "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "revoked": false, "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
NOTE { "data": [ { "id": "ban_3tq0vJ1c9Ydl2Hk7WqPzEw", "member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "reason": "Random deathmatch", "is_active": true, "expires_at": "2026-09-27T18:04:05Z", "issued_by_member_id": "usr_3tq0vJ1c9Ydl2Hk7WqPzEw", "revoked": false, "revoked_at": null, "revoked_reason": null, "created_at": "2026-09-27T18:04:05Z" } ], "meta": { "next_cursor": "cur_3tq0vJ1c9Ydl2Hk7WqPzEw" } }
Errors (the format is in Errors):
NOTE Errors (the format is in Errors):
NOTE
400: Malformed request (invalid limit, cursor, JSON, Idempotency-Key, or an API key sent in the URL).
401: Missing, invalid, revoked or expired API key (codes missing_api_key, invalid_api_key, api_key_revoked, api_key_expired).
403: The key lacks a scope (missing_scope), the IP is not allowed (ip_not_allowed), the server's plan has no API (plan_required) or an MDT module is off (module_off).
404: Not found in this server. An id from another server is always a 404.
429: Too many requests for this API key (the limit is per key and per minute, by plan). Too many failed authentications from one IP also give a 429.
← Previous
API v1: members and roles
Next →
API v1: ER:LC sessions
46 / 54 Something missing here →
STEP 1 · PLAN ×
Pick your server's plan
After payment you name it and we configure it together. You can change plan whenever you like.
FREE1 OF 1 LEFT Up to 500 characters and basic CAD. To try it. 0 €
PLUSMONTHLY Full CAD, moderation, activity and economy. 5,99 €
PREMIUMER:LC & FIVEM Everything in PLUS, FiveM included and higher limits. 12,99 €
ENTERPRISEPERMANENT All of PREMIUM forever, self-hosted, never a fee. Contact
Continue to payment
Cancel any time · 14-day withdrawal right, unless you ask to start straight away
Confirm and pay
ER:LC PREMIUM
Monthly · one licence
12,99 €
EMAIL
CARD
Back
In development — unavailable
Blixye is in development: services can’t be purchased yet.Secure payment · VAT included
Name your server
This is the name your players see in the launcher and on Discovery. You can change it whenever.
SERVER NAME
It gets a short code, like SKY-T2Q, to link the launcher.
NEXT Once created we open the setup guide: launcher, Discord and modules in three steps.
Back
Create the server
Type at least 3 characters.
STEP 1 OF 3 · GUIDE ×
1. Send your people the launcher
It is the only thing they install, and only once. They sign in with Discord, we verify their Roblox account and the overlay shows over the session.
Go to the download
2. Create your departments
Police, sheriff, fire or whatever you run. Each with its ranks and permissions: that decides who can punish, clock in or read records.
3. Open the server
With the first duty shift the calls, activity and economy start filling up. From there you just tune it.
Back
Next
⌕ ESC
In-game overlay Radio, sheet and dispatch over the session, no alt-tab. ER:LC CAD and departments Queued calls, units with status and rosters with ranks. ER:LC Moderation and appeals Punishments with context, logs and appeals that do not get lost. ER:LC Staff activity Quotas per rank, shifts and an automatic weekly report. ER:LC Economy and businesses Accounts, payroll, player businesses and inventory. ER:LC Blixye Framework The core: characters, permissions, database and QBCore and ESX bridge. FiveM Inventory Weight, containers and safe player trades. FiveM Police MDT Records, fines, warrants and plate lookups. FiveM Banking Accounts, transfers, payroll and business accounts. FiveM Jobs Shifts, payroll and per-company hierarchy. FiveM Garages Vehicle ownership, persistent damage and impound. FiveM Housing Buying, renting, furniture and personal storage. FiveM Phone Messages, calls, apps and in-world socials. FiveM EMS Per-limb injuries, treatment and a hospital with beds. FiveM All the scripts All eight scripts unlimited, as a permanent purchase or a subscription. FiveM Install Blixye on ER:LC From an empty server to the first duty shift, without touching a game file. Docs Install the FiveM framework The zip, the SQL and your current base bridge, in the right order. Docs Your first week What to set up each day so you do not end up with twenty half-done things. Docs CAD and dispatch Calls, units and priorities inside the overlay. Docs Moderation and appeals Punishments with evidence, appeals and the log that covers you. Docs Activity and shifts Hours, quotas and who is really patrolling. Docs Scripts and free version What each script free version limits and what the full one opens. Docs QBCore and ESX bridge Living with your current base without duplicating players or money. Docs Performance Where to look when the server stutters. Docs
Nothing by that name. Try “inventory”, “CAD” or “licences”.
↵ open CTRL K search 37 results
ROTATE THE KEY ×
! The current key stops working the moment you confirm. This cannot be undone.
current key → new key on confirm
Paste the new key into the script config.
Restart the resource: refresh and ensure.
Until you do, the script will not load.
Yes, rotate the key Cancel
What each plan includes ×
FREE
DISCORD
PLUS
PREMIUM
ENTERPRISE
Price
Free
2,99 €/mo
5,99 €/mo
12,99 €/mo
Contact
GENERAL
Characters stored
500
—
5000
∞
∞
Custom invite code
—
✓
✓
✓
✓
CAD
Max corporations
2
—
6
∞
∞
Max subdivisions
0
—
6
∞
∞
MDT data wipe
1 month
—
1 year
Never
Never
MDT access
Complete
—
Complete
Complete
Complete
Logs history
7 days
—
90 days
∞
∞
Data export
—
—
✓
✓
✓
Investigations
—
—
✓
✓
✓
Evidence storage
—
—
Unmetered
Unmetered
Unmetered
Custom laws
50
—
150
∞
∞
Real-time map
—
—
✓
✓
✓
Bodycam
—
—
✓
✓
✓
Realtime map location
—
—
✓
✓
✓
Advanced search
—
—
✓
✓
✓
Radio channels (Discord VC)
10
—
50
100
∞
Roles per corporation
15
—
50
∞
∞
BANK
Bank accounts
1 per char
—
3 per char
6 per char
12 per char
Transfers
✓
—
✓
✓
✓
Transaction history
✓
—
✓
✓
✓
Cards per account
1
—
2
3
5
Timed cards
Fixed durations
—
✓
✓
✓
Usage-based cards
—
—
Max 5 per char
✓
✓
Role rewards
✓
—
✓
✓
✓
Allow negative balance
—
—
✓
✓
✓
Scheduled transfers
—
—
✓
✓
✓
Player debts
—
—
✓
✓
✓
Per-operation limits
—
—
✓
✓
✓
Shared accounts
Max 2 members
—
Max 5 members
∞
∞
ADMIN
Player heatmap
—
—
✓
✓ more precise
✓ more precise
Max forms
3
5
10
∞
∞
Your server on the phone
—
—
✓
✓
✓
Max admin roles
owner +2
owner +5
owner +10
∞
∞
Priority support
—
✓
✓
✓
✓
Staff audit log history
7 days
30 days
90 days
∞
∞
Beta features
—
✓
✓
✓
✓
Create server
Character and storage addons stack on any plan.
Cookies ESSENTIAL ONLY
We only use the essential ones: your session, sign-in security and your language. There is no analytics and no advertising, so there is nothing to accept or reject.
Got it
Cookie policy