> ## 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/p2p/inventory — Your CS2 Inventory, Ready to List

> Your CS2 items, one row per copy, with whether each can be listed on the CSBoard P2P market right now and why not.

The first step of listing over the API. It returns every CS2 item we have seen in your Steam inventory, one row per copy — `asset_id` tells two copies of the same skin apart. `listable` says whether a copy can be published right now; when it cannot, `reasons` says why. `listed` marks copies that already have a listing.

Pass `operational_asset_id` and `asset_revision` from this response, unchanged, to [`POST /v1/p2p/listings`](/api-reference/post-p2p-listings).

**Authentication required.** Send your key as `Authorization: Bearer csb_pub_...`. Free — any valid key, no balance requirement.

## The inventory read

Publishing needs a current read of your Steam inventory. `inventory_proof` tells you where that stands:

| `inventory_proof.status` | Meaning | What to do |
| - | - | - |
| `ready` | We hold a current read. | List the rows with `listable: true`. |
| `pending` | This call started a new read. | Call again after `retry_after_ms`. |
| `blocked` | We cannot read your inventory. | Fix what `code` names — for example a private inventory or a missing trade URL — and call again. |

## Example request

```bash theme={null}
curl https://csboard.com/v1/p2p/inventory \
  -H "Authorization: Bearer csb_pub_..."
```

## Example response

```json theme={null}
{
  "data": [
    {
      "operational_asset_id": "5b0c1f7e-3d2a-4c8e-9a61-2f4d8b7e1c30",
      "asset_revision": "sha256:fd0e6de607b774aaaf4d9cdb7e014c003ba614b03f0460b01e8c94bce034bac5",
      "asset_id": "38451927734",
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "context_id": "2",
      "listable": true,
      "reasons": [],
      "listed": false,
      "listing_id": null,
      "listing_status": null,
      "snapshot_completed_at": "2026-10-02T11:58:03.000Z"
    },
    {
      "operational_asset_id": "c81e2d44-9b07-4f1a-b3d5-6e2a90f4c7b8",
      "asset_revision": "sha256:a5b10a9006f6ebb68f8b9e81c85b5a6d1bf0f32737fc3f57a597dd01e66e0523",
      "asset_id": "38451927990",
      "market_hash_name": "Glock-18 | Water Elemental (Minimal Wear)",
      "context_id": "16",
      "listable": false,
      "reasons": [
        { "code": "hold_not_ended", "message": "The Steam trade hold has not ended yet." }
      ],
      "listed": false,
      "listing_id": null,
      "listing_status": null,
      "snapshot_completed_at": "2026-10-02T11:58:03.000Z"
    }
  ],
  "inventory_proof": {
    "status": "ready",
    "completed_at": "2026-10-02T11:58:03.000Z",
    "asset_count": 2
  }
}
```

## Error codes

| HTTP status | Code | Meaning |
| - | - | - |
| 401 | `missing_api_key` / `invalid_api_key` | Missing or invalid API key. |
| 403 | `account_banned` | The account is banned. |
| 403 | `ip_not_allowed` | The request came from outside the key's IP allowlist. |
| 429 | `rate_limit_exceeded` | Over your key's per-minute limit. Wait for the `Retry-After` header value. |
| 503 | `p2p_disabled` | The P2P market is switched off right now. |


## OpenAPI

