# paths./api/v3/internal/idempotency/claim.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/internal/idempotency/claim.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/internal/jobs/{job_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/codes.get.description
Return a list of map codes ordered by exact match, prefix match, or similarity. Results can be filtered by archived/hidden status or playtest status.

# paths./api/v3/utilities/autocomplete/codes.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/mechanics.get.description
Return a list of mechanics ordered by similarity to the provided search string.

# paths./api/v3/utilities/autocomplete/mechanics.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/names.get.description
Return a list of map names ordered by text similarity to the provided search string.

# paths./api/v3/utilities/autocomplete/names.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/restrictions.get.description
Return a list of map restrictions ordered by text similarity to the provided search string.

# paths./api/v3/utilities/autocomplete/restrictions.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/tags.get.description
Return a list of map tags ordered by text similarity to the provided search string.

# paths./api/v3/utilities/autocomplete/tags.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/autocomplete/users.get.description
Return a list of users ordered by text similarity to the provided search string. Considers nickname, global name, and Overwatch usernames.

# paths./api/v3/utilities/autocomplete/users.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/map-names.get.description
Return all Overwatch map names alphabetically. Full list, no search/limit.

# paths./api/v3/utilities/transformers/codes.get.description
Transform a free-form input string into the closest matching map code. Results may be filtered by archived, hidden, or playtest status.

# paths./api/v3/utilities/transformers/codes.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/transformers/mechanics.get.description
Transform a free-form input string into the closest matching map mechanic.

# paths./api/v3/utilities/transformers/mechanics.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/transformers/names.get.description
Transform a free-form input string into the closest matching OverwatchMap name.

# paths./api/v3/utilities/transformers/names.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/transformers/restrictions.get.description
Transform a free-form input string into the closest matching map restriction.

# paths./api/v3/utilities/transformers/restrictions.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/transformers/tags.get.description
Transform a free-form input string into the closest matching Tags name.

# paths./api/v3/utilities/transformers/tags.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tags/autocomplete.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tags/mutate.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tags/search.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/community/leaderboard.get.description
Return leaderboard rows with optional filters (name, XP tier, skill rank), sorting (xp_amount, nickname, prestige_level, wr_count, map_count, playtest_count, discord_tag, skill_rank, skill_score), and pagination.

# paths./api/v3/community/leaderboard.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/community/statistics/maps/completions.get.description
Return min, max, and average verified completion times for a map code.

# paths./api/v3/community/statistics/maps/completions.get.parameters[].schema.description
Overwatch map code (4-6 uppercase alphanumeric characters)

# paths./api/v3/community/statistics/maps/completions.get.parameters[].description
Overwatch map code (4-6 uppercase alphanumeric characters)

# paths./api/v3/community/statistics/maps/completions.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/community/statistics/maps/{code}/user/{user_id}.get.description
Return a user's record times over time for the specified map code.

# paths./api/v3/community/statistics/maps/{code}/user/{user_id}.get.parameters[].schema.description
Overwatch map code (4-6 uppercase alphanumeric characters)

# paths./api/v3/community/statistics/maps/{code}/user/{user_id}.get.parameters[].description
Overwatch map code (4-6 uppercase alphanumeric characters)

# paths./api/v3/community/statistics/maps/{code}/user/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/community/statistics/maps/difficulty.get.description
Count official, visible maps per base difficulty (stripping '+'/'-').

# paths./api/v3/community/statistics/skill/players.get.description
Count the number of players per derived skill rank (Ninja → God).

# paths./api/v3/community/statistics/xp/players.get.description
Count the number of players in each main XP tier.

# paths./api/v3/community/statistics/creators/popular.get.description
Return creators with ≥3 rated maps, ranked by average quality.

# paths./api/v3/community/statistics/maps/popular.get.description
Return the top 5 maps per base difficulty ranked by completions (tiebreaker: quality).

# paths./api/v3/community/statistics/ranks/time-played.get.description
Sum verified playtime across maps, grouped by base difficulty (stripping '+'/'-').

# paths./api/v3/community/statistics/maps/all.get.description
Count all maps grouped by map name, regardless of archive/visibility.

# paths./api/v3/community/statistics/maps/unarchived.get.description
Count non-archived, non-hidden maps grouped by map name.

# paths./api/v3/store/admin/users/{user_id}/quests/{progress_id}.patch.description
Edit quest data, progress, or completion status for a user's quest.

