Every tournament on this site is backed by a single JSON file containing its players, decklists, and round-by-round match results. The same data drives the leaderboards, matchup tables, and deck clustering pages.
Each tournament's dataset is served from a stable URL:
Tournament IDs are listed in the Download column on the home page — each link points directly at the JSON for that event. Files update as rounds are played.
A minimal tournament with two players and one completed round looks like this:
{
"title": "Example RC 2026",
"source_url": "https://melee.gg/Tournament/View/000000",
"start_date": "2026-01-01T16:00:00+00:00",
"players": {
"1001": {
"ident": "1001",
"name": "Alice",
"url": "https://melee.gg/Profile/Index/1001",
"deck": {
"archetype": "Mono-Red Aggro",
"author": null,
"url": null,
"main_deck": [
{ "name": "Monastery Swiftspear", "count": 4 },
{ "name": "Mountain", "count": 20 }
],
"side_board": [
{ "name": "Roiling Vortex", "count": 2 }
]
}
},
"1002": {
"ident": "1002",
"name": "Bob",
"url": null,
"deck": {
"archetype": "Esper Control",
"author": null,
"url": null,
"main_deck": [
{ "name": "Counterspell", "count": 4 }
],
"side_board": []
}
}
},
"round_results": [
[
{ "p1": "1001", "p2": "1002", "games": [2, 1, 0], "complete": true }
]
]
}
A simple tournament where Alice won the only match 2-1.
The tables below describe each object in the dataset. A formal JSON Schema is available for use with validators and code generators.
| Field | Type | Description | |
|---|---|---|---|
| title | string | required | Human readable tournament name. Empty string when not known. |
| source_url | string | required | URL of the original tournament listing (e.g. melee.gg) that this data was scraped from. Empty string when not known. |
| start_date | string | required | ISO 8601 start date/time of the tournament. Empty string when not known. |
| limited_rounds | integer[] | required | 0-indexed round numbers played in a limited (drafted) format for mixed limited-constructed tournaments. Empty list if there are no limited rounds. |
| required_points | { string: integer } | required | Match-point cutoffs. The key is the number of rounds played; the value is the minimum match points needed at that point to continue playing. e.g. { "9": 18 } = need 18 points after 9 rounds. Empty when there is no cut. |
| top_cut_rounds | integer | required | Number of single-elimination rounds at the end of the tournament. 3 = Top 8, 4 = Top 16, etc. |
| players | { string: Player } | required | Map from a player's ident to their record. |
| round_results | MatchResult[][] | required | Round-by-round results. For in progress tournaments the length of this array should always be the total number of rounds in the tournament. Rounds that have not started will have an empty MatchResult array associated with them. |
| Field | Type | Description | |
|---|---|---|---|
| ident | string | required | Identifier for the player. Format depends on data source. |
| name | string | required | Display name of the player. |
| url | string | null | optional | Profile URL of the player on the source platform, when available. |
| deck | Deck | required | The decklist registered by this player. |
| Field | Type | Description | |
|---|---|---|---|
| main_deck | Card[] | required | Main deck cards |
| side_board | Card[] | required | Sideboard cards. |
| archetype | string | required | Archetype label for the deck. "unknown" when no archetype could be determined. |
| author | string | null | optional | Original deck author, if given. |
| url | string | null | optional | URL of the decklist on the source platform, when available. |
| Field | Type | Description | |
|---|---|---|---|
| name | string | required | Card name (direct from data source, no normalizing has been done) |
| count | integer ≥ 1 | required | Number of copies of this card. |
| Field | Type | Description | |
|---|---|---|---|
| p1 | string | required | Player id of the first player. |
| p2 | string | null | required | Player id of the second player. null for byes or forfeits. |
| games | [integer, integer, integer] | required | Game scores as [p1 wins, p2 wins, draws]. For byes this is [0, 0, 0]. For forfeits this is [0, 2, 0]. Intentional draws are [0, 0, 0]. Match results are normalized so p1 is the winner (forfeits exempted). |
| complete | boolean | optional, default true |
False if the match is still in progress. |
For automated validation or code generation, download
tournament.schema.json
(Draft 2020-12).
Loading…