# Unknown is not zero

The difference between a source saying nothing and a source saying zero, why StampDEX keeps them apart, and how to read the distinction in the API.

> Source: bitcoinuniverseio/stampdex (private application source), src20 hub map known flags, market aggregation source map. Applicable release continuous deployment, verify with GET /api/version. Last verified 2026-09-01. Chain bitcoin/mainnet.

import ProductShot from '../../../components/screens/ProductShot.astro';

A missing number and a number that is zero mean opposite things. A token with no
listings has **no floor**. A token that traded nothing yesterday has a volume of
**zero**. Showing both as `0` turns a gap in the data into a claim about the market.

StampDEX keeps them apart everywhere.

## How to read it on screen

<ProductShot id="fixture-unknown-value" />

| You see | It means |
| --- | --- |
| A double dash | No source answered. A screen reader announces it as Unknown |
| `0` | A source answered, and the answer was zero |

## How to read it in the API

Every market row carries a `sources` object with one entry per figure:

```json
{
  "tick": "MSKK",
  "floor_price": 1,
  "holders": 19090,
  "mint_progress": 100,
  "sources": {
    "identity": "stampchain",
    "price": "stampchain",
    "volume": "stampchain",
    "holders": "stampchain",
    "listings": "none"
  }
}
```

A field whose source reads `none` is unknown. A numeric field with no reading is null
or absent, never `0`.

**The source map wins over the number.** A nested block can carry a literal zero while
the source map says `none`. When that happens the field is unknown, and rendering the
zero would be wrong.

## Why the rule is written down

This is not a style preference. It came from a measured failure. On one reading of the
first hundred tokens on the board, the volume source read `none` for ninety-seven rows
and the volume field was null for the same ninety-seven, while a nested market block
held a literal `0` for every one of them. A fallback chain that treated the missing
value as zero was printing a confident zero for ninety-seven tokens that had simply not
been measured.

The fix was to derive an explicit known flag for each figure from the source map, and
to render on that rather than on the number. The behaviour is covered by tests, so it
cannot quietly regress.

## Where the rule applies

- **Fully:** the market board, token pages, search results, collection figures, and
  the API responses behind all of them.
- **Partially:** parts of the portfolio are still being brought up to it. When a price
  is missing there, treat the holding's value as unknown rather than as zero.

Sorting and filtering follow the same rule. An unknown price does not sort as though it
were zero, and a price range filter does not return it as a match.

## The neighbouring distinction

The same discipline applies to two words that are easy to confuse:

- **Unknown**: nobody has an answer.
- **Unavailable**: we could not ask.

They appear together in deployment resolution, where "no deployment exists" and "the
index did not answer" are different screens. See
[Deployment identity](/docs-stampdex/concepts/deployment-identity/).

## Related

- [Market data](/docs-stampdex/concepts/market-data/)
- [Data provenance](/docs-stampdex/concepts/data-provenance/)