IVK Skill API 1.0

Getting Started

You should have received from us:

  • user_id
  • api_key
  • config_id

For most requests, you will also need to provide a match_id. This can be an arbitrary string for testing.

REST API Overview

All requests use Basic Auth:

username: {{user_id}}
password: {{api_key}}

Base URL:

https://dev.ivk.dev/v1/mmr/{{config_id}}

e.g. to test credentials with cURL (and retrieve the configuration JSON):

curl https://dev.ivk.dev/v1/mmr/{{config_id}} -u "{{user_id}}:{{api_key}}"

Examples

We recommend using Bruno as an API client. (not Postman)

The most common route for sending match results:

POST https://dev.ivk.dev/v1/mmr/{{config_id}}/full/player/?match_id={{match_id}}

1v1 - Balanced Match

body - 1v1

[
  // Team 1
  {
    "player_id": "T1P1",
    "team_score": 30,
    "player_score": 30,
    "mmr": 400,
    "games_played": 100
  },
  // Team 2
  {
    "player_id": "T2P1",
    "team_score": 40,
    "player_score": 40,
    "mmr": 400,
    "games_played": 100
  }
]

response - 1v1

{
  "success": true,
  "player_count": 2,
  "team_count": 2,
  "result": [
    {
      "player_id": "T1P1",
      "mmr": 400,
      "mmr_team": 0.4,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5,
      "outcome": 0.009485174635513356,
      "player_expected_raw": 0.5,
      "player_expected": 0.5,
      "player_outcome": 0,
      "player_weight": 0.8,
      "player_contrib": -19.583213144091705,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -4.43142779453245,
      "mmr_delta": -24.014640938624154,
      "mmr_final": 375.98535906137585
    },
    {
      "player_id": "T2P1",
      "mmr": 400,
      "mmr_team": 0.4,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5,
      "outcome": 0.9905148253644867,
      "player_expected_raw": 0.5,
      "player_expected": 0.5,
      "player_outcome": 1,
      "player_weight": 0.8,
      "player_contrib": 20.416786855908327,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 4.6200547419162215,
      "mmr_delta": 25.036841597824548,
      "mmr_final": 425.03684159782455
    }
  ],
  "debug": null
}

3v3 - Balanced Match

body - 3v3

[
  //
  // Team 1
  //
  {
    "team_id": "T1",
    "player_id": "T1P1",
    "team_score": 30,
    "player_score": 15,
    "mmr": 500,
    "games_played": 100
  },
  {
    "team_id": "T1",
    "player_id": "T1P2",
    "team_score": 30,
    "player_score": 10,
    "mmr": 400,
    "games_played": 100
  },
  {
    "team_id": "T1",
    "player_id": "T1P3",
    "team_score": 30,
    "player_score": 5,
    "mmr": 400,
    "games_played": 100
  },
  //
  // Team 2
  //
  {
    "team_id": "T2",
    "player_id": "T2P1",
    "team_score": 40,
    "player_score": 20,
    "mmr": 500,
    "games_played": 100
  },
  {
    "team_id": "T2",
    "player_id": "T2P2",
    "team_score": 40,
    "player_score": 15,
    "mmr": 450,
    "games_played": 100
  },
  {
    "team_id": "T2",
    "player_id": "T2P3",
    "team_score": 40,
    "player_score": 5,
    "mmr": 350,
    "games_played": 100
  }
]

response - 3v3