# paths./api/v3/store/admin/users/{user_id}/quests/{progress_id}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/quests/{progress_id}/claim.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/admin/quests/rotation/generate.post.description
Manually trigger quest rotation generation.

# paths./api/v3/store/admin/rotation/generate.post.description
Manually trigger new rotation generation.

# paths./api/v3/store/admin/rotation/generate.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/admin/config.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/keys.get.description
Get key pricing for all key types with bulk discounts.

# paths./api/v3/store/users/{user_id}/purchases.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/admin/quests/config.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/users/{user_id}/quest-history.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/quests.get.description
Get current weekly quests with progress.

# paths./api/v3/store/quests.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/rotation.get.description
Get currently available items in the rotating store.

# paths./api/v3/store/rotation.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/admin/quests.get.description
List all global quest-pool entries for the admin pool browser.

# paths./api/v3/store/admin/quests.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/purchase/item.post.description
Purchase an item from the current rotation.

# paths./api/v3/store/purchase/item.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/purchase/keys.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/store/admin/quests/{quest_id}.patch.description
Update or deactivate a quest in the pool.

# paths./api/v3/store/admin/quests/{quest_id}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/users/{user_id}/changes/{change_id}.get.description
Return the drill-down for a single change: previous/new/delta, the top-5 per-map contributors (main_causes), and the summed remaining tail (other_factors), with sum(main_causes.impact) + other_factors == delta within 1e-6 (D-06/D-07). A change_id that does not belong to the user (or does not exist) returns 404.

# paths./api/v3/skill/users/{user_id}/changes/{change_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/users/{user_id}/changes.get.description
Return the player's newest-first paginated change feed (delta + cause_category + description per recompute that touched them). A player with no changes returns an empty list. An unknown window value is rejected at decode (4xx).

# paths./api/v3/skill/users/{user_id}/changes.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/config.get.description
Return the current skill-score tuning weights from the DB config.

# paths./api/v3/skill/config.patch.description
Update the skill-score tuning weights (superuser only) and SCHEDULE a full recompute so scores pick up the new weights (D-10). The recompute is coalesced with any rebuild already in flight: if one is running, this call enqueues a rerun rather than blocking on it, so a read immediately after the 200 may briefly still show the previous scores until the rerun (which reloads the new weights) completes.

# paths./api/v3/skill/config.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/users/{user_id}/history.get.description
Return the player's time-windowed score history (oldest-first points) plus a summary (best/lowest/average, first-vs-last point and percent change). A player with no history returns an empty points list and a zeroed summary (never 500). An unknown window value is rejected at decode (4xx).

# paths./api/v3/skill/users/{user_id}/history.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/tiers.get.description
Return the current tier boundaries, configured percentiles, and computed_at for rendering a tier legend. Public read; no new scope.

# paths./api/v3/skill/tiers.patch.description
Update the tier percentiles (superuser only) and immediately re-derive the boundaries from the current snapshot — scores are unchanged (U82-TIER-PATCH-01). Invalid percentiles return 400 and persist nothing.

# paths./api/v3/skill/tiers.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/users/{user_id}/breakdown.get.description
Return the per-map breakdown captured during recompute (D-06): per-map raw score, gamma-decayed contribution, and medal/WR/video badges. Empty list for a player with no eligible runs (D-07).

# paths./api/v3/skill/users/{user_id}/breakdown.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/skill/users/{user_id}.get.description
Return the player's aggregate skill score and summary counts. A player with no eligible runs returns score 0 with a zero summary (D-07).

# paths./api/v3/skill/users/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/log-map-click.post.description
Log when a user clicks on a Map Code Copy button.

# paths./api/v3/utilities/log-map-click.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/utilities/image.post.description
Upload an image or screenshot file to the CDN. The file must be sent as multipart/form-data.

# paths./api/v3/utilities/image.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/suspicious.get.description
Retrieve suspicious flags associated with a user's completions.

# paths./api/v3/completions/suspicious.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/suspicious.post.description
Insert a new suspicious flag for a completion.

# paths./api/v3/completions/suspicious.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/suspicious.delete.description
Remove an existing suspicious flag from a completion.

# paths./api/v3/completions/suspicious.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/all.get.description
Get all completions that are verified sorted by most recent.

# paths./api/v3/completions/all.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{record_id}/submission.get.description
Retrieve enriched submission details for a specific completion, including ranks, medals, and display names.

# paths./api/v3/completions/{record_id}/submission.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions.get.description
Retrieve all verified completions for a given user, optionally filtered by difficulty and by the archive state of the completed map.

