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 PutBeatmapSetRequest.Uri getter when API.Endpoints.BeatmapSubmissionServiceUrl is null. PutBeatmapSetRequest creates a beatmapset (PUT /beatmapsets); without the submission service URL the request has no valid target and the getter throws NotSupportedException. Note the Target property also throws NotSupportedException as a secondary guard.

Source

Thrown at osu.Game/Online/API/Requests/PutBeatmapSetRequest.cs:26

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using osu.Framework.IO.Network;
using osu.Framework.Localisation;
using osu.Game.Localisation;
using osu.Game.Online.API.Requests.Responses;
using osu.Game.Screens.Edit.Submission;

namespace osu.Game.Online.API.Requests
{
    public class PutBeatmapSetRequest : APIRequest<PutBeatmapSetResponse>
    {
        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";
            }
        }

        protected override string Target => throw new NotSupportedException();

        [JsonProperty("beatmapset_id")]
        public uint? BeatmapSetID { get; init; }

        [JsonProperty("beatmaps_to_create")]
        public uint BeatmapsToCreate { get; init; }

        [JsonProperty("beatmaps_to_keep")]
        public uint[] BeatmapsToKeep { get; init; } = [];

        [JsonProperty("target")]
        public BeatmapSubmissionTarget SubmissionTarget { get; init; }

View on GitHub (pinned to d9c73e12ad)

Solutions

  1. Set API.Endpoints.BeatmapSubmissionServiceUrl before exposing/using the submission flow.
  2. Disable the submission UI entry point when BeatmapSubmissionServiceUrl is null.
  3. Post-deployment, remove the guard per the inline comment.

Example fix

// before
var req = new PutBeatmapSetRequest { ... };
api.Perform(req); // NotSupportedException from Uri getter

// after
if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{
    submissionButton.Enabled.Value = false;
    return;
}
var req = new PutBeatmapSetRequest { ... };
api.Perform(req);
Defensive patterns

Strategy: validation

Validate before calling

if (api.Endpoints.BeatmapSubmissionServiceUrl == null)
{ submissionButton.Enabled.Value = false; return; }
var req = new PutBeatmapSetRequest { ... };

Type guard

static bool IsSubmissionEnabled(IAPIEndpointProvider endpoints)
    => !string.IsNullOrWhiteSpace(endpoints.BeatmapSubmissionServiceUrl);

Try / catch

try { api.Perform(req); }
catch (NotSupportedException ex) when (ex.Message.Contains("Beatmap submission"))
{ /* 'submission unavailable' notification */ }

Prevention

When it happens

Trigger: Performing a PutBeatmapSetRequest (create new beatmapset submission) when BeatmapSubmissionServiceUrl is unconfigured. The Uri getter is hit during request execution.

Common situations: Editor 'submit beatmap' flow on a build where the submission service endpoint isn't set; dev/staging configs missing the URL; the feature enabled in code before deployment.

Related errors


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/544b7fe99ba76caa. Report an issue: GitHub.