````yaml GET /p2p/inventory
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:
  /p2p/inventory:
    get:
      tags:
        - P2P
      summary: Your inventory, ready to list
      description: >-
        Every CS2 item we have seen in your Steam inventory, one row per copy,
        with whether it can be listed right now and why not. Free — any valid
        key, no balance requirement. If we hold no current read of your
        inventory this call starts one and answers `inventory_proof.status =
        pending`; call again after `retry_after_ms`.
      operationId: getP2PInventory
      responses:
        '200':
          description: Your items and the state of the inventory read.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/P2PInventoryItem'
                  inventory_proof:
                    $ref: '#/components/schemas/P2PInventoryProof'
                required:
                  - data
                  - inventory_proof
              example:
                data:
                  - operational_asset_id: 5b0c1f7e-3d2a-4c8e-9a61-2f4d8b7e1c30
                    asset_revision: >-
                      sha256:fd0e6de607b774aaaf4d9cdb7e014c003ba614b03f0460b01e8c94bce034bac5
                    asset_id: '38451927734'
                    market_hash_name: AK-47 | Redline (Field-Tested)
                    context_id: '2'
                    listable: true
                    reasons: []
                    listed: false
                    listing_id: null
                    listing_status: null
                    snapshot_completed_at: '2026-10-02T11:58:03.000Z'
                  - operational_asset_id: c81e2d44-9b07-4f1a-b3d5-6e2a90f4c7b8
                    asset_revision: >-
                      sha256:a5b10a9006f6ebb68f8b9e81c85b5a6d1bf0f32737fc3f57a597dd01e66e0523
                    asset_id: '38451927990'
                    market_hash_name: Glock-18 | Water Elemental (Minimal Wear)
                    context_id: '16'
                    listable: false
                    reasons:
                      - code: hold_not_ended
                        message: The Steam trade hold has not ended yet.
                    listed: false
                    listing_id: null
                    listing_status: null
                    snapshot_completed_at: '2026-10-02T11:58:03.000Z'
                inventory_proof:
                  status: ready
                  completed_at: '2026-10-02T11:58:03.000Z'
                  asset_count: 2
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: Forbidden — the key's IP allowlist or an account ban.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                account_banned:
                  summary: Account banned
                  value:
                    code: account_banned
                    detail: This account is banned.
                ip_not_allowed:
                  summary: Request from outside the key's IP allowlist
                  value:
                    code: ip_not_allowed
                    detail: >-
                      This API key is restricted to an IP allowlist and
                      203.0.113.7 is not on it. Update it at
                      https://csboard.com/profile?tab=api
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/P2PDisabled'
components:
  schemas:
    P2PInventoryItem:
      type: object
      properties:
        operational_asset_id:
          type: string
          description: Send this to `POST /p2p/listings`.
        asset_revision:
          type: string
          description: Send this to `POST /p2p/listings` unchanged.
        asset_id:
          type: string
          description: Steam asset id — tells two copies of the same skin apart.
        market_hash_name:
          type: string
        context_id:
          type: string
          enum:
            - '2'
            - '16'
          description: Steam inventory context the copy was seen in.
        listable:
          type: boolean
          description: '`true` when this copy can be published right now.'
        reasons:
          type: array
          description: >-
            Why it cannot be published — empty when `listable` is `true`.
            Typical codes: `snapshot_stale`, `not_tradable`, `on_hold`,
            `hold_not_ended`, `already_listed`, `reserved`, `active_trade`.
          items:
            type: object
            properties:
              code:
                type: string
              message:
                type: string
        listed:
          type: boolean
          description: Already has a listing.
        listing_id:
          type:
            - string
            - 'null'
        listing_status:
          type:
            - string
            - 'null'
          description: Status of that listing, as in `P2PListing.status`.
        snapshot_completed_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When the inventory read that last saw this copy finished.
    P2PInventoryProof:
      type:
        - object
        - 'null'
      description: >-
        Whether we hold a current read of your Steam inventory. Publishing needs
        `ready`. On `pending`, call `GET /p2p/inventory` again after
        `retry_after_ms`. On `blocked`, `code` says what to fix on your side.
      properties:
        status:
          type: string
          enum:
            - ready
            - pending
            - blocked
        completed_at:
          type: string
          format: date-time
          description: '`ready` only.'
        asset_count:
          type:
            - integer
            - 'null'
          description: '`ready` only.'
        started_at:
          type: string
          format: date-time
          description: '`pending` only.'
        retry_after_ms:
          type: integer
          description: '`pending` only — when to ask again.'
        code:
          type: string
          description: >-
            `blocked` only: `no_steam_link`, `no_trade_url`,
            `private_inventory`, `invalid_trade_url`, `empty_inventory`,
            `inventory_too_large`, `bot_service_unavailable` or
            `build_timed_out`.
        message:
          type: string
          description: '`blocked` only.'
    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
  responses:
    Unauthorized:
      description: Missing or invalid API key (`missing_api_key` or `invalid_api_key`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: missing_api_key
            detail: >-
              Provide your API key via `Authorization: Bearer csb_pub_…`.
              Generate one at https://csboard.com/profile?tab=api
    RateLimited:
      description: >-
        Rate limit exceeded. Includes a Retry-After header (60 seconds on the
        per-key limits).
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rate_limit_exceeded
            detail: Rate limit of 100 requests/min exceeded.
    P2PDisabled:
      description: The P2P market is switched off.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            p2p_disabled:
              summary: P2P market unavailable
              value:
                code: p2p_disabled
                detail: The P2P market is not available right now.
  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.