TrofeyАяй → JSON API
Аяй

JSON API: довідник ендпойнтів

Кожен виклик на цій сторінці — робочий: скопіюй у термінал і отримаєш те, що надруковано під ним.

651 конфігурацій · 2 категорії · оновлено 22.09

← Усе про відкриті дані

Для сервісу — JSON API

Ті самі числа віддає звичайний HTTP-запит. Один запит — одна конфігурація: модель, памʼять, стан. Ключів немає, реєстрації немає, платити не треба.

https://trofey.app/api/v1

База — адреса нижче. П'ять ендпойнтів, усі GET, усі з Access-Control-Allow-Origin: *, тож ходити можна просто з браузера.

З цього починається інтеграція · GET /models

Назва моделі збігається повністю. Тому перший виклик — цей: він віддає наші точні рядки й кількість конфігурацій у кожного, без цін. q шукає підрядком і регістр не важливий; без q приїде вся категорія.

curl -s -G "https://trofey.app/api/v1/models" \  --data-urlencode "q=iphone 13"
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "count": 4,  "currency": "UAH",  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "license": "https://trofey.app/terms/",  "method": "https://trofey.app/methodology/",  "models": [    {"brand": "iPhone", "configurations": 4, "model": "iPhone 13"},    {"brand": "iPhone", "configurations": 4, "model": "iPhone 13 Pro"},    {"brand": "iPhone", "configurations": 5, "model": "iPhone 13 Pro Max"},    {"brand": "iPhone", "configurations": 2, "model": "iPhone 13 mini"}  ],  "query": "iphone 13",  "source": "https://trofey.app/analytics/phones/",  "updated": "2026-09-22"}

«iPhone 16 Pro» і «iPhone 16 Pro Max» — різні телефони з різними цінами. Саме тому збіг повний, і саме тому цей виклик існує. Підрядком ми шукаємо тільки тут: помилитись у виборі коштує ще одного виклику, а підрядок усередині пошуку ціни коштував би опублікованої неправильної відповіді. Порожній результат несе reason: виробника, якого ми не публікуємо, просту одруківку, назву лінійки і модель з іншої категорії видно окремо, бо дії з них протилежні. В останньому випадку поруч їде try_category — те саме поле, що й у /configurations, і сусідню категорію ми питаємо тим самим пошуком, тож неточна назва теж її знаходить. Найближчі назви в цій категорії приїжджають окремим полем did_you_mean — але ніколи разом із try_category: відповідь несе рівно один наступний крок, а не два протилежні. Це правило будь-якої відмови з try_category, не одного виклику — /configurations і /price поводяться так само.

brand — це лінійка, а не виробник. Усі девʼять значень, які ми публікуємо: iPhone, Samsung, Redmi, POCO, Xiaomi, Google Pixel, Apple iPad, Samsung Galaxy Tab, Lenovo. Тобто iPhone, а не Apple; Redmi і POCO окремо від Xiaomi; Samsung у планшетах під іншим іменем, ніж у телефонах. Так задумано: по цьому полю стоять сторінки брендів і адреси, і саме так люди шукають. Якщо потрібен виробник — його розуміє пошук: q=Apple віддає 50 моделей під brand=iPhone, q=Xiaomi — 108 під трьома лінійками. Поля manufacturer немає.

Ціна однієї конфігурації · GET /price

Параметри: model (обовʼязковий, збігається повністю), storage_gb (ціле число), conditionused або new, category (типово phones).

curl -s -G "https://trofey.app/api/v1/price" \  --data-urlencode "model=iPhone 13" \  -d storage_gb=128 \  -d condition=used
{  "above_range": 24,  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "below_range": 6,  "brand": "iPhone",  "category": "phones",  "cheapest_live_uah": 5000,  "condition": "used",  "currency": "UAH",  "dearest_live_uah": 26000,  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "finds_14d": 160,  "license": "https://trofey.app/terms/",  "live_listings": 1293,  "market_price_uah": 12500,  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "price_range_uah": [    7000,    17000  ],  "slug": "iphone-13-128-used",  "source": "https://trofey.app/analytics/phones/",  "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/",  "storage_gb": 128,  "typical_spread_uah": 1000,  "updated": "2026-09-22",  "watch_price_credits_per_day": 27}