# paths./api/v3/completions.get.parameters[].schema.description
Filter by the archive state of the completed map.

# paths./api/v3/completions.get.parameters[].description
Filter by the archive state of the completed map.

# paths./api/v3/completions.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions.post.description
Submit a new completion record and publish an event.

# paths./api/v3/completions.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{code}.get.description
Retrieve the leaderboard for a given map, including ranks and medals.

# paths./api/v3/completions/{code}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/dashboard.get.description
Get a user's recent completions with verification status for the dashboard.

# paths./api/v3/completions/dashboard.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{code}/legacy.get.description
Get all legacy completions for a particular map code.

# paths./api/v3/completions/{code}/legacy.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/pending.get.description
Retrieve all completions that are awaiting verification.

# paths./api/v3/completions/moderation/records.get.description
Fetch completion records with optional filters for moderation purposes.

# paths./api/v3/completions/moderation/records.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/upvoting/{message_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/world-records.get.description
Retrieve all verified World Records for a given user, optionally filtered by the archive state of the completed map.

# paths./api/v3/completions/world-records.get.parameters[].schema.description
Filter by the archive state of the completed map.

# paths./api/v3/completions/world-records.get.parameters[].description
Filter by the archive state of the completed map.

# paths./api/v3/completions/world-records.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{record_id}/moderate.put.description
Moderate a completion record (change time, verification status, suspicious flag).

# paths./api/v3/completions/{record_id}/moderate.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{code}/quality.post.description
Set the quality vote for a user for a map code.

# paths./api/v3/completions/{code}/quality.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/upvoting.post.description
Upvote a completion submission. Returns the updated count.

# paths./api/v3/completions/upvoting.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/completions/{record_id}/verification.put.description
Update the verification status of a completion and publish an event.

# paths./api/v3/completions/{record_id}/verification.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/exists.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/legacy.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/guides.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/guides.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps.get.description
Search and filter maps with comprehensive filtering options.

# paths./api/v3/maps.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/guides/{user_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/guides/{user_id}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/affected.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/plot.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/mastery.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/mastery.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/partial.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/trending.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/link-codes.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/link-codes.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/quality.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/release-code.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}/playtest.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/archive.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/{code}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/debug/{user_id}/{key_type}/{reward_type}/{.post.description
For debugging only. Grants a reward to a user without consuming a key.

# paths./api/v3/lootbox/users/debug/{user_id}/{key_type}/{reward_type}/{.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/keys/{key_type}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/keys/{key_type}.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/xp/multiplier.get.description
Get the XP multiplier, e.g. double XP weekends.

# paths./api/v3/lootbox/xp/multiplier.post.description
Change the XP multiplier, e.g. double XP weekends.

# paths./api/v3/lootbox/xp/multiplier.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/xp/tier.get.description
Calculate tier change when XP is updated.

# paths./api/v3/lootbox/xp/tier.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/keys.get.description
Get keys owned by a user grouped by key type.

# paths./api/v3/lootbox/users/{user_id}/keys.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/keys.post.description
Grant the currently active key to a user.

# paths./api/v3/lootbox/users/{user_id}/keys.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/{key_type}/{reward_type}/{reward.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/xp.post.description
Add XP to a user and return their previous and new totals.

# paths./api/v3/lootbox/users/{user_id}/xp.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/keys/{key_type}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/keys.get.description
Get all possible key types with optional filter.

# paths./api/v3/lootbox/keys.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/rewards.get.description
Get all possible rewards with optional filters.

# paths./api/v3/lootbox/rewards.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/coins.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/rewards.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/lootbox/users/{user_id}/xp-summary.get.description
Get a user's complete XP progression including current tier, next tier, and XP requirements.

# paths./api/v3/lootbox/users/{user_id}/xp-summary.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits.post.description
Submit a map edit request for moderator approval.

# paths./api/v3/maps/map-edits.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits/{edit_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits/{edit_id}/submission.get.description
Get enriched edit request data for the verification queue.

# paths./api/v3/maps/map-edits/{edit_id}/submission.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits/pending.get.description
Retrieve all map edit requests awaiting approval.

# paths./api/v3/maps/map-edits/user/{user_id}.get.description
Get all edit requests submitted by a user.

# paths./api/v3/maps/map-edits/user/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits/{edit_id}/resolve.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/map-edits/{edit_id}/message.patch.description
Associate a Discord message ID with an edit request.