{
  "success": true,
  "player_count": 6,
  "team_count": 2,
  "result": [
    {
      "player_id": "T1P1",
      "mmr": 500,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5717913636893147,
      "outcome": 0.5694851746355133,
      "player_expected_raw": 0.5897392046116434,
      "player_expected": 0.5897392046116434,
      "player_outcome": 0.7,
      "player_weight": 0.8,
      "player_contrib": 1.1530945269004178,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -1.1530945269004178,
      "mmr_delta": -0.11530945269004178,
      "mmr_final": 499.88469054730996
    },
    {
      "player_id": "T1P2",
      "mmr": 400,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.46381049397388585,
      "outcome": 0.3294851746355134,
      "player_expected_raw": 0.4547631174673573,
      "player_expected": 0.4547631174673573,
      "player_outcome": 0.4,
      "player_weight": 0.8,
      "player_contrib": -2.1448756035963696,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -4.43142779453243,
      "mmr_delta": -6.5763033981288,
      "mmr_final": 393.4236966018712
    },
    {
      "player_id": "T1P3",
      "mmr": 400,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.46381049397388585,
      "outcome": 0.08948517463551336,
      "player_expected_raw": 0.4547631174673573,
      "player_expected": 0.4547631174673573,
      "player_outcome": 0.1,
      "player_weight": 0.8,
      "player_contrib": -13.89480349005136,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -4.431427794532437,
      "mmr_delta": -18.3262312845838,
      "mmr_final": 381.6737687154162
    },
    {
      "player_id": "T2P1",
      "mmr": 500,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5717913636893147,
      "outcome": 0.9905148253644867,
      "player_expected_raw": 0.5897392046116434,
      "player_expected": 0.5897392046116434,
      "player_outcome": 1,
      "player_weight": 0.8,
      "player_contrib": 16.41043181553427,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 4.525741268224334,
      "mmr_delta": 20.936173083758604,
      "mmr_final": 520.9361730837586
    },
    {
      "player_id": "T2P2",
      "mmr": 450,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5181319340019225,
      "outcome": 0.7505148253644867,
      "player_expected_raw": 0.5226649175024031,
      "player_expected": 0.5226649175024031,
      "player_outcome": 0.7,
      "player_weight": 0.8,
      "player_contrib": 7.165081511622735,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 4.571473482662635,
      "mmr_delta": 11.73655499428537,
      "mmr_final": 461.73655499428537
    },
    {
      "player_id": "T2P3",
      "mmr": 350,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.4108023896865164,
      "outcome": 0.2705148253644867,
      "player_expected_raw": 0.3885029871081455,
      "player_expected": 0.3885029871081455,
      "player_outcome": 0.1,
      "player_weight": 0.8,
      "player_contrib": -11.159640135958671,
      "team_expected_raw": 0.5,
      "team_expected": 0.5,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 4.376526947614297,
      "mmr_delta": -6.783113188344373,
      "mmr_final": 343.2168868116556
    }
  ],
  "debug": null
}

3v3 - Leaver

body - leaver

[
  //
  // Team 1
  //
  {
    "team_id": "T1",
    "player_id": "T1P1",
    "team_score": 30,
    "player_score": 15,
    "mmr": 500,
    "games_played": 100
  },
  {
    "team_id": "T1",
    "player_id": "T1P2",
    "team_score": 30,
    "player_score": 10,
    "played_frac": 0.5, // <-- was only in half of the match
    "mmr": 400,
    "games_played": 100
  },
  {
    "team_id": "T1",
    "player_id": "T1P3",
    "team_score": 30,
    "player_score": 5,
    "mmr": 400,
    "games_played": 100
  },
  //
  // Team 2
  //
  {
    "team_id": "T2",
    "player_id": "T2P1",
    "team_score": 40,
    "player_score": 20,
    "mmr": 500,
    "games_played": 100
  },
  {
    "team_id": "T2",
    "player_id": "T2P2",
    "team_score": 40,
    "player_score": 15,
    "mmr": 450,
    "games_played": 100
  },
  {
    "team_id": "T2",
    "player_id": "T2P3",
    "team_score": 40,
    "player_score": 5,
    "mmr": 350,
    "games_played": 100
  }
]

response - leaver

