# How to Find CS2 Skin Arbitrage Across Marketplaces

> `GET /v1/prices/latest` supplies normalized asks and bids across six marketplaces, which can identify candidates where one source's acquisition ask is below another source's exit bid.

Two low asks show a shopping comparison. An arbitrage candidate needs an observed exit quote, so the destination side should be a `bid`, not another listing.

## Quote coverage for an arbitrage screen

BUFF, Youpin, and Steam provide `ask`, `bid`, `ask_volume`, and `bid_volume`. CSFloat and C5Game provide asks and bids without bid volume. Skinport provides asks, listing counts, listing statistics, and rolling sale windows, but no bid.

All prices are normalized to USD and each source object includes `updated_at` and `collected_at`. Supported Doppler, Gamma Doppler, and Case Hardened phases or tiers are priced independently under `variants`.

## Screening cross-market routes

For every exact base or variant identity, pair a positive cash-market `ask` with a different cash source's positive `bid`. Reject stale rows using `collected_at`, discard a source when its bid is above its own positive ask, and calculate the gross spread.

Apply the actual buy fee, sell fee, conversion cost, deposit or withdrawal cost, and any route-specific restrictions outside the API. Rank only the remaining net-positive candidates and keep the source timestamps beside them.

Join candidates to `GET /v1/liquidity/items` when the screen needs a sale-activity check. The absolute liquidity bucket and `estimated_sale_time` provide context about how often the item sells at a competitive listing price.

## Applicable endpoints

| Endpoint | Returns | Plans |
| --- | --- | --- |
| `GET /v1/prices/latest` | Current all-source asks, bids, volumes, and variants | All plans |
| `GET /v1/liquidity/items` | Daily liquidity and estimated sale time | Scale, Enterprise |

## Why a positive quote spread can fail

- Top-of-book fields do not expose destination depth for every source. CSFloat and C5Game have no `bid_volume`, so they cannot prove that a chosen quantity can exit.
- C5Game ask and bid observations come from independent collection passes. A crossed pair is a stale-data warning, not an opportunity.
- A current bid can change while an item is transferred or held. The API does not model execution latency or account restrictions.
- Variant identity must remain exact. A Ruby ask cannot be paired with a base Doppler bid.

Start with the [six-market price comparison](/resources/compare-cs2-skin-prices-across-marketplaces) when the goal is acquisition shopping rather than a two-sided route.
