> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alura.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Listing score

> How the 0 to 100 listing score of your own listings is computed, its 5 sections and 14 checks, and when it is null

> [!NOTE]
>
> **Version 2026-10.** This page covers `listing_score` on your own listings and its `score_breakdown`, computed with Alura's listing score rubric, version **1.5.0** (the `@pixell-co/alura-listing-score` package, pinned to exactly 1.5.0). The breakdown names its rubric version in `version`.

The listing score rates how complete and searchable a listing is, from 0 to 100. It looks only at what the listing shows a shopper: photos, video, title, description and tags. It doesn't look at sales, views or price.

## Where the score comes from

* **`listing_score`** is the score Alura stores with the listing. Search, sort and filter use this stored value (`sort=listing_score`, `listing_score_min`, `listing_score_max`).
* **`score_breakdown`** is computed when you ask for it, with `expand=score_breakdown` on `GET /v1/workspace/listings/{id}`, or `include: ["score_breakdown"]` on `get_my_listing`. It uses the listing's stored photos, videos, title, description and tags.

Both use the same rubric, so the breakdown's `total` equals `listing_score` when the stored score was computed with the same version. When it wasn't, or Alura doesn't know which version computed it, the breakdown adds a `score_version_mismatch` notice: its `total` may differ from `listing_score` until Alura scores the listing again.

## The sections and checks

The score has 5 sections and 14 checks. Each check earns points up to its maximum, and the score is the points earned as a share of the points possible, rounded to a whole number.

| Section | Check `id` | Label | Most points |
| - | - | - | - |
| `photos` (Photo score) | `photo-count` | Photos added | 12 |
| | `resolution` | Photo quality | 6, or 0 when Alura knows no photo's size |
| | `alt-text` | Alt text added | 7 |
| `video` (Video score) | `video-presence` | Video added | 7 |
| | `video-resolution` | Video quality | 3, or 0 when the video's size is unknown |
| `title` (Title score) | `length` | Length | 4 |
| | `keyword-upfront` | Keyword up front | 4 |
| | `clean-wording` | Clean wording | 6 |
| `description` (Description score) | `length` | Length | 5 |
| | `keyword-upfront` | Keyword up front | 5 |
| | `formatting` | Formatting | 5 |
| `tags` (Tag score) | `slots` | Tags added | 10 |
| | `phrases` | Multi-word tags | 6 |
| | `wasted` | No wasted tags | 4 |

`length` and `keyword-upfront` appear in both the title and the description section. Identify a check by its section and its `id` together.

When Alura doesn't know the size of any photo, or of the video, the quality check has 0 possible points, so it can neither raise nor lower the score.

**Tags in the API.** The rubric can also count a tag as wasted when it repeats the listing's category or an attribute. The API's breakdown and the stored score don't give the rubric the category or attributes, so here `wasted` only flags a tag you used twice (Etsy reads singular and plural as the same tag).

## How `score_breakdown` reports it

Part of a breakdown, with one section and one check shown:

```json theme={null}
{
  "version": "1.5.0",
  "total": 86,
  "sections": [
    {
      "id": "tags",
      "label": "Tag score",
      "score": 16,
      "max_score": 20,
      "checks": [
        { "id": "slots", "label": "Tags added", "value": "13/13", "score": 10, "max_score": 10, "status": "pass", "advice": "Each tag is another search you can show up in. Use all 13, since empty slots leave sales on the table." }
      ]
    }
  ],
  "notices": []
}
```

* **`total`** is the score out of 100.
* **Each section** has its `score` and `max_score`, and its `checks`.
* **Each check** has:
  * `value`: what the rubric found, as short text such as `13/13`, `8 words` or `Missing`;
  * `score` and `max_score`: the points earned and possible;
  * `status`: `pass` at 90% of the possible points or more (`slots` needs all 13 tags), `partial` above 0, `fail` at 0, and `na` when the check has no possible points;
  * `advice`: the rubric's advice for that result, in English.

## When it is null

* **`listing_score` is `null`** when Alura has no stored score for the listing yet, or the stored value isn't a score from 1 to 100. A stored `0` reads as `null`: it's never `0` for a listing Alura hasn't scored.
* **`score_breakdown` is `null`** when Alura hasn't stored all of the listing's photos, or the listing has a video Alura hasn't stored. The response then has `score_breakdown_error: "media_incomplete"`. Scoring a listing with missing photos would give it a lower score than it has.

## Version history

| Version | Change |
| - | - |
| 2026-10 | First published version, with rubric 1.5.0. |

An earlier plan for this page counted 15 checks. Rubric 1.5.0 has 14.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.