# How to Build a Liquid CS2 Skin Screener

> A liquid CS2 skin screener can join `GET /v1/schema`, `GET /v1/liquidity/items`, and `GET /v1/prices/latest` by exact `market_hash_name`.

The three datasets answer separate questions. The schema defines what the item is, liquidity estimates how readily it sells at a competitive price, and current prices determine whether it fits an acquisition or exit threshold.

## Data requirements for the screen

| Filter | Endpoint and fields |
| --- | --- |
| Item type | Schema `category`, `is_tradable`, rarity, wear, StatTrak, Souvenir |
| Liquidity | `liquidity` and `estimated_sale_time` |
| Budget | Current per-source `ask` values in USD |
| Exit reference | Current `bid` where the source supports it |
| Special variants | Independent variant metadata, liquidity, and prices |

Liquidity is recomputed daily from real BUFF, Steam, and CSFloat sale volume and traded value over rolling 30- and 90-day windows. It is an absolute, deterministic bucket from `unknown` through `extremely_liquid`, not a percentile rank.

`estimated_sale_time` is an 80th-percentile estimate for a competitively priced listing. Supported Doppler, Gamma Doppler, and Case Hardened variants are scored separately from their base items.

## Screening sequence

Filter the schema first to the categories and attributes the product permits. Join those names to the daily liquidity snapshot and apply a minimum bucket or maximum estimated sale time. Then read the current all-item price snapshot and require at least one fresh, positive quote inside the chosen price range.

Define whether the price filter uses the lowest cash-market ask, one fixed source, or a current bid. Keep Steam wallet pricing separate from cash-market budget limits, and retain the winning source and `collected_at` beside each result.

## Applicable endpoints

| Endpoint | Returns | Plans |
| --- | --- | --- |
| `GET /v1/schema` | Catalog metadata and exact names | All plans |
| `GET /v1/liquidity/items` | Daily liquidity and estimated sale time | Scale, Enterprise |
| `GET /v1/prices/latest` | Current all-source price snapshot | All plans |

## What can invalidate a result

- A sale-time estimate assumes competitive pricing. A listing far above comparable asks can take longer than its bucket suggests.
- `unknown` means recent evidence was insufficient. It should not pass a maximum-time filter unless the application defines a separate fallback.
- Current `ask` is a floor and can represent one unusual float or sticker craft. The schema and price endpoints do not describe that exact listed asset.
- The liquidity snapshot updates daily while current prices refresh more often. Store each response timestamp so the screen can be reproduced.

See [how to find the most liquid skins](/resources/how-to-find-most-liquid-cs2-skins) for a liquidity-first variant of this screen.