Пів-ключа — це пів-відповіді, і ми на нього не відповідаємо. Якщо переданого досить, щоб лишився рівно один варіант, приїде ціна. Якщо варіантів лишається кілька, ми не вгадуємо, а питаємо назад:

curl -s -G "https://trofey.app/api/v1/price" \  --data-urlencode "model=iPhone 13"
{  "error": "ambiguous configuration",  "model": "iPhone 13",  "category": "phones",  "choose_from": [    {"storage_gb": 128, "condition": "new"},    {"storage_gb": 128, "condition": "used"},    {"storage_gb": 256, "condition": "used"},    {"storage_gb": 512, "condition": "used"}  ],  "see": "https://trofey.app/api/v1/configurations?model=iPhone%2013&category=phones",  "updated": "2026-09-22",  "currency": "UAH",  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "method": "https://trofey.app/methodology/",  "license": "https://trofey.app/terms/",  "source": "https://trofey.app/analytics/phones/",  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on."}

В адресах усередині відповідей значення percent-encoded: %20 — це пробіл. Так строго правильно для машини, яка їх розбирає. У терміналі зручніше не кодувати руками, а передавати значення через --data-urlencode, як у прикладах вище.

Чого ми не міряли — те не має ціни, а не нульову ціну. У відповіді «не знайдено» немає жодного числового поля: market_price_uah: 0 прочитався б наступним графіком як «телефон нічого не вартий», а підставлена оцінка виглядала б точно як вимір.

curl -s -G "https://trofey.app/api/v1/price" \  --data-urlencode "model=Nokia 3310"
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "found": false,  "model": "Nokia 3310",  "model_known": false,  "reason": "No published configuration matches, and the model name is not one Trofey publishes in this category. Names are matched in full — call `models` (MCP) or GET /models to see the exact strings. Trofey publishes a price only where it measured one; it does not estimate on request.",  "source": "https://trofey.app/analytics/phones/",  "updated": "2026-09-22"}

Усі конфігурації однієї моделі · GET /configurations

Те саме, що показує сторінка моделі. model тут теж обовʼязковий і теж збігається повністю — немає такого значення, яке віддало б чужу модель, тим паче всі.

curl -s -G "https://trofey.app/api/v1/configurations" \  --data-urlencode "model=iPhone 13"
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "configurations": [    {"above_range": 1, "below_range": 0, "brand": "iPhone", "cheapest_live_uah": 10000, "condition": "new", "dearest_live_uah": 32000, "finds_14d": 4, "live_listings": 37, "market_price_uah": 14000, "model": "iPhone 13", "price_range_uah": [10000, 27000], "slug": "iphone-13-128-new", "source_page": "https://trofey.app/analytics/phones/iphone-13-128-new/", "storage_gb": 128, "typical_spread_uah": 2500, "watch_price_credits_per_day": 3},    {"above_range": 24, "below_range": 6, "brand": "iPhone", "cheapest_live_uah": 5000, "condition": "used", "dearest_live_uah": 26000, "finds_14d": 160, "live_listings": 1293, "market_price_uah": 12500, "model": "iPhone 13", "price_range_uah": [7000, 17000], "slug": "iphone-13-128-used", "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/", "storage_gb": 128, "typical_spread_uah": 1000, "watch_price_credits_per_day": 27},    {"above_range": 8, "below_range": 6, "brand": "iPhone", "cheapest_live_uah": 5000, "condition": "used", "dearest_live_uah": 35500, "finds_14d": 20, "live_listings": 240, "market_price_uah": 14500, "model": "iPhone 13", "price_range_uah": [9000, 19500], "slug": "iphone-13-256-used", "source_page": "https://trofey.app/analytics/phones/iphone-13-256-used/", "storage_gb": 256, "typical_spread_uah": 1495, "watch_price_credits_per_day": 4},    {"above_range": 1, "below_range": 0, "brand": "iPhone", "cheapest_live_uah": 12300, "condition": "used", "dearest_live_uah": 27000, "finds_14d": 5, "live_listings": 14, "market_price_uah": 15000, "model": "iPhone 13", "price_range_uah": [12300, 20000], "slug": "iphone-13-512-used", "source_page": "https://trofey.app/analytics/phones/iphone-13-512-used/", "storage_gb": 512, "typical_spread_uah": 1951, "watch_price_credits_per_day": 1}  ],  "currency": "UAH",  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "license": "https://trofey.app/terms/",  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "query": "iPhone 13",  "source": "https://trofey.app/analytics/phones/",  "updated": "2026-09-22"}

