Get price trends (GET /market/trends) — Kite API
KitePlatform
Use casesDocsGuidesPricing
Browse endpoints
All endpoints

Reference data

  • List cities
  • List neighborhoods
  • List city directions
  • List enumerated values
  • Get this key's limits
  • What the API covers

Listings

  • Search listings
  • Count listings
  • Get listings by id
  • Get a listing
  • Get a listing's price history

Market data

  • Market summary
  • Price distribution
  • Area distribution
  • New supply
  • Vacancy indicator
  • Prices by neighborhood
  • Commercial rent per m² by neighborhood

Official data

  • Registered rents (REGA)
  • Kite Property Index

Analytics

  • Get comparable listings
  • Get a listing's market position
  • Get a listing's nearby asking-price band
  • Find below-market listings
  • Find below-market listings (old path)
  • Get gross rental yield
  • Get price trends
  • Compare neighborhoods

Registered transactions

  • Search registered deals
  • Registered deal statistics
  • Land prices per m²

Off-plan projects

  • Search projects
  • Get a project
  • List a project's units
  • Search project units
  • List developers

Exports

  • Create an export
  • List exports
  • Get an export

Administration

  • Get your organization
  • List data keys
  • Create a data key
  • Revoke a key
  • List projects
  • Daily usage
  • List members and invitations
  • List audit events
  • List request logs
  • Create a webhook endpoint
  • List webhook endpoints
  • Delete a webhook endpoint
  • List deliveries
  • Replay a delivery

Interactive reference

All endpoints

Reference data

  • List cities
  • List neighborhoods
  • List city directions
  • List enumerated values
  • Get this key's limits
  • What the API covers

Listings

  • Search listings
  • Count listings
  • Get listings by id
  • Get a listing
  • Get a listing's price history

Market data

  • Market summary
  • Price distribution
  • Area distribution
  • New supply
  • Vacancy indicator
  • Prices by neighborhood

Analytics

Get price trends

GET/market/trends

Monthly asking prices over recent months (up to 36), for a city or for up to five neighborhoods (one series each): the median and quartiles for the price level, and a constant-quality price index (price_index) for change over time. The median is not a price index; see the methodology.

Computed from Kite's listing history, not from today's listings: every listing Kite has recorded, including ones since rented, sold or removed, and every price change (the price in force at each point in time, not the current one).

  • on_market (default): a listing counts in a month if it was live at any point that month (first seen before the month ended, and still active or last seen on or after the month started), at the price it had at the end of the month, or when last seen if it went off the market earlier.
  • new_listings: a listing counts in the month Kite first saw it, at its first recorded asking price.

