StarPrice

API цен на подарки

Бесплатный публичный JSON API: минимальная цена любого NFT-подарка Telegram и его модели на маркетплейсе Telegram, Fragment и Portals. Без ключей и регистрации.

Эндпоинты

ЗапросЧто возвращает
GET /api/v1/giftsВсе коллекции из каталога: slug, название, флор на каждом рынке.
GET /api/v1/gifts/{gift}Коллекция и все её модели с ценами. ?models=0 — без списка моделей, ?history=1 — плюс флоры по дням за 30 дней.
GET /api/v1/gifts/{gift}/{model}Одна модель: самая низкая цена и цены на каждом рынке. ?history=1 — плюс история.

{gift} и {model} — это slug из адреса страницы на StarPrice (/gifts/light-swords/darksaber) или просто название как в Telegram:/api/v1/gifts/Light%20Sword/Darksaber тоже сработает. Регистр не важен.

Пример: цена модели

GET https://starprice.net/api/v1/gifts/light-swords/darksaber
{
  "gift": { "slug": "light-swords", "name": "Light Sword", "url": "https://starprice.net/gifts/light-swords" },
  "model": {
    "slug": "darksaber",
    "name": "Darksaber",
    "kind": "upgrade",
    "rarity_permille": 4,
    "rarity_pct": 0.4,
    "craft_rarity": null,
    "issued": 123,
    "image": "https://starprice.net/uploads/gifts/light-swords/darksaber.webp",
    "url": "https://starprice.net/gifts/light-swords/darksaber",
    "floor": {
      "market": "portals", "price": 40, "currency": "GRAM", "rub": 3912, "lots": 38,
      "url": "https://telegram.me/portals/market?startapp=…", "updated_at": "2026-11-03T00:40:24.122Z"
    },
    "offers": [
      { "market": "telegram", "price": 3200, "currency": "STARS", "rub": 4992, "lots": null, "url": null, "updated_at": "2026-11-03T00:12:09.000Z" },
      { "market": "fragment", "price": 45, "currency": "GRAM", "rub": 4401, "lots": 24, "url": "https://fragment.com/gifts/lightsword?sort=price_asc&filter=sale&attr%5BModel%5D=%5B%22Darksaber%22%5D", "updated_at": "2026-11-03T00:30:00.000Z" },
      { "market": "portals", "price": 40, "currency": "GRAM", "rub": 3912, "lots": 38, "url": "https://telegram.me/portals/market?startapp=…", "updated_at": "2026-11-03T00:40:24.122Z" }
    ]
  },
  "rates": { "gram_rub": 97.8, "star_rub": 1.56 }
}

Поля

ПолеОписание
floorСамое дешёвое предложение среди рынков. Сравниваем в рублях; если курс неизвестен — между Fragment и Portals в GRAM. null, когда модель нигде не выставлена.
offers[]Флор на каждом рынке, где есть лоты. Рынки: telegram (встроенный маркетплейс, цены в Stars), fragment и portals (в GRAM).
offers[].price, currencyЦена в валюте рынка: STARS или GRAM (бывший Toncoin).
offers[].rubТа же цена в рублях по текущему курсу, округлена до рубля. Для Stars берётся цена звезды в самом дешёвом магазине каталога, то есть «сколько реально заплатить». null, если курса нет.
offers[].lotsСколько лотов выставлено. Fragment отдаёт не больше 60, Telegram количество по моделям не сообщает.
offers[].urlГде купить: на Fragment — сразу лоты этой модели по возрастанию цены, на Portals — маркет в мини-приложении. Для маркетплейса Telegram ссылки нет: он открывается только внутри Telegram.
offers[].updated_atКогда мы последний раз обновили цену на этом рынке (ISO 8601, UTC).
ratesgram_rub — рублей за 1 GRAM, star_rub — рублей за 1 Star. По ним посчитаны поля rub.
model.rarity_permille, rarity_pctШанс выпадения модели при улучшении: в промилле, как отдаёт Telegram, и в процентах. У крафтовых моделей (kind: "craft") вместо шанса заполнен craft_rarity.
history[]По запросу ?history=1: { date, fragment, portals } — минимальная цена дня в GRAM на каждом рынке, null там, где рынок в этот день не отслеживался. Историю Portals ведём с ноября 2026.

Коллекция целиком

GET https://starprice.net/api/v1/gifts/light-swords

{
  "slug": "light-swords",
  "name": "Light Sword",
  "url": "https://starprice.net/gifts/light-swords",
  "image": "https://starprice.net/uploads/gifts/light-swords.webp",
  "models_count": 52,
  "issued": 17674,
  "supply": null,
  "floor": { "market": "portals", "price": 6.39, "currency": "GRAM", "rub": 625, "lots": 2538, … },
  "offers": [ … ],
  "updated_at": "2026-11-03T09:30:12.000Z",
  "rates": { "gram_rub": 97.8, "star_rub": 1.56 },
  "models": [
    { "slug": "darksaber", "name": "Darksaber", "kind": "upgrade", "rarity_pct": 0.4, "floor": { … }, "offers": [ … ] },
    …
  ]
}

Модели отсортированы от самой редкой к самой частой, крафтовые в конце. Чтобы узнать slug’и всех коллекций, запросите /api/v1/gifts.

Ошибки

404  { "error": "not_found", "message": "unknown gift \"foo\"; see /api/v1/gifts for the list" }
400  { "error": "bad_request", "message": "…" }
429  слишком много запросов с одного адреса

Лимиты и кэш

  • Цены на Fragment и Portals обновляются примерно каждые 30 минут, на маркетплейсе Telegram — несколько раз в час. Чаще, чем раз в 5 минут, опрашивать нет смысла: ответы кэшируются на 5 минут (Cache-Control в ответе).
  • Ограничение — 30 запросов в секунду с одного IP, при превышении 429. Для списка коллекций и коллекции с моделями хватает одного запроса.
  • CORS открыт (Access-Control-Allow-Origin: *): можно вызывать прямо из браузера.
  • Ключ не нужен. Если используете данные публично, поставьте ссылку на starprice.net/gifts — нам это поможет.

Примеры кода

JavaScript

const r = await fetch("https://starprice.net/api/v1/gifts/plush-pepes/frozen");
const { model } = await r.json();
console.log(model.floor.market, model.floor.price, model.floor.currency, "≈", model.floor.rub, "₽");

Python

import requests
data = requests.get("https://starprice.net/api/v1/gifts/plush-pepes", params={"models": 0}).json()
for o in data["offers"]:
    print(o["market"], o["price"], o["currency"], o["rub"])

curl

curl -s "https://starprice.net/api/v1/gifts/Durov's%20Cap/Fire?history=1" | jq .history

Формат стабилен в пределах версии v1: поля могут добавляться, но не исчезать и не менять тип. Вопросы и пожелания — на странице контактов.