Stats

API change history

API that provides statistical data about Players and Matches.

Halo 5 - Match Result - Campaign

Retrieves detailed statistics for a Match with the Campaign Game Mode.

Every time a player plays a portion of a Campaign Mission, a Match will be generated whether the player finishes the Mission or not. If the "Match" ends because the Mission was completed, this will be indicated in the response.


Changelog

December 22, 2017:

  • Added Game Mode clarifications to the Endpoint description.

February 21, 2017:

  • Renamed Endpoint from "Post-Game Carnage Report: Campaign" to "Halo 5 - Match Result - Campaign".
  • Removed "{title}" Request Parameter.

May 16, 2016:

  • Documented HTTP 503 Response Code.

April 20, 2016:

  • Added documentation for the "GameVariantResourceId", "MapVariantResourceId", and "PlayerScore" fields.

Try it

Request

Request URL

Request parameters

  • string

    An ID that uniquely identifies a Match. Match IDs can be retrieved from the "Halo 5 - Player Match History" Endpoint.

Request headers

  • string
    Subscription key which provides access to this API. Found in your Profile.

Request body

Responses

200 OK

The response body will contain the Match Result.

Representations

{
  // A list of stats for each player who was present in the match.
  "PlayerStats": [
    {
      // The player's biggest score due to a kill.
      "BiggestKillScore": "int",

      // The game base variant specific stats for this match. Flexible stats are
      // available via the Metadata API.
      "FlexibleStats": {

        // The set of flexible stats that are derived from medal events.
        "MedalStatCounts": [
          {
            // The ID of the flexible stat.
            "Id": "guid",

            // The number of times this flexible stat was earned.
            "Count": "int"
          }
        ],

        // The set of flexible stats that are derived from impulse events.
        "ImpulseStatCounts": [
          {
            // The ID of the flexible stat.
            "Id": "guid",

            // The number of times this flexible stat was earned.
            "Count": "int"
          }
        ],

        // The set of flexible stats that are derived from medal time lapses.
        "MedalTimelapses": [
          {
            // The ID of the flexible stat.
            "Id": "guid",

            // The amount of time the flexible stat was earned for. This is expressed as
            // an ISO 8601 Duration.
            "Timelapse": "string"
          }
        ],        

        // The set of flexible stats that are derived from impulse time lapses.
        "ImpulseTimelapses": [
          {
            // The ID of the flexible stat.
            "Id": "guid",

            // The amount of time the flexible stat was earned for. This is expressed as
            // an ISO 8601 Duration.
            "Timelapse": "string"
          }
        ]
      },

      // The player's score.
      // Score can be a negative value. Unfortunately, this value is returned as an
      // unsigned 32-bit integer. This means that if the score is -1, the score reported
      // is 4,294,967,295.
      "Score": "uint32",

      // Unused.
      "CharacterIndex": null,

      "Player": {

         // The player's gamertag.
        "Gamertag": "string",

        // Internal use only. This will always be null.
        "Xuid": null
      },

      // The ID of the team that the player was on when the match ended. This value has
      // no meaning in Campaign.
      "TeamId": "int",

      // The player's team-agnostic ranking.
      "Rank": "int",

      // Indicates whether the player was present in the match when it ended. 
      "DNF": "boolean",

      // The player's average lifetime.
      "AvgLifeTimeOfPlayer": "string",

      // Internal use only. This will always be null.
      "PreMatchRatings": null,

      // Internal use only. This will always be null.
      "PostMatchRatings": null,

      // Unused for Campaign matches. This will usually be null or contain invalid data.
      "PlayerScore": null,

      // Total number of kills done by the player. This includes melee kills, shoulder
      // bash kills and Spartan charge kills, all power weapons, AI kills and vehicle
      // destructions. 
      "TotalKills": "int",

      // Total number of headshots done by the player.
      "TotalHeadshots": "int",

      // Total weapon damage dealt by the player.
      "TotalWeaponDamage": "double",

      // Total number of shots fired by the player.
      "TotalShotsFired": "int",

      // Total number of shots landed by the player.
      "TotalShotsLanded": "int",

      // The weapon the player used to get the most kills this match.
      "WeaponWithMostKills": {

        "WeaponId": {

          // The ID of the weapon. Weapons are available via the Metadata API.
          "StockId": "int",

          // Any attachments the weapon had.
          "Attachments": [ "int" ]
        },

        // The number of shots fired for this weapon.
        "TotalShotsFired": "int",

        // The number of shots landed for this weapon.
        "TotalShotsLanded": "int",

        // The number of headshots for this weapon.
        "TotalHeadshots": "int",

        // The number of kills for this weapon.
        "TotalKills": "int",

        // The total damage dealt for this weapon.
        "TotalDamageDealt": "double",

        // The total possession time for this weapon. This is expressed as an ISO 8601
        // Duration.
        "TotalPossessionTime": "string"
      },

      // Total number of melee kills by the player.
      "TotalMeleeKills": "int",

      // Total melee damage dealt by the player.
      "TotalMeleeDamage": "double",

      // Total number of assassinations by the player.
      "TotalAssassinations": "int",

      // Total number of ground pound kills by the player.
      "TotalGroundPoundKills": "int",

      // Total ground pound damage dealt by the player.
      "TotalGroundPoundDamage": "double",

      // Total number of shoulder bash kills by the player.
      "TotalShoulderBashKills": "int",

      // Total shoulder bash damage dealt by the player.
      "TotalShoulderBashDamage": "double",

      // Total grenade damage dealt by the player.
      "TotalGrenadeDamage": "double",

      // Total number of power weapon kills by the player.
      "TotalPowerWeaponKills": "int",

      // Total power weapon damage dealt by the player.
      "TotalPowerWeaponDamage": "double",

      // Total number of power weapon grabs by the player.
      "TotalPowerWeaponGrabs": "int",

      // Total power weapon possession by the player. This is expressed as an ISO 8601
      // Duration.
      "TotalPowerWeaponPossessionTime": "string",

      // Total number of deaths by the player.
      "TotalDeaths": "int",

      // Total number of assists by the player.
      "TotalAssists": "int",

      // Not used.
      "TotalGamesCompleted": "int",

      // Not used.
      "TotalGamesWon": "int",

      // Not used.
      "TotalGamesLost": "int",

      // Not used.
      "TotalGamesTied": "int",

      // Total timed played in this match by the player.
      "TotalTimePlayed": "string",

      // Total number of grenade kills by the player.
      "TotalGrenadeKills": "int",

      // The set of Medals earned by the player.
      "MedalAwards": [
        {
          // The ID of the Medal. Medals are available via the Metadata API.
          "MedalId": "int",

          // The number of times the Medal was earned.
          "Count": "int"
        }
      ], 

      // List of enemy vehicles destroyed. Vehicles are available via the Metadata API.
      // Note: this stat measures enemy vehicles, not any vehicle destruction.
      "DestroyedEnemyVehicles": [
        {
          // The enemy this entry references
          "Enemy": {

            // The Base ID for the enemy.
            "BaseId": "int",

            // The attachments (variants) for the enemy.
            "Attachments": [
              "int"
            ]
          },

          // Total number of kills on the enemy by the player
          "TotalKills": "int"
        }
      ],

      // List of enemies killed, per enemy type. Enemies are available via the Metadata
      // API.
      "EnemyKills": [
        {
          // The enemy this entry references
          "Enemy": {

            // The Base ID for the enemy.
            "BaseId": "int",

            // The attachments (variants) for the enemy.
            "Attachments": [
              "int"
            ]
          },

          // Total number of kills on the enemy by the player
          "TotalKills": "int"
        }
      ],

      // The set of weapons (weapons and vehicles included) used by the player.
      "WeaponStats": [
        {
          "WeaponId": {

              // The ID of the weapon. Weapons are available via the Metadata API.
            "StockId": "int",

              // Any attachments the weapon had.
            "Attachments": [ 
              "int" 
            ]
          },

            // The number of shots fired for this weapon.
          "TotalShotsFired": "int",

            // The number of shots landed for this weapon.
          "TotalShotsLanded": "int",

            // The number of headshots for this weapon.
          "TotalHeadshots": "int",

            // The number of kills for this weapon.
          "TotalKills": "int",

            // The total damage dealt for this weapon.
          "TotalDamageDealt": "double",

            // The total possession time for this weapon. This is expressed as an ISO
            // 8601 Duration.
          "TotalPossessionTime": "string"
        }
      ],

      // The set of Impulses (invisible Medals) earned by the player.
      "Impulses": [
        {
          // The ID of the Impulse. Impulses are available via the Metadata API.
          "Id": "int",

          // The number of times the Impulse was earned.
          "Count": "int"
        }
      ],

      // Total number of Spartan kills by the player.
      "TotalSpartanKills": "int"
    }
  ],

  // The total playthrough time of the mission as calculated by the game. This value is
  // persisted in save files.
  "TotalMissionPlaythroughTime": "string",

  // The difficulty the mission was played at. Options are:
  //   Easy = 0,
  //   Normal = 1,
  //   Heroic = 2,
  //   Legendary = 3
  "Difficulty": "int",

  // The list of skulls used for the mission. Skulls are available via the Metadata API.
  "Skulls": [
    "int"
  ],

  // Indicates whether the mission was completed when the match ended.
  "MissionCompleted": "boolean",

  // Indicates if the match is completed or not. Some match details are available while
  // the match is in-progress, but the behavior for incomplete matches in undefined.
  "IsMatchOver": "boolean",

  // The length of the match. This is expressed as an ISO 8601 Duration.
  "TotalDuration": "string",

  // Unused for Campaign matches. This will always be an empty guid.
  "MapVariantId": "guid",

  // Unused for Campaign matches. This will always be empty guid.
  "GameVariantId": "guid",

  // The playlist ID of the match. Playlists are available via the Metadata API.
  "PlaylistId": "guid",

  // The ID of the Campaign Mission. In Campaign, Map ID is overriden to be the Mission
  // ID. Missions are available via the Metadata API.
  "MapId": "guid",

  // The ID of the game base variant for this match. Game base variants are available via
  // the Metadata API.
  "GameBaseVariantId": "guid",

  // Whether this was a team-based game or not.
  "IsTeamGame": "boolean",

  // Unused for Campaign matches. This will always be null.
  "SeasonId": null,

  // Unused for Campaign matches. All fields within this structure will have their
  // default value.
  "GameVariantResourceId": {

    "ResourceType": "int",

    "ResourceId": "guid",

    "OwnerType": "int",

    "Owner": "string"
  },

  // Unused for Campaign matches. All fields within this structure will have their
  // default value.
  "MapVariantResourceId": {

    "ResourceType": "int",

    "ResourceId": "guid",

    "OwnerType": "int",

    "Owner": "string"
  }
}

404 Not Found

The specified Match could not be found.

Representations

500 Internal Server Error

Internal Server Error

Representations

503 Service Unavailable

Service Unavailable

Representations

Code samples

@ECHO OFF

curl -v -X GET "https://www.haloapi.com/stats/h5/campaign/matches/{matchId}"
-H "Ocp-Apim-Subscription-Key: {subscription key}"

--data-ascii "{body}" 
using System;
using System.Net.Http.Headers;
using System.Text;
using System.Net.Http;
using System.Web;

namespace CSHttpClientSample
{
    static class Program
    {
        static void Main()
        {
            MakeRequest();
            Console.WriteLine("Hit ENTER to exit...");
            Console.ReadLine();
        }
        
        static async void MakeRequest()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

            var uri = "https://www.haloapi.com/stats/h5/campaign/matches/{matchId}?" + queryString;

            var response = await client.GetAsync(uri);
        }
    }
}	
// // This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/)
import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class JavaSample 
{
    public static void main(String[] args) 
    {
        HttpClient httpclient = HttpClients.createDefault();

        try
        {
            URIBuilder builder = new URIBuilder("https://www.haloapi.com/stats/h5/campaign/matches/{matchId}");


            URI uri = builder.build();
            HttpGet request = new HttpGet(uri);
            request.setHeader("Ocp-Apim-Subscription-Key", "{subscription key}");


            // Request body
            StringEntity reqEntity = new StringEntity("{body}");
            request.setEntity(reqEntity);

            HttpResponse response = httpclient.execute(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) 
            {
                System.out.println(EntityUtils.toString(entity));
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

<!DOCTYPE html>
<html>
<head>
    <title>JSSample</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
</head>
<body>

<script type="text/javascript">
    $(function() {
        var params = {
            // Request parameters
        };
      
        $.ajax({
            url: "https://www.haloapi.com/stats/h5/campaign/matches/{matchId}?" + $.param(params),
            beforeSend: function(xhrObj){
                // Request headers
                xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key","{subscription key}");
            },
            type: "GET",
            // Request body
            data: "{body}",
        })
        .done(function(data) {
            alert("success");
        })
        .fail(function() {
            alert("error");
        });
    });
</script>
</body>
</html>
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    NSString* path = @"https://www.haloapi.com/stats/h5/campaign/matches/{matchId}";
    NSArray* array = @[
                         // Request parameters
                         @"entities=true",
                      ];
    
    NSString* string = [array componentsJoinedByString:@"&"];
    path = [path stringByAppendingFormat:@"?%@", string];

    NSLog(@"%@", path);

    NSMutableURLRequest* _request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]];
    [_request setHTTPMethod:@"GET"];
    // Request headers
    [_request setValue:@"{subscription key}" forHTTPHeaderField:@"Ocp-Apim-Subscription-Key"];
    // Request body
    [_request setHTTPBody:[@"{body}" dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData* _connectionData = [NSURLConnection sendSynchronousRequest:_request returningResponse:&response error:&error];

    if (nil != error)
    {
        NSLog(@"Error: %@", error);
    }
    else
    {
        NSError* error = nil;
        NSMutableDictionary* json = nil;
        NSString* dataString = [[NSString alloc] initWithData:_connectionData encoding:NSUTF8StringEncoding];
        NSLog(@"%@", dataString);
        
        if (nil != _connectionData)
        {
            json = [NSJSONSerialization JSONObjectWithData:_connectionData options:NSJSONReadingMutableContainers error:&error];
        }
        
        if (error || !json)
        {
            NSLog(@"Could not parse loaded json with error:%@", error);
        }
        
        NSLog(@"%@", json);
        _connectionData = nil;
    }
    
    [pool drain];

    return 0;
}
<?php
// This sample uses the Apache HTTP client from HTTP Components (http://hc.apache.org/httpcomponents-client-ga/)
require_once 'HTTP/Request2.php';

$request = new Http_Request2('https://www.haloapi.com/stats/h5/campaign/matches/{matchId}');
$url = $request->getUrl();

$headers = array(
    // Request headers
    'Ocp-Apim-Subscription-Key' => '{subscription key}',
);

$request->setHeader($headers);

$parameters = array(
    // Request parameters
);

$url->setQueryVariables($parameters);

$request->setMethod(HTTP_Request2::METHOD_GET);

// Request body
$request->setBody("{body}");

try
{
    $response = $request->send();
    echo $response->getBody();
}
catch (HttpException $ex)
{
    echo $ex;
}

?>
########### Python 2.7 #############
import httplib, urllib, base64

headers = {
    # Request headers
    'Ocp-Apim-Subscription-Key': '{subscription key}',
}

params = urllib.urlencode({
})

try:
    conn = httplib.HTTPSConnection('www.haloapi.com')
    conn.request("GET", "/stats/h5/campaign/matches/{matchId}?%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################

########### Python 3.2 #############
import http.client, urllib.request, urllib.parse, urllib.error, base64

headers = {
    # Request headers
    'Ocp-Apim-Subscription-Key': '{subscription key}',
}

params = urllib.parse.urlencode({
})

try:
    conn = http.client.HTTPSConnection('www.haloapi.com')
    conn.request("GET", "/stats/h5/campaign/matches/{matchId}?%s" % params, "{body}", headers)
    response = conn.getresponse()
    data = response.read()
    print(data)
    conn.close()
except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

####################################
require 'net/http'

uri = URI('https://www.haloapi.com/stats/h5/campaign/matches/{matchId}')

request = Net::HTTP::Get.new(uri.request_uri)
# Request headers
request['Ocp-Apim-Subscription-Key'] = '{subscription key}'
# Request body
request.body = "{body}"

response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
    http.request(request)
end

puts response.body