Search listings (GET /listings) — 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

Listings

Search listings

GET/listings

Active, deduplicated listings in one city, quality-filtered like kite.sa. Paginate with cursor. Paging depth per query is limited by plan; to mirror inventory, sort by updated_asc and advance updated_since.

Watching for new listings? Subscribe instead of polling. A webhook (POST /organization/webhooks) posts listing.created, listing.price_changed and listing.delisted to your URL for the same filters as this endpoint, so you don't re-run this query with sort=newest on a timer. Deliveries aren't metered: you pay only for the listings you then fetch. See the Webhooks guide.

Prices are asking prices: each listing's price.price_basis says whether price.yearly_sar is a yearly rent or a total sale price.

Authentication
Send a data key (dk_live_… or dk_test_…) as a Bearer token.
Scope
listings
Cost
NaN 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 ; and to ; to ), as are Arabic city names. The response's and the header show the slug used.

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

    eastern_province
    buraydah
    unaizah
    qassim
    hofuf
    al_ahsa
    filters.city
    X-Resolved-City
    listing_typerequiredquerystring

    One of: rent, sale

    listing_categoryquerystring

    Omit for both.

    One of: residential, commercial

    property_typequerystring[]

    One or more, comma-separated.

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

    neighborhood_idqueryinteger[]

    Neighborhood ids from GET /cities/{city}/neighborhoods.

    bedsqueryinteger

    Exact number of bedrooms. Exact at every value, including 5 — kite.sa's own filter treats 5 as five-or-more, so the same number returns different sets here. Use beds_min for a range.

    beds_minqueryinteger

    Minimum number of bedrooms.

    beds_maxqueryinteger

    Maximum number of bedrooms.

    bathrooms_minqueryinteger

    Minimum number of bathrooms.

    price_minqueryinteger

    SAR. Yearly for rentals (see price.yearly_sar).

    price_maxqueryinteger

    SAR. Yearly for rentals (see price.yearly_sar).

    area_minquerynumber

    Square meters.

    area_maxquerynumber

    Square meters.

    furnishedquerystring

    Whether the listing is furnished. Omit to include listings that don't say.

    One of: true, false

    sourcequerystring[]

    Source platforms, see GET /enums. Values aren't checked against the list, so a misspelled source narrows to nothing rather than erroring.

    bboxquerystring

    Bounding box west,south,east,north in degrees (GeoJSON order).

    updated_sincequerystring (date-time)

    Only listings whose updated_at is at or after this ISO 8601 time. Combine with sort=updated_asc to sync.

    bathroomsqueryinteger

    Exact number of bathrooms.

    bathrooms_maxqueryinteger

    Maximum number of bathrooms.

    livings_minqueryinteger

    Minimum number of living rooms.

    neighborhood_id_excludequeryinteger[]

    Exclude these neighborhoods. Ids from GET /cities/{city}/neighborhoods. Listings Kite could not place in a neighborhood are kept — unlike neighborhood_id, which drops them.

    qquerystring

    Free-text match on the advertiser's title and description, as posted — not on headline, which Kite builds for the response. Several words must all appear; "quote a phrase" to match it whole, and | between words for either. Sources that post no title (Aqar among them) are matched on description alone.

    amenitiesquerystring[]

    Only listings that have all of these. See GET /enums.

    One of: ac, kitchen, maid_room, parking, private_roof, lift, pool, gym, balcony, garden, laundry_room

    amenities_excludequerystring[]

    Exclude listings that have any of these.

    One of: ac, kitchen, maid_room, parking, private_roof, lift, pool, gym, balcony, garden, laundry_room

    photo_featuresquerystring[]

    Only listings whose photos show all of these: real_photos (photos of the actual property, not renders or stock images), kitchen_installed (fitted kitchen cabinets), ac_split, pool, roof_terrace, balcony, large_windows (a living room or bedroom with large windows). Read from the listing's photos by an automated vision model and published only for features it identifies with high precision, so this is a must-have filter and nothing else: a listing whose photos don't show a feature, or that hasn't been analysed yet, simply doesn't match, and there is no way to ask for listings without a feature. Coverage is homes with photos; recently added listings may not be analysed yet.

    One of: real_photos, kitchen_installed, ac_split, pool, roof_terrace, balcony, large_windows

    floorquerystring

    ground for ground-floor listings, upper for any stated floor above it. The two do not partition the results: a listing whose floor the source didn't state is in neither.

    One of: ground, upper

    source_excludequerystring[]

    Exclude these source platforms, see GET /enums.

    max_agequeryinteger

    Maximum property age in years. In Riyadh the age is checked against municipal building permits from 2018 on: when the ad claims a building at least four years younger than its latest permit allows, the permit's age (the permit year plus a year to build) is used instead. A permit never makes a building younger than its ad says. Aqar records an age of 0 when the advertiser leaves it blank, so an Aqar listing at 0 counts as new only when a Riyadh permit or the ad's own text (first occupant, never lived in, newly built) backs it; otherwise its age is unknown and it doesn't match. Where an ad's own description states the building's age ("العمر 8 سنوات") at least three years older than its age field, or the field is empty, the description's age is used.

    verifiedquerystring

    true for listings the source marks as verified. false means everything else — both listings it marked unverified and listings it said nothing about.

    One of: true, false

    advertiser_typequerystring

    Who posted the ad. The underlying column holds eight source-specific values; these two group them. Ads by an intermediary who does not say whether they are a firm or a person match neither.

    One of: company, individual

    compoundquerystring

    Compound name, partial match.

    in_compoundquerystring

    Only listings that belong to a compound, whichever one.

    One of: true, false

    rent_frequencyquerystring

    How the rent is advertised. price.yearly_sar stays yearly either way; see price.as_posted.

    One of: monthly, yearly

    days_on_market_minqueryinteger

    Days since Kite first saw the listing.

    days_on_market_maxqueryinteger

    Days since Kite first saw the listing.

    sortquerystring

    newest (first seen by Kite), updated_desc/updated_asc (by updated_at; use updated_asc to sync), price_asc/price_desc, price_drop (only listings whose price dropped, biggest drop first; drops over 50% are excluded as likely corrections), days_on_market_desc, and recommended — Kite's own ranking, blending asking price against comparable listings, how long the ad has been up, how complete it is, and how sought-after the neighborhood is, with no single source allowed to fill the top. It is a ranking rather than an ordering, so it is retuned from time to time and the same query can reorder between releases; page through it freely, but sync with updated_asc.

    One of: newest, updated_desc, updated_asc, price_asc, price_desc, price_drop, days_on_market_desc, recommended

    limitqueryinteger
    cursorquerystring

    Response

    The data field is a list; each item has these fields.

    NameTypeDescription
    idrequiredinteger
    urlrequiredstring

    The listing's page on kite.sa.

    titlerequiredstring | null

    The advertiser's title, as posted. Null for sources that don't have titles (for example Aqar); use headline for display.

    headlinerequiredstring

    A short English description built from the listing's fields. Always present.

    descriptionrequiredstring | null

    As posted (usually Arabic).

    description_enrequiredstring | null

    English translation, where available.

    listing_typerequiredstring
    listing_categoryrequiredstring | null
    property_typerequiredstring
    pricerequiredobject
    financingrequiredobject
    bedroomsrequiredinteger | null
    bathroomsrequiredinteger | null
    livingsrequiredinteger | null

    Living rooms.

    area_sqmrequirednumber | null
    floorrequiredstring | null
    age_yearsrequiredinteger | null
    furnishedrequiredboolean | null
    amenitiesrequiredstring[]
    locationrequiredobject
    compound_namerequiredstring | null
    project_idrequiredinteger | null

    Off-plan project this unit belongs to, if linked.

    imagesrequiredstring[]

    Image URLs on Kite's CDN.

    image_countrequiredinteger
    advertiserrequiredobject
    verified_by_sourcerequiredboolean | null

    The source marks this ad as verified.

    sourcerequiredobject
    also_listed_onrequiredstring[]

    Other sources carrying the same property. Kite shows one listing per property.

    first_seen_atrequiredstring (date-time) | null

    When Kite first saw the listing.

    updated_atrequiredstring (date-time) | null

    Last update at the source, or the last time Kite saw the listing if the source doesn't publish update times. Drives updated_since and the updated_* sorts.

    last_seen_atrequiredstring (date-time) | null

    Last time Kite confirmed the listing is live.

    days_on_marketrequiredinteger | null

    Example request

    curl
    curl "https://api.kite.sa/v1/listings?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.listings.search({ city: "riyadh", listing_type: "rent" });
    Python (kite-sa)
    from kite_sa import Kite
    
    kite = Kite()  # reads KITE_API_KEY
    result = kite.listings.search(city="riyadh", listing_type="rent")

    Open in the interactive reference

    Related endpoints

    • Count listings GET /listings/count
    • Get listings by id GET /listings/batch
    • Get a listing GET /listings/{id}
    • Get a listing's price history GET /listings/{id}/price-history

    Guides

    • Quickstart
    • What a listing is
    • Searching and filtering
    • Keeping a copy in sync
    • Limits and quotas
    • Pagination
    • Errors