Drafter.lol is desktop only for now

Open this page on a computer to create and run drafts.

Version 1.0Updated: 01.03.2026

API Documentation

discordJoin Developer Community

Introduction

Welcome to the Drafter.lol API documentation. Our API provides programmatic access to create and manage draft series, enabling seamless integration for tournament organizers, discord bots, and event management systems.

Need help?

Join our Discord for direct support from the developers.

Authorization

The API uses Bearer Token authentication. You must include your API Key in the Authorization header of every request.

Header Example

plaintext
Authorization: Bearer DRAFTER-123XYZ

Note: API Keys are exclusively available to users with an active subscription. View Pricing

POST

Create Series

Programmatically create a new draft series. This endpoint is ideal for automating match generation for tournaments.

Endpoint

https://api.drafter.lol/api/series

Request Body

Send a JSON object with the following parameters:

json
{
  "team1Name": string,        // Max 35 characters
  "team2Name": string,        // Max 35 characters
  "fearless": boolean,    // Enable fearless mode
  "ironman": boolean,     // Enable ironman mode
  "firstSelection": boolean,  // Optional. Enable first-selection mode
  "gameAmount": number,   // Number of games (1-5)
  "disabledChampions": string[] // Optional. Champion keys to disable (defaults to [])
}

Use internal champion keys, not display names (e.g. Wukong = MonkeyKing).

Important

Fearless and Ironman modes are mutually exclusive.

Example

javascript
const response = await fetch('https://api.drafter.lol/api/series', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer DRAFTER-123XYZ',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    team1Name: 'T1',
    team2Name: 'GenG',
    fearless: true,
    ironman: false,
    firstSelection: true,
    gameAmount: 3,
    disabledChampions: ['Aatrox', 'Ahri', 'MonkeyKing']
  })
});

const data = await response.json();
console.log(data);

Response

Returns the created series ID and direct URL:

json
{
  "id": "series_123abc",
  "url": "https://drafter.lol/draft/series_123abc"
}
POST

Create Single Draft

Create a standalone draft room without series features.

Endpoint

https://api.drafter.lol/api/rooms

Request Body

Send a JSON object with the following parameters:

json
{
  "blueName": string,       // Max 35 characters
  "redName": string,        // Max 35 characters
  "firstSelection": boolean, // Optional. Defaults to false
  "disabledChampions": string[] // Optional. Champion keys to disable (defaults to [])
}

Use internal champion keys, not display names (e.g. Wukong = MonkeyKing).

Example

javascript
const response = await fetch('https://api.drafter.lol/api/rooms', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer DRAFTER-123XYZ',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    blueName: 'Blue Team',
    redName: 'Red Team',
    firstSelection: true,
    disabledChampions: ['Aatrox', 'Ahri', 'MonkeyKing']
  })
});

const data = await response.json();
console.log(data);

Response

Returns the created draft ID and direct URL:

json
{
  "id": "draft_123abc",
  "url": "https://drafter.lol/draft/draft_123abc"
}
GET

Drafts Created

Fetch recent Drafts created by your account.

Endpoint

https://api.drafter.lol/api/drafts-created

Query Parameters

json
{
  "amount"?: number // Optional. Defaults to 20. Max 100.
}

Example

javascript
const response = await fetch('https://api.drafter.lol/api/drafts-created?amount=20', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer DRAFTER-123XYZ'
  }
});

const data = await response.json();
console.log(data);

Response

Returns a list of drafts created by your account (limited by amount):

json
{
  "draftsCreated": [
    "draft_123abc",
    "draft_456def",
    ...
  ]
}

Ordered from most recent to oldest.

Errors

401
Missing/invalid API key
429
Too many requests
GET

Get Draft Data

Fetch completed draft results for a single draft or a series by ID. The response shape depends on the draft type.

Endpoint

https://api.drafter.lol/api/drafts/{id}

Path Parameters

json
{
  "id": string // Draft or series ID
}

Missing or unavailable IDs return 404 Draft not found.

Example

javascript
const id = 'draft_123abc';