{
  "success": true,
  "player_count": 6,
  "team_count": 2,
  "result": [
    {
      "player_id": "T1P1",
      "mmr": 500,
      "mmr_team": 1.1,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.5293052378801512,
      "outcome": 0.5694851746355133,
      "player_expected_raw": 0.5897392046116434,
      "player_expected": 0.5897392046116434,
      "player_outcome": 0.7,
      "player_weight": 0.8,
      "player_contrib": 4.410431815534266,
      "team_expected_raw": 0.2875693709541823,
      "team_expected": 0.2875693709541823,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -2.401434977766158,
      "mmr_delta": 2.008996837768109,
      "mmr_final": 502.0089968377681
    },
    {
      "player_id": "T1P2",
      "mmr": 400,
      "mmr_team": 1.1,
      "played_frac": 0.5,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.42132436816472235,
      "outcome": 0.3294851746355134,
      "player_expected_raw": 0.4547631174673573,
      "player_expected": 0.4547631174673573,
      "player_outcome": 0.4,
      "player_weight": 0.8,
      "player_contrib": -2.1448756035963883,
      "team_expected_raw": 0.2875693709541823,
      "team_expected": 0.2875693709541823,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -2.3513906510635976,
      "mmr_delta": -4.496266254659986,
      "mmr_final": 395.50373374534
    },
    {
      "player_id": "T1P3",
      "mmr": 400,
      "mmr_team": 1.1,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.42132436816472235,
      "outcome": 0.08948517463551336,
      "player_expected_raw": 0.4547631174673573,
      "player_expected": 0.4547631174673573,
      "player_outcome": 0.1,
      "player_weight": 0.8,
      "player_contrib": -13.894803490051348,
      "team_expected_raw": 0.2875693709541823,
      "team_expected": 0.2875693709541823,
      "team_outcome": 0.04742587317756678,
      "team_weight": 0.2,
      "team_contrib": -2.351390651063578,
      "mmr_delta": -16.246194141114927,
      "mmr_final": 383.7538058588851
    },
    {
      "player_id": "T2P1",
      "mmr": 500,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.6142774894984783,
      "outcome": 0.9905148253644867,
      "player_expected_raw": 0.5897392046116434,
      "player_expected": 0.5897392046116434,
      "player_outcome": 1,
      "player_weight": 0.8,
      "player_contrib": 16.410431815534242,
      "team_expected_raw": 0.7124306290458177,
      "team_expected": 0.7124306290458177,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 2.401434977766153,
      "mmr_delta": 18.811866793300396,
      "mmr_final": 518.8118667933004
    },
    {
      "player_id": "T2P2",
      "mmr": 450,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.560618059811086,
      "outcome": 0.7505148253644867,
      "player_expected_raw": 0.5226649175024031,
      "player_expected": 0.5226649175024031,
      "player_outcome": 0.7,
      "player_weight": 0.8,
      "player_contrib": 7.165081511622751,
      "team_expected_raw": 0.7124306290458177,
      "team_expected": 0.7124306290458177,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 2.4257012653981826,
      "mmr_delta": 9.590782777020934,
      "mmr_final": 459.59078277702093
    },
    {
      "player_id": "T2P3",
      "mmr": 350,
      "mmr_team": 1.3,
      "played_frac": 1,
      "placement_frac": 1,
      "party_size": 1,
      "expected": 0.45328851549567994,
      "outcome": 0.2705148253644867,
      "player_expected_raw": 0.3885029871081455,
      "player_expected": 0.3885029871081455,
      "player_outcome": 0.1,
      "player_weight": 0.8,
      "player_contrib": -11.159640135958677,
      "team_expected_raw": 0.7124306290458177,
      "team_expected": 0.7124306290458177,
      "team_outcome": 0.9525741268224333,
      "team_weight": 0.2,
      "team_contrib": 2.322259331731681,
      "mmr_delta": -8.837380804226996,
      "mmr_final": 341.162619195773
    }
  ],
  "debug": null
}

Advanced

IVK Skill also has routes for calculating pre-match data, or for calculating in-match results (e.g. when a team or player is eliminated in a battle royale).

POST https://dev.ivk.dev/v1/mmr/{{config_id}}/pre/player/?match_id={{match_id}}
POST https://dev.ivk.dev/v1/mmr/{{config_id}}/partial/player/?match_id={{match_id}}