Darakالمنصة
الاستخداماتالتوثيقالأدلةالباقات

سجل التغييرات

تغييرات Darak API. ضمن /v1 نضيف فقط؛ وأي ميزة سيُوقف دعمها يُعلَن عنها هنا أولًا. راجع سياسة الإصدارات.

موجز RSS
  1. 30 سبتمبر 2026

    Unit costs: 1 unit per 10 results, analytics 10–15 units, listing exports on Enterprise

    • تغييرList endpoints (listing search, project lists) cost 1 unit per 10 results asked for with limit (was 25), up to your plan's page size, and GET /listings/batch 1 unit per 10 ids. A page of 100 costs 10 units.
    • تغييرAnalytics cost 10 units for market position and price band, and 15 for comparables, rental yield, neighborhood compare and trends (were 2–5). GET /market/deals costs 2 units per 10 results asked for.
    • تغييرListing exports (listings, listing_changes) are on Enterprise (were Pro and up) and cost 100 units per 1,000 rows (was 10). Open-data exports stay free on every plan.
    • تغييرPlan prices and monthly quotas are unchanged. Single records, market statistics and reference data cost what they did.
  2. 30 سبتمبر 2026

    Listing source links go through darak.app

    • تغييرsource.url on a listing is now a darak.app link (https://darak.app/r/{id}) that forwards to the original ad, instead of the source's own URL. Links you show keep working the same way for your users.
    • تغييرOn the Free plan, source.url and source.listing_id are null. source.name is still set: where you show a listing, link its url and credit the source by name.
  3. 30 سبتمبر 2026

    Free plan: 250 units a month

    • تغييرThe Free plan includes 250 units a month (was 2,500), in line with other property-data APIs' free tiers. Free is for building and testing an integration; Starter and up are unchanged. It changes now rather than after 30 days' notice because Free accounts were being combined to add up their limits (section 5.2 of the API terms).
    • تغييرFree is one account per person or company (section 2.2). Free accounts whose keys call from the same address are reviewed.
    • تغييرTest keys never get more than the organization's own monthly quota. On Free that is 250 units, below the usual 1,000.
  4. 27 سبتمبر 2026

    Bulk exports, and price trends back to the start of listing history

    • إضافةPOST /exports, GET /exports and GET /exports/{export_id}: whole datasets as files for a warehouse. listings is every active listing matching the /listings filters (several cities and both listing types in one export); listing_changes is every created, price_changed and delisted event in a date range of up to 366 days, with the listing as it is now; registered_transactions and registered_rents are the Ministry of Justice deals and REGA rent index, with ATTRIBUTION.txt. Exports run in the background; poll GET /exports/{export_id} and download each part (gzip NDJSON or CSV, up to 25,000 rows a file) from its signed link, valid for an hour. Files are kept 7 days.
    • إضافةThe exports scope, on Pro and Enterprise, for the two listing datasets. They are counted before anything is written and charged 10 units per 1,000 rows (at least 10), once, against the monthly quota but not the per-minute rate; units on the export shows the charge, and a failed export is refunded. Open-data exports are free on every plan and need no scope. At most 2 exports run at once and 20 are created per day per organization (409 export_limit).
    • تغييرGET /market/trends takes months up to 36 (was 12). Listing history begins 2026-03-09, so each point now has coverage: no_history before March 2026 (no data exists, which is not zero listings), history_start for March 2026 (partly covered; under new_listings it counts the whole initial stock as new), complete, or in_progress for the current month. history gives the start date and first complete month.
    • إصلاحchange_pct in GET /market/trends is now measured between complete months only. It used to start from March 2026 when that month was in range, and under new_listings March counts every listing live when history began as new, which made the change meaningless.
  5. 27 سبتمبر 2026

    Property Index: land and home prices from notary and Real Estate Registry deals, Riyadh included

    • تغييرland_registered in GET /market/property-index is built on REGA's Real Estate Indicators (every sale deal registered by Ministry of Justice notaries **and** by the Real Estate Registry) from methodology v1-2026-11, instead of the Ministry of Justice open data. Riyadh is included in every period and every point is coverage_flag: "full"; the national series no longer leaves Riyadh out. The series starts at 2023-Q2. Its property is land (plots, not homes): agricultural land and land described as commercial are excluded, and the source does not otherwise classify plots as residential or commercial.
    • إضافةhome_registered in GET /market/property-index: registered sale prices of apartments and floors per m² of the unit's deed area, as a chained matched-neighborhood index (home_price_index) and the median of what sold (median_price_per_sqm), national and per city, quarterly from 2023-Q2. property: "home". Villas and houses are excluded because their deed area is the plot. City-scope land and home series are published only for cities whose index rests on at least 500 deals every quarter and is stable (land: Riyadh, Jeddah, Madinah; homes: Riyadh, Jeddah, Eastern Province); every city counts in the national series.
    • إضافةsource_key (rega_rent_index, moj_transactions, rega_rei or darak_listings) and source (the credit line, verbatim) on every series of GET /market/property-index. attribution covers open-data sources only, so it is null when every returned series is built on REGA Real Estate Indicators or Darak's listings. Individual REGA Real Estate Indicators deals are never served.
    • تغييرproperty in GET /market/property-index can now be land or home as well as apartment; residential_land remains only for releases drafted before 2026-11, whose land came from Ministry of Justice open data. GET /transactions, GET /market/transactions and GET /market/land-prices are unchanged and still serve Ministry of Justice open data (notary deals only).
  6. 26 سبتمبر 2026

    Riyadh-city registered-deal figures from 2024 are labelled notary-only

    • إصلاحThe Riyadh explanation was wrong. Riyadh-city deals were not withdrawn from public data: the Real Estate Registry has registered a growing share of Riyadh-city sales since 2024 (a majority by late 2025) and all of them from 19 May 2026, and the Ministry of Justice open data these endpoints serve covers notary-registered deals only. coverage.notes, the endpoint descriptions and the Property Index caveats now say so.
    • إضافةcoverage_flag (full, notary_only or incomplete) on every cell of GET /market/transactions, every point of GET /market/land-prices and every point of GET /market/index, and coverage.notary_only_from_quarter on the three MOJ endpoints. Riyadh-city figures from 2024-Q1 are notary_only: served, but missing Registry deals, and they may under-represent districts that moved early. Quarters past coverage.complete_through_quarter are incomplete.
    • تغييرRiyadh-city deals dated after 2026-05-18 (a dozen stray rows) are no longer served by GET /transactions or counted in GET /market/transactions and GET /market/land-prices, matching the Property Index, which already withholds Riyadh land from 2026-Q2. Riyadh 2026-Q2 now holds 1 April to 18 May only and stays complete: false.
  7. 26 سبتمبر 2026

    Registered deals and land prices from Ministry of Justice open data, free on every plan

    • إضافةGET /transactions: individual sale deals registered with the Ministry of Justice, from its quarterly open data. Each deal has the month it was registered, its neighborhood (id and names) and MOJ's own city and district, its land-use class (residential, commercial, agricultural, industrial, mixed_use, other), area, price, price per m², the number of properties conveyed and its source quarter. Filter by neighborhood, class, month range, price, area and price per m²; paginate with cursor. Dates are served to the month, and plan, parcel and deed numbers are never served. Every id is an opaque txn_… value.
    • إضافةGET /market/transactions: deal counts and the median and quartile price per m² and total price per calendar quarter and land-use class, for a city, a set of neighborhoods, or each neighborhood. Cells under min_sample_size (at least 5) keep their count and drop their prices.
    • إضافةGET /market/land-prices: the median price per m² of residential (or commercial) land plots per quarter, for a city or up to 20 neighborhoods, with quarter-on-quarter and year-on-year change. MOJ's residential class is overwhelmingly vacant plots, so these are land prices, and the response says so with asset: "land".
    • إضافةAll three are free on every plan, including Free, and cost 0 units: they serve Saudi government open data at no charge. Every response says price_source: "registered" and carries attribution (the ODC Attribution License notice, the Saudi Open Data License v2.0 link and the source dataset of each quarter), which must travel with the data, and coverage, which flags gaps in the source: Riyadh-city deals moved to the Real Estate Registry, which this open data does not carry, so Riyadh figures from 2026-Q2 on are marked complete: false (see the entry above for the notary-only labelling added the same day). Quarters 2020-Q2 and 2023-Q1, published with misaligned columns, are excluded.
  8. 26 سبتمبر 2026

    Reference endpoints work with every data key

    • تغييرA data key limited to some APIs can now always call the reference endpoints (GET /cities, /cities/{city}/neighborhoods, /cities/{city}/directions, /enums, /limits, and the free open-data endpoints /market/registered-rents and /market/property-index), whatever scopes it is limited to. They cost 0 units and you need them to use every other API, so a key restricted to market no longer gets scope_not_in_key looking up a neighborhood id. Keys limited to other scopes are otherwise unchanged.
  9. 26 سبتمبر 2026

    Nearby asking-price band for a listing

    • إضافةGET /listings/{id}/price-band (analytics scope, 2 units): the 25th percentile, median and 75th percentile of asking prices for comparable units near a listing, in SAR and per m², where the listing's price sits against them (placement, diff_from_median_pct, and a direction that is only below or above when the median's 95% cluster-bootstrap interval excludes the price), and the cohort behind it: property type, bedrooms, radius, look-back, area tolerance, distinct units and evidence clusters, with the methodology and calibration versions. It is the same published comparison as the darak.app listing page and GET /market/deals. When there is no band, status says why: insufficient_comparables, unsupported_cohort, plot_area_only, area_unusable, fields_unusable, not_residential, multi_unit, no_price or no_location. Prices are asking prices (price_source: asking), and the band is not a valuation.
  10. 26 سبتمبر 2026

    Registered rents and the Darak Property Index

    • إضافةGET /market/registered-rents: REGA's registered rents per neighborhood and property type for a city and quarter, from the rent index REGA publishes on open.data.gov.sa. Each cell gives the mean yearly rent of the leases registered on Ejar, the mean yearly rent per m² and the contract count, with price_source: "registered" and statistic: "mean" — these are means, not medians. Cells with fewer than 5 contracts are withheld (you can raise the threshold with min_sample_size, not lower it), and coverage says how many were. city_totals gives the city-wide mean over every contract counted. Cells matched to a Darak neighborhood carry its neighborhood_id; unmatched ones are returned with REGA's own names.
    • إضافةGET /market/property-index: the Darak Property Index as published in its monthly releases — contracted apartment rent (REGA, registered), registered residential land (Ministry of Justice deals: plots, not homes, registered) and asking apartment rent (Darak listings, asking) — nationally and per city, with each point's sample size, the periods withheld inside a series, the release's methodology version and revision, and its caveats. Only published releases are served, and a release's figures never change: a correction is a new revision with a note.
    • إضافةBoth carry an attribution object: the notice, the licence (Saudi Open Data License v2.0, an adaptation of ODC-By) and links to the source datasets on open.data.gov.sa. The licence requires the notice to travel with the figures, so show it wherever you display or pass them on. Both are free on every plan, including Free: they cost 0 units, because this is Saudi open data served at no charge. New tag in the reference: Official data. New 404 codes: period_not_found, release_not_found.
  11. 26 سبتمبر 2026

    Every price says where it comes from

    • إضافةResponses that carry prices now include price_source: asking for advertised prices from listings, registered for registered transactions and rent contracts. It sits beside price_basis on /market/summary, /market/price-distribution, /market/neighborhoods, /market/trends, /market/rental-yield, /market/neighborhoods/compare, /listings/{id}/comparables and /listings/{id}/market-position, and inside each result's comparison on /market/deals. Every figure served today is asking; endpoints built on registered data will return registered, so you can tell the two apart without reading the docs. price_basis is unchanged: it still says whether the numbers are yearly rent or total sale price.
  12. 25 سبتمبر 2026

    Reference data is free

    • تغييرGET /cities, /cities/{city}/neighborhoods, /cities/{city}/directions and /enums now cost 0 units, like /limits. Resolve neighborhood names and valid filter values as often as you need without spending quota.
  13. 25 سبتمبر 2026

    Timestamp inputs now require seconds

    • تغييرBreaking validation change in v1: ISO date-time inputs must include seconds. For example, 2026-09-21T10:00:00Z is accepted; the previously accepted 2026-09-21T10:00Z is now rejected. This affects listings updated_since, organization key expires_at, and request-log since/until filters. Zod 4.6 also narrows the OpenAPI date-time patterns on responses; the server continues to emit timestamps with seconds.
    • تغييرOpenAPI nullable fields now use JSON Schema type arrays (for example, [string, null]) instead of equivalent anyOf unions. Generated example responses may show representative non-null values where they previously showed null; runtime response fields remain nullable.
  14. 23 سبتمبر 2026

    Webhooks

    • إضافةSubscribe an HTTPS URL to listing events instead of polling for them. POST /organization/webhooks takes a URL, the event types you want and the listing filters that decide which listings count — the same vocabulary GET /listings takes. A city is required: without one the subscription is every new listing in the Kingdom, and neither of us finds that out until the volume arrives. listing.created delivers today; listing.price_changed and listing.delisted are accepted on a subscription now and start arriving when they land.
    • إضافةDeliveries are signed with Darak-Signature: t=…,v1=…, HMAC-SHA256 over {timestamp}.{body}, in the scheme Stripe popularised — enough libraries and enough people already know it. The timestamp is inside what was signed, so a captured request can't be replayed later. The webhooks guide carries the verification code rather than describing it.
    • إضافةDelivery is at least once: retry six times over about eight hours, deduplicate on Darak-Event-Id, which is stable across retries and replays. A 4xx is retried as well as a 5xx, since a 404 usually means a deploy is in flight rather than that the event is unwanted. Twenty deliveries that exhaust their attempts disable the endpoint rather than keep posting at something long gone.
    • إضافةGET /organization/webhooks/{id}/deliveries shows what was sent and what your server answered, including the first 500 characters of its reply, and …/replay sends one again once you've fixed whatever rejected it.
  15. 23 سبتمبر 2026

    Test keys

    • إضافةA dk_test_… key reads the same live data as a live key, under a fixed allowance of 1,000 units a month at 30 units a minute, 25 results a page and 250 deep. Create one on the API keys page; an organization can hold three, and they don't count against the live-key limit your plan sets.
    • إضافةTest usage is metered against its own counters, so a test key left running in CI cannot eat the quota your production integration depends on, and it never appears in usage or billing. Overage is off on a test key whatever your plan allows, so it can't generate a charge.
    • تغييرA test key reaches the same APIs your plan does — a sandbox that answered 403 where production answers 200 would send you debugging the wrong thing. It cannot reach /v1/organization, which still needs an admin key.
  16. 23 سبتمبر 2026

    Read your own limits, and your own request log

    • إضافةGET /limits returns the plan, rate limit, monthly quota, page size and paging depth that apply to the key making the call, and the APIs that key can reach. It costs no units and is on every plan. GET /organization has carried the same numbers all along, but it takes an admin key and admin keys are owners-only — so a running service had no way to ask what its own page size was, and found out by requesting too many and reading the 400. Read this at start-up instead of hard-coding a page size, and the same code works on every plan.
    • إضافةGET /organization/request-logs returns the calls your organization made, newest first, within your retention window. Filter by key_id, route, status or a time range — or by request_id to look up one call, which ignores every other filter. Until now the log existed but only the dashboard could read it, so answering "my job got a 400 at 03:00, what was wrong with it" meant a person opening a web page.
    • إضافةFailed calls now record the message and the parameter at fault alongside the error code, so the log can say *which* value was rejected rather than only that something was. Both follow the same privacy switch as request parameters and IP addresses: organizations that turn off request details get neither.
  17. 23 سبتمبر 2026

    Listing and Pagination are named schemas

    • تغييرListing and Pagination are defined once under components.schemas and referenced, instead of being written out in full in every response that returns them. Nothing about the responses changes — the same fields, in the same shape — but a client generated from the spec now gets a named Listing type rather than an anonymous inline one repeated per endpoint, and the document is 61% smaller (750 KB to 295 KB), which is most of a second off loading the reference.
    • إصلاحThe three copies of the pagination schema had already drifted apart in their wording; there is now one.
  18. 23 سبتمبر 2026

    Filters that didn't do what they said

    • إضافةA path that exists, called with a method it doesn't take, now returns 405 method_not_allowed in the usual error shape with an Allow header naming the methods that work. POST /v1/listings used to get an empty 405 from the framework — no body, no request_id. A CORS preflight to any endpoint now gets a 204 rather than HTML.
    • إصلاحq is documented as matching the advertiser's title and description, which is what it has always done — it was described as matching headline, a field Darak composes for the response and never searches. Its query syntax is documented too: several words must all appear, "a quoted phrase" matches whole, and | means either.
    • إصلاحThe docs claimed GET /listings/{id} and /listings/batch return any live listing. They don't: a listing is served once Darak has copied its photos to its own CDN, so a photo-less listing is a 404 and comes back in missing_ids. Land is exempt, being routinely advertised without photos. What those endpoints actually skip is the quality filter, so they return listings search won't.
    • إصلاحadvertiser.type showed company as its example — a value the column never holds. It returns the source's own wording (agency, developer, individual_owner and so on); company and individual are what the *filter* takes, grouping those, so a response value can't be passed straight back as a filter.
    • تغييرThe quality filter is described accurately: per-tier price fences from the median and MAD of log price, with bedroom and area caps and a floor at 30% of the neighborhood median. The coverage page had been calling it winsorized percentiles, which it was until March 2026 and hasn't been since.
    • تغييرEight filters had no description at all (beds_min, beds_max, bathrooms_min, bathrooms_max, price_max, area_max, furnished, days_on_market_max), and four described behaviour loosely enough to mislead: beds is exact at every value including 5 (darak.app treats 5 as five-or-more); floor=ground and floor=upper don't partition, since a listing with no stated floor is in neither; verified=false includes listings the source said nothing about; neighborhood_id_exclude keeps listings with no neighborhood while neighborhood_id drops them; and a misspelled source narrows to nothing rather than erroring.
  19. 23 سبتمبر 2026

    The guide has its own pages, and says what your plan allows

    • إضافةThe written guide is now at [platform.darak.app/docs/guides](https://platform.darak.app/docs/guides/quickstart) — quickstart, authentication, limits, pagination, retrying, errors, data notes, versioning and terms, one page each. The same text still opens the API reference, so there is one copy of it; the pages just have room for tables and are readable without JavaScript.
    • إضافةEvery plan's limits are published: units per minute, units per month, page size, **paging depth** and active keys, for Free, Starter, Growth and Pro. Paging depth in particular appeared nowhere except Pro's, so there was no way to size a sync without hitting result_window_exceeded in production.
    • تغييرdoc_url in an error body now links to that specific code — …/docs/guides/errors#invalid-cursor — rather than to the whole errors section.
    • إضافةAuthentication documents the two key kinds and what each reaches, how to store a key, and OAuth access tokens: what they can do, and which organization they act for when someone belongs to several.
    • إضافةTerms now states in the docs the four rules that shape how you build: storage is capped at 30 days from retrieval, delisted listings come down within 7 days, takedowns are 3 business days, and attribution is required where you display data. They were only in the terms of use, one link away from the sync recipe that makes a local copy.
    • إضافةThe quickstart links the OpenAPI document, both SDKs, the changelog feed, the status page and an address to write to with a request_id.
  20. 23 سبتمبر 2026

    The reference now describes what the API actually sends

    • إصلاحThe Administration endpoints are documented as taking an admin key (dk_admin_…). The spec declared a single dk_live_… scheme for everything, so a client generated from it failed every Administration call with nothing in the reference to explain why.
    • إضافةEvery endpoint shows an example response, built from the schema so it can never describe a shape the API doesn't return. Nullable fields with nothing characteristic to show appear as null rather than invented values.
    • إصلاحTimestamps are marked format: date-time. They have always been ISO 8601 in UTC, but nothing said so, so generated clients typed them as plain strings.
    • إصلاحThe documented response headers match the ones sent: X-Request-Units, X-Quota-Limit and X-Quota-Reset were missing, Retry-After was described only in prose, and the Deprecation, Sunset and Link headers a deprecated endpoint sends were undocumented. Administration endpoints no longer list rate-limit headers, which they never sent — they are unmetered.
    • إضافةEach section of the reference now says what it covers and which plan reaches it, and the spec links the terms of use.
  21. 23 سبتمبر 2026

    Pagination cursors are signed

    • تغييرCursors now carry a signature, so the API accepts only cursors it issued. **Cursors issued before this change no longer work** and return 400 invalid_cursor; a paging loop that was mid-query when this shipped starts again from its first page. Nothing else changes: keep passing next_cursor back exactly as you received it.
    • تغييرA malformed, edited or mismatched cursor now reports invalid_cursor rather than the generic invalid_value. It still arrives as a 400 with param: "cursor".
    • إصلاحA cursor's contents could previously be edited to page to any offset, which sidestepped the paging depth your plan allows. Cursors have always been documented as opaque values to pass back unchanged, and that is now enforced rather than assumed — which also means their contents can change when pagination does, without breaking anyone.
  22. 23 سبتمبر 2026

    Idempotency keys, and conflicts that say so

    • إضافةPOST endpoints accept an Idempotency-Key header. Send the same key with the same body and you get the first call's response back — marked Idempotent-Replay: true — instead of the work happening twice. A key reused with a different body is rejected with 409 idempotency_key_reuse. This makes POST /organization/keys safe to retry: before it, a request that timed out after the key was created minted a second key on retry, and its secret was only ever shown once. Keys are remembered for 24 hours.
    • إصلاحCreating keys faster than the hourly limit allows now returns 429 rate_limited with a Retry-After header. It used to return 400 limit_reached with no wait hint, so a caller that should have backed off read it as a permanent bad request.
    • تغييرRequests that clash with the current state of an organization — the active-key limit, the project limit, a name already taken — now return 409 with a conflict-type error naming which limit (key_limit, project_limit, name_taken), instead of a single 400 limit_reached. Only /v1/organization endpoints are affected.
    • إضافةinvalid_cursor distinguishes a malformed or mismatched cursor from other bad values; it used to report as invalid_value.
    • تغييرThe errors section of these docs now explains every code — what it means, whether retrying helps, and what to do — rather than listing code names. Notably rate_limited (wait seconds) and monthly_quota_exceeded (wait for the next UTC month) no longer read as the same instruction.
    • إصلاحA request to an unknown /v1 path now returns the X-Request-Id header as well as request_id in the body, and a CORS preflight to one gets a JSON-shaped answer instead of HTML.
  23. 23 سبتمبر 2026

    Broker listings endpoint removed

    • إزالةPOST /broker-listings and the brokers scope are removed. The endpoint returned advertisers' names and phone numbers, which Darak no longer shares outside the listing page, and no client had called it.
  24. 23 سبتمبر 2026

    Sign in with OAuth, as well as an API key

    • إضافةAuthorization: Bearer now accepts an OAuth access token as well as an API key. Tokens are issued by platform.darak.app, last an hour, and act for the person who granted them, so a tool can read data on their behalf without ever holding a key. API keys are unchanged and remain the way a server, script or scheduled job authenticates.
    • تغييرAn OAuth token can read listings, market data, analytics, projects and reference data. It cannot submit broker listings or manage an organization, whatever the plan allows — those need a key.
  25. 23 سبتمبر 2026

    Project filters, and enums for all of them

    • إضافةGET /projects and GET /project-units accept features and banks (a project must have all the ids you ask for), and /project-units accepts bathrooms and bathrooms_min.
    • إضافةGET /enums now lists amenities, project_features, project_banks and advertiser_types, so every enumerated filter has a source of truth.
    • تغييرadvertiser_type on GET /listings takes company or individual. The underlying column holds eight source-specific values, so these two group them; an intermediary who does not say whether they are a firm or a person matches neither.
  26. 23 سبتمبر 2026

    sort=recommended

    • إضافةGET /listings accepts sort=recommended, the ranking darak.app itself defaults to: 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 of the page. 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 keep using sort=updated_asc with updated_since to sync. The default sort is unchanged (newest).
  27. 23 سبتمبر 2026

    The rest of the listing filters

    • إضافةGET /listings and GET /listings/count accept q (free text over the headline and description), amenities and amenities_exclude, floor, verified, advertiser_type, compound and in_compound, max_age, rent_frequency, source_exclude, neighborhood_id_exclude, livings_min, days_on_market_min/days_on_market_max, and bathrooms/bathrooms_max alongside the existing bathrooms_min. These have always been part of darak.app's own search; they were simply never exposed here.
    • تغييرbathrooms is an exact number and livings_min is a minimum, each said explicitly rather than by convention — the same way beds is exact and beds_min is a minimum. No existing parameter changed meaning.
  28. 22 سبتمبر 2026

    New plans, and units priced by results

    • تغييرList endpoints now cost 1 unit per 25 results asked for with limit (up to your plan's page size), and listing batch 1 unit per 25 ids. A request for 25 results still costs 1 unit. Analytics endpoints cost 2–5 units. Each endpoint's cost is x-units in the reference, and every response's X-Request-Units header.
    • إضافةA Growth plan (200,000 units a month, analytics included). Pro now includes 750,000 units a month and paging up to 20,000 results. Plans can be paid yearly (2 months free) and in SAR or USD.
    • إضافةGET /listings/{id}/price-history returns history_window_days: the Free plan sees the last 90 days of price changes, paid plans the full history.
  29. 22 سبتمبر 2026

    Market data, analytics and off-plan projects

    • إضافةMarket data (Starter and up): GET /market/summary, /market/price-distribution, /market/area-distribution, /market/supply, /market/vacancy and /market/neighborhoods. Every figure uses one sample: live listings updated in the last 30 days, with the same outlier filter as darak.app, and each response states its window.
    • إضافةAnalytics: GET /listings/{id}/comparables, /listings/{id}/market-position, /market/deals, /market/rental-yield, /market/trends (monthly medians from real listing history since March 2026) and /market/neighborhoods/compare.
    • إضافةOff-plan projects: GET /projects, /projects/{id}, /projects/{id}/units, /project-units and /developers.
    • إضافةError codes neighborhood_not_found and project_not_found (404).
  30. 22 سبتمبر 2026

    Listing headlines

    • إضافةListings have a headline: a short English description built from their fields (for example "3-bedroom apartment for rent in Al Malqa, Riyadh"), always present. title is still the advertiser's own title and is null for sources that don't have one.
  31. 22 سبتمبر 2026

    Self-serve plans and spend caps

    • إضافةSubscribe to Starter or Pro from the dashboard, paying monthly by card in SAR. Past the monthly quota, requests keep working and are billed per 1,000 units, up to a monthly spend cap you set on the Billing page.
    • إضافةError code 429 spend_cap_reached: this month's extra usage reached your spend cap. Raise the cap, or wait for the quota to reset on the 1st.
  32. 21 سبتمبر 2026

    Admin API

    • إضافةAdmin keys (dk_admin_…), created by owners in the dashboard, manage your organization from code: GET /organization, GET/POST /organization/keys, POST /organization/keys/{key_id}/revoke, GET /organization/projects, /organization/usage, /organization/members and /organization/audit-events. Admin calls aren't metered.
    • إضافةError codes admin_key_required and admin_key_not_allowed (admin and data keys each call only their own endpoints), plus forbidden_action and limit_reached for admin API requests your role or plan doesn't allow.
  33. 21 سبتمبر 2026

    Restricted keys, key expiry and project caps

    • إضافةKeys can be limited to some APIs. Calls outside them fail with 403 scope_not_in_key.
    • إضافةProjects can have a monthly unit cap. Past it, that project's keys get 429 project_cap_exceeded until the 1st.
    • تغييرAn expired key now gets 401 expired_api_key (it used to get revoked_api_key). Revoked keys are unchanged.
  34. 21 سبتمبر 2026

    Listings endpoints

    • إضافةGET /listings, GET /listings/count, GET /listings/batch, GET /listings/{id} and GET /listings/{id}/price-history.
    • إضافةSync a copy with sort=updated_asc and updated_since. Paging depth per query depends on your plan (result_window_reached).
    • إضافةListings carry financing details where the source publishes them: rent-now-pay-later, bank financing and landlord payment plans.
  35. 21 سبتمبر 2026

    Darak API v1

    • إضافةAPI keys, plans with rate limits and monthly quotas, and the RateLimit-* and X-Quota-* headers.
    • إضافةReference data: GET /cities, GET /cities/{city}/neighborhoods, GET /cities/{city}/directions and GET /enums.
    • إضافةBroker listings for enterprise plans: POST /broker-listings.