const response = await fetch(`https://api.drafter.lol/api/drafts/${id}`, {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer DRAFTER-123XYZ'
  }
});

const data = await response.json();
console.log(data);

Response

Single draft response:

json
{
  "draftData": {
    "type": "draft",
    "id": "draft_123abc",
    "blueName": "T1",
    "redName": "GenG",
    "firstSelection": true,
    "disabledChampions": ["Aatrox", "MonkeyKing"],
    "firstPick": "blue",
    "secondPick": "red",
    "blueBan1": "Aatrox",
    "blueBan2": "Ahri",
    "blueBan3": "Akali",
    "blueBan4": "Alistar",
    "blueBan5": "Amumu",
    "redBan1": "Anivia",
    "redBan2": "Annie",
    "redBan3": "Aphelios",
    "redBan4": "Ashe",
    "redBan5": "Aurelion Sol",
    "bluePick1": "Braum",
    "bluePick2": "Caitlyn",
    "bluePick3": "Camille",
    "bluePick4": "Cassiopeia",
    "bluePick5": "Cho'Gath",
    "redPick1": "Darius",
    "redPick2": "Diana",
    "redPick3": "Draven",
    "redPick4": "Ekko",
    "redPick5": "Elise"
  }
}

disabledChampions contains champion keys (for example, Wukong is MonkeyKing).

Series response:

json
{
  "draftData": {
    "type": "series",
    "id": "draft_123abc",
    "team1Name": "T1",
    "team2Name": "GenG",
    "fearless": true,
    "ironman": false,
    "firstSelection": true,
    "gameAmount": 3,
    "disabledChampions": ["Aatrox", "MonkeyKing"],
    "fearlessUsedChampions": {
      "T1": [
        "Braum",
        "Caitlyn",
        "Camille",
        "Cassiopeia",
        "Cho'Gath",
      ],
      "GenG": [
        "Darius",
        "Diana",
        "Draven",
        "Ekko",
        "Elise"
      ]
    },
    "drafts": [
      {
        "gameNumber": 1,
        "blueName": "T1",
        "redName": "GenG",
        "firstPick": "blue",
        "secondPick": "red",
        "blueBan1": "Aatrox",
        "blueBan2": "Ahri",
        "blueBan3": "Akali",
        "blueBan4": "Alistar",
        "blueBan5": "Amumu",
        "redBan1": "Anivia",
        "redBan2": "Annie",
        "redBan3": "Aphelios",
        "redBan4": "Ashe",
        "redBan5": "Aurelion Sol",
        "bluePick1": "Braum",
        "bluePick2": "Caitlyn",
        "bluePick3": "Camille",
        "bluePick4": "Cassiopeia",
        "bluePick5": "Cho'Gath",
        "redPick1": "Darius",
        "redPick2": "Diana",
        "redPick3": "Draven",
        "redPick4": "Ekko",
        "redPick5": "Elise"
      }
    ]
  }
}

For series, only drafts that are completed are included in the drafts array.

In fearless or ironman mode, fearlessUsedChampions tracks champions that were picked (and banned if ironman mode) by each team across the series.

Rate Limits & Errors

This endpoint is limited to 100 requests per minute per API key.

Missing draft lookups are additionally limited to 10 per hour.

json
// 429 Too Many Requests
{
  "message": "Too many requests, please try again later. ..."
}
json
// 429 Too Many Requests (missing draft limit)
{
  "message": "Too many requests for missing drafts. Please try again later. ..."
}
400
Invalid ID
401
Missing/invalid API key
404
Draft not found (invalid ID or draft not yet completed)

Webhooks

Instead of polling for results, we can push them to you. Every draft you create through the API sends two POST requests to a URL of your choice: one the moment all picks and bans are locked in, and one when role confirmation resolves. Only drafts created with your API key are sent, and only after webhooks have been enabled for your account.

Enabling

Send us the URL you want to receive events on and we will attach it to your account. If you want to verify that a request really came from us, send a token along with it and we will put it on every delivery as Authorization: Bearer …. You can confirm what we have on file, and send yourself a test event, with these endpoints:

