ppy/osu · error · NotSupportedException
Beatmap submission not supported in this configuration!
Error message
Beatmap submission not supported in this configuration!
What it means
Thrown by ReplaceBeatmapPackageRequest.Uri getter when API.Endpoints.BeatmapSubmissionServiceUrl is null. This request replaces an entire beatmapset's package (PUT /beatmapsets/{id}); the same production-rollout guard as the other submission requests applies. NotSupportedException indicates feature unavailability.
Source
Thrown at osu.Game/Online/API/Requests/ReplaceBeatmapPackageRequest.cs:18
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Net.Http;
using osu.Framework.IO.Network;
namespace osu.Game.Online.API.Requests
{
public class ReplaceBeatmapPackageRequest : APIUploadRequest
{
protected override string Uri
{
get
{
// can be removed once the service has been successfully deployed to production
if (API!.Endpoints.BeatmapSubmissionServiceUrl == null)
throw new NotSupportedException("Beatmap submission not supported in this configuration!");
return $@"{API!.Endpoints.BeatmapSubmissionServiceUrl}/beatmapsets/{BeatmapSetID}";
}
}
protected override string Target => throw new NotSupportedException();
public uint BeatmapSetID { get; }
private readonly byte[] oszPackage;
public ReplaceBeatmapPackageRequest(uint beatmapSetID, byte[] oszPackage)
{
this.oszPackage = oszPackage;
BeatmapSetID = beatmapSetID;
}
protected override WebRequest CreateWebRequest()
View on GitHub (pinned to d9c73e12ad)
Solutions
- Configure API.Endpoints.BeatmapSubmissionServiceUrl to enable the submission service.
- Hide/disable the replace-submission control when the URL is null.
- After production deployment, remove the guard as the comment indicates.
Example fix
// before
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes);
api.Perform(req); // NotSupportedException
// after
if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{
Notifications.Post(new SimpleNotification { Text = "Beatmap submission is unavailable in this build." });
return;
}
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes);
api.Perform(req); Defensive patterns
Strategy: validation
Validate before calling
if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{ Notifications.Post(new SimpleNotification { Text = "Beatmap submission is unavailable." }); return; }
var req = new ReplaceBeatmapPackageRequest(beatmapSetId, oszBytes); Type guard
static bool IsSubmissionEnabled(IAPIEndpointProvider endpoints)
=> !string.IsNullOrWhiteSpace(endpoints.BeatmapSubmissionServiceUrl); Try / catch
try { api.Perform(new ReplaceBeatmapPackageRequest(id, bytes)); }
catch (NotSupportedException ex) when (ex.Message.Contains("Beatmap submission"))
{ /* inform user the build lacks the submission endpoint */ } Prevention
- Disable replace-submission controls when BeatmapSubmissionServiceUrl is null.
- Ensure endpoint configuration ships with builds that expose submission.
- Remove the guard after the service reaches production.
When it happens
Trigger: Constructing/performing a ReplaceBeatmapPackageRequest (full replacement upload for an existing beatmapset) with BeatmapSubmissionServiceUrl unconfigured.
Common situations: Editor 'replace submission' path active on a build without the submission service URL; dev environments; pre-production rollout where the feature flag/endpoint isn't set.
Related errors
- Beatmap submission not supported in this configuration!
- Beatmap submission not supported in this configuration!
- Cannot use this argument in a non-debug build.
- A channel with the name {channelName} could not be found.
- Binary message type not supported.
AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13).
Data as JSON: /api/errors/ec5cce3b2ad3c5a3.
Report an issue: GitHub.