Перейти к содержимому

Часовая история цен

Метод реализован локально. Выкатка в прод и полнота исторических данных проверяются отдельно: наличие метода не означает, что у каждого предмета уже есть полный график.

GET /v1/items/{item_id}/history/hourly читает сохранённые часовые снимки из нашей БД, не обращаясь к поставщику. Сначала найди точный ID: износы и фазы различаются.

Окно терминала
curl 'https://api.csfolder.com/v1/items/123/history/hourly?from=2026-09-01&to=2026-09-07&provider=steam&side=ask&limit=100' \
-H "Authorization: Bearer $CSFOLDER_API_KEY"

123 — пример, подставь найденный ID. Ключ хранится в окружении сервера, не в промпте, URL или браузере. Подробнее: ключи и доступ.

  • side: по умолчанию ask, либо bid. Одно не подменяется другим.
  • provider: точный идентификатор маркета, необязателен. Без фильтра возвращаются все маркеты с ценой на выбранной стороне. Отсутствующий маркет не подменяется другим.
  • from / to: даты UTC включительно, максимум 31 день. По умолчанию сегодня и предыдущие 30 дней. Длинную историю запрашивай отдельными окнами.
  • limit: количество строк, а не часов; по умолчанию 500, максимум 1 000. В MCP по умолчанию 25, максимум 100.
  • after: передавай meta.next_page, пока он не станет null. Не меняй предмет, сторону, маркет и даты. Курсор запоминает фильтры и даты, если в продолжении их нет.

Строка содержит ts, provider, side, amount, quantity, currency: USD, minor_units: 2, kind: hourly_cached_quote, availability, ingested_at, checked_at, source_observed_at. Цена — целые центы USD; неизвестное количество — null. Сортировка: час UTC и маркет, сначала отметки без маркета. Сохранённая история остаётся доступной, даже если предмет удалён из текущего каталога.

availability Значение
quoted В снимке есть цена для этого маркета и стороны.
item_missing Снимок был записан, но точный предмет/фаза отсутствовал в его фиде. Цена null.
no_quote Предмет присутствовал, но для выбранного маркета/стороны цены нет. Цена null.

Без фильтра маркета возвращаются строки с доступными ценами. Если на выбранной стороне нет ни одной цены, возвращается одна отметка с provider=null. Все отсутствующие маркеты по отдельности не перечисляются. С фильтром отметка сохраняет запрошенный provider.

Если часовой снимок не записан, строки за этот час нет. Не подставляй ноль или предыдущую цену как наблюдение. На графике показывай разрыв; пустая история не означает нулевую стоимость предмета.

ts — часовой интервал. checked_at — время нашей успешной проверки GET/304; ingested_at — время публикации зеркала цен. source_observed_at остаётся null, если поставщик не передаёт время наблюдения цены. Ответ 304 подтверждает неизменность кэша, а не новую цену на маркете. Это не история сделок и не OHLC.

Сохраняется первый успешный проверенный снимок каждого часа UTC. Последующие обновления внутри часа его не перезаписывают. Строки неизменяемы, но пагинация не фиксирует всю выборку: поздняя запись может потребовать перечитать окно и убрать дубли по ID предмета, ts, маркету и стороне. Дневная /history — отдельные данные; она не размножается в искусственные часовые точки.

SDK: api.request('getHourlyPriceHistory', { params, query }) или ограниченный api.pages('getHourlyPriceHistory', input, { maxPages }). MCP-инструмент называется так же и получает те же аргументы, по одной странице за вызов. Достигнутый лимит страниц не означает полную выгрузку: проверяй оставшийся next_page.

Промпт: «Сделай график Steam asks для этого точного предмета через getHourlyPriceHistory. Сохрани null и разрывы, раздели время проверки кэша и время источника, держи ключ на сервере, протестируй пагинацию и 429».

Подробнее: TypeScript SDK и MCP и skill.