Та сама ціна по днях · GET /price-history

Друге питання після «скільки коштує» — дешевшає воно чи дорожчає, і одне число на нього не відповідає. Це та сама лінія, що на сторінці позиції: до 31 точки, по одній на день.

curl -s -G "https://trofey.app/api/v1/price-history" \  --data-urlencode "model=iPhone 13" \  -d storage_gb=128 \  -d condition=used \  -d days=7
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "change_pct": 0.0,  "change_uah": 0,  "condition": "used",  "currency": "UAH",  "days": 7,  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "first_point": "2026-09-16",  "history_updated": "2026-09-22",  "last_point": "2026-09-22",  "license": "https://trofey.app/terms/",  "live_listings": 1293,  "market_price_uah": 12500,  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "price_history": [    {"date": "2026-09-16", "market_price_uah": 12500},    {"date": "2026-09-17", "market_price_uah": 12500},    {"date": "2026-09-18", "market_price_uah": 12500},    {"date": "2026-09-19", "market_price_uah": 12500},    {"date": "2026-09-20", "market_price_uah": 12500},    {"date": "2026-09-21", "market_price_uah": 12500},    {"date": "2026-09-22", "market_price_uah": 12500}  ],  "published_delay_days": 0,  "slug": "iphone-13-128-used",  "source": "https://trofey.app/analytics/phones/",  "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/",  "storage_gb": 128,  "updated": "2026-09-22",  "window_from": "2026-09-16",  "window_to": "2026-09-22"}

Без days приїде весь опублікований місяць — більшого не існує. change_uah рахується по точках, які повернулись. days — це календарні дні, як і у /find-history: window_from і window_to — те, що спитали, а first_point і last_point — дні, на яких лінія справді має точки. Стеля — 31 день тут і 30 у /find-history: різниця це день збірки, який лінія цін уже має. Попросиш більше — приїде requested_days поруч із тим days, що повернувся. Ця лінія йде на день далі за знахідки, і обидві кажуть про це в published_delay_days.

Де насправді стоять оголошення · GET /price-distribution

price_range_uah у /price — це не найдешевше й найдорожче оголошення, а межі гістограми, і частина лотів стоїть поза ними. Скільки саме — кажуть below_range і above_range у тій самій відповіді. Це та сама гістограма, що на сторінці позиції: від чотирьох до восьми смуг між тими самими межами.

curl -s -G "https://trofey.app/api/v1/price-distribution" \  --data-urlencode "model=iPhone 13" \  -d storage_gb=128 \  -d condition=used
{  "above_range": 24,  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "below_range": 6,  "bins": [    {"from_uah": 7000, "listings": 20, "share_pct": 1.5, "to_uah": 8250},    {"from_uah": 8250, "listings": 39, "share_pct": 3.0, "to_uah": 9500},    {"from_uah": 9500, "listings": 143, "share_pct": 11.1, "to_uah": 10750},    {"from_uah": 10750, "listings": 243, "share_pct": 18.8, "to_uah": 12000},    {"from_uah": 12000, "listings": 441, "share_pct": 34.1, "to_uah": 13250},    {"from_uah": 13250, "listings": 211, "share_pct": 16.3, "to_uah": 14500},    {"from_uah": 14500, "listings": 118, "share_pct": 9.1, "to_uah": 15750},    {"from_uah": 15750, "listings": 48, "share_pct": 3.7, "to_uah": 17000}  ],  "category": "phones",  "condition": "used",  "currency": "UAH",  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "history_updated": "2026-09-22",  "in_range_listings": 1263,  "license": "https://trofey.app/terms/",  "live_listings": 1293,  "market_price_uah": 12500,  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "range_uah": [    7000,    17000  ],  "slug": "iphone-13-128-used",  "source": "https://trofey.app/analytics/phones/",  "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/",  "storage_gb": 128,  "unverified_listings": 7,  "updated": "2026-09-22"}

below_range і above_range — оголошення поза смугами: без них смуги в сумі менші за live_listings. in_range_listings — сума самих смуг, тобто те, від чого відсотки недобирають до сотні: разом ці три числа й дають live_listings. Розподіл є лише від восьми живих оголошень — той самий поріг, що й у ціни.

