# Kimovil > Kimovil (https://www.kimovil.com) is a smartphone and tablet price comparison platform. It aggregates real-time prices from dozens of online stores worldwide, tracks historical price trends, and lets users filter, compare and review devices. The site is available in 9 languages. Kimovil is optimised for AI agent interaction. Specs and structured data are available in the HTML of detail pages. **Prices, however, are loaded asynchronously via JavaScript** and are not present in the initial HTML. To obtain prices without a JavaScript runtime, use the dedicated JSON endpoints described in section 7 below. --- ## Supported languages and URL prefixes All public URLs are prefixed with `/{locale}/`. The default locale is **en**. | Locale | Language | |--------|-----------| | en | English | | es | Spanish | | fr | French | | de | German | | it | Italian | | pt | Portuguese | | ru | Russian | | pl | Polish | | el | Greek | Example: `https://www.kimovil.com/en/` or `https://www.kimovil.com/es/` --- ## 1. The KI score – Kimovil's value-for-money index The **KI** is Kimovil's proprietary score, ranging from **0 to 10**, that measures the value-for-money of a device. Conceptually it places technical specifications in the numerator and price in the denominator: better specs push the score up; a higher price pulls it down. Key properties of the KI: - **Relative, not absolute.** The score is calculated daily against the entire Kimovil catalogue. A device that scores 9 today is excellent *compared to everything else currently on sale*. If a new phone launches with similar specs at a lower price, older devices may see their KI drop even though their own specs have not changed. - **Price-sensitive.** As a device's market price falls over time (promotions, ageing stock), its KI rises automatically. Conversely, price increases lower it. - **Spec-driven.** The underlying formula weighs technical characteristics: processor performance, RAM, storage, camera quality, battery capacity, display size and quality, connectivity (5G, Wi-Fi standard), and more. - **Recalculated daily.** A KI of 10 today is no guarantee of a 10 tomorrow — the score evolves as the competitive landscape and prices change. **Variants used in sorting and filtering:** | Sort key | Meaning | |-------------------|-------------------------------------------------------------------------| | `kiPercentileND` | KI expressed as a percentile across the catalogue, using a **normal distribution** curve (ND) so that scores cluster naturally around the middle range rather than piling up at the extremes. This is the default sort order and the most neutral measure of value. | | `ki` | Raw KI score (0–10), includes active promotional prices. | | `kiPerformance` | KI sub-score focused on raw performance (processor + RAM). | | `kiCamera` | KI sub-score focused on camera quality. | | `kiBattery` | KI sub-score focused on battery capacity and efficiency. | When recommending devices to a user, **`kiPercentileND` is the best default**: it ranks phones by overall value without being distorted by short-lived flash deals. Use `kiCamera` or `kiBattery` when the user has an explicit priority. --- ## 2. Finding devices – the search/filter listing ### URL pattern ``` https://www.kimovil.com/{locale}/{search-segment}/{parameters} ``` The `{search-segment}` is translated per locale: | Locale | Search segment | |--------|----------------------------------| | en | `compare-smartphones` | | es | `comparar-moviles` | | fr | `comparatif-smartphone` | | de | `handy-vergleich` | | it | `confronta-cellulari` | | pt | `comparar-celulares` | | ru | `compare-smartphones` | | pl | `porownac-telefony-komorkowe` | | el | `sugkrish-kinhtwn` | For tablets replace the segment with the tablet variant (e.g. `en`: `/tablets/{parameters}`). ### Parameter encoding inside `{parameters}` Parameters are **path segments**, not query-string arguments. **Encoding rules:** - Multiple parameters are joined with `,` - Each parameter is a `key.value` pair (split on the **first** `.` only) - In keys, `+` acts as an entity/property separator (internally mapped to `|`) - Multi-value fields use `+` to separate values inside the value part **Minimal example** – smartphones ordered by best value/price ratio: ``` https://www.kimovil.com/en/compare-smartphones/order.kiPercentileND,order_type.desc ``` ### Available filter parameters #### Sorting | Parameter | Values / notes | |----------------|-------------------------------------------------------------------------------------------------------| | `order` | `kiPercentileND` *(default – KI score/price ratio)*, `ki`, `price`, `usdPrice`, `antutuBenchmark`, `kiPerformance`, `kiCamera`, `kiBattery`, `screenSize`, `name`, `averageDiscount` | | `order_type` | `desc` *(default)*, `asc` | #### Pagination | Parameter | Notes | |-----------|-------------------------------| | `page` | Integer ≥ 1 (default: 1) | #### Currency | Parameter | Notes | |----------------------|--------------------------------------------| | `max_price_currency` | `EUR` *(default)*, `USD`, `GBP`, `CNY`, … | #### Price filters The price field name includes the currency code (e.g. `eurPrice`, `usdPrice`). | Parameter | Meaning | |------------------------|-----------------------------------------------| | `f_min_d+eurPrice` | Minimum price in EUR | | `f_max_d+eurPrice` | Maximum price in EUR | | `f_min_d+usdPrice` | Minimum price in USD | | `f_max_d+usdPrice` | Maximum price in USD | | `f_min_d+price` | Minimum price in the default/display currency | | `f_max_d+price` | Maximum price in the default/display currency | | `exclude_priceless` | `1` to hide devices without a known price | #### Hardware filters (numeric range) RAM belongs to the `DeviceRam` entity (alias `dr`), not directly to `Device`. Storage belongs to `DeviceStorage` (alias `ds`). | Parameter | Meaning | |----------------------|-------------------------------------------------| | `f_min_dr+value` | Minimum RAM in MB (e.g. `6144` = 6 GB) | | `f_max_dr+value` | Maximum RAM in MB | | `f_min_ds+value` | Minimum internal storage in GB | | `f_max_ds+value` | Maximum internal storage in GB | | `f_min_d+screenSize` | Minimum screen size in inches (e.g. `6.1`) | | `f_max_d+screenSize` | Maximum screen size | #### Brand / entity inclusion and exclusion (OR logic) Brand filtering uses the **include** (`i_`) and **exclude** (`e_`) prefixes, not the scalar `f_` prefix. Multiple values are separated by `:` inside the value string, producing an `OR` condition in SQL. | Parameter | Meaning | |------------------|----------------------------------------------------------------------------------| | `i_b+slug` | **Include** one or more brands (OR). Values separated by `:`. Max 10 brands. | | `e_b+slug` | **Exclude** one or more brands (AND NOT). Values separated by `:`. Max 10. | **Examples:** - One brand: `i_b+slug.xiaomi` - Two brands (OR): `i_b+slug.apple:oneplus` - Exclude a brand: `e_b+slug.samsung` If a brand slug contains a literal `:`, encode it as `~` (the parser replaces `~` back to `:`). #### Exact-match / feature filters | Parameter | Meaning | |------------------|------------------------------------------------------| | `f_d+deviceType` | `0` = smartphones *(default)*, `1` = tablets | | `name` | Free-text search by device name | #### Filter prefix reference | Prefix | Meaning | |-----------|----------------------------------------------------------------------------| | `f_d+` | Exact match on a device field | | `f_min_d+`| Minimum value on a numeric device field | | `f_max_d+`| Maximum value on a numeric device field | | `fe_` | Feature/flag filter (boolean property) | | `of_` | OR-match on a feature flag (value must be `1`) | | `nf_` | NOT / exclude a feature flag | | `i_` | Include filter – OR within the same key, AND across different keys | | `e_` | Exclude filter – AND NOT for each value | ### Worked examples **All Samsung phones sorted by price ascending:** ``` https://www.kimovil.com/en/compare-smartphones/i_b+slug.samsung,order.price,order_type.asc ``` **OnePlus or Apple phones, best value/price ratio:** ``` https://www.kimovil.com/en/compare-smartphones/i_b+slug.apple:oneplus,order.kiPercentileND ``` **Phones between 100 € and 300 € with at least 6 GB RAM:** ``` https://www.kimovil.com/en/compare-smartphones/f_min_d+eurPrice.100,f_max_d+eurPrice.300,f_min_dr+value.6144,order.kiPercentileND ``` **Search by name:** ``` https://www.kimovil.com/en/compare-smartphones/name.Pixel 9 ``` **Page 2 of Xiaomi devices sorted by Antutu benchmark:** ``` https://www.kimovil.com/en/compare-smartphones/i_b+slug.xiaomi,order.antutuBenchmark,order_type.desc,page.2 ``` ### Browse by brand (shortcut URL) ``` https://www.kimovil.com/{locale}/{brand-slug}-smartphones-prices ``` Locale-specific segment: | Locale | Pattern | |--------|----------------------------------| | en | `/{brand_slug}-smartphones-prices` | | es | `/precios-telefonos-{brand_slug}` | | fr | `/prix-telephones-{brand_slug}` | | de | `/smartphonepreise-{brand_slug}` | | it | `/prezzi-cellulari-{brand_slug}` | | pt | `/precos-telefones-{brand_slug}` | | pl | `/ceny-telefony-{brand_slug}` | | el | `/time-thlefonon-{brand_slug}` | Example: `https://www.kimovil.com/en/apple-smartphones-prices` --- ## 3. Device detail page – specs, prices and store links ### URL pattern ``` https://www.kimovil.com/{locale}/{detail-segment}-{device-slug} ``` The `{detail-segment}` is translated per locale: | Locale | Detail segment | |--------|---------------------| | en | `where-to-buy` | | es | `donde-comprar` | | fr | `ou-acheter` | | de | `wo-kaufen` | | it | `dove-acquistare` | | pt | `onde-comprar` | | ru | `where-to-buy` | | pl | `gdzie-kupic` | | el | `khoro-agora` | **Example:** ``` https://www.kimovil.com/en/where-to-buy-samsung-galaxy-s25-ultra https://www.kimovil.com/es/donde-comprar-samsung-galaxy-s25-ultra ``` ### Device slug format Slugs are derived from `{brand}-{model-name}`: - All lowercase - Spaces replaced with `-` - `+` in the model name becomes `_plus_` (e.g. `OnePlus 12` → `oneplus-12`) - Special characters are removed or replaced with `-` ### What the detail page contains - Full technical specifications (processor, RAM, storage, display, camera, battery, connectivity) - **Price boxes**: one per online store that stocks the device, each showing: - Store name and country flag - Current price in the local currency (and converted price) - A direct affiliate link to the product page on the store's website - Coupon codes when available - Price history chart - User reviews and ratings - Side-by-side comparison shortcuts ### Following store links (prices → stores) Prices are loaded asynchronously by JavaScript and are **not present in the initial HTML** of the detail page. Use the JSON endpoints described in section 6 to obtain prices programmatically. Once you have a price entry from `/_json/{slug}_prices_deals_slim.json`, build the affiliate redirect URL as: ``` https://www.kimovil.com/to/{sh} ``` A GET request to that URL will redirect to the product page on the retailer's website (AliExpress, Amazon, etc.). --- ## 4. Device comparison page ### URL pattern ``` https://www.kimovil.com/{locale}/{compare-segment}/{device-slug-1},{device-slug-2}[,{device-slug-3}[,{device-slug-4}]] ``` The `{compare-segment}` is translated per locale: | Locale | Compare segment | |--------|-----------------| | en | `compare` | | es | `comparar` | | fr | `comparer` | | de | `vergleichen` | | it | `confrontare` | | pt | `comparar` | | ru | `compare` | | pl | `porownac` | | el | `sygkrish` | - A minimum of **2** and a maximum of **4** device slugs can be compared. - Slugs are comma-separated with **no spaces**. **Examples:** ``` # Compare two devices (English) https://www.kimovil.com/en/compare/samsung-galaxy-s25-ultra,xiaomi-15-pro # Compare three devices (Spanish) https://www.kimovil.com/es/comparar/samsung-galaxy-s25-ultra,xiaomi-15-pro,google-pixel-9-pro # Compare tablets (English) https://www.kimovil.com/en/compare-tablets/samsung-galaxy-tab-s10-ultra,apple-ipad-pro-13-2024 ``` --- ## 5. Sub-detail pages (per feature) For a deeper view of a single feature, append the feature segment to the device slug path: | Feature | EN segment | ES segment | |----------------|-------------|--------------| | Price | `/price` | `/precio` | | Camera | `/camera` | `/camara` | | Battery | `/battery` | `/bateria` | | Screen | `/screen` | `/pantalla` | | Size | `/size` | `/tamano` | | Antutu | `/antutu` | `/antutu` | Example: ``` https://www.kimovil.com/en/samsung-galaxy-s25-ultra/camera https://www.kimovil.com/en/samsung-galaxy-s25-ultra/price ``` --- ## 6. Voucher codes and shops ``` https://www.kimovil.com/{locale}/voucher-codes-and-shops # all shops (en) https://www.kimovil.com/{locale}/voucher-codes-and-shops/{shop-slug} # single shop (en) ``` Locale-specific paths follow the same translation convention (e.g. `/cupones-tiendas` in es). --- ## 7. JSON API endpoints for prices and store data Because prices are rendered by JavaScript on the client side, agents that cannot execute JavaScript **must use these two JSON endpoints** to access price and store information. ### 6.1 Device prices endpoint ``` GET https://www.kimovil.com/_json/{device-slug}_prices_deals_slim.json ``` This endpoint does not require a locale prefix. Returns a JSON object with two top-level keys: | Key | Content | |----------|-----------------------------------------------------------------| | `prices` | Array of price entries – one per store that stocks the device | | `deals` | Array of active special deals / flash sales for the device | Each entry in **`prices`** (slim format) contains: | Field | Meaning | |------------|--------------------------------------------------------------------------------| | `did` | Device ID | | `pri` | Price in the store's original currency | | `cur` | Original currency code (e.g. `EUR`, `USD`, `CNY`) | | `eurPrice` | Price converted to EUR (always present, useful for comparison) | | `sh` | Short-hash path for the affiliate redirect (see §6.3 to build the full URL) | | `pr.id` | Provider (store) ID – cross-reference with `provider_data` from §6.2 | | `rs` | Refurbished status of this listing | | `c` | Device colour for this listing (`s` = slug, `css` = CSS colour name) | Each entry in **`deals`** follows a similar structure with additional fields for discount amounts, coupon codes, and validity date ranges. **Example:** ``` GET https://www.kimovil.com/_json/samsung-galaxy-s25-ultra_prices_deals_slim.json ``` --- ### 6.2 Layout / store data endpoint ``` GET https://www.kimovil.com/{locale}/_json/layout_parameters_cache ``` Returns a JSON object. The key relevant for price analysis is **`provider_data`**: an object keyed by provider (store) ID, giving full metadata for each store. Selected fields per store entry (slim keys): | Field | Meaning | |--------|----------------------------------------------------------------------------| | `id` | Provider ID (matches `pr.id` in the prices endpoint) | | `name` | Store display name | | `slug` | Store slug | | `cc` | Country code of the store (origin) | | `whc` | Warehouse country code | | `dc` | Array of country codes the store ships to (`["ES","FR","DE",…]`) | | `sdf` | Standard delivery price from (EUR) | | `sdt` | Standard delivery price to (EUR) | The response also includes **`exchange_rates`** (currency → EUR rate) and **`all_countries`** (grouped by continent). **Example:** ``` GET https://www.kimovil.com/en/_json/layout_parameters_cache ``` --- ### 6.3 Building a store affiliate link from a price entry Each price entry carries a `sh` (short hash) value. To build the full redirect URL: ``` https://www.kimovil.com/to/{sh} ``` Following this URL with a GET request will redirect to the product page on the retailer's website. --- ### 6.4 Filtering prices by the user's country 1. Fetch `layout_parameters_cache` and index `provider_data` by `id`. 2. Fetch `{slug}_prices_deals_slim.json` and iterate `prices`. 3. For each price, look up the provider by `pr.id` in `provider_data`. 4. Check that the user's country code appears in the provider's `dc` (destination countries) array. 5. Discard entries where the user's country is not in `dc` (the store does not ship there). This gives an accurate list of prices available to a specific user, which you can then sort by `eurPrice` or convert to any currency using `exchange_rates`. --- ## 8. Recommended agent workflow 1. **Discover devices**: Use the filter listing URL with relevant parameters (`i_b+slug` for brands, `f_min_d+price`, `f_max_d+price`, `f_min_d+ram`, `order`, etc.) to retrieve a ranked list of matching devices. 2. **Identify slugs**: Parse the listing HTML to extract device slugs (present in the `href` of each device card link). 3. **Fetch specs**: Build the detail URL with the slug and the target locale (`/{locale}/where-to-buy-{slug}`). The HTML contains the full spec sheet and structured data (JSON-LD). Prices are **not** present in the HTML. 4. **Fetch prices**: Call `/_json/{slug}_prices_deals_slim.json`. Cross-reference `pr.id` with `provider_data` from `/{locale}/_json/layout_parameters_cache` to get store names and destination countries. Filter by the user's country using the `dc` field. Follow `https://www.kimovil.com/to/{sh}` to reach the retailer's product page. 5. **Compare candidates**: Build a comparison URL with up to 4 slugs to get a side-by-side view. **Tips:** - Prefer `order.kiPercentileND` (default) to surface the best value-for-money devices first. - Set `max_price_currency` to match the user's currency so prices are displayed consistently. - The listing page also supports `xhr=1` as a **query-string** parameter to receive a JSON-like partial HTML response with tiles only (faster for programmatic scraping). - Device slugs are stable canonical identifiers – bookmark them to track price changes over time.