Для сервісу — 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 (ціле число), condition — used або 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_listing — true, дешевших живих оголошень немає взагалі, а 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, а не лише тут.
Питання і відповіді
Скільки запитів можна робити?
Ціни — без ліміту: вони приходять із файлів, які сайт публікує раз на день і які лежать у кеші на краю мережі, тож повторне питання нічого не коштує. Ліміт є лише на перевірку IMEI — 120 запитів на хвилину.
Як часто оновлюються числа?
Раз на добу. Кожна відповідь несе поле з днем розрахунку — орієнтуйся на нього, а не на день, коли ти зробив запит.
Чи можна використовувати ці дані у себе?
Так, безкоштовно. Умова одна: вказати Trofey і послатись на сторінку, де число опубліковане. Посилання на ліцензію приходить у кожній відповіді.