А найдешевше й найдорожче оголошення, які справді є, — це cheapest_live_uah і dearest_live_uah у тій самій відповіді. Саме їх треба називати, коли питають «від скільки». Межі гістограми — теж ціни живих оголошень, але не крайніх: це найдешевше й найдорожче з тих, що вміщаються у шкалу. На 651 позиції нижня межа збігається з найдешевшим лотом у 419 випадках, верхня з найдорожчим — у 274, а весь ринок позиції вміщається у графік на 222. Там, де щось лишилось поза шкалою, воно лишилось далеко: найдешевший лот на 44% нижчий за межу (медіана).

Скільки знахідок було кожного дня · GET /find-history

Кількості за день, і нічого більше: стрічка окремих лотів платна й доставляється в канал акаунта. Це finds_14d у часі — різниця між «шість знахідок» і «шість за один ранок» видна тільки тут.

curl -s -G "https://trofey.app/api/v1/find-history" \  --data-urlencode "model=iPhone 13" \  -d storage_gb=128 \  -d condition=used \  -d days=7
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "condition": "used",  "currency": "UAH",  "days": 7,  "days_with_finds": 7,  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "find_history": [    {"date": "2026-09-15", "finds": 13},    {"date": "2026-09-16", "finds": 12},    {"date": "2026-09-17", "finds": 14},    {"date": "2026-09-18", "finds": 7},    {"date": "2026-09-19", "finds": 16},    {"date": "2026-09-20", "finds": 11},    {"date": "2026-09-21", "finds": 16}  ],  "finds_14d": 160,  "finds_total": 89,  "first_find": "2026-09-15",  "history_updated": "2026-09-22",  "last_find": "2026-09-21",  "license": "https://trofey.app/terms/",  "live_listings": 1293,  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "published_delay_days": 1,  "slug": "iphone-13-128-used",  "source": "https://trofey.app/analytics/phones/",  "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/",  "storage_gb": 128,  "updated": "2026-09-22",  "window_from": "2026-09-15",  "window_to": "2026-09-21"}

У рядку рівно два поля: date і finds — ні посилання, ні заголовка, ні ціни. Дні без знахідок відсутні, а не нульові.

Чи нормальна ця ціна · GET /price-check

Головне питання, і воно нічого нового не публікує: та сама арифметика, що в картці бота. Без нього — три виклики й ділення руками.

curl -s -G "https://trofey.app/api/v1/price-check" \  --data-urlencode "model=iPhone 13" \  -d storage_gb=128 \  -d condition=used \  -d price_uah=11250
{  "above_every_live_listing": false,  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "below_every_live_listing": false,  "category": "phones",  "cheaper_listings_at_least": 208,  "cheaper_listings_at_most": 451,  "cheaper_share_at_least_pct": 16.1,  "cheapest_live_uah": 5000,  "condition": "used",  "currency": "UAH",  "dearest_live_uah": 26000,  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "discount_vs_market_pct": 10.0,  "discount_vs_market_uah": 1250,  "history_updated": "2026-09-22",  "license": "https://trofey.app/terms/",  "live_listings": 1293,  "market_price_uah": 12500,  "method": "https://trofey.app/methodology/",  "model": "iPhone 13",  "price_bin": {    "from_uah": 10750,    "listings": 243,    "to_uah": 12000  },  "quoted_uah": 11250,  "range_uah": [    7000,    17000  ],  "slug": "iphone-13-128-used",  "source": "https://trofey.app/analytics/phones/",  "source_page": "https://trofey.app/analytics/phones/iphone-13-128-used/",  "spreads_from_market": 1.2,  "storage_gb": 128,  "typical_spread_uah": 1000,  "updated": "2026-09-22",  "verdict": "below_market",  "verdict_basis": "typical_spread"}

