---
title: "Delete or retire a scoring format"
method: DELETE
path: "/v1/admin/scoring_formats/{id}"
tags: ["Admin Scoring Formats"]
---

# Delete or retire a scoring format

`DELETE /v1/admin/scoring_formats/{id}`

## Request

- Base URL: `https://api.hify.club`
- URL: `https://api.hify.club/v1/admin/scoring_formats/{id}`
- Auth: API key in header `X-User-Token`

Deleted outright when nothing references it. A format a tournament or match points at is deactivated instead, so those keep resolving and a played match's snapshot stays traceable to a row.

## Response `200`

Referenced, so retired instead

- object
  - `id` integer
  - `sport` 'padel' | 'pickleball': The sports row, named by its lowercase name. Accepted on write and echoed on read. A sport the platform does not have, or has but cannot score, is refused.
  - `sport_id` integer: The resolved sports row, returned alongside `sport`.
  - `slug` string: Stable identifier. Partner feeds name a format by this.
  - `name` string
  - `subtitle` string, nullable: Short display name for the referee-facing card. Its presence is what makes the compiler emit match_format_info at all.
  - `description` string, nullable
  - `real_world_use` string, nullable
  - `rules` Rules: The sport-agnostic rule payload. Validated by compiling it, so a format that cannot produce a snapshot cannot be saved.
    - `match` object, required
      - `win` WinRule, required: How a unit is won. `target` points, games or sets, taken by `margin`.
        - `target` integer, required
        - `margin` integer
      - `deciding` object, nullable: A decider that REPLACES the final unit — a match tiebreak — as distinct from deciding_overrides, which modifies it.
        - `kind` 'match_tiebreak'
        - `win` WinRule: How a unit is won. `target` points, games or sets, taken by `margin`.
          - `target` integer, required
          - `margin` integer
        - `label` string, nullable
    - `levels` Level[], required
      - `type` string, required
      - `win` WinRule: How a unit is won. `target` points, games or sets, taken by `margin`.
        - `target` integer, required
        - `margin` integer
      - `tiebreak` Tiebreak: `trigger_at` is deliberately independent of the level's own target — Fast 6 intercepts at 5-5, a Race to 8 at 7-7.
        - `trigger_at` integer, nullable
        - `win` WinRule: How a unit is won. `target` points, games or sets, taken by `margin`.
          - `target` integer, required
          - `margin` integer
      - `scoring` 'tennis_points' | 'numeric': Leaf level only. Which family of point scoring applies.
      - `deuce` object: tennis_points leaves only.
        - `max_advantages` null | 0 | 1 | 2, nullable: null unlimited (advantage), 0 golden, 1 silver, 2 star point.
        - `receiver_chooses_side` boolean
        - `on_set_point` object: Deuce played on games that decide a set. max_advantages is required (null = advantage).
          - `max_advantages` null | 0 | 1 | 2, nullable, required
          - `receiver_chooses_side` boolean: Inherits the base deuce when omitted.
        - `on_match_point` object: Deuce played on games that decide a match. max_advantages is required (null = advantage).
          - `max_advantages` null | 0 | 1 | 2, nullable, required
          - `receiver_chooses_side` boolean: Inherits the base deuce when omitted.
      - `freeze` object, nullable: numeric leaves only.
        - `enabled` boolean
        - `triggers_at` integer, nullable
      - `deciding_overrides` object, nullable: How the FINAL unit at this level differs. Key presence is the signal: omit the object entirely and the decider behaves like any other unit; send `{"tiebreak": null}` and it is played out with no tiebreak; send a tiebreak and the decider uses that one instead.
        - `tiebreak` Tiebreak: `trigger_at` is deliberately independent of the level's own target — Fast 6 intercepts at 5-5, a Race to 8 at 7-7.
          - `trigger_at` integer, nullable
          - `win` WinRule: How a unit is won. `target` points, games or sets, taken by `margin`.
            - `target` integer, required
            - `margin` integer
    - `serve` object
      - `model` 'alternating' | 'side_out' | 'rally'
      - `player_format` 'singles' | 'doubles'
      - `starting_score` string, nullable
      - `end_change_at` integer, nullable
    - `side_changes` object, nullable
    - `extensions` object, nullable: Sport-specific escape hatch, e.g. the MLP DreamBreaker rotation.
  - `display_overrides` object: Bespoke copy overriding the generated match_format_info.
  - `active` boolean
  - `rules_version` integer: Bumped on every rules change and stamped into the snapshot, so a played match traces to an exact row and revision.
  - `position` integer
  - `scoring_config_snapshot` object: What a device would be given for a match scored under this format. Returned on every response so an edit can be confirmed without a second request. When the format plays a different deuce on set or match point, the snapshot carries a top-level deuce_overrides object keyed set_point / match_point, each shaped like deuce. Absent otherwise.
  - `retired` boolean
  - `reason` string

## Other responses

- `204`: Deleted

---

[API](https://skmtc.dev/hify/apis/hify-apis.md) - [All operations](https://skmtc.dev/hify/apis/hify-apis/llms.txt) - [OpenAPI document](https://skmtc.dev/hify/apis/hify-apis/revisions/b5920403538d?raw)
