> ## 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.

# Instant Sell API — программная продажа CS2-скинов (по инвайту)

> Продавайте CS2-скины из любого Steam-инвентаря через бот-сеть CSBoard и получайте выплату на баланс CSBoard после завершения трейд-защиты Steam.

<Note>
  **Доступ по запросу.** Instant Sell включается на уровне аккаунта. Ваш API-ключ может обращаться к `GET /v1/sell/status` из коробки, но котировки и продажа возвращают `selling_not_enabled`, пока доступ не выдан. Напишите в поддержку, чтобы запросить доступ.
</Note>

## Как это работает

1. **Котировка** — `POST /v1/sell/quotes` с трейд-ссылкой Steam возвращает все предметы этого инвентаря, которые мы готовы купить, с точной суммой в USD, которая будет вам зачислена за каждый предмет.
2. **Создание ордера** — `POST /v1/sell/orders` с выбранными `asset_ids`. Бот из сети CSBoard отправляет трейд-оффер Steam на трейд-ссылку продавца. Большие корзины могут разбиваться на до 3 офферов от разных ботов — массив `offers[]` ордера отражает каждый из них.
3. **Продавец принимает** — ордер переходит в статус `received`. Начинается трейд-защита Steam (около 8 дней). Ожидаемая сумма видна в `GET /v1/balance` в поле `incoming_hold`.
4. **Расчёт** — когда холд заканчивается, ордер завершается, и вся сумма зачисляется на **ваш баланс CSBoard**. Других направлений выплаты нет: деньги всегда приходят на баланс того API-ключа, который создал ордер.

<Warning>
  Деньги зачисляются **только после расчёта**, никогда в момент принятия оффера. Ордер в статусе `received` — это деньги в пути, а не деньги на балансе. Планируйте кеш-флоу с учётом холда \~8 дней.
</Warning>

## Верификация офферов для ваших пользователей

Каждый оффер содержит профиль отправляющего бота и id трейд-оффера Steam:

```json theme={null}
"bot": {
  "name": "CSBoard Bot #4",
  "avatar": "https://…",
  "steam_id": "7656119…",
  "profile_url": "https://steamcommunity.com/profiles/7656119…",
  "level": 30
},
"trade_offer_id": "7654321098"
```

Отображайте эти данные рядом с собственным UI, чтобы продавец мог сверить входящий оффер Steam с ожидаемыми `trade_offer_id` и `steam_id` бота перед принятием — эта проверка закрывает скам с подменой отправителя независимо от того, какой бот отправляет оффер.

## Эндпоинты

Все эндпоинты живут под `/v1/sell` и используют тот же Bearer-ключ `csb_pub_`, что и остальной API.

### GET /v1/sell/status

Обнаружение возможностей. Работает для любого ключа.

```json theme={null}
{
  "enabled": true,
  "access": "invite_only",
  "selling_enabled_for_key": false,
  "min_item_usd": 0.5,
  "max_items_per_order": 250,
  "max_active_orders": 10,
  "hold_days_estimate": 8
}
```

### POST /v1/sell/quotes

```json theme={null}
{ "trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=…&token=…" }
```

Возвращает предметы, которые можно продать, с точной суммой в USD за каждый:

```json theme={null}
{
  "expires_at": "2026-07-11T18:03:00Z",
  "items": [
    {
      "asset_id": "41165110534",
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "price_usd": 21.37,
      "float": 0.23,
      "phase": null,
      "icon_url": "https://…"
    }
  ]
}
```

Котировки действительны около двух минут. Если срок истёк, запросите котировку заново перед созданием ордера.

### POST /v1/sell/orders

```json theme={null}
{
  "trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=…&token=…",
  "asset_ids": ["41165110534", "41165110599"],
  "min_total_usd": 30.00,
  "external_id": "my-shop-order-1017"
}
```

* `min_total_usd` — необязательный порог против дрифта цены. Если реальная сумма опустится ниже этого значения между котировкой и исполнением, ордер будет отклонён с кодом `price_drift` без побочных эффектов.
* `external_id` — ваш идемпотентный id, уникальный в рамках ключа. Повтор запроса с тем же `external_id` вернёт исходный ордер, а не создаст дубликат.
* Заголовок `Idempotency-Key` — защита от повторов на уровне запроса, семантика та же, что у `POST /v1/orders`.

### GET /v1/sell/orders/:id

Также доступен как `GET /v1/sell/orders?external_id=…`.

```json theme={null}
{
  "id": "so_cmqx…",
  "external_id": "my-shop-order-1017",
  "status": "received",
  "total_usd": 30.10,
  "credited_usd": 0,
  "unhold_at": "2026-07-19T14:02:11Z",
  "offers": [
    {
      "trade_offer_id": "7654321098",
      "status": "received",
      "amount_usd": 30.10,
      "expires_at": "2026-07-11T14:17:11Z",
      "items": [ { "asset_id": "…", "market_hash_name": "…", "price_usd": 21.37 } ],
      "bot": { "name": "…", "avatar": "…", "steam_id": "…", "profile_url": "…", "level": 30 }
    }
  ],
  "fail_reason": null
}
```

`credited_usd` растёт по мере расчёта офферов — разбитый ордер может частично рассчитаться, пока остальные офферы всё ещё в холде.

### POST /v1/sell/orders/:id/cancel

Разрешено, пока ордер в статусе `pending` или `offer_sent` (до принятия продавцом). На более поздних стадиях возвращается `409 not_cancellable`.

## Жизненный цикл ордера

| Статус       | Значение                                            |
| ------------ | --------------------------------------------------- |
| `pending`    | Ордер создан, офферы готовятся                      |
| `offer_sent` | Трейд-оффер(ы) Steam доставлены продавцу            |
| `received`   | Продавец принял; идёт трейд-защита (\~8 дней)       |
| `completed`  | Расчёт завершён — вся сумма зачислена на ваш баланс |
| `cancelled`  | Отменён, либо оффер истёк / был отклонён            |
| `failed`     | Не удалось выполнить — см. `fail_reason`            |

## Ошибки

Ошибки следуют стандартному конверту `{ "code", "detail" }`. Коды, специфичные для продажи: `invalid_trade_url`, `private_inventory`, `inventory_unavailable`, `item_not_in_inventory`, `item_not_tradable`, `no_eligible_items`, `price_drift`, `too_many_items`, `active_order_exists`, `too_many_active_orders`, `daily_cap_exceeded`, `offer_declined`, `offer_expired`, `sell_disabled`, `selling_not_enabled`, `rate_limited`.

## Лимиты

* Котировки: 10 запросов/мин на ключ (сканирование инвентаря — дорогая операция).
* Ордера: 5 созданий/мин на ключ, 10 активных ордеров, дневной кап объёма \$2 000 по умолчанию. Лимиты поднимаются индивидуально — напишите в поддержку.