Вердикт міряється передусім розкидом самої позиції, а не відсотком від медіани: typical_spread_uah — це наскільки звичайне оголошення цієї конфігурації відстоїть від ринкової ціни, і половина живих лотів лежить усередині нього. spreads_from_market каже, на скільки таких розкидів відійшла названа ціна. Один і той самий відсоток — це різні речі на різних позиціях: «на 20% дешевше» на широкому ринку це звичайне оголошення, а на вузькому — дешевше майже за все. Під розкидом лежить одна абсолютна підлога: 45% від медіани — це far_below_market на будь-якому ринку, бо після такої знижки вона перестає виглядати вигодою і починає виглядати причиною. Сам verdict — одне з пʼяти: far_below_market, below_market, about_market, above_market, far_above_market. А verdict_basis каже, котра мірка відповіла: typical_spread, percent_floor, percent_ceiling або percent_of_market — остання там, де розкид ніколи не рахувався і відповідає сама відсоткова драбина. percent_ceiling — дзеркало підлоги: там, де розкид позиції злипся, три розкиди бувають знижкою в один відсоток, тож far_* вимагає ще й розриву щонайменше 5%.
cheaper_listings_at_least — нижня межа, не перцентиль: смуга з названою ціною не ділиться і їде як price_bin, а cheaper_listings_at_most — стеля разом із нею. Коли below_every_live_listingtrue, дешевших живих оголошень немає взагалі, а above_every_live_listing каже те саме про верх. Обидва читаються з найдешевшої й найдорожчої живої ціни, і межі з ними узгоджені: ціна, дорожча за найдешевше оголошення, має під собою щонайменше його, а ціна, не вища за найдорожче, не може мати під собою всі. І це не порада: ми кажемо, де стоїть число, а батарею й подряпини бачить лише той, хто тримає телефон.

Що ця служба віддає й що обмежує · GET /info

Один виклик замість читання цієї сторінки: що ми публікуємо, скільки це коштує (нічого), під якою ліцензією, чого тут свідомо немає — і єдиний ліміт на всій поверхні. Поля: limits, licence, transports, not_available.

Яка це модель · вісім цифр · GET /device

Перші вісім цифр IMEI — це TAC, тобто модель, а не апарат. Віддає brand, model, as_of — і published_as: той самий апарат під назвою, яку публікуємо ми, готовою до запиту ціни. Саме тут ланцюг «сфотографував коробку → точна назва → ціна» і замикається: у реєстрі стоїть GALAXY A21, у нас — Galaxy A21s, і це різні телефони за різні гроші, тож поля два, а не одне. Якщо ціни на цей апарат у нас немає, published_as порожнє, а did_you_mean називає найближчі опубліковані назви. Вісім цифр, не пʼятнадцять — кому потрібна лише модель, той не мусить надсилати весь номер.

Чи числиться телефон у розшуку · GET /imei-check

Повні пʼятнадцять цифр проти реєстру втрачених і викрадених, який ми переопубліковуємо, плюс апарат із того самого TAC. Поля: reported, status, listed_on, checksum_ok, as_of, і imei_tail замість самого номера — відповідь не повторює його цілком. published_as приїжджає й тут: та сама наша назва апарата, що й у /device.

reported: false — це «номера немає в ЦЬОМУ реєстрі», а не гарантія про телефон. Скажіть це людині, яка зараз платить за апарат. checksum_ok: false зазвичай означає одруківку, але пошук однаково виконується: шоста частина записів самого реєстру не проходить власну контрольну цифру. Якщо реєстр недосяжний, приїде error: "registry unavailable" — і це теж не чистий телефон. Це єдині два виклики з лімітом: 120 на хвилину на викликача, бо вони єдині тут не є закешованим файлом.

Що ми взагалі міряємо · GET /categories

Лічильники й дати, і ніколи — самі позиції. Це виклик «чи покритий мій товар», а не спосіб забрати все одним запитом. Якщо категорія зранку не зібралась, вона просто не приїде в перелік — решта працює.

curl -s "https://trofey.app/api/v1/categories"
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "categories": [    {"category": "phones", "configurations": 566, "currency": "UAH", "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень", "license": "https://trofey.app/terms/", "method": "https://trofey.app/methodology/", "page": "https://trofey.app/analytics/phones/", "updated": "2026-09-22"},    {"category": "tablets", "configurations": 85, "currency": "UAH", "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень", "license": "https://trofey.app/terms/", "method": "https://trofey.app/methodology/", "page": "https://trofey.app/analytics/tablets/", "updated": "2026-09-22"}  ],  "source": "https://trofey.app/"}

Живий і за який день · GET /health

«Живий» — не найцікавіше питання: процес, що віддає тижневий файл, теж живий. Тому тут одразу дати. Ця відповідь не кешується ніде.