# paths./api/v3/maps/map-edits/{edit_id}/message.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/avatar/pose.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/avatar/pose.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/avatar/skin.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/avatar/skin.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/background.get.description
Return the user's current rank-card background.

# paths./api/v3/users/{user_id}/rank-card/background.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/background.put.description
Set the user's rank-card background by name.

# paths./api/v3/users/{user_id}/rank-card/background.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/badges.get.description
Return the user's badge settings with resolved URLs (e.g., mastery, spray).

# paths./api/v3/users/{user_id}/rank-card/badges.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card/badges.put.description
Set all badge slots (1-6) for the user. The user_id in the payload is ignored if provided.

# paths./api/v3/users/{user_id}/rank-card/badges.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank-card.get.description
Return full rank card payload including rank, avatar, badges, map totals, and XP.

# paths./api/v3/users/{user_id}/rank-card.get.parameters[].schema.description
Filter preset for which maps to include in stats.

# paths./api/v3/users/{user_id}/rank-card.get.parameters[].description
Filter preset for which maps to include in stats.

# paths./api/v3/users/{user_id}/rank-card.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/preferences/bulk.put.description
Update multiple notification preferences at once.

# paths./api/v3/notifications/users/{user_id}/preferences/bulk.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/events.post.description
Create a notification event and dispatch for delivery.

# paths./api/v3/notifications/events.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/dismiss-all.patch.description
Dismiss all notifications for a user and mark them as read.

# paths./api/v3/notifications/users/{user_id}/dismiss-all.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/events/{event_id}/dismiss.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/preferences.get.description
Get all notification preferences for a user.

# paths./api/v3/notifications/users/{user_id}/preferences.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/unread-count.get.description
Get count of unread notifications for badge display.

# paths./api/v3/notifications/users/{user_id}/unread-count.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/events.get.description
Get notifications for a user's notification tray.

# paths./api/v3/notifications/users/{user_id}/events.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/read-all.patch.description
Mark all notifications as read for a user.

# paths./api/v3/notifications/users/{user_id}/read-all.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/events/{event_id}/read.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/events/{event_id}/delivery-result.post.description
Record the result of a notification delivery attempt.

# paths./api/v3/notifications/events/{event_id}/delivery-result.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/should-deliver.get.description
Check if a notification should be delivered to a channel.

# paths./api/v3/notifications/users/{user_id}/should-deliver.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/notifications/users/{user_id}/preferences/{event_type}/{.put.description
Update a single notification preference.

# paths./api/v3/notifications/users/{user_id}/preferences/{event_type}/{.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/maps.post.description
Create a new Overwatch map from a mixed-multipart request (name + required banner). Idempotent: re-posting an existing name returns 201 with `inserted: false` and overwrites the banner at the same stripped key (replace-banner). Requires the `content:admin` scope.

# paths./api/v3/content/maps.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/categories.get.description
Return all movement technique categories ordered by sort_order.

# paths./api/v3/content/movement-tech/categories.post.description
Create a new movement technique category.

# paths./api/v3/content/movement-tech/categories.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/difficulties.get.description
Return all movement technique difficulty levels ordered by sort_order.

# paths./api/v3/content/movement-tech/difficulties.post.description
Create a new movement technique difficulty level.

# paths./api/v3/content/movement-tech/difficulties.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/techniques.post.description
Create a new movement technique with optional tips and videos.

# paths./api/v3/content/movement-tech/techniques.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/categories/{category_id}.put.description
Update the name of an existing movement technique category.

# paths./api/v3/content/movement-tech/categories/{category_id}.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/categories/{category_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}.put.description
Update the name of an existing movement technique difficulty level.

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}.delete.description
Delete a movement technique difficulty level.

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/techniques/{technique_id}.get.description
Fetch a single movement technique by ID.

# paths./api/v3/content/movement-tech/techniques/{technique_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/techniques/{technique_id}.put.description
Update a movement technique's fields. Only provided fields are changed.

# paths./api/v3/content/movement-tech/techniques/{technique_id}.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/techniques/{technique_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech.get.description
Return all movement techniques with nested tips and videos.

# paths./api/v3/content/movement-tech/categories/{category_id}/reorder.post.description
Move a movement technique category one position up or down.

# paths./api/v3/content/movement-tech/categories/{category_id}/reorder.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}/reord.post.description
Move a movement technique difficulty level one position up or down.

# paths./api/v3/content/movement-tech/difficulties/{difficulty_id}/reord.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/content/movement-tech/techniques/{technique_id}/reorder.post.description
Move a movement technique one position up or down.