GET https://api.drafter.lol/api/webhooks

POST https://api.drafter.lol/api/webhooks/test

javascript
// Send a ping event to your endpoint and see what it answered
const response = await fetch('https://api.drafter.lol/api/webhooks/test', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer DRAFTER-123XYZ'
  }
});

console.log(await response.json());
// { "delivered": true, "url": "https://your.app/drafter", "authenticated": true, "status": 200, "error": null }

Events

Every delivery carries an event field, so you can react to only the ones you care about:

plaintext
draft.completed All picks and bans are final. Role confirmation may still be running. role_confirmation.completed Both teams confirmed their lane assignments. role_confirmation.skipped Nobody confirmed in time, so there are no lane assignments. ping Only ever sent by the test endpoint.

A finished draft always produces exactly two deliveries: draft.completed followed by one of the two role_confirmation.* events. Drafts that are abandoned before the last pick send nothing.

Payload

data matches the single draft shape of Get Draft Data, so you can reuse the same parsing:

json
{
  "event": "role_confirmation.completed",
  "sentAt": "2026-03-01T18:04:12.517Z",
  "draftId": null,
  "seriesId": "series_123abc",
  "data": {
    "type": "draft",
    "id": "series_123abc",
    "url": "https://drafter.lol/draft/series_123abc",
    "patch": "15.5.1",
    "seriesId": "series_123abc",
    "gameNumber": 2,
    "blueName": "T1",
    "redName": "GenG",
    "firstPick": "blue",
    "secondPick": "red",
    "fearless": true,
    "ironman": false,
    "firstSelection": false,
    "blueBan1": "Aatrox",
    // ... all bans and picks, as in Get Draft Data
    "redPick5": "Lulu",
    "roleAssignments": {
      "blue": {
        "top": "Gnar",
        "jungle": "LeeSin",
        "mid": "Ahri",
        "adc": "Jinx",
        "support": "Thresh"
      },
      "red": {
        "top": "Ornn",
        "jungle": "Graves",
        "mid": "Syndra",
        "adc": "Caitlyn",
        "support": "Lulu"
      }
    }
  }
}

roleAssignments is null on draft.completed and role_confirmation.skipped. draftId is only set for standalone drafts. Series games use seriesId plus gameNumber instead.

Headers

plaintext
X-Drafter-Event: role_confirmation.completed X-Drafter-Timestamp: 2026-03-01T18:04:12.517Z User-Agent: drafter-webhooks/1 Authorization: Bearer <your token> // only if you gave us a token

If you gave us a token, compare it against your copy and reject anything that does not match. Use a constant-time comparison if your language offers one. We only ever send it over HTTPS and we never follow redirects, so your endpoint is the only thing that sees it.

Without a token the requests are unauthenticated, so keep your endpoint URL private and treat every payload as unverified input: look the draft or series up by draftId or seriesId if you need to be sure it is one of yours. Requests are never signed, so a token proves who sent the request but not that the body is unmodified.

Delivery & Retries

Answer with any 2xx status within 10 seconds. Timeouts, network errors and 429/5xx responses are retried twice more (after 2 and 8 seconds); other 4xx responses are treated as a permanent rejection and are not retried. Redirects are not followed, so give us the final URL.

Retries mean deliveries can arrive out of order, so use event and sentAt rather than arrival order.

Note that draft.completed is sent before the draft is marked as complete, so fetching it from Get Draft Data right away can still 404. The payload already contains the full result.

Testing

You can test integration using our dedicated test endpoints and key. This allows you to verify your integration without an active subscription.

Test Key

plaintext
DRAFTER-KEY123

Test Endpoints

For Series Creation:

https://api.drafter.lol/api/test/series

For Single Draft Creation:

https://api.drafter.lol/api/test/room

For Draft Data:

https://api.drafter.lol/api/test/draft-data/{id}

Allowed IDs: test-series-id (returns series data) and test-draft-id (returns single draft data).

These endpoints mimic the behavior of the production API. They are rate-limited to 100 requests per minute.