About · Draft room
How drafts and lanes work
The draft room plans a game before it starts: both teams' heroes and the bans on one board, who's ahead after every pick, the best next picks and how each lane should go. This page says what goes into each number, how often the lane model was right on lanes it had never seen, and how to use drafts from other tools.
At a glance
How sure is it? Not very, and the draft room says so. The model's expected lead for a lane is usually a few hundred souls; lanes with the same four heroes finish anywhere from about −3,264 to +3,264 (the middle 80%). It tells you which side is more likely to be ahead, by a little. The chance of being ahead is the model's best honest figure: lanes it gave 55–60% were ahead 57.4% of the time.
What a draft is here
Deadlock has no pick-by-pick draft. Players choose heroes in the lobby, there are bans, and there is a short window to swap. So the draft room is a planning board, for a party (or two) and not a copy of the game's screen. It follows what the match data says about the game:
- One of each hero. In 220,117 matches checked on 27 October 2026, none had the same hero twice, on either team. So a hero can be in one place only: a slot or a ban.
- Bans are for the whole match. A ranked match has 3 and any other 2, the same list for all twelve players, so a ban takes a hero out for both teams. Each side can record the bans it wants, but the total is capped. Who proposes a ban is a note, not a rule.
- Lanes come in pairs. There are three lanes, York (assigned_lane 1), Broadway (assigned_lane 4), Greenwich (assigned_lane 6), with two heroes a side in each. In every match checked, the teams split 2-2-2. Slots 1–2 on the board are York, 3–4 Broadway and 5–6 Greenwich, on both teams.
Who's ahead, the best next picks and bans
Who's ahead is the pre-game win-chance model on the heroes picked so far, with the map side left out. Empty slots count as average heroes, so a half-picked draft sits nearer 50%. What moves it is each piece's effect on the chance, found by taking only that piece away.
Best next picks are every free hero, ranked by the team's chance with it added. The number beside a pick is exactly the chance the page shows once you add it. The reasons are the pieces of that number involving the hero: its own strength, each hero on the other team it is good or bad into, each teammate it works well or badly with. Two more things sit beside them and do not change the order: the lane it fits best (the change in that lane's expected lead at 9:00, shown when it is 40 souls or more) and how often the hero is banned at the player's rank.
Bans. The most banned heroes come from deadlock-api's hero-ban-stats at the chosen rank over the last 30 days (matches with ban data only), falling back to all ranks when the rank has under 1,000 such matches. Bans that would cost them most are the heroes the other team would most want for its open slots (up to three): a ban only matters by the gap between the hero and the pick they would take instead, so the page shows that gap and what they would fall back to.
Solo draft fills the other team's open slots with what is commonly picked: 600 teams drawn at random, each hero in proportion to its pick rate at the rank, skipping anyone picked or banned. A pick is scored by the team chance it gives on average over those teams. Heroes are drawn independently of each other, which real lobbies are not, so read it as a guide to what is common, not a prediction of the lobby. The draws use a fixed seed taken from the draft, so the same board gives the same answer.
Lanes at 9:00
The lane model predicts how far ahead a duo is at 9:00, in souls with the two players' souls added together (the way deadlock-api's lane endpoints report it), from the four heroes in the lane. It is a least-squares fit that adds up:
- Hero strength: every hero in one duo adds its own number and every hero in the other takes it away. The strongest in the fit is Calico at +325 souls, the weakest McGinnis at −496.
- Head to head: each hero in one duo against each in the other (836 pairings kept).
- Together: the two heroes of a duo (802 pairings kept).
- Lane side: the Amber Hand's edge in each lane, York −231, Broadway −48, Greenwich +83 souls. It is real and fairly steady, and the draft room and the match page use it because the sides are known there.
It was fitted on 5,118,379 two-against-two lanes from 6 October 2026 to 20 October 2026, in standard matches (six against six, ranked or unranked, no bots, scored, five minutes or longer) where all four players were still in at 9:00, read from deadlock-api's public data lake (no analytics API calls). Pair effects are pulled towards zero (penalties chosen on 658,512 later lanes). The chance of being ahead is a normal curve over the expected lead with a spread of 2,550 souls. The numbers below are for the model exactly as shipped, on 1,337,238 lanes from 20 October 2026 to 23 October 2026 that it never saw. Each lane counts from both sides.
| What the model sees | Picked the leader | Typical miss (souls) | Log loss |
|---|---|---|---|
| Nothing (a coin flip) | 50.0% | 2,369 | 0.6931 |
| Hero strengths only | 54.4% | 2,347.5 | 0.6869 |
| + head to head | 54.8% | 2,343.9 | 0.6858 |
| Shipped (+ together), map side unknown | 54.9% | 2,343.1 | 0.6855 |
| Shipped, map side known | 55.4% | 2,338.2 | 0.6842 |
On ranked lanes it picked the leader 55.8% of the time and on unranked 54.7% (201,446 and 1,135,792 lanes). By lane: York 54.6%, Broadway 55.2%, Greenwich 54.8%. When it expected a lead of 200 souls or more (59% of lanes), it picked the leader 57.2% of the time.
Calibration of the chance of being ahead
Each dot is a bucket of duos. Across is the chance of being ahead the model gave them; up is how often they were. The dashed line is a model that is exactly right, and the bars are 95% ranges.
| Chance given | Duos | Mean given | Actually ahead |
|---|---|---|---|
| under 35% | 14,433 | 33.2% | 32.2% |
| 35–40% | 106,680 | 38.2% | 37.8% |
| 40–45% | 405,810 | 42.9% | 42.6% |
| 45–48% | 454,197 | 46.6% | 46.4% |
| 48–52% | 711,796 | 50.0% | 50.0% |
| 52–55% | 454,197 | 53.4% | 53.6% |
| 55–60% | 405,810 | 57.1% | 57.4% |
| 60–65% | 106,680 | 61.8% | 62.3% |
| 65% or more | 14,433 | 66.8% | 67.8% |
The same duos' own record
deadlock-api also keeps the record of exactly two duos against each other. It is thin: the draft room shows it, from the last 30 days across all ranks, when at least 30 lanes are behind it. We tested whether it should be mixed into the prediction. For each size of record, we compared the model, and the exact record alone, with what happened in the next lanes between those duos:
| Lanes in the record | Lanes tested | Model's miss (souls) | Record's miss (souls) |
|---|---|---|---|
| 1–9 | 207,871 | 2,377.2 | 2,655.2 |
| 10–29 | 418,549 | 2,413.8 | 2,479.6 |
| 30–99 | 333,189 | 2,403.4 | 2,428.2 |
| 100–299 | 38,117 | 2,340 | 2,349.1 |
Even with 100 to 300 lanes behind it, an exact record was no better than the model, so it is shown beside the prediction, with its range, and is not mixed in. The pair model has already learnt what the lane's four heroes have in common; what is left is mostly luck and the players.
On match pages
A finished match shows, for each two-against-two lane, what the model expected for the Amber Hand's duo at 9:00 (with the lane's side edge) next to what the two players' souls added up to. It is a way to see which lanes went the way the heroes suggested and which didn't, not a grade. A lane that finished far from the expected lead mostly says the players mattered, as they usually do.
The draft code
A draft is one line of text, for links, chat and other tools:
d1:7R:1,2,0,0,0,0:7,8,9,0,0,0:76:13,69d1: the format version.7R: the rank tier the stats are read at (1 to 11,0for all ranks, as in deadlock-api's ranks) andRfor ranked (three bans) orUfor unranked (two).1,2,0,0,0,0: the Amber Hand's six slots, then7,8,9,0,0,0the Sapphire Flame's. Numbers are deadlock-api's hero IDs;0is an empty slot. Slots 1–2 are York, 3–4 Broadway, 5–6 Greenwich, on both teams.76and13,69: the bans each side recorded (a list may be empty, which leaves nothing between the colons).
A code is valid only if every number is a hero ID from 1 to 255, no hero appears twice anywhere in it (picks and bans together) and the bans are within the limit. Anything else is refused. Open one on the draft room by pasting it in the box, or with /scout/draft/?code=….
Shared rooms
A room is a draft kept on our servers, so a party can plan on one board. Its code is twelve characters in two halves, like K7QM2X-9FPWTR, from an alphabet without look-alikes (no 0, 1, I, L or O). Anyone with the whole code can edit; the first half on its own, in /scout/draft/?view=K7QM2X, is a read-only link. The room keeps only a hash of the second half.
- Every change goes through the room, which applies changes in the order they arrive and tells everyone. If two people change the same slot, the later one wins; if two people pick the same hero, the later is told it is taken.
- Up to 24 people can be in a room at once. A browser that can't keep a WebSocket open checks the room every few seconds instead.
- A room is deleted 14 days after its last change. Rooms hold hero IDs and the rank; nothing about who edited.
- Anyone with a room's ID can read it, from any site.
Reading a draft from another tool
The reads are public, need no key and allow any site (CORS):
GET /api/draft/decode?code=d1:…: the answer for a draft code, with no room involved.GET /api/draft/rooms/<id>: a room by its ID (the first half of its code), with its revision, times and the draft. Add?since=<rev>to get{ "unchanged": true }when nothing has changed, for polling.
Both answer with the same shape. The chances are the pre-game model's and the lanes the lane model's, from the frozen model files (no rank-specific stats), so the same draft always gives the same answer until a model is refitted (models says which versions). The example below is this page's own code run on the example code above:
The answer for d1:7R:1,2,0,0,0,0:7,8,9,0,0,0:76:13,69
{
"code": "d1:7R:1,2,0,0,0,0:7,8,9,0,0,0:76:13,69",
"rank": 7,
"ranked": true,
"teams": {
"amber": {
"name": "The Amber Hand",
"heroes": [
{
"id": 1,
"name": "Infernus"
},
{
"id": 2,
"name": "Seven"
},
null,
null,
null,
null
],
"bans": [
{
"id": 76,
"name": "Graves"
}
],
"chance": 0.5175
},
"sapphire": {
"name": "The Sapphire Flame",
"heroes": [
{
"id": 7,
"name": "Wraith"
},
{
"id": 8,
"name": "McGinnis"
},
{
"id": 9,
"name": "Hero 9"
},
null,
null,
null
],
"bans": [
{
"id": 13,
"name": "Haze"
},
{
"id": 69,
"name": "The Doorman"
}
],
"chance": 0.4825
}
},
"chance": {
"model": "pregame-v1",
"amber": 0.5175,
"sapphire": 0.4825,
"confidence": "toss-up",
"picked": {
"amber": 2,
"sapphire": 3
}
},
"lanes": [
{
"id": 1,
"name": "York",
"amber": [
{
"id": 1,
"name": "Infernus"
},
{
"id": 2,
"name": "Seven"
}
],
"sapphire": [
{
"id": 7,
"name": "Wraith"
},
{
"id": 8,
"name": "McGinnis"
}
],
"lead": 359,
"amberAhead": 0.5559
},
{
"id": 4,
"name": "Broadway",
"amber": [
null,
null
],
"sapphire": [
{
"id": 9,
"name": "Hero 9"
},
null
],
"lead": null,
"amberAhead": null
},
{
"id": 6,
"name": "Greenwich",
"amber": [
null,
null
],
"sapphire": [
null,
null
],
"lead": null,
"amberAhead": null
}
],
"bestNext": {
"amber": [
{
"id": 66,
"name": "Victor",
"chance": 0.5907,
"gain": 0.0732
},
{
"id": 84,
"name": "Rat King",
"chance": 0.59,
"gain": 0.0725
},
{
"id": 67,
"name": "Paige",
"chance": 0.566,
"gain": 0.0485
}
],
"sapphire": [
{
"id": 66,
"name": "Victor",
"chance": 0.5419,
"gain": 0.0594
},
{
"id": 67,
"name": "Paige",
"chance": 0.5366,
"gain": 0.0541
},
{
"id": 84,
"name": "Rat King",
"chance": 0.5363,
"gain": 0.0538
}
]
},
"models": {
"pregame": 1,
"lanes": 1
}
}teams: each team's name, six heroes (null for an empty slot), bans and chance.chance: both chances, how far from even (toss-up,slight,clearorstrong) and how many heroes are picked.lanes: the three lanes, each team's duo, the Amber Hand's expected lead at 9:00 in souls and its chance of being ahead (null until both teams have a hero there).bestNext: the three best next picks for each team, with the chance each would give and the change.
Writing needs the full room code: POST /api/draft/rooms (optionally { "code": "d1:…" }) makes a room, and POST /api/draft/rooms/<id>/op with { "key": "…", "op": {…} } makes one change; the page uses a WebSocket on/api/draft/rooms/<id>/ws for the same changes. New rooms are limited to ten a minute per address. Don't build anything that depends on the edit messages staying the same; the read answers are the ones we mean to keep.
On Discord, /draft code:<draft code or room code> posts the same answer as a card. Give it a room code and it reads the room.
What it cannot do
- It knows the heroes, not the players. Lanes between the same four heroes end anywhere from a big win to a big loss, and the model's edge is small beside that.
- Hero strengths are the same at every rank, and the lane model is not split by rank. The pre-game model is also fitted on all ranks.
- It doesn't know items, builds, the order heroes will reach their power, or what the other team does next. The suggested split is the best against the other team as it stands and must be asked again if they move.
- A new hero, or a patch that changes many heroes, makes both models stale until they are refitted. The date above is when that last happened. Heroes the models haven't seen add nothing.
- The draft room's bans and pick shares come from deadlock-api's aggregates, which only count matches whose ban data was read.
Refitting
The lane model is built by two scripts in scripts/draft/, in a throwaway Python environment (duckdb numpy scipy pandas); nothing is added to the site's dependencies: extract_lanes.py reads the lanes from the data lake and fit_lanes.py fits the model and writes apps/web/src/data/lane-model.json, with its accuracy, calibration and a few scored lanes that tests/lane-model.test.ts checks the page's code against. This page reads that file, so its numbers follow a refit. The pre-game model is refitted by scripts/win-chance/.