# Israel Registered Contractors (פנקס הקבלנים) – lookup & changes (`signalrows/israel-contractors-registry`) Actor

Registered contractors from Israel's Registrar of Contractors (פנקס הקבלנים) via the official data.gov.il open-data API: licence branches, classifications (ג1-ג5), scope limits, status, city; companies only by default; lookup, search and change monitoring. Open licence, attribution included.

- **URL**: https://apify.com/signalrows/israel-contractors-registry.md
- **Developed by:** [Signalrows Studio](https://apify.com/signalrows) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 record extracteds

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

## Israel Registered Contractors (פנקס הקבלנים): lookup, search & change monitoring

Get **Israel's Registrar of Contractors** (פנקס הקבלנים הרשומים, Ministry of Construction and Housing / משרד הבינוי והשיכון) as clean, structured JSON from the **official data.gov.il open-data API**: contractor licence number, registered name, company vs. individual, every **branch (ענף) with its classification (סיווג, e.g. ג5)**, maximum project scope, registration and classification dates, restrictions (suspended / frozen / no new works), recognition for government works, city and business phone. **Look up** a contractor by licence or company number, **search** by name, branch, classification or city, or **monitor** the registry for classification upgrades/downgrades, suspensions and removals. Public, non-personal data only: **by default the output contains registered companies only** (legal entities with a company number, ח.פ.); contractors registered as individuals are included only if you opt in (`includeIndividuals`), and their phone, e-mail and address are never returned. Runs in one click with sensible defaults, and every record carries its source URL, fetch time and licence attribution.

### What you get

One record per registered contractor. By default that is the **~8.9k registered companies**; with `includeIndividuals: true` all 17.9k contractors (24k contractor x branch rows in the source, refreshed weekly by the ministry; see `updatedAt`).

| Field | Type | Example |
|---|---|---|
| `contractorId` | string | `"38094"` (מספר קבלן, the licence number) |
| `entityId` | string | null | `"514697309"` (company number ח.פ.; `null` only for individuals, opt-in) |
| `name` | string | `"מ מ אורסקו בע\"מ"` (name as registered) |
| `legalType` | `company` | `individual` | `"company"` (`individual` only with `includeIndividuals: true`) |
| `branches[]` | array | see below |
| `city` | string | null | `"ירושלים"` |
| `phone` | string | null | `"052-6303864"` (companies only, as registered) |
| `registeredAt` | date | `"2016-05-01"` (earliest branch registration) |
| `status` | `active` | `restricted` | `removed` | `"active"` (`restricted` = at least one branch carries a restriction) |
| `govRecognized` | boolean | `true` when recognized for government works in any branch (קבלן מוכר) |
| `updatedAt` | date | `"2026-08-17"` (dataset resource last modified) |
| `changeType` | enum | null | `new` · `classification-changed` · `status-changed` · `removed` (monitor mode; `null` otherwise) |
| `maskedFields` | string\[] | `["phone"]` — fields withheld for privacy on this record |
| `url`, `license`, `licenseUrl`, `attribution` | provenance | dataset page, licence name, licence URL, credit line |
| `source_url`, `fetched_at`, `actor_version` | provenance | reproducible API query for this contractor, fetch time, build |

Each branch (`branches[]`): `code` (`"100"`), `name` (`"בניה"`), `group` (`א`/`ב`/`ג`), `level` (`1`-`5` or `ק`), `classification` (`"ג5"`), `maxScopeILS` (maximum scope per site in ILS; `null` when unlimited), `unlimitedScope` (`ב.מ.`), `classifiedAt`, `registeredAt`, `status` (`active` · `suspended` · `frozen` · `no-new-work` · `limited`), `note` (restriction text as published), `govRecognizedLevel` (`"5"` = מוכר בסיווג 5), `registrationBasis` (`manager-qualification` · `qualified-employees`).

```json
{
  "contractorId": "40008", "entityId": "510000011", "name": "י.ח. דמרי דוגמה בניה ופיתוח בע\"מ", "legalType": "company",
  "branches": [
    { "code": "100", "name": "בניה", "group": "ג", "level": "5", "classification": "ג5", "maxScopeILS": null, "unlimitedScope": true,
      "classifiedAt": "2026-08-15", "registeredAt": "2026-08-15", "status": "active", "note": null, "govRecognizedLevel": "5", "registrationBasis": "qualified-employees" },
    { "code": "111", "name": "פיתוח חצרות", "group": "א", "level": "1", "classification": "א1", "maxScopeILS": 1948000, "unlimitedScope": false,
      "classifiedAt": "2026-08-15", "registeredAt": "2026-08-15", "status": "active", "note": null, "govRecognizedLevel": null, "registrationBasis": "qualified-employees" }
  ],
  "city": "נתיבות", "phone": "08-9900000", "registeredAt": "2026-08-15", "status": "active", "govRecognized": true,
  "updatedAt": "2026-08-17", "changeType": null, "maskedFields": [],
  "url": "https://data.gov.il/datasets/ministry_of_housing/pinkashakablanim",
  "license": "Data.Gov.il open-data licence (רישיון לשימוש במאגרי המידע באתר Data.Gov.il, updated 30/08/2025)",
  "licenseUrl": "https://data.gov.il/terms-of-use",
  "attribution": "מקור: פנקס הקבלנים הרשומים, משרד הבינוי והשיכון, באמצעות data.gov.il",
  "source_url": "https://data.gov.il/api/3/action/datastore_search?resource_id=4eb61bd6-18cf-4e7c-9f9c-e166dfa0a2d8&limit=100&filters=%7B%22MISPAR_KABLAN%22%3A%2240008%22%7D",
  "fetched_at": "2026-09-24T17:30:00.000Z", "actor_version": "0.1"
}
```

(Example values are synthetic.)

### Who uses it

- **Developers, project managers and procurement teams** verifying that a contractor holds the classification a tender or building permit requires (e.g. "ג5 in בניה"), before signing.
- **Insurers and mortgage banks** checking licence status and scope when underwriting construction projects or construction loans, and getting alerted when a contractor's licence is suspended or downgraded.
- **B2B marketing and sales teams in construction supply** building lists of licensed companies by branch, classification and city (the default output is companies only).
- **Legal and compliance teams, local authorities** monitoring specific contractors for changes.
- **AI agents** via the Apify MCP server: "is contractor 38094 licensed for בניה and at what level?" / "list ג5 building contractors in Beer Sheva".

### Pricing

Pay per result: **$0.003 per contractor** returned in search and lookup mode (event `record-extracted`); **$0.01 per change** in monitor mode (event `change-detected`). No charge for empty runs; unchanged contractors in monitor mode are neither returned nor charged. Set `maxItems` to cap your spend. A default run (200 contractors) costs $0.60 and takes about 10 seconds.

### Input

| Parameter | Default | Notes |
|---|---|---|
| `mode` | `search` | `search` · `lookup` · `monitor` |
| `query` | – | Name substring (Hebrew; quotes and dots ignored), or an exact contractor / company number |
| `branches` | `[]` | Branch codes (`100`) or Hebrew name substrings (`בניה`, `שיפוצים`, `כבישים`, `חשמל`, `מיזוג`, `אינסטלציה`, `גשרים` ...) |
| `classifications` | `[]` | `ג5`, `ג-4`, `5` (any group), `א-ק`. With `branches`, both must hold for the same branch |
| `cities` | `[]` | City substrings as registered (`ירושלים`, `תל אביב`, `באר שבע`) |
| `includeIndividuals` | `false` | Off: registered companies only (contractors without a company number are skipped). On: licensed individuals are returned too (name and licence facts; contact details never) |
| `legalTypes` | `[]` | `company` · `individual` (the latter only with `includeIndividuals`) |
| `ids` | `[]` | Lookup mode: contractor numbers or 9-digit company numbers; numbers not found are listed in `RUN_SUMMARY.not_found` |
| `maxItems` | `200` | Hard cap 5,000. Search results are newest registrations first |
| `maskPersonalIds` | `true` | Keep on unless you have a lawful basis to process personal data (Israeli Privacy Protection Law) |

Branch codes in the registry (32): 100 בניה · 111 פיתוח חצרות · 120 כלונסאות · 130 בטונים ובניית שלדים · 131 שיפוצים · 132 עבודות אבן · 133 דריכת בטון · 134 איטום מבנים · 135 הרחבת מבנים · 140 בניה טרומית · 150 קונסטרוקציות פלדה · 160 חשמלאות ותקשורת במבנים · 170 מיזוג אוויר וקירור · 171 מתקני הסקה · 180 מעליות · 190 אינסטלציה וכיבוי אש · 191 אנרגיה סולרית · 193 בריכות מים · 200 כבישים תשתית ופיתוח · 210 עבודות עפר וחציבה · 220 אספלט · 230 מסועות בטון · 240 קווי תקשורת · 260 קווי מים ביוב וניקוז · 270 קווי חשמל ותאורת כבישים · 280 רמזורים · 300 גשרים · 310 בטון דרוך לגשרים · 320 פלדה לגשרים · 400 נמלים ועבודות ימיות · 500 מערכות אלקטרו-מכניות בתחנות שאיבה · 700 ממגורות מגדלי מים וארובות.

Classification levels: `1`-`5` per group (`5` = unlimited scope, `ב.מ.`), plus `ק` in group א (scope 825k ILS). `maxScopeILS` gives the maximum scope per single site as published by the registrar.

#### Monitor mode

Schedule the actor (daily or weekly) with `mode: "monitor"` and the filters you care about. The first run of a filter combination saves a baseline of fingerprints (branches, classifications, statuses) in a named key-value store in your account (`israel-contractors-registry-state-<hash of filters>`, key `STATE`) and returns nothing. Every later run returns only contractors whose `changeType` is `new` (newly registered or newly matching), `classification-changed` (a branch was added/removed or its level changed), `status-changed` (a restriction appeared or was lifted) or `removed` (no longer in the registry; the record carries the last known name, city and branches). Records cut off by `maxItems` are reported on the next run. Combine with an Apify webhook or the Make/Zapier/n8n integrations for alerts.

### Use from code, Make/Zapier/n8n, or AI agents (MCP)

```bash
## lookup two contractors by number
curl -X POST "https://api.apify.com/v2/acts/signalrows~israel-contractors-registry/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' -d '{"mode": "lookup", "ids": ["38094", "514697309"]}'

## ג5 building contractors (companies) in Beer Sheva
curl -X POST "https://api.apify.com/v2/acts/signalrows~israel-contractors-registry/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"branches": ["100"], "classifications": ["ג5"], "cities": ["באר שבע"], "legalTypes": ["company"], "maxItems": 100}'
```

This actor is also exposed as a tool on the Apify MCP server, so AI agents can call it directly.

### Limits and fair use

- Uses the official, documented data.gov.il CKAN API only (no HTML scraping), strictly sequential at **max 1 request/second**, with an identifying User-Agent and `From` header. A full read of the registry is 6 requests.
- The registry is republished by the ministry roughly weekly; the actor reflects the latest published file (`updatedAt`). For legally binding confirmation consult the registrar's official publications.
- **Data licence and attribution:** data from *פנקס הקבלנים הרשומים, משרד הבינוי והשיכון*, published on data.gov.il under the [Data.Gov.il open-data licence](https://data.gov.il/terms-of-use) (commercial use permitted with attribution). Every record carries the credit line in `attribution`; keep it when you republish. The licence forbids uses that harm a person's privacy, including cross-referencing the data with other sources, and does not cover personal data under the Israeli Privacy Protection Law.
- **Personal data:** the registry also lists licensed individuals. By default they are skipped entirely: the output contains registered companies only. With `includeIndividuals: true` they are returned with their registered name and licence facts only. Phone numbers of individuals, and e-mail addresses, street addresses and names of qualified staff of anyone, are never returned; personal-ID-like numbers are masked by default. Company phone numbers are returned as registered.
- Source structure changes are monitored daily and fixed automatically; if a run fails, please open an issue.

### Data removal / contact

If you are a registered contractor and want your record excluded from this actor's output, or you represent the source, contact signalrows.data@gmail.com. Requests are handled within 24 hours.

### Development notes

- Shared library: `src/shared/tenders/` is a vendored copy of `ventures-src/apify/shared/tenders/` (text normalizer, redaction). Do not edit it here; change the shared folder and run `scripts\sync-shared.cmd`.
- Offline tests: `npm test` (synthetic fixtures in `test/fixtures/`, no real names or numbers). Live smoke test: `set LIVE=1 && npx vitest run test/live.test.ts` (3 requests).
- Local run: `apify run -p` with `storage/key_value_stores/default/INPUT.json`; the run summary is written to the key-value store as `RUN_SUMMARY`.
- Compliance evidence and licence quotes: `COMPLIANCE.md`.

# Actor input Schema

## `mode` (type: `string`):

search = contractors matching the filters, newest registrations first · lookup = the contractors listed in `ids` · monitor = only contractors that are new, changed classification/status or were removed since the previous run with the same filters (state kept in a named key-value store; the first run saves a baseline and returns nothing).

## `query` (type: `string`):

Substring of the registered name (Hebrew, quotes/dots ignored), e.g. "דמרי". All digits = exact contractor number or company number (ח.פ.).

## `branches` (type: `array`):

Branch codes or Hebrew name substrings: 100 בניה · 131 שיפוצים · 130 בטונים ובניית שלדים · 200 כבישים תשתית ופיתוח · 260 קווי מים ביוב וניקוז · 160 חשמלאות ותקשורת במבנים · 170 מיזוג אוויר · 190 אינסטלציה · 300 גשרים ... Empty = all.

## `classifications` (type: `array`):

Group + level, e.g. "ג5", "ג-4", "5" (any group), "א-ק". Combined with `branches`, both must hold for the same branch ("ג5 in בניה"). Empty = all.

## `cities` (type: `array`):

City name substrings as registered (Hebrew), e.g. "ירושלים", "תל אביב", "באר שבע". Empty = all.

## `includeIndividuals` (type: `boolean`):

Off (default): the output contains registered companies only (legal entities with a company number, ח.פ.); contractors registered as individuals are skipped entirely. On: individuals are returned with their registered name and licence facts; their phone, e-mail and address are never returned (`maskedFields` lists what was withheld).

## `legalTypes` (type: `array`):

company = legal entities with a company number (ח.פ.) · individual = licensed individuals (only returned when `includeIndividuals` is on). Empty = both.

## `ids` (type: `array`):

Contractor licence numbers (מספר קבלן, e.g. 6866) or 9-digit company numbers (ח.פ.). Used only when mode = lookup. Numbers not found are listed in the run's RUN\_SUMMARY.

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

Stop after this many contractor records. You are charged per record returned (per change in monitor mode).

## `maskPersonalIds` (type: `boolean`):

Keep on unless you have a lawful basis to process personal data: entity numbers of individuals that look like a personal ID are withheld and free text is redacted. Individuals' phone, e-mail, address and staff names are never returned regardless of this setting.

## Actor input object example

```json
{
  "mode": "search",
  "branches": [],
  "classifications": [],
  "cities": [],
  "includeIndividuals": false,
  "legalTypes": [],
  "ids": [],
  "maxItems": 200,
  "maskPersonalIds": true
}
```

# Actor output Schema

## `results` (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 = {
    "branches": [],
    "classifications": [],
    "cities": [],
    "legalTypes": [],
    "ids": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("signalrows/israel-contractors-registry").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 = {
    "branches": [],
    "classifications": [],
    "cities": [],
    "legalTypes": [],
    "ids": [],
}

# Run the Actor and wait for it to finish
run = client.actor("signalrows/israel-contractors-registry").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 '{
  "branches": [],
  "classifications": [],
  "cities": [],
  "legalTypes": [],
  "ids": []
}' |
apify call signalrows/israel-contractors-registry --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalrows/israel-contractors-registry"
        }
    }
}
```

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/dpArDt7ucmpG0qh2i/builds/alRUhH0XKN7eQfmEX/openapi.json
