# NHC Saudi Housing Projects Scraper: Prices & Availability (`automatic/nhc-saudi-projects`) Actor

Scrape NHC's Saudi housing project catalogue: developer, city and ISO region code, unit count, project area, sales availability and starting prices in SAR where published. Schedule daily runs to get only new or changed projects, price and availability included. $3 per 1,000 projects.

- **URL**: https://apify.com/automatic/nhc-saudi-projects.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 housing projects

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## NHC Saudi Housing Project Catalog

**Explore NHC's Saudi housing projects by city, developer and project scale.** Bring published project information into your market research, developer shortlists and business reports, with direct links for follow-up.

Focus on a city or keyword, compare the projects that matter to you, and export the results as **Excel, CSV or JSON**.

### Project data for your next decision

- **Project names and links** to keep your research connected to each NHC project.
- **Cities, regions and ISO region codes** for geographic comparisons and joins.
- **Developers, housing unit counts and project areas** to compare the published scale of developments.
- **Sales availability labels and starting home prices in SAR**, when published.
- **Descriptions and brochure links**, where available.
- **Observation dates** to organize and compare your exports over time.

### Join keys for your CRM or data model

| Field | What it is |
| --- | --- |
| `projectId` | NHC's own project number; stable across runs. Use it as the deduplication and change key. |
| `projectUrl` | The official NHC project page, for follow-up and verification. |
| `cityId` | NHC's city identifier used by the catalog filter. |
| `city`, `region` | Published city and its catalogue region. |
| `regionCode` | ISO 3166-2:SA code of the published region, for example `SA-04` for the Eastern Region. |
| `countryCode` | ISO 3166-1 alpha-2 country code (`SA`). |
| `developer` | Published developer name. NHC does not publish developer commercial-registration or VAT numbers. |

If you need a developer's commercial registration, join this export to a commercial-registry source on the developer name and city.

### Built for housing research

**Market researchers:** compare NHC project coverage and housing capacity across Saudi cities.

**Business development teams:** create focused project and developer shortlists for follow-up.

**Property-data teams:** add NHC project references to spreadsheets, reports and internal catalogs, with ISO codes that join to your own geography tables.

### Follow only new or changed projects

Turn on **Only new or changed projects** for a monitoring feed:

- The first run for a filter set returns everything it examines and says `firstRun: true` in the run summary.
- Later runs return only projects that are new, or whose published price, availability, units, area, developer or description changed. Each row says `changeType` (`new` or `changed`) and lists the `changedFields`.
- Set the same **Saved state name** if you want the same feed to continue after changing the project limit.

Use it with a daily schedule and a city filter to follow NHC's releases and price changes without re-reading the same catalogue each day.

### Quick start

1. Leave the defaults and press **Start** to collect **10 projects** with full details.
2. Add a city (Riyadh, Jeddah, Dammam, Tabuk and the other catalog cities) or a keyword to narrow the selection.
3. Turn off **Include project details** when you only need the catalog-level fields, for a faster and cheaper run.
4. Export the dataset to Excel, CSV or JSON.

### Example result

```json
{
  "projectId": "47576",
  "projectUrl": "https://www.nhc.sa/en/real-estate-development/projects/47576/",
  "name": "Saraya Alsharq",
  "city": "Dammam",
  "region": "Eastern Region",
  "regionCode": "SA-04",
  "cityId": "14",
  "country": "Saudi Arabia",
  "countryCode": "SA",
  "developer": "Dar Wa Emaar",
  "unitCount": 616,
  "areaM2": 161860,
  "availability": "available",
  "startingPrice": 1014989,
  "priceCurrency": "SAR",
  "startingPriceText": "1,014,989 SAR",
  "description": "The “Saraya Al Sharq” project features 616 residential units ...",
  "brochureUrl": "https://ruh-s3.bluvalt.com/api-nhc.sa/s3fs-public/2025-05/Saraya-Alsharq2-Brochure-2.2_compressed%20%281%29.pdf",
  "detailsStatus": "included",
  "detailIssues": [],
  "capturedAt": "2026-11-10T05:30:00+00:00",
  "source": "NHC"
}
```

### Simple pricing

**$0.003 per project — $3 per 1,000 results.** Available project details are included, with no start fee or separate detail surcharge.

An export of 10 projects costs **$0.03**; 25 projects cost **$0.075**; 100 projects cost **$0.30**. Projects delivered in a later export are charged again, but with **Only new or changed projects** a later run charges only for rows that actually changed. See the Pricing tab for current charges.

### Coverage

This product covers **NHC's housing-project catalog**, rather than all Saudi developments or individual homes. Available information varies by project and can change over time.

Sales availability describes housing sales, not construction progress. Starting prices concern homes, not total project budgets. Contractor contacts, construction stages and handover dates are outside this product's scope.

### FAQ

**Does it include every Saudi housing project?** No. It covers NHC's own catalog only. Other developers' projects need a different source.

**Why is a starting price missing?** NHC publishes prices for only some projects. An empty price means the project page does not state one, not that the Actor failed.

**What does `availability` mean?** It is NHC's own sales label (for example "available"). It is not a construction stage or a handover date.

**Can I get the developer's commercial registration?** No. NHC publishes the developer name only. Join to a registry source if you need CR or VAT data.

**What happens if a project page changes?** The run fails with a clear message rather than submitting an incomplete catalog. Rows already delivered are kept.

**How do I follow changes?** Use **Only new or changed projects** with a daily schedule. The first run returns the selection; later runs return only new or changed projects and name the changed fields.

Independently maintained; not affiliated with or endorsed by NHC.

# Actor input Schema

## `maxItems` (type: `integer`):

Maximum unique matching NHC projects examined in one run. The run's charge limit can reduce this. With Only new or changed projects on, projects that did not change are skipped without using this limit.

## `city` (type: `string`):

City name from the current NHC catalog, such as Riyadh, Jeddah, Dammam or Tabuk. Empty includes all cities.

## `keyword` (type: `string`):

Matches the project name, city, region or catalog description. Not developer names or brochure text.

## `includeDetails` (type: `boolean`):

Include developer, units, area, availability and starting price when the project page provides them.

## `maxRunSeconds` (type: `integer`):

Total source collection deadline. Exhausting it fails the run without submitting an incomplete dataset.

## `onlyNewSinceLastRun` (type: `boolean`):

Return only projects not delivered before, or whose published details changed (price, availability, units, area, developer, description). Use it on a daily schedule to follow NHC's catalog; the first run with a filter set returns everything it examines.

## `stateKey` (type: `string`):

Name of the saved list of already-delivered projects for this filter set. Leave empty to derive it from the city and keyword filters. Set the same name to continue a feed after changing maxItems.

## Actor input object example

```json
{
  "maxItems": 10,
  "city": "",
  "keyword": "",
  "includeDetails": true,
  "maxRunSeconds": 240,
  "onlyNewSinceLastRun": false,
  "stateKey": ""
}
```

# Actor output Schema

## `projects` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/nhc-saudi-projects").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("automatic/nhc-saudi-projects").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call automatic/nhc-saudi-projects --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automatic/nhc-saudi-projects"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dYPINrgxqYjIjdhfq/builds/FC4aLDC7Qnwbi33s4/openapi.json