curl -s "https://trofey.app/api/v1/health"
{  "ok": true,  "source": "https://trofey.app/",  "updated": {    "phones": "2026-09-22",    "tablets": "2026-09-22"  }}

Помилки

400 · немає model
{  "error": "model is required",  "example": "https://trofey.app/api/v1/price?model=iPhone%2013&storage_gb=128"}
400 · storage_gb не число
{  "error": "storage_gb must be an integer"}
400 · condition не з нашого переліку
{  "error": "unknown condition",  "condition": "refurbished",  "category": "phones",  "published": [    "new",    "used"  ]}
400 · варіантів лишається кілька
{  "error": "ambiguous configuration",  "model": "iPhone 13",  "category": "phones",  "choose_from": [    {"storage_gb": 128, "condition": "new"},    {"storage_gb": 128, "condition": "used"},    {"storage_gb": 256, "condition": "used"},    {"storage_gb": 512, "condition": "used"}  ],  "see": "https://trofey.app/api/v1/configurations?model=iPhone%2013&category=phones",  "updated": "2026-09-22",  "currency": "UAH",  "definition": "market_price_uah = медіана цін живих оголошень позиції за останні 14 днів; рахується лише за наявності щонайменше 8 живих оголошень",  "method": "https://trofey.app/methodology/",  "license": "https://trofey.app/terms/",  "source": "https://trofey.app/analytics/phones/",  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on."}
404 · такої категорії ми не публікуємо
{  "error": "unknown category",  "category": "cars",  "published": [    "phones",    "tablets"  ]}
404 · такої конфігурації ми не міряли
{  "attribution": "Trofey — https://trofey.app . Free to use; credit Trofey and link the page the number is published on.",  "category": "phones",  "found": false,  "model": "Nokia 3310",  "model_known": false,  "reason": "No published configuration matches, and the model name is not one Trofey publishes in this category. Names are matched in full — call `models` (MCP) or GET /models to see the exact strings. Trofey publishes a price only where it measured one; it does not estimate on request.",  "source": "https://trofey.app/analytics/phones/",  "updated": "2026-09-22"}
503 · файл не читається просто зараз
{  "error": "data unavailable",  "category": "phones"}

Помилки не кешуються ніде (Cache-Control: no-store): помилка — про цей запит. І storage_gb=128gb — це 400, а не мовчазне ігнорування параметра: викинутий фільтр дав би відповідь про іншу конфігурацію, і ти б про це не дізнався. З тієї ж причини той самий параметр, надісланий двічі, теж 400: два різні значення одного імені не мають правила, яке казало б, котре з них наше. Невідомий параметр при цьому толерується й може повторюватись — кеш-бастер &_cb= лишається робочим.

Кеш і ввічливий клієнт

Успішна відповідь їде з public, max-age=3600, stale-while-revalidate=86400 і з ETag, порахованим із байтів самої відповіді. Ввічливий клієнт шле назад If-None-Match і отримує 304 без тіла, тримає свою копію годину й опитує нас раз на добу: між ранковими збираннями не змінюється нічого. Ліміту, який тебе зупинить, немає — саме тому це твоя справа, а не наша.

Числа перераховуються щодня, і кожна відповідь каже, за який день вона порахована — щоб вчорашнє число не виглядало як сьогоднішнє.

Що ми просимо натомість

Одне: назви Trofey і постав посилання на сторінку, де число опубліковане. Сторінка вже приїхала до тебе разом із числом — це поле source_page. Умови — поле license, як рахується число — поле method. Прохання їде в кожній відповіді полем attribution, а не лише тут.

Для асистента — MCP

Питання і відповіді

Скільки запитів можна робити?

Ціни — без ліміту: вони приходять із файлів, які сайт публікує раз на день і які лежать у кеші на краю мережі, тож повторне питання нічого не коштує. Ліміт є лише на перевірку IMEI — 120 запитів на хвилину.

Як часто оновлюються числа?

Раз на добу. Кожна відповідь несе поле з днем розрахунку — орієнтуйся на нього, а не на день, коли ти зробив запит.

Чи можна використовувати ці дані у себе?

Так, безкоштовно. Умова одна: вказати Trofey і послатись на сторінку, де число опубліковане. Посилання на ліцензію приходить у кожній відповіді.