# paths./api/v3/content/movement-tech/techniques/{technique_id}/reorder.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/remember-token.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/sessions/user/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/sessions/user/{user_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/status/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/login.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/register.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/forgot-password.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/resend-verification.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/reset-password.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/remember-token/user/{user_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/sessions/{session_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/sessions/{session_id}.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/sessions/{session_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/remember-token/validate.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/auth/verify-email.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/creator.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/exists.get.description
Return a boolean indicating whether a user with the given ID exists.

# paths./api/v3/users/{user_id}/exists.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/fake.post.description
Create a placeholder user with an auto-generated ID and return the new user ID.

# paths./api/v3/users/fake.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users.get.description
Fetch all users with their basic fields and aggregated Overwatch usernames.

# paths./api/v3/users.post.description
Create a new user with the provided ID, nickname, and global name. If the user already exists, this is a no-op. Duplicate primary keys are reported with a 400.

# paths./api/v3/users.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/overwatch.get.description
Retrieve Overwatch usernames for a user. Responds with 404 if the user does not exist. Includes `username` and `is_primary` fields.

# paths./api/v3/users/{user_id}/overwatch.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/overwatch.put.description
Replace the Overwatch usernames for a user. This clears all existing entries and inserts the provided list. Use `is_primary` on exactly one entry to mark it as primary.

# paths./api/v3/users/{user_id}/overwatch.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}.get.description
Fetch a single user by ID. Returns nickname, global name, coins, aggregated Overwatch usernames, and a `coalesced_name` preferring primary OW username, then nickname, then global name.

# paths./api/v3/users/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}.patch.description
Update the global name and nickname for a user.

# paths./api/v3/users/{user_id}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/{user_id}/rank.get.description
Compute per-difficulty completion counts and medal thresholds for the given user. Uses verified, latest-per-user runs and Global maps only.

# paths./api/v3/users/{user_id}/rank.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/users/fake/{fake_user_id}/link/{real_user_id}.put.description
Reassign references from the fake user to the real user and delete the fake user row.

# paths./api/v3/users/fake/{fake_user_id}/link/{real_user_id}.put.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/approve.post.description
Approve a playtest, marking it as verified and setting its difficulty rating.

