API Reference
difficalcy exposes calculators for all official rulesets in a single server.
Each calculator is accessible by key under /api/calculators/{key}:
| Endpoint | Description |
|---|---|
GET /api/calculators |
Lists all available calculators with their keys |
GET /api/calculators/{key}/info |
Returns details of the calculation engine |
GET /api/calculators/{key}/calculation |
Calculates both difficulty and performance of a score |
POST /api/calculators/{key}/batch/calculation |
Calculates a batch of difficulties and performances |
GET /api/calculators/{key}/beatmapdetails |
Returns beatmap metadata and statistics |
The default available keys are osu, taiko, catch, and mania.
Difficalcy v1
difficalcy
GET /api/calculators
Responses
osu
GET /api/calculators/osu/info
Responses
{
"rulesetName": "string",
"calculatorName": "string",
"calculatorPackage": "string",
"calculatorVersion": "string",
"calculatorUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"rulesetName": {
"type": [
"null",
"string"
]
},
"calculatorName": {
"type": [
"null",
"string"
]
},
"calculatorPackage": {
"type": [
"null",
"string"
]
},
"calculatorVersion": {
"type": [
"null",
"string"
]
},
"calculatorUrl": {
"type": [
"null",
"string"
]
}
}
}
GET /api/calculators/osu/calculation
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No | ||
mods |
query | string | No |
Responses
{
"accuracy": {},
"combo": {},
"difficulty": {
"aim": {},
"speed": {},
"flashlight": {},
"reading": {},
"total": {}
},
"performance": {
"aim": {},
"speed": {},
"accuracy": {},
"flashlight": {},
"reading": {},
"total": {}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"combo": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"difficulty": {
"$ref": "#/components/schemas/OsuDifficulty"
},
"performance": {
"$ref": "#/components/schemas/OsuPerformance"
}
}
}
POST /api/calculators/osu/batch/calculation
Request body
[
{
"combo": 78,
"misses": 257,
"mehs": 146,
"oks": 289,
"sliderTails": 228,
"sliderTicks": 257,
"beatmapId": "string",
"mods": [
{
"acronym": "string",
"settings": {}
}
]
}
]
Responses
[
{
"accuracy": {},
"combo": {},
"difficulty": {
"aim": {},
"speed": {},
"flashlight": {},
"reading": {},
"total": {}
},
"performance": {
"aim": {},
"speed": {},
"accuracy": {},
"flashlight": {},
"reading": {},
"total": {}
}
}
]
GET /api/calculators/osu/beatmapdetails
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No |
Responses
{
"circleCount": 107,
"sliderCount": 242,
"spinnerCount": 13,
"sliderTickCount": 183,
"circleSize": {},
"approachRate": {},
"accuracy": {},
"drainRate": {},
"artist": "string",
"title": "string",
"difficultyName": "string",
"author": "string",
"maxCombo": 196,
"length": {},
"minBPM": 108,
"maxBPM": 181,
"commonBPM": 10,
"baseVelocity": {},
"tickRate": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"circleCount": {
"type": "integer",
"format": "int32"
},
"sliderCount": {
"type": "integer",
"format": "int32"
},
"spinnerCount": {
"type": "integer",
"format": "int32"
},
"sliderTickCount": {
"type": "integer",
"format": "int32"
},
"circleSize": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"approachRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"drainRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"artist": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"difficultyName": {
"type": [
"null",
"string"
]
},
"author": {
"type": [
"null",
"string"
]
},
"maxCombo": {
"type": "integer",
"format": "int32"
},
"length": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"minBPM": {
"type": "integer",
"format": "int32"
},
"maxBPM": {
"type": "integer",
"format": "int32"
},
"commonBPM": {
"type": "integer",
"format": "int32"
},
"baseVelocity": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"tickRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
}
}
}
taiko
GET /api/calculators/taiko/info
Responses
{
"rulesetName": "string",
"calculatorName": "string",
"calculatorPackage": "string",
"calculatorVersion": "string",
"calculatorUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"rulesetName": {
"type": [
"null",
"string"
]
},
"calculatorName": {
"type": [
"null",
"string"
]
},
"calculatorPackage": {
"type": [
"null",
"string"
]
},
"calculatorVersion": {
"type": [
"null",
"string"
]
},
"calculatorUrl": {
"type": [
"null",
"string"
]
}
}
}
GET /api/calculators/taiko/calculation
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No | ||
mods |
query | string | No |
Responses
{
"accuracy": {},
"combo": {},
"difficulty": {
"stamina": {},
"rhythm": {},
"colour": {},
"total": {}
},
"performance": {
"difficulty": {},
"accuracy": {},
"total": {}
}
}
Schema of the response body
{
"type": "object",
"properties": {
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"combo": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"difficulty": {
"$ref": "#/components/schemas/TaikoDifficulty"
},
"performance": {
"$ref": "#/components/schemas/TaikoPerformance"
}
}
}
POST /api/calculators/taiko/batch/calculation
Request body
Responses
[
{
"accuracy": {},
"combo": {},
"difficulty": {
"stamina": {},
"rhythm": {},
"colour": {},
"total": {}
},
"performance": {
"difficulty": {},
"accuracy": {},
"total": {}
}
}
]
GET /api/calculators/taiko/beatmapdetails
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No |
Responses
{
"hitCount": 111,
"drumRollCount": 63,
"swellCount": 280,
"accuracy": {},
"drainRate": {},
"artist": "string",
"title": "string",
"difficultyName": "string",
"author": "string",
"maxCombo": 173,
"length": {},
"minBPM": 7,
"maxBPM": 129,
"commonBPM": 173,
"baseVelocity": {},
"tickRate": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"hitCount": {
"type": "integer",
"format": "int32"
},
"drumRollCount": {
"type": "integer",
"format": "int32"
},
"swellCount": {
"type": "integer",
"format": "int32"
},
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"drainRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"artist": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"difficultyName": {
"type": [
"null",
"string"
]
},
"author": {
"type": [
"null",
"string"
]
},
"maxCombo": {
"type": "integer",
"format": "int32"
},
"length": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"minBPM": {
"type": "integer",
"format": "int32"
},
"maxBPM": {
"type": "integer",
"format": "int32"
},
"commonBPM": {
"type": "integer",
"format": "int32"
},
"baseVelocity": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"tickRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
}
}
}
catch
GET /api/calculators/catch/info
Responses
{
"rulesetName": "string",
"calculatorName": "string",
"calculatorPackage": "string",
"calculatorVersion": "string",
"calculatorUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"rulesetName": {
"type": [
"null",
"string"
]
},
"calculatorName": {
"type": [
"null",
"string"
]
},
"calculatorPackage": {
"type": [
"null",
"string"
]
},
"calculatorVersion": {
"type": [
"null",
"string"
]
},
"calculatorUrl": {
"type": [
"null",
"string"
]
}
}
}
GET /api/calculators/catch/calculation
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No | ||
mods |
query | string | No |
Responses
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
Schema of the response body
{
"type": "object",
"properties": {
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"combo": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"difficulty": {
"$ref": "#/components/schemas/CatchDifficulty"
},
"performance": {
"$ref": "#/components/schemas/CatchPerformance"
}
}
}
POST /api/calculators/catch/batch/calculation
Request body
Responses
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
GET /api/calculators/catch/beatmapdetails
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No |
Responses
{
"fruitCount": 268,
"juiceStreamCount": 52,
"bananaShowerCount": 146,
"circleSize": {},
"approachRate": {},
"drainRate": {},
"artist": "string",
"title": "string",
"difficultyName": "string",
"author": "string",
"maxCombo": 161,
"length": {},
"minBPM": 80,
"maxBPM": 272,
"commonBPM": 221,
"baseVelocity": {},
"tickRate": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"fruitCount": {
"type": "integer",
"format": "int32"
},
"juiceStreamCount": {
"type": "integer",
"format": "int32"
},
"bananaShowerCount": {
"type": "integer",
"format": "int32"
},
"circleSize": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"approachRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"drainRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"artist": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"difficultyName": {
"type": [
"null",
"string"
]
},
"author": {
"type": [
"null",
"string"
]
},
"maxCombo": {
"type": "integer",
"format": "int32"
},
"length": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"minBPM": {
"type": "integer",
"format": "int32"
},
"maxBPM": {
"type": "integer",
"format": "int32"
},
"commonBPM": {
"type": "integer",
"format": "int32"
},
"baseVelocity": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"tickRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
}
}
}
mania
GET /api/calculators/mania/info
Responses
{
"rulesetName": "string",
"calculatorName": "string",
"calculatorPackage": "string",
"calculatorVersion": "string",
"calculatorUrl": "string"
}
Schema of the response body
{
"type": "object",
"properties": {
"rulesetName": {
"type": [
"null",
"string"
]
},
"calculatorName": {
"type": [
"null",
"string"
]
},
"calculatorPackage": {
"type": [
"null",
"string"
]
},
"calculatorVersion": {
"type": [
"null",
"string"
]
},
"calculatorUrl": {
"type": [
"null",
"string"
]
}
}
}
GET /api/calculators/mania/calculation
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No | ||
mods |
query | string | No |
Responses
⚠️ This example has been generated automatically from the schema and it is not accurate. Refer to the schema for more information.
Schema of the response body
{
"type": "object",
"properties": {
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"difficulty": {
"$ref": "#/components/schemas/ManiaDifficulty"
},
"performance": {
"$ref": "#/components/schemas/ManiaPerformance"
}
}
}
POST /api/calculators/mania/batch/calculation
Request body
Responses
GET /api/calculators/mania/beatmapdetails
Input parameters
| Parameter | In | Type | Default | Nullable | Description |
|---|---|---|---|---|---|
beatmapId |
query | string | No |
Responses
{
"noteCount": 90,
"holdNoteCount": 224,
"keyCount": {},
"accuracy": {},
"drainRate": {},
"artist": "string",
"title": "string",
"difficultyName": "string",
"author": "string",
"maxCombo": 126,
"length": {},
"minBPM": 59,
"maxBPM": 51,
"commonBPM": 79,
"baseVelocity": {},
"tickRate": {}
}
Schema of the response body
{
"type": "object",
"properties": {
"noteCount": {
"type": "integer",
"format": "int32"
},
"holdNoteCount": {
"type": "integer",
"format": "int32"
},
"keyCount": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"accuracy": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"drainRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"artist": {
"type": [
"null",
"string"
]
},
"title": {
"type": [
"null",
"string"
]
},
"difficultyName": {
"type": [
"null",
"string"
]
},
"author": {
"type": [
"null",
"string"
]
},
"maxCombo": {
"type": "integer",
"format": "int32"
},
"length": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"minBPM": {
"type": "integer",
"format": "int32"
},
"maxBPM": {
"type": "integer",
"format": "int32"
},
"commonBPM": {
"type": "integer",
"format": "int32"
},
"baseVelocity": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
},
"tickRate": {
"type": "object",
"anyOf": [
{
"type": "number"
},
{
"enum": [
"NaN",
"Infinity",
"-Infinity"
]
}
],
"format": "double"
}
}
}
Schemas
CalculatorInfo
| Name | Type | Description |
|---|---|---|
calculatorName |
string | null | |
calculatorPackage |
string | null | |
calculatorUrl |
string | null | |
calculatorVersion |
string | null | |
rulesetName |
string | null |
CatchBeatmapDetails
| Name | Type | Description |
|---|---|---|
approachRate |
||
artist |
string | null | |
author |
string | null | |
bananaShowerCount |
integer(int32) | |
baseVelocity |
||
circleSize |
||
commonBPM |
integer(int32) | |
difficultyName |
string | null | |
drainRate |
||
fruitCount |
integer(int32) | |
juiceStreamCount |
integer(int32) | |
length |
||
maxBPM |
integer(int32) | |
maxCombo |
integer(int32) | |
minBPM |
integer(int32) | |
tickRate |
||
title |
string | null |
CatchCalculation
| Name | Type | Description |
|---|---|---|
accuracy |
||
combo |
||
difficulty |
CatchDifficulty | |
performance |
CatchPerformance |
CatchDifficulty
| Name | Type | Description |
|---|---|---|
total |
CatchPerformance
| Name | Type | Description |
|---|---|---|
total |
CatchScore
| Name | Type | Description |
|---|---|---|
beatmapId |
string | null | |
combo |
integer(int32) | null | |
largeDroplets |
integer(int32) | null | |
misses |
integer(int32) | |
mods |
Array<Mod> | |
smallDroplets |
integer(int32) | null |
ErrorResponse
| Name | Type | Description |
|---|---|---|
error |
string | null |
ManiaBeatmapDetails
| Name | Type | Description |
|---|---|---|
accuracy |
||
artist |
string | null | |
author |
string | null | |
baseVelocity |
||
commonBPM |
integer(int32) | |
difficultyName |
string | null | |
drainRate |
||
holdNoteCount |
integer(int32) | |
keyCount |
||
length |
||
maxBPM |
integer(int32) | |
maxCombo |
integer(int32) | |
minBPM |
integer(int32) | |
noteCount |
integer(int32) | |
tickRate |
||
title |
string | null |
ManiaCalculation
| Name | Type | Description |
|---|---|---|
accuracy |
||
difficulty |
ManiaDifficulty | |
performance |
ManiaPerformance |
ManiaDifficulty
| Name | Type | Description |
|---|---|---|
total |
ManiaPerformance
| Name | Type | Description |
|---|---|---|
difficulty |
||
total |
ManiaScore
| Name | Type | Description |
|---|---|---|
beatmapId |
string | null | |
goods |
integer(int32) | |
greats |
integer(int32) | |
mehs |
integer(int32) | |
misses |
integer(int32) | |
mods |
Array<Mod> | |
oks |
integer(int32) |
Mod
| Name | Type | Description |
|---|---|---|
acronym |
string | null | |
settings |
OsuBeatmapDetails
| Name | Type | Description |
|---|---|---|
accuracy |
||
approachRate |
||
artist |
string | null | |
author |
string | null | |
baseVelocity |
||
circleCount |
integer(int32) | |
circleSize |
||
commonBPM |
integer(int32) | |
difficultyName |
string | null | |
drainRate |
||
length |
||
maxBPM |
integer(int32) | |
maxCombo |
integer(int32) | |
minBPM |
integer(int32) | |
sliderCount |
integer(int32) | |
sliderTickCount |
integer(int32) | |
spinnerCount |
integer(int32) | |
tickRate |
||
title |
string | null |
OsuCalculation
| Name | Type | Description |
|---|---|---|
accuracy |
||
combo |
||
difficulty |
OsuDifficulty | |
performance |
OsuPerformance |
OsuDifficulty
| Name | Type | Description |
|---|---|---|
aim |
||
flashlight |
||
reading |
||
speed |
||
total |
OsuPerformance
| Name | Type | Description |
|---|---|---|
accuracy |
||
aim |
||
flashlight |
||
reading |
||
speed |
||
total |
OsuScore
| Name | Type | Description |
|---|---|---|
beatmapId |
string | null | |
combo |
integer(int32) | null | |
mehs |
integer(int32) | |
misses |
integer(int32) | |
mods |
Array<Mod> | |
oks |
integer(int32) | |
sliderTails |
integer(int32) | null | |
sliderTicks |
integer(int32) | null |
TaikoBeatmapDetails
| Name | Type | Description |
|---|---|---|
accuracy |
||
artist |
string | null | |
author |
string | null | |
baseVelocity |
||
commonBPM |
integer(int32) | |
difficultyName |
string | null | |
drainRate |
||
drumRollCount |
integer(int32) | |
hitCount |
integer(int32) | |
length |
||
maxBPM |
integer(int32) | |
maxCombo |
integer(int32) | |
minBPM |
integer(int32) | |
swellCount |
integer(int32) | |
tickRate |
||
title |
string | null |
TaikoCalculation
| Name | Type | Description |
|---|---|---|
accuracy |
||
combo |
||
difficulty |
TaikoDifficulty | |
performance |
TaikoPerformance |
TaikoDifficulty
| Name | Type | Description |
|---|---|---|
colour |
||
rhythm |
||
stamina |
||
total |
TaikoPerformance
| Name | Type | Description |
|---|---|---|
accuracy |
||
difficulty |
||
total |
TaikoScore
| Name | Type | Description |
|---|---|---|
beatmapId |
string | null | |
combo |
integer(int32) | null | |
misses |
integer(int32) | |
mods |
Array<Mod> | |
oks |
integer(int32) |
Tags
| Name | Description |
|---|---|
| difficalcy | |
| osu | |
| taiko | |
| catch | |
| mania |
Generated from difficalcy OpenAPI schema