Listings are deduplicated across sources and pass the same outlier filter as the current market (fences are today's), but not the 30-day freshness window, which doesn't apply to history. Prices are asking prices in SAR: yearly rent for rentals (monthly, weekly and daily postings are converted to a yearly amount), total price for sales. Medians and quartiles are null when fewer than 5 listings back them; check sample_size before relying on a number.

The median is not a price index. Asking prices cluster on round numbers, so a monthly median can sit on the same figure for months while prices move (Riyadh rent apartments: 45,000 SAR in every month from March to November 2026), and it moves when the mix of what is listed changes even if no price does. Use price_index for change over time; use the median and quartiles for the price level.

price_index is a constant-quality (same-basket) index, 100 at index_base_month, the first month in the window with enough data. Listings are grouped into cells of neighborhood × property type × bedrooms (0-4, 5+, or not stated); a cell counts in a month when it has at least 5 listings, and its level is the geometric mean of their prices. Each month is linked to the previous month with a value over the cells present in both, each weighted by the smaller of its two counts, and the links are chained. A cell entering or leaving doesn't move the index, so a change in mix doesn't read as a price change. A link needs 100 matched listings (); below that the month's is null and the next month links to the last month that has one. A series with no link that passes is null throughout. Listings without a neighborhood are left out of the index. For property types without bedrooms (land, most commercial types) a cell is neighborhood × property type, so a shift in the plot or unit sizes listed within a neighborhood can still show up in the index. With , each neighborhood's index is built from its own cells and is often null for small neighborhoods. The index uses the same listings, prices and filters as the median, under either .

Kite API

Saudi real estate data for developers.

Product
  • API reference
  • Data coverage
  • Pricing
  • Valuation checks
  • Changelog
  • Status
Company
  • kite.sa
  • Contact
  • Security
Legal
  • Terms
  • Subprocessors
© Kite
  • Commercial rent per m² by neighborhood
  • Official data

    • Registered rents (REGA)
    • Kite Property Index

    Analytics

    • Get comparable listings
    • Get a listing's market position
    • Get a listing's nearby asking-price band
    • Find below-market listings
    • Find below-market listings (old path)
    • Get gross rental yield
    • Get price trends
    • Compare neighborhoods

    Registered transactions

    • Search registered deals
    • Registered deal statistics
    • Land prices per m²

    Off-plan projects

    • Search projects
    • Get a project
    • List a project's units
    • Search project units
    • List developers

    Exports

    • Create an export
    • List exports
    • Get an export

    Administration

    • Get your organization
    • List data keys
    • Create a data key
    • Revoke a key
    • List projects
    • Daily usage
    • List members and invitations
    • List audit events
    • List request logs
    • Create a webhook endpoint
    • List webhook endpoints
    • Delete a webhook endpoint
    • List deliveries
    • Replay a delivery

    Interactive reference

    index_sample_size
    price_index
    neighborhood_id
    basis

    History starts on 2026-03-09: nothing before it can be rebuilt, so you can ask for up to 36 months, but months before March 2026 come back empty with coverage: "no_history". March 2026 itself is history_start: part of the month is missing, and under new_listings every listing already live on 2026-03-09 counts as new that month. Kite also added sources over time, so the earliest months under-cover the market and a change between months can reflect coverage as well as prices. The current month is in_progress (and partial). change_pct and index_change_pct use complete months only.

    Authentication
    Send a data key (dk_live_… or dk_test_…) as a Bearer token.
    Scope
    analytics
    Cost
    75 units per call

    Parameters

    NameTypeDescription
    cityrequiredquerystring

    City slug from GET /cities. A town inside a covered region is accepted and resolved to its city (dammam, khobar, dhahran, jubail and qatif to eastern_province; buraydah and unaizah to qassim; hofuf to al_ahsa), as are Arabic city names. The response's filters.city and the X-Resolved-City header show the slug used.

    listing_typerequiredquerystring

    rent (prices are yearly rent) or sale (prices are total price).

    One of: rent, sale

    listing_categoryquerystring

    Defaults to residential when property_type is omitted, so dwellings and commercial stock are never mixed into one median. With a property_type, omit it to include both categories of that type.

    One of: residential, commercial

    property_typequerystring

    One property type, see GET /enums.

    One of: apartment, villa, floor, duplex, office, shop, warehouse, land, building

    bedsqueryinteger

    Exact number of bedrooms (0 = studio).

    neighborhood_idqueryinteger[]

    One series per neighborhood (comma-separated ids, up to 5). Omit for one city-wide series. Unknown ids are a 404.

    monthsqueryinteger

    Calendar months to return, ending with the current one. Up to 36; history begins 2026-03-09, and earlier months come back with coverage: "no_history".

    basisquerystring

    on_market: listings live during the month, at their price then. new_listings: listings first seen that month, at their first asking price.

    One of: on_market, new_listings

    Response

    The data field is an object with these fields.

    NameTypeDescription
    filtersrequiredobject

    The filters the numbers were computed for, after defaults.

    price_basisrequiredstring

    What the *_sar price fields mean: yearly_rent (SAR per year) for rentals, sale_price (total SAR) for sales.

    One of: yearly_rent, sale_price

    price_sourcerequiredstring

    Where the prices come from: asking = advertised asking prices from listings; registered = registered transactions or rent contracts. Asking prices typically sit above what is finally agreed.

    One of: asking, registered

    basisrequiredstring

    One of: on_market, new_listings

    seriesrequiredobject[]
    historyrequiredobject

    Where the listing history behind these series begins.

    methodologyrequiredstring

    How the numbers were computed.

    Example request

    curl
    curl "https://api.kite.sa/v1/market/trends?city=riyadh&listing_type=rent" \
      -H "Authorization: Bearer $KITE_API_KEY"
    JavaScript (@kite-sa/sdk)
    import { Kite } from "@kite-sa/sdk";
    
    const kite = new Kite(); // reads KITE_API_KEY
    const result = await kite.analytics.trends({ city: "riyadh", listing_type: "rent" });
    Python (kite-sa)
    from kite_sa import Kite
    
    kite = Kite()  # reads KITE_API_KEY
    result = kite.analytics.trends(city="riyadh", listing_type="rent")

    Open in the interactive reference

    Related endpoints

    • Get comparable listings GET /listings/{id}/comparables
    • Get a listing's market position GET /listings/{id}/market-position
    • Get a listing's nearby asking-price band GET /listings/{id}/price-band
    • Find below-market listings GET /market/below-market
    • Find below-market listings (old path) GET /market/deals
    • Get gross rental yield GET /market/rental-yield
    • Compare neighborhoods GET /market/neighborhoods/compare

    Guides

    • Quickstart
    • What a listing is
    • Coverage and freshness
    • Limits and quotas
    • Errors