Running a proper Assetto Corsa league race weekend comes down to four things: a locked entry list so only your registered drivers can join, Balance of Performance to even up a mixed field, the right session structure for a race weekend, and a penalty plugin — because the base game can't enforce serious race rules on its own. Get those four right and you've got a championship-grade server. This guide walks through each on the stock Kunos racing server.
This is the racing path throughout. If you want AI traffic or cruising, you're on the wrong server entirely — that's freeroam, and it runs different software.
The league recipe: lock the grid without booking mode
The first instinct is to reach for "booking mode". Don't. Kunos's own config even says of booking mode: "do not use it." The modern way to lock a league grid is:
; ---- cfg/server_cfg.ini → [SERVER] ---- PICKUP_MODE_ENABLED=1 ; keep pickup mode ON LOCKED_ENTRY_LIST=1 ; but only Steam GUIDs in entry_list.ini may join PASSWORD=league-secret ; plus a join password as a second gate
LOCKED_ENTRY_LIST=1 restricts the server to the exact drivers you've listed by Steam GUID in entry_list.ini. Combined with pickup mode, each registered driver connects and takes their assigned car — a fixed, known grid, no gatecrashers, and none of the clunky booking-session flow. This is what almost every league actually runs.
Building the entry list with Balance of Performance
entry_list.ini is where the grid lives. For a league, each [CAR_n] block pins a car and skin to a specific driver's Steam GUID and carries that car's BoP:
; ---- cfg/entry_list.ini ---- [CAR_0] MODEL=ks_ferrari_488_gt3 SKIN=racing_team_01 DRIVERNAME=A. Driver TEAM=Rosso Racing GUID=76561198000000001 ; the driver's Steam64 ID — only this account can take the slot SPECTATOR_MODE=0 BALLAST=20 ; +20 kg ballast (BoP) — alters handling; capped by MAX_BALLAST_KG RESTRICTOR=0 ; air restrictor 0–100 — cuts power only, no handling change FIXED_SETUP= ; blank = free setup; a path locks the setup [CAR_1] MODEL=ks_mclaren_650_gt3 SKIN=blue_01 DRIVERNAME=B. Racer TEAM=Papaya Motorsport GUID=76561198000000002 SPECTATOR_MODE=0 BALLAST=0 RESTRICTOR=8 ; 8% restrictor to peg back a quicker car FIXED_SETUP= [CAR_2] MODEL=ks_ferrari_488_gt3 SKIN=press_cam DRIVERNAME=Race Control GUID=76561198000000099 SPECTATOR_MODE=1 ; a broadcast/spectator slot — not racing BALLAST=0 RESTRICTOR=0 FIXED_SETUP=
The two BoP levers behave differently, and it matters:
BALLASTadds weight in kilograms. It slows a car and changes how it handles (more weight, higher centre of gravity). Capped byMAX_BALLAST_KGinserver_cfg.ini.RESTRICTOR(0–100) chokes the engine's top-end power without touching handling. It's the cleaner lever when you only want to peg back straight-line speed.
SPECTATOR_MODE=1 marks a slot as a non-racing entry — handy for a broadcast camera or race control. And FIXED_SETUP locks the car's setup when you point it at a setup file (leave it blank for open setups).
Structuring the race weekend
The session order is fixed — practice, then qualifying, then race — and you define each in server_cfg.ini. A typical sprint weekend:
; ---- cfg/server_cfg.ini ---- [PRACTICE] NAME=Practice TIME=20 ; minutes IS_OPEN=1 [QUALIFY] NAME=Qualifying TIME=15 IS_OPEN=1 [RACE] NAME=Feature Race LAPS=24 ; a lap-counted race (use TIME for a timed race instead) TIME=0 WAIT_TIME=60 ; grid time before the green light IS_OPEN=1 ; drivers can't parachute into a formation
For a mandatory pit stop, add the window (in [SERVER]):
RACE_PIT_WINDOW_START=8 ; window opens on lap 8 (or minute 8 for a timed race) RACE_PIT_WINDOW_END=16 ; and closes on lap 16
A stop only counts if the driver enters the pits and stops in their box inside that window. Base Assetto Corsa enforces "you must pit in the window" but not what the stop involves (tyres, minimum time, driver swap) — that needs a plugin. For a full breakdown of every session and rule key, see server_cfg.ini explained line by line.
Enforcing penalties (the base server can't do it alone)
Here's the honest limitation: the stock Kunos server has only crude penalty tools — a cut-penalty toggle (RACE_GAS_PENALTY_DISABLED), a cut tolerance (ALLOWED_TYRES_OUT), jump-start handling (START_RULE) and a contact-based auto-kick (MAX_CONTACTS_PER_KM). There is no track-limit strike system, no automated stop-and-go, no minimum-pit-time enforcement in the base config. Anyone who tells you PENALTIES=1 does all that is wrong — that key doesn't exist in the Kunos server.
Real leagues layer a plugin on top:
- KissMyRank — automated penalties for track limits, collisions and speeding, plus safety ratings. This is the pragmatic choice for most sprint leagues, and it's what our racing servers ship built in — enable it from the dashboard, set your collision and cut rules, done.
- Real Penalty — the endurance standard, with automated stop-and-go, track-limit strikes, and crucially driver-swap and minimum-pit-time enforcement. It's a commercial plugin (roughly €5/month for the server side) and requires a client app, so it's an add-on you'd run yourself rather than something we bundle.
For the championship layer — points across multiple rounds, live timing, results pages and applying post-race penalties — the community standard is assetto-server-manager (ACSM) by JustaPenguin, which integrates KissMyRank, Real Penalty and stracker for you. One tool that's worth not building on: Minorating, the old safety-rating gate, has been shut down — don't design a league around it.
The typical multi-weekend workflow: stand up a racing server per round, build the grid with GUID-pinned entries and BoP, set the sessions and pit window, attach KissMyRank (sprint) or Real Penalty (endurance) for penalties, and aggregate each round's results JSON into standings with ACSM's championship mode.
Sizing a race server
A race server is far lighter than a freeroam one — there's no AI traffic to simulate, and the grid is capped at ~24 by the track's pit boxes. It still benefits from strong single-thread CPU for clean netcode with a full grid, but you don't need the CPU headroom a traffic server demands. Our server sizing guide has the numbers for both; for most leagues a mid-tier plan is plenty.
Frequently Asked Questions
How do I stop random people joining my league server?
Set LOCKED_ENTRY_LIST=1 in server_cfg.ini and pin each driver's Steam GUID in entry_list.ini — only those accounts can join. Add a join PASSWORD as a second layer. Keep pickup mode on (PICKUP_MODE_ENABLED=1); you don't need booking mode, which Kunos itself advises against.
What's the difference between ballast and restrictor for BoP?
Ballast adds weight in kilograms, which slows the car and changes its handling. A restrictor (0–100) cuts engine power without affecting handling. Use restrictor to peg back a car that's only too fast in a straight line, and ballast when you want to blunt its overall pace and agility. Both are set per car in entry_list.ini.
Can Assetto Corsa enforce track limits and stop-and-go penalties?
Not with the base server — it only has a basic cut penalty and contact kick. For proper track-limit strikes, automated stop-and-go, and minimum pit time you need a plugin: KissMyRank for most leagues (built in on our racing servers) or Real Penalty for endurance racing with driver swaps.
How many drivers can a league race server hold?
Around 24, because Assetto Corsa caps the grid at the track's number of pit boxes and most tracks have 24. Some pit-box mods raise it slightly, but the engine often won't spawn beyond the track's original count. Plan your grid around 24–26 and test any high-pit-box track before relying on it.
Want a league server with the rules engine already in place? Our Assetto Corsa racing servers come with KissMyRank built in and dashboard editors for race rules and your entry-list BoP — so you can run a clean championship without wrestling config files every round.