# paths./api/v3/maps/playtests/{thread_id}/approve.post.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/approve.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.post.description
Submit a vote for a specific playtest thread on behalf of a user.

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.post.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.delete.description
Remove an individual user's vote for a specific playtest thread.

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.delete.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/vote/{user_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/vote.delete.description
Remove all votes associated with a specific playtest thread.

# paths./api/v3/maps/playtests/{thread_id}/vote.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}.get.description
Retrieve the full playtest metadata and related details for a specific thread.

# paths./api/v3/maps/playtests/{thread_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/force_accept.post.description
Forcefully accept a playtest regardless of votes, assigning difficulty and verifier.

# paths./api/v3/maps/playtests/{thread_id}/force_accept.post.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/force_accept.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/force_deny.post.description
Forcefully deny a playtest regardless of votes, recording the reason for rejection.

# paths./api/v3/maps/playtests/{thread_id}/force_deny.post.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/force_deny.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/votes.get.description
Retrieve all votes currently associated with a specific playtest thread.

# paths./api/v3/maps/playtests/{thread_id}/votes.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/maps/playtests/{thread_id}/reset.post.description
Reset a playtest to its initial state, optionally removing votes and completions.

# paths./api/v3/maps/playtests/{thread_id}/reset.post.responses.202.description
Request accepted, processing continues off-line

# paths./api/v3/maps/playtests/{thread_id}/reset.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/bootstrap.post.description
Manually activate the FIRST grid-snapped edition (one edition + one child cycle per active category) so it then rolls over automatically via the pg_cron transition machinery. Idempotent-safe: an active edition already existing returns 409. The shared started_at is grid-snapped (never now()).

# paths./api/v3/tournaments/categories/{category_id}/next-cycle.get.description
Preview the pending next cycle for a category.

# paths./api/v3/tournaments/categories/{category_id}/next-cycle.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}/next-cycle.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories.post.description
Create a new tournament category with difficulty groupings.

# paths./api/v3/tournaments/categories.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}.delete.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/publish-results.patch.description
Admin escape hatch (D-03): force-publish the results of the edition currently awaiting_results, IGNORING any remaining in-flight verifications. Computes results from currently-verified runs, writes the deferred results event, and completes the edition. Abandoned (still-pending) runs are left pending (audit trail). Returns 409 if no edition is awaiting results. Requires tournaments:write; the bot-side mod gate (Plan 05) is the authoritative caller check.

# paths./api/v3/tournaments/editions/active.get.description
Return the single active edition's shared grid-anchored timing (id/started_at/ends_at/status). ``ends_at`` is STORED, not derived — the frontend reads it here instead of computing it (D-05/D-08, closes frontend-spec §8).

# paths./api/v3/tournaments/config.patch.description
Update global tournament configuration fields.

# paths./api/v3/tournaments/config.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/cycles/{cycle_id}/leaderboard.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/streaks/{user_id}.get.description
Get a single user's tournament participation streak.

# paths./api/v3/tournaments/streaks/{user_id}.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/cycles.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/completions/{tournament_completion_id}/rejec.patch.description
Reject a non-PB tournament completion (bot mod-review callback).

# paths./api/v3/tournaments/completions/{tournament_completion_id}/rejec.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}/reroll-active.post.description
Reroll the LIVE active cycle's map, wiping its submissions and preserving the edition window.

# paths./api/v3/tournaments/categories/{category_id}/reroll-active.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}/reroll.post.description
Delete current pending cycle and select a new map.

# paths./api/v3/tournaments/categories/{category_id}/reroll.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/categories/{category_id}/select-map.post.description
Trigger random map selection for next cycle.

# paths./api/v3/tournaments/categories/{category_id}/select-map.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/debug-cycle-length.patch.summary
Override Edition Length (DEBUG/TEST ONLY)

# paths./api/v3/tournaments/debug-cycle-length.patch.description
DEBUG/TEST ONLY: override the GLOBAL edition length in seconds so the next transition recomputes from the override. Pass seconds=null to clear the override and restore the normal cadence. Rejected in production (T-12-07).

# paths./api/v3/tournaments/debug-cycle-length.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/pause.patch.description
GLOBAL hiatus lever (D-03/D-12): pause (paused=true) or resume (paused=false) automatic edition transitions. While paused the active edition still runs its full term; only creation of the NEXT edition is suppressed at the boundary. Resuming restores the normal cadence.

# paths./api/v3/tournaments/pause.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/tournaments/completions/{tournament_completion_id}/verif.patch.description
Verify a non-PB tournament completion (bot mod-review callback).

# paths./api/v3/tournaments/completions/{tournament_completion_id}/verif.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/newsfeed.get.description
Return a paginated list of newsfeed events ordered by most recent first. Supports an optional type filter via the "type" query parameter and fixed page sizes (10, 20, 25, 50).

# paths./api/v3/newsfeed.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/newsfeed.post.description
Insert a newsfeed event and immediately publish its ID to RabbitMQ. The request body must be a valid NewsfeedEvent; the response is the numeric ID of the newly created row.

# paths./api/v3/newsfeed.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/change-requests/permission.get.description
Return whether the given `user_id` is included in the creator mentions for the thread and code.

# paths./api/v3/change-requests/permission.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/change-requests.get.description
List all unresolved change requests for the specified map code, newest first.

# paths./api/v3/change-requests.get.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/change-requests.post.description
Create a change request for a specific map code and discussion thread.

# paths./api/v3/change-requests.post.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/change-requests/stale.get.description
Return change requests older than two weeks that are neither alerted nor resolved.

# paths./api/v3/change-requests/{thread_id}/resolve.patch.description
Mark the change request associated with the given thread as resolved.

# paths./api/v3/change-requests/{thread_id}/resolve.patch.responses.400.description
Bad request syntax or unsupported method

# paths./api/v3/change-requests/{thread_id}/alerted.patch.description
Mark the change request associated with the given thread as having been alerted.

# paths./api/v3/change-requests/{thread_id}/alerted.patch.responses.400.description
Bad request syntax or unsupported method

# components.schemas.CompletionCreateRequest.properties.screenshot.description
Must be a valid URL starting with http:// or https://.

# components.schemas.GuideFullResponse.properties.url.description
Must be a valid URL starting with http:// or https://.

# components.schemas.GuideResponse.properties.url.description
Must be a valid URL starting with http:// or https://.

# components.schemas.NewsfeedGuide.properties.guide_url.description
Must be a valid URL starting with http:// or https://.

# components.schemas.NewsfeedRecord.properties.video.description
Must be a valid URL starting with http:// or https://.