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

# GET /v1/public/prices — Keyless Min-Ask Feed for CS2, Dota 2 and Rust

> One cheapest price per item name, for CS2, Dota 2 or Rust. No API key, no balance requirement — limited to one request per minute per IP.

The public price feed answers one question: what is the cheapest ask on CSBoard for each item, right now? You get a single object that maps every `market_hash_name` on sale in one game to its minimum price in USD. There is no depth, no listing count, no wear split and no paging.

**No API key required.** Send no `Authorization` header and no balance is needed. That makes it the endpoint for price-comparison sites, spreadsheets and scrapers that only need one number per name.

## What you get

* **One game per request.** `appId=730` is CS2 (the default), `570` is Dota 2, `252490` is Rust.
* **Steam's own names.** CS2 Doppler and Gamma Doppler phases are merged into the base name Steam uses, so `Karambit | Doppler (Factory New)` carries the price of its cheapest phase. Every key matches a real Steam `market_hash_name`.
* **Sorted keys, prices rounded to the cent.** Only names with at least one listing on sale appear.
* **`updatedAt`** is when the payload was built.

## Limits and freshness

The feed is rebuilt at most **once a minute** and served with `Cache-Control: public, max-age=60`. Requests are limited to **1 per minute per IP address**. Polling faster cannot get you newer data — it only gets you a `429` with a `Retry-After` header.

<Note>
  The `429` here comes from the per-IP limiter, not the per-key one, so its body is `{ "error": "...", "statusCode": 429 }` and has no `code` field. Branch on the HTTP status and wait `Retry-After` seconds.
</Note>

## Example request

```bash theme={null}
curl "https://csboard.com/v1/public/prices?appId=730"
```

## Example response

```json theme={null}
{
  "appId": 730,
  "currency": "USD",
  "updatedAt": "2026-10-02T12:00:41.512Z",
  "items": {
    "AK-47 | Redline (Field-Tested)": 11.92,
    "AWP | Asiimov (Field-Tested)": 96.4,
    "Karambit | Doppler (Factory New)": 812.5
  }
}
```

## Error codes

| HTTP status | Code | Meaning |
| - | - | - |
| 400 | `invalid_param` | The `appId` is not one of the games we serve. `detail` lists the ones you can use. |
| 429 | — | More than one request this minute from your IP. Wait for the `Retry-After` header value. |

<Tip>
  Need wear and phase splits, listing counts, filters or paging? Use the keyed [`GET /v1/prices`](/api-reference/get-prices). Need the exact listing to buy? Use [`GET /v1/listings`](/api-reference/get-listings) — this feed is indicative and can be up to a minute old.
</Tip>


## OpenAPI

````yaml GET /public/prices
openapi: 3.1.0
info:
  title: CSBoard API
  version: 1.0.0
  description: >-
    Market data over the CSBoard marketplace — live listings, floats, stickers,
    minAsk prices, FX rates — plus opt-in buying straight from your balance.
    Free to read, key-gated, built for automation.
  contact:
    name: CSBoard
    url: https://csboard.com/docs
servers:
  - url: https://csboard.com/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Status
    description: Liveness and freshness probes.
  - name: Market data
    description: Read the live catalog, prices, and FX rates.
  - name: Trading
    description: Buy listings from your CSBoard balance. Opt-in, key-gated.
  - name: P2P
    description: >-
      List your own CS2 skins on the CSBoard P2P market. Free — any valid key,
      no balance requirement.
  - name: Account
    description: Your balance, settled funds, and trading status.
  - name: Webhooks
    description: Register an endpoint and receive signed order updates instead of polling.
paths:
  /public/prices:
    get:
      tags:
        - Market data
      summary: Keyless min-ask feed
      description: >-
        One number per item: the cheapest current ask in USD for every
        `market_hash_name` on sale in one game. **No API key and no balance
        requirement** — send no `Authorization` header. In exchange it is
        limited to 1 request per minute per IP address, and the payload is
        rebuilt at most once a minute (`Cache-Control: public, max-age=60`), so
        polling faster gains nothing.


        CS2 Doppler and Gamma Doppler phases are merged into Steam's own base
        name, so every key matches a real Steam `market_hash_name`. For depth,
        counts, wear, filters or paging use the keyed `GET /prices`.
      operationId: getPublicPrices
      parameters:
        - name: appId
          in: query
          required: false
          description: >-
            Game to price: `730` = CS2 (the default), `570` = Dota 2, `252490` =
            Rust. A game that is not available answers `400 invalid_param`.
          schema:
            type: integer
            enum:
              - 730
              - 570
              - 252490
            default: 730
      responses:
        '200':
          description: Name → min-ask map for the game.
          headers:
            Cache-Control:
              description: '`public, max-age=60`.'
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicPrices'
              example:
                appId: 730
                currency: USD
                updatedAt: '2026-10-02T12:00:41.512Z'
                items:
                  AK-47 | Redline (Field-Tested): 11.92
                  AWP | Asiimov (Field-Tested): 96.4
                  Karambit | Doppler (Factory New): 812.5
        '400':
          description: The `appId` is not available.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                code: invalid_param
                detail: 'appId "440" is not available. Use one of: 730, 570, 252490.'
        '429':
          description: >-
            More than 1 request in a minute from your IP address. Wait
            `Retry-After` seconds. This limit is enforced per address, not per
            key, and its body has no `code` field — branch on the status code.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  statusCode:
                    type: integer
              example:
                error: Rate limit exceeded, retry in 37 seconds
                statusCode: 429
      security: []
components:
  schemas:
    PublicPrices:
      type: object
      properties:
        appId:
          type: integer
          description: The game these prices are for.
          example: 730
        currency:
          type: string
          enum:
            - USD
        updatedAt:
          type: string
          format: date-time
          description: When this payload was built. It is rebuilt at most once a minute.
        items:
          type: object
          additionalProperties:
            type: number
          description: >-
            `market_hash_name` → the cheapest current ask in USD, rounded to the
            cent. Keys are sorted. Only names with at least one listing on sale
            appear. CS2 Doppler and Gamma Doppler phases are merged into Steam's
            base name and carry the cheapest phase.
      required:
        - appId
        - currency
        - updatedAt
        - items
    Error:
      type: object
      description: >-
        All errors return { code, detail }. Some carry extra fields (e.g.
        price_moved adds current_total_usd, insufficient_balance adds
        required_usd/current_usd).
      properties:
        code:
          type: string
          description: >-
            Machine-readable error code, e.g. rate_limit_exceeded,
            trading_not_enabled, price_moved.
        detail:
          type: string
          description: Human-readable explanation.
      required:
        - code
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Send your key as a Bearer token on every request: `Authorization: Bearer
        csb_pub_...`. Generate keys in your CSBoard profile.

````

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