# Shooting match card

> Canonical HTML: https://screenrig.ai/docs/cards/shooting-match/

Live standings for a ringed-target shooting match (rimfire, air rifle, smallbore): every division ranked by score and X count beside the featured card's sheet, each bull drawn with its hits where they landed, row totals and the card's total. The scorekeeper's agent writes the scored cards; a fresh card is featured and celebrated.

Category: Sports. Tags: Scoreboards, Leaderboards and standings, Individual sports.

## Previews

![Shooting match](/cards/shooting-match/v1/screenshots/canvas-bloom.webp?sha=abf895b40857559c097e098afd83dfcc1f70123ae78355ae8e5149b5f5fbd68a)

Canvas

![Shooting match](/cards/shooting-match/v1/screenshots/corner-bloom.webp?sha=84f212cd5136b445d9f9f1d531fa4e85bad905b1f9b01b9df267209f71f852ad)

Corner

![Shooting match](/cards/shooting-match/v1/screenshots/chip-bloom.webp?sha=947b86d799a3a154508218dd121f8f97e538a36bcc54ddd126155074a940bb7e)

Chip

## Views and forms

Views: canvas, corner, chip. Canvas forms: landscape, portrait, square, strip.

[Card views, themes and publishing](/docs/cards/). [Browse the gallery](/apps/#cards).

## Data and privacy

This card uses its configured properties and live card data.

## Properties

For theme, background, accent and position, see [Common properties](/docs/cards/#common-properties).

Set static properties in `params`. Bind `data` to a project card data key for live values; that document holds only dynamic properties. Without a data key, put the complete configuration in `params`. Nested rows describe the contents of their parent property.

### Static properties

| Name | Type | Default | Values and limits | Description |
| --- | --- | --- | --- | --- |
| `title` | string | `"Match standings"` | maxLength: `60` | The label above the match name; the heading itself when the data names no match. |
| `subtitle` | string | `""` | maxLength: `120` | One line under the heading, before the match date and the shooter count. |
| `target` | object |  | additionalProperties: `false` | The target sheet every card is shot on. |
| `target.bulls` | integer | `25` | minimum: `1`; maximum: `100` | Record bulls on one sheet. |
| `target.rows` | integer | `5` | minimum: `1`; maximum: `20` | Rows the bulls sit in, read left to right, top to bottom. |
| `target.rings` | array | `[10,9,8,7,6,5]` | minItems: `1`; maxItems: `12` | Scoring ring values from the inner ring outward. The first is a bull's highest score. |
| `target.xRing` | boolean | `true` |  | An X ring inside the inner ring; X counts break ties. |
| `target.radii` | array | `[]` | maxItems: `12` | Ring radii from the inner ring outward, one per ring value, in any unit (the card scales the outer ring to 1). Empty spaces the rings evenly. |
| `target.xRadius` | number | `0` | minimum: `0` | The X ring's radius in the unit of radii, or as a fraction of the outer ring when radii is empty. 0 is half the inner ring. |
| `target.black` | integer | `4` | minimum: `0`; maximum: `12` | How many rings, from the inner ring outward, the aiming black covers. |
| `target.shotSize` | number | `0.22` | minimum: `0`; maximum: `1` | A shot hole's diameter as a fraction of the outer scoring ring's radius. |
| `showPercent` | boolean | `true` |  | Show each card's score as a percentage of the sheet's maximum. |
| `ranking` | string | `"best"` | `"best"`, `"every"` | best ranks each shooter once per division, on their best card; every ranks every card. |
| `rotateSeconds` | integer | `12` | minimum: `0`; maximum: `600` | Seconds each ranked card is featured on the wall-clock rotation. 0 keeps the latest card featured. |
| `freshMinutes` | integer | `3` | minimum: `0`; maximum: `60` | A card submitted this recently is fresh: featured ahead of the rotation and marked Just in. 0 turns it off. |

### Dynamic properties

| Name | Type | Default | Values and limits | Description |
| --- | --- | --- | --- | --- |
| `match` | object |  | additionalProperties: `false` | The match. |
| `match.name` | string | `""` | maxLength: `60` |  |
| `match.date` | string | `""` | maxLength: `10` | YYYY-MM-DD. |
| `divisions` | array | `[]` | maxItems: `8` | Divisions in display order. A division an entry names but this list lacks is added after them. |
| `divisions[].id` | string |  | minLength: `1`; maxLength: `40`; Required |  |
| `divisions[].name` | string |  | maxLength: `40`; Required |  |
| `entries` | array | `[]` | maxItems: `200` | Scored cards, one per sheet shot. The scores are authoritative: the card totals and ranks them and draws each hit where it landed, but never re-scores from the hits. |
| `entries[].id` | string |  | minLength: `1`; maxLength: `60`; Required | Stable and unique: the agent rewrites the same id when it corrects a card. |
| `entries[].shooter` | string |  | minLength: `1`; maxLength: `40`; Required | The shooter's display name; cards with the same name (ignoring case) are one shooter. |
| `entries[].division` | string |  | maxLength: `40` | A divisions[].id. |
| `entries[].label` | string |  | maxLength: `80` | What this card is, for example 25 m · Sheet 2. |
| `entries[].submittedAt` | string |  | maxLength: `40` | ISO 8601 instant the card was scored. Drives freshness and breaks ties (earlier wins). |
| `entries[].bulls` | array |  | maxItems: `100`; Required | One per record bull in sheet order, left to right by row. Bulls past target.bulls are ignored; missing ones read as not scored. |
| `entries[].bulls[].score` | number, null |  | minimum: `0`; maximum: `100`; Required | The bull's score; null is not scored yet. |
| `entries[].bulls[].x` | boolean |  |  | The shot is in the X ring (its score is the inner ring's value). |
| `entries[].bulls[].hits` | array |  | maxItems: `10` | Shot centres in units of the bull's outer scoring ring radius: 0,0 is the centre, +x right, +y up. |
| `entries[].bulls[].hits[].dx` | number |  | minimum: `-2`; maximum: `2`; Required |  |
| `entries[].bulls[].hits[].dy` | number |  | minimum: `-2`; maximum: `2`; Required |  |
| `entries[].photo` | string |  | maxLength: `512` | A host-resolved media URL of the card photo. |
| `featured` | string | `""` | maxLength: `60` | An entry id to keep featured. Empty features a fresh card, else rotates. |

## Canvas example

Add this item to a playlist page’s `primitives`. [Publish the playlist and assign a screen](/docs/cards/#publish-a-card-canvas).

```json
{
  "id": "shooting-match",
  "primitive": "card",
  "card": "shooting-match",
  "major": 1,
  "params": {
    "theme": "neomustard"
  },
  "rect": {
    "x": 0,
    "y": 0,
    "width": 1920,
    "height": 1080
  },
  "layer": 0,
  "content_fit": "fill",
  "data": "shooting-match-main"
}
```

## Write live data

Create this document before showing the card, then replace it to update the screen without republishing. Use the same project as the playlist. Supply your API authorization through the environment; see [API authentication](/docs/authentication/).

```console
curl --request PUT "https://api.screenrig.ai/api/card-data/shooting-match-main" \
  --header "Authorization: Bearer $SCREENRIG_TOKEN" \
  --header "ScreenRig-Project: $SCREENRIG_PROJECT" \
  --header "Content-Type: application/json" \
  --data '{"document":{"match":{},"divisions":[],"entries":[],"featured":""}}'
```
