💪

SportsDataIO-APIでUFCの(無料枠内の)データを取得してみる

2023/02/11に公開

このページは

総合格闘技のUFCを観戦するのに最近ハマっており、興味本位でUFC関連のWebAPIとか公開されていないかなと調べてみると良さそうなのがあったので、実際に使ってみてどんなデータが返されるのかを確認してみたいと思います。

なおこのAPIは無料枠と有料枠があり、財布の都合上今回は無料枠でアクセス可能な範囲のデータに絞って取得したいと思いますのでご了承ください。

利用するWebAPI

SportsDataIO
https://sportsdata.io/

UFC以外にもNFL,NBA, MLBといったアメリカの人気スポーツリーグに関するデータも用意されているみたいです。

利用登録

https://sportsdata.io/user/register
氏名, メールアドレス, パスワードが必要です。

必要事項を入力してSUBMITを押すのですが、メールアドレスが正しいものかどうかの確認が完了していないため、マイページは作成されてもまだAPIの利用は開始できません。
一旦マイページに行きCOMFIRMを押すと、先ほど入力したメールアドレスに確認メールを送信されます。
送られてきたメールの中の認証ボタンを押すことで利用が開始できます。

取得可能な情報リスト

https://sportsdata.io/developers/api-documentation/mma

  • Schedule (大会日程)
  • Event (大会の詳細)
  • Fighter (選手の詳細)
  • Fighters (選手リスト)
  • Leagues (リーグ/団体リスト)
  • Fight (試合の詳細)

ここから下の賭博関連の情報に関しては有料プランへの加入が必要なようです。

  • Betting Metadata
  • Betting Events By Event
  • Upcoming Betting Events
  • Betting Fighter Props By Event
  • Betting Market
  • Betting Markets By Betting Event
  • Betting Markets by Market Type
  • Event Fight Odds
  • Event FIght Odds Line Movement

実際に使ってみた

レスポンスが配列の場合は一部のみ抜粋

/Schedule

現段階で予定されている今年(2023年)の大会スケジュールを取得してみます。
URL: https://api.sportsdata.io/v3/mma/scores/json/Schedule/UFC/2023?key=${your-api-key}

[
        {
		"EventId": 285,
		"LeagueId": 1,
		"Name": "UFC 283: Teixeira vs. Hill",
		"ShortName": "UFC 283",
		"Season": 2023,
		"Day": "2023-01-21T00:00:00",
		"DateTime": "2023-01-21T17:30:00",
		"Status": "Final",
		"Active": true
	},
	{
		"EventId": 286,
		"LeagueId": 1,
		"Name": "UFC 284: Makhachev vs. Volkanovski",
		"ShortName": "UFC 284",
		"Season": 2023,
		"Day": "2023-02-11T00:00:00",
		"DateTime": "2023-02-11T18:00:00",
		"Status": "Scheduled",
		"Active": true
	},
	{
		"EventId": 288,
		"LeagueId": 1,
		"Name": "UFC Fight Night: Vera vs. Sandhagen",
		"ShortName": "UFC Fight Night",
		"Season": 2023,
		"Day": "2023-02-18T00:00:00",
		"DateTime": "2023-02-18T16:00:00",
		"Status": "Scheduled",
		"Active": true
	},
	...
	
]

個人的に良いと思ったのが、中堅選手や若手選手が中心の大会であるFight Nightの日程も取得できる点です。
僕はてっきり人気と注目度が高いナンバーシリーズの日程しか取得できないと思っていたのですが、どうやらそんな事なかったようです...!

Statusは大会の状態を表していて、Scheduled,Final, Canceledなどを含めた6種類の値が用意されているようです。

Indicates the event's status. Possible values include: Scheduled, In Progress, Final, Suspended, Postponed, Canceled

Activeは説明を読んでみてもよく分かりませんでした...

Indicates if the event is active

大会が中止になった場合はfalseになるのかな? でもそれだったら先ほどのStatusの"Canceled"があるし、2020〜2023の日程を見てみた感じだと全ての大会は"Status": trueでした。謎。

/Event

EventIdをもとに大会の詳細情報を取得できるエンドポイントです。
上記の/Scheduleで取得した大会日程の情報の中から、UFC284のEventIdである286をパラメーターに指定してみます。
https://api.sportsdata.io/v3/mma/scores/json/Event/286?key=${your-api-key}

