{"openapi":"3.1.0","info":{"title":"packs.haruhime.moe API","version":"1","description":"Read public packs and manage your own with a personal API key. 60 requests and 10 writes a minute per account. Docs: https://packs.haruhime.moe/docs/api","contact":{"email":"haruhime@haruhime.moe"}},"servers":[{"url":"https://packs.haruhime.moe/api/v1"}],"security":[{"apiKey":[]}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Who the API key belongs to","parameters":[],"responses":{"200":{"description":"The key's owner.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/me/packs":{"get":{"operationId":"listMyPacks","summary":"Your packs, any visibility, 50 a page","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":999999,"default":1}}],"responses":{"200":{"description":"One page of your packs.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackPageResponse"}}}},"400":{"description":"The body or a query parameter isn't valid.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/packs":{"get":{"operationId":"listPublicPacks","summary":"Public packs, most recently updated first, 50 a page","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":999999,"default":1}}],"responses":{"200":{"description":"One page of public packs.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackPageResponse"}}}},"400":{"description":"The body or a query parameter isn't valid.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createPack","summary":"Save a new pack","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackInput"}}}},"responses":{"201":{"description":"The saved pack.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"400":{"description":"The body or a query parameter isn't valid.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"You already have the most packs one account can keep.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"The body is too large.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"The body isn't application/json.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/packs/{slug}":{"get":{"operationId":"getPack","summary":"One pack (private and hidden packs only for their owner)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{10}$"}}],"responses":{"200":{"description":"The pack.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The pack doesn't exist, or it's private or hidden and not yours.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"updatePack","summary":"Replace one of your packs","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{10}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackInput"}}}},"responses":{"200":{"description":"The updated pack.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackResponse"}}}},"400":{"description":"The body or a query parameter isn't valid.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The pack doesn't exist or isn't yours.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"The body is too large.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"The body isn't application/json.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePack","summary":"Delete one of your packs","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{10}$"}}],"responses":{"204":{"description":"Deleted.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"401":{"description":"No API key, or the key isn't valid (code unauthorized or invalid_api_key).","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The pack doesn't exist or isn't yours.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a rate limit. Wait Retry-After seconds.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Something failed on our side. Try again later.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"Your personal API key (hpk_...), from your account page."}},"schemas":{"MeResponse":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"osuId":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"username":{"type":"string"}},"required":["id","osuId","username"],"additionalProperties":false}},"required":["user"],"additionalProperties":false},"PackResponse":{"type":"object","properties":{"pack":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"slots":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"mod":{"anyOf":[{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},{"type":"null"}]},"index":{"type":"integer","minimum":1,"maximum":99},"beatmapId":{"type":"integer","minimum":1,"maximum":2147483647}},"required":["mod","index","beatmapId"],"additionalProperties":false}},"buckets":{"maxItems":14,"type":"array","items":{"anyOf":[{"type":"object","properties":{"code":{"type":"string","enum":["NM","HD","HR","DT","FM","TB"]}},"required":["code"],"additionalProperties":false},{"type":"object","properties":{"code":{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},"color":{"type":"integer","minimum":0,"maximum":9},"mods":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"forced"},"set":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["EZ","HD","HR","DT","HT","FL"]}}},"required":["kind","set"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"free"}},"required":["kind"],"additionalProperties":false}]}},"required":["code","color"],"additionalProperties":false}]}},"slug":{"type":"string","pattern":"^[A-Za-z0-9_-]{10}$"},"visibility":{"type":"string","enum":["private","unlisted","public"]},"description":{"type":"string"},"exports":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["magnet"]},"url":{"type":"string","maxLength":2048},"createdAt":{"type":"string"}},"required":["kind","url","createdAt"],"additionalProperties":false}},"hiddenAt":{"type":"string"},"historyPublic":{"type":"boolean"},"stats":{"type":"object","properties":{"srMin":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Lowest star rating, 2 decimals. Null when none is known."},"srMax":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Highest star rating, 2 decimals."},"srAvg":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Average star rating over the slots, 2 decimals."},"lenMin":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Shortest map in seconds, after DT and HT."},"lenMax":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Longest map in seconds, after DT and HT."},"bpmMin":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Lowest BPM, after DT and HT."},"bpmMax":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Highest BPM, after DT and HT."},"mods":{"type":"array","items":{"type":"string","enum":["NM","HD","HR","DT","FM","TB","EZ","HT","FL"]},"description":"Mods the pack has: its built-in slots (NM HD HR DT FM TB) and the mods its custom slots force (EZ HD HR DT HT FL; a custom freemod slot counts as FM), in that order."},"modes":{"type":"array","items":{"type":"string","enum":["osu","taiko","fruits","mania"]},"description":"Rulesets of the pack's maps."},"count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of maps."},"complete":{"type":"boolean","description":"False when a map's details or a rating with mods couldn't be looked up; the numbers then cover the maps that could. A map osu! says doesn't exist is left out and doesn't count."},"computedAt":{"type":"string","description":"When the stats were computed (ISO 8601)."}},"required":["srMin","srMax","srAvg","lenMin","lenMax","bpmMin","bpmMax","mods","modes","count","complete","computedAt"],"additionalProperties":false,"description":"Star rating, length and BPM ranges, mods and rulesets, computed on the server after a save. Slots that force EZ, HR, DT, HT or FL count with their rating with mods."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"packKey":{"type":"string"},"ownerName":{"type":"string"}},"required":["name","slots","slug","visibility","createdAt","updatedAt","packKey","ownerName"],"additionalProperties":false}},"required":["pack"],"additionalProperties":false},"PackPageResponse":{"type":"object","properties":{"packs":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"slots":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"mod":{"anyOf":[{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},{"type":"null"}]},"index":{"type":"integer","minimum":1,"maximum":99},"beatmapId":{"type":"integer","minimum":1,"maximum":2147483647}},"required":["mod","index","beatmapId"],"additionalProperties":false}},"buckets":{"maxItems":14,"type":"array","items":{"anyOf":[{"type":"object","properties":{"code":{"type":"string","enum":["NM","HD","HR","DT","FM","TB"]}},"required":["code"],"additionalProperties":false},{"type":"object","properties":{"code":{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},"color":{"type":"integer","minimum":0,"maximum":9},"mods":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"forced"},"set":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["EZ","HD","HR","DT","HT","FL"]}}},"required":["kind","set"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"free"}},"required":["kind"],"additionalProperties":false}]}},"required":["code","color"],"additionalProperties":false}]}},"slug":{"type":"string","pattern":"^[A-Za-z0-9_-]{10}$"},"visibility":{"type":"string","enum":["private","unlisted","public"]},"description":{"type":"string"},"exports":{"maxItems":10,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["magnet"]},"url":{"type":"string","maxLength":2048},"createdAt":{"type":"string"}},"required":["kind","url","createdAt"],"additionalProperties":false}},"hiddenAt":{"type":"string"},"historyPublic":{"type":"boolean"},"stats":{"type":"object","properties":{"srMin":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Lowest star rating, 2 decimals. Null when none is known."},"srMax":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Highest star rating, 2 decimals."},"srAvg":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Average star rating over the slots, 2 decimals."},"lenMin":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Shortest map in seconds, after DT and HT."},"lenMax":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Longest map in seconds, after DT and HT."},"bpmMin":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Lowest BPM, after DT and HT."},"bpmMax":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}],"description":"Highest BPM, after DT and HT."},"mods":{"type":"array","items":{"type":"string","enum":["NM","HD","HR","DT","FM","TB","EZ","HT","FL"]},"description":"Mods the pack has: its built-in slots (NM HD HR DT FM TB) and the mods its custom slots force (EZ HD HR DT HT FL; a custom freemod slot counts as FM), in that order."},"modes":{"type":"array","items":{"type":"string","enum":["osu","taiko","fruits","mania"]},"description":"Rulesets of the pack's maps."},"count":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Number of maps."},"complete":{"type":"boolean","description":"False when a map's details or a rating with mods couldn't be looked up; the numbers then cover the maps that could. A map osu! says doesn't exist is left out and doesn't count."},"computedAt":{"type":"string","description":"When the stats were computed (ISO 8601)."}},"required":["srMin","srMax","srAvg","lenMin","lenMax","bpmMin","bpmMax","mods","modes","count","complete","computedAt"],"additionalProperties":false,"description":"Star rating, length and BPM ranges, mods and rulesets, computed on the server after a save. Slots that force EZ, HR, DT, HT or FL count with their rating with mods."},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"packKey":{"type":"string"},"ownerName":{"type":"string"}},"required":["name","slots","slug","visibility","createdAt","updatedAt","packKey","ownerName"],"additionalProperties":false}},"page":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"pageCount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"total":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["packs","page","pageCount","total"],"additionalProperties":false},"PackInput":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"slots":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"mod":{"anyOf":[{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},{"type":"null"}]},"index":{"type":"integer","minimum":1,"maximum":99},"beatmapId":{"type":"integer","minimum":1,"maximum":2147483647}},"required":["mod","index","beatmapId"]}},"buckets":{"maxItems":14,"type":"array","items":{"anyOf":[{"type":"object","properties":{"code":{"type":"string","enum":["NM","HD","HR","DT","FM","TB"]}},"required":["code"],"additionalProperties":false},{"type":"object","properties":{"code":{"type":"string","pattern":"^[\\p{L}\\p{N}]{1,12}$"},"color":{"type":"integer","minimum":0,"maximum":9},"mods":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"forced"},"set":{"minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["EZ","HD","HR","DT","HT","FL"]}}},"required":["kind","set"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"free"}},"required":["kind"],"additionalProperties":false}]}},"required":["code","color"],"additionalProperties":false}]}},"visibility":{"default":"unlisted","type":"string","enum":["private","unlisted","public"]},"description":{"type":"string"}},"required":["name","slots"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"headers":{"RateLimit-Limit":{"description":"Requests allowed in the current window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window starts over.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer"}}}}}