{
	"EventId": 286,
	"LeagueId": 1,
	"Name": "UFC 284: Makhachev vs. Volkanovski",
	"ShortName": "UFC 284",
	"Season": 2023,
	"Day": "2023-02-11T00:00:00",
	"DateTime": "2023-02-11T18:00:00",
	"Status": "Scheduled",
	"Active": true,
	"Fights": [
		{
			"FightId": 3421,
			"Order": 1,
			"Status": "Scrambled",
			"WeightClass": "Scrambled",
			"CardSegment": "Scrambled",
			"Referee": "Scrambled",
			"Rounds": 3,
			"ResultClock": 0,
			"ResultRound": 0,
			"ResultType": "Scrambled",
			"WinnerId": null,
			"Active": true,
			"Fighters": [
				{
					"FighterId": 140000285,
					"FirstName": "Islam",
					"LastName": "Makhachev",
					"PreFightWins": 17,
					"PreFightLosses": 1,
					"PreFightDraws": 0,
					"PreFightNoContests": 0,
					"Winner": false,
					"Moneyline": -288,
					"Active": true
				},
				{
					"FighterId": 140000347,
					"FirstName": "Alexander",
					"LastName": "Volkanovski",
					"PreFightWins": 19,
					"PreFightLosses": 1,
					"PreFightDraws": 0,
					"PreFightNoContests": 0,
					"Winner": false,
					"Moneyline": 227,
					"Active": true
				}
			]
		},
		{
			"FightId": 3420,
			"Order": 2,
			"Status": "Scrambled",
			"WeightClass": "Scrambled",
			"CardSegment": "Scrambled",
			"Referee": "Scrambled",
			"Rounds": 3,
			"ResultClock": 0,
			"ResultRound": 0,
			"ResultType": "Scrambled",
			"WinnerId": null,
			"Active": true,
			"Fighters": [
				{
					"FighterId": 140000615,
					"FirstName": "Yair",
					"LastName": "Rodriguez",
					"PreFightWins": 11,
					"PreFightLosses": 2,
					"PreFightDraws": 0,
					"PreFightNoContests": 1,
					"Winner": false,
					"Moneyline": -121,
					"Active": true
				},
				{
					"FighterId": 140000243,
					"FirstName": "Josh",
					"LastName": "Emmett",
					"PreFightWins": 13,
					"PreFightLosses": 1,
					"PreFightDraws": 0,
					"PreFightNoContests": 0,
					"Winner": false,
					"Moneyline": 102,
					"Active": true
				}
			]
		},
		...
	]
}

大会データの中に各試合のデータがネストしていて、さらに各試合には対戦選手のデータがネストしているという構造のようです。こんな感じ↓

{
 大会データ:[
   {試合データ:[{選手データ}, {選手データ}]},
   {試合データ:[{選手データ}, {選手データ}]},
   ...
   ]
}

大会データの内容に関しては先ほどの/Scheduleで取得したデータと比較してみても、各試合データがネストして付随している点以外に差は無さそうです。
試合と選手のデータに関しては、/Fightと/Fighterでそれぞれ見ていきます。

/Fight

https://api.sportsdata.io/v3/mma/stats/json/Fight/3454?key=${your-api-key}

2023/01/22に行われたUFC283でのテイシェイラvs.ヒルの試合データを取得してみます。

{
	"FightId": 3454,
	"Order": 1,
	"Status": "Scrambled",
	"WeightClass": "Scrambled",
	"CardSegment": "Scrambled",
	"Referee": "Scrambled",
	"Rounds": 5,
	"ResultClock": 302,
	"ResultRound": 5,
	"ResultType": "Scrambled",
	"WinnerId": 140840494,
	"Active": true,
	"FightStats": [
		{
			"FighterId": 140000015,
			"FirstName": "Glover",
			"LastName": "Teixeira",
			"Winner": false,
			"FantasyPoints": 47.8,
			"FantasyPointsDraftKings": 47.8,
			"Knockdowns": 0,
			"TotalStrikesAttempted": 197.2,
			"TotalStrikesLanded": 108.6,
			"SigStrikesAttempted": 161,
			"SigStrikesLanded": 75.4,
			"TakedownsAttempted": 17.1,
			"TakedownsLanded": 2,
			"TakedownsSlams": 0,
			"TakedownAccuracy": 0.1,
			"Advances": 0,
			"Reversals": 0,
			"Submissions": 0,
			"SlamRate": 0,
			"TimeInControl": 207.2,
			"FirstRoundWin": false,
			"SecondRoundWin": false,
			"ThirdRoundWin": false,
			"FourthRoundWin": false,
			"FifthRoundWin": false,
			"DecisionWin": false
		},
		{
			"FighterId": 140000491,
			"FirstName": "Jamahal",
			"LastName": "Hill",
			"Winner": true,
			"FantasyPoints": 151.9,
			"FantasyPointsDraftKings": 151.9,
			"Knockdowns": 0,
			"TotalStrikesAttempted": 421.5,
			"TotalStrikesLanded": 249.5,
			"SigStrikesAttempted": 404.4,
			"SigStrikesLanded": 233.4,
			"TakedownsAttempted": 0,
			"TakedownsLanded": 0,
			"TakedownsSlams": 0,
			"TakedownAccuracy": 0,
			"Advances": 0,
			"Reversals": 1,
			"Submissions": 0,
			"SlamRate": 0,
			"TimeInControl": 207.2,
			"FirstRoundWin": false,
			"SecondRoundWin": false,
			"ThirdRoundWin": false,
			"FourthRoundWin": false,
			"FifthRoundWin": false,
			"DecisionWin": true
		}
	],
	"Fighters": [
		{
			"FighterId": 140000015,
			"FirstName": "Glover",
			"LastName": "Teixeira",
			"PreFightWins": 33,
			"PreFightLosses": 8,
			"PreFightDraws": 0,
			"PreFightNoContests": 0,
			"Winner": false,
			"Moneyline": 120,
			"Active": true
		},
		{
			"FighterId": 140000491,
			"FirstName": "Jamahal",
			"LastName": "Hill",
			"PreFightWins": 11,
			"PreFightLosses": 1,
			"PreFightDraws": 0,
			"PreFightNoContests": 1,
			"Winner": true,
			"Moneyline": -142,
			"Active": true
		}
	]
}

気になるのがScrambledという値が各所にあることです。
下記リンク先のFAQページに書かれていましたが、どうやら無料枠では参照できないようになっているようです。
https://sportsdata.io/developers/faq#what-does-scrambled-data-mean

無料枠だからしょうがないですが、試合の階級を表すWeightClassや大会のメインカードなのかセミメインカードなのかを表すであろうCardSegmentがScrambledされているのは辛いですね...
FightStatsは両選手のその試合におけるノックダウン数やテイクダウン数などの情報が入っているようです。

/Fighter

グローバー・テイシェイラ選手の情報を取得してみます。
https://api.sportsdata.io/v3/mma/scores/json/Fighter/140000015?key=${your-api-key}

{
	"FighterId": 140000015,
	"FirstName": "Glover",
	"LastName": "Teixeira",
	"Nickname": null,
	"WeightClass": "Scrambled",
	"BirthDate": "1979-10-28T00:00:00",
	"Height": 68.2,
	"Weight": 188.8,
	"Reach": 70,
	"Wins": 30,
	"Losses": 8,
	"Draws": 0,
	"NoContests": 0,
	"TechnicalKnockouts": 17,
	"TechnicalKnockoutLosses": 3,
	"Submissions": 8,
	"SubmissionLosses": 1,
	"TitleWins": 1,
	"TitleLosses": 3,
	"TitleDraws": 0,
	"CareerStats": {
		"FighterId": 140000015,
		"FirstName": "Glover",
		"LastName": "Teixeira",
		"SigStrikesLandedPerMinute": 3.2,
		"SigStrikeAccuracy": 55.1,
		"TakedownAverage": 1.8,
		"SubmissionAverage": 0.8,
		"KnockoutPercentage": 15.4,
		"TechnicalKnockoutPercentage": 15.4,
		"DecisionPercentage": 6.1
	}
}

身長やリーチなどの身体情報の他にもKO数サブミッションでの勝利数などの戦績が取得できるようです。
また、CareerStatsにはキャリアにおけるテイクダウン率などの情報が入っているようです。

/Leagues

総合格闘技の団体情報を取得できるエンドポイントですが、現状はUFCだけしか取得できないようです。
今後、BellatorやONEといったUFC以外の有名な団体も追加されるようになるのでしょうか...?
https://api.sportsdata.io/v3/mma/scores/json/Leagues?key=${your-api-key}

[{"LeagueId":1,"Name":"Ultimate Fighting Championship","Key":"UFC"}]

感想

無料枠だとScrambledとなって値が見えないフィールドやそもそも取得できないデータがありますが、大会の日程や、どの選手が出るのかといった基本的な情報は問題なく取得できるので、その辺りはありがたいなと感じました。

また、これはAPI自体の話ではありませんが良いなと思ったのは、公式サイトが各エンドポイントがすぐ試せるような作りになっていて検証がしやすい点です。
パラメーターを入力するとそれに対応するURLが即時表示され、あとは押すだけでリクエストを送る事ができるので手軽にレスポンスを確認することが出来ます。

一方で現状はUFCのデータしか取れないため、今後Bellatorなどの他の団体の試合日程や選手データも取れるようになれば、もう言うこと無しですね。

皆さんも是非使ってみてください!

Discussion