Singapore BCA Registered Contractors Scraper (CRS Directory) avatar

Singapore BCA Registered Contractors Scraper (CRS Directory)

Pricing

from $9.23 / 1,000 results

Go to Apify Store
Singapore BCA Registered Contractors Scraper (CRS Directory)

Singapore BCA Registered Contractors Scraper (CRS Directory)

Scrape the Singapore BCA CRS registered contractors directory with no API key. Get company name, UEN, address, postal code, phone, fax, workhead, grade, tendering limit, registration expiry and the full registration profile. Build construction leads and KYB data. Export to JSON, CSV or Excel.

Pricing

from $9.23 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Share

Singapore BCA Registered Contractors Scraper

Singapore BCA Registered Contractors Scraper (CRS Directory)

Scrape the Singapore BCA (Building and Construction Authority) registered contractors directory, the official CRS (Contractors Registration System) register, with no API key. Turn the BCA contractor directory into clean construction leads and KYB data: company name, UEN, address, contacts, every workhead and grade, tendering limit, and registration expiry.

Here is one real result, with every field the actor returns:

{
"companyName": "BHCC CONSTRUCTION PTE. LTD.",
"uen": "200311975W",
"workhead": "CW01",
"workheadDescription": "General Building",
"grade": "A1",
"tenderingLimit": "Unlimited",
"registrationExpiry": "01/07/2028",
"registrationStatus": "Active",
"registrations": [
{ "workhead": "CR13", "workheadDescription": "Waterproofing Installation", "grade": "L2", "tenderingLimit": "S$1.6 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "CW01", "workheadDescription": "General Building", "grade": "A1", "tenderingLimit": "Unlimited", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "CW02", "workheadDescription": "Civil Engineering", "grade": "B1", "tenderingLimit": "S$50 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "ME01", "workheadDescription": "Air-Conditioning, Refrigeration & Ventilation Works", "grade": "L4", "tenderingLimit": "S$8 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "ME05", "workheadDescription": "Electrical Engineering", "grade": "L5", "tenderingLimit": "S$16 million", "expiry": "01/07/2028", "status": "Active" }
],
"builderLicences": [
{ "code": "GB1", "description": "General Builder Class 1", "expiry": "16/06/2027", "status": "Active" }
],
"address": "1 TAMPINES NORTH DRIVE 3 #08-01 BHCC SPACE SINGAPORE 528499",
"postalCode": "528499",
"phone": "66594666",
"fax": "66594555",
"companyUrl": "https://www.bca.gov.sg/eBACS/BCA_DIRECTORY/Company/CompanyDetails?uenNo=200311975W",
"licenceType": "Registered Contractor",
"source": "Singapore BCA Contractors Directory",
"observedAt": "2026-08-15T10:02:38.180Z"
}

The most complete Singapore BCA registered contractors scraper available. It returns every field the BCA public contractor directory exposes for each company, plus the company's full registration profile (every workhead, grade, tendering limit and expiry it holds) and any Licensed Builder licences, and gives you five filters to target exactly the contractors you need. No API key, no account on BCA, no browser extension.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor reads the Singapore Building and Construction Authority (BCA) public directory of registered contractors (the CRS, or Contractors Registration System), discovers the live list of workheads and grades, paginates through every matching company, and writes one normalized record per company and workhead to the run's dataset. Company name, UEN (Unique Entity Number), address, postal code, phone, fax, workhead, grade and tendering limit come straight from the listing. When you enable withDetails, the actor opens each company page to add the registration expiry, an active or expired status, the company's complete registration profile (every workhead, grade, tendering limit and expiry it holds), and any Licensed Builder licences.

The workhead and grade catalogue is discovered live from the directory, so new workheads are picked up automatically. Data covers Singapore registered contractors only.

Use cases

  • Construction lead generation in Singapore. Build a targeted list of contractors by trade (workhead) and capacity (grade), with phone, fax and address ready for outreach.
  • KYB and supplier due diligence. Verify a firm's UEN, registration status, grades and expiry dates before onboarding a subcontractor or supplier.
  • Tender and procurement screening. Filter contractors by tendering limit to find firms eligible to bid on a project of a given contract value.
  • Market and competitor mapping. Export whole workheads (for example every A1 General Building contractor) to size a market or track competitors.
  • UEN lookup and enrichment. Resolve a company name to its UEN, address and BCA registration profile.

How this compares

CapabilityThis actorOther BCA / SG contractor scrapers
No API key or BCA accountYesVaries
Filter by workhead (trade)YesUsually no (dump only)
Filter by gradeYesNo
Company name searchYesNo
UEN per recordYesSometimes
Phone and faxYesSometimes
Full multi-workhead profile per companyYesRare
Tendering limit per gradeYesNo
Licensed Builder licencesYesSeparate actor
Active / expired statusYesNo
Pay per result, no charge on failureYesVaries

We accept every input a directory-dump scraper accepts (that is, none required) and return every field they return, plus workhead and grade filters, a name search, the full registration profile, per-grade tendering limits, builder licences and status.

Quickstart

Open the actor, paste this into the input, and press Run. It returns up to 5 General Building (CW01) grade A1 contractors with their full registration profile.

{
"workheads": ["CW01"],
"grades": ["A1"],
"withDetails": true,
"maxContractors": 5
}

Leave workheads empty to scrape every registered-contractor workhead, and leave grades empty to include every grade for each workhead. Every input field is optional; with an empty input the actor collects every registered-contractor workhead and grade.

Input reference

FieldTypeRequiredDefaultDescription
maxContractorsintegerno10Maximum number of contractor records to collect. Leave high to pull everything for the selected workheads and grades.
workheadsstring[]no["CW01"]Workhead codes to collect, for example CW01 (General Building), CW02 (Civil Engineering), ME05 (Electrical Engineering). Leave empty to scrape every registered-contractor workhead (CW, CR, ME, RW, TR).
gradesstring[]no(all)Grades to keep, for example A1, A2, B1, B2, C1, C2, C3 for construction workheads, or L1 to L6 for construction-related and M&E workheads. Leave empty to include every grade available for each selected workhead.
withDetailsbooleannofalseOpen each company page to add the registration expiry date, active or expired status, the full registration profile (with per-grade tendering limits) and any Licensed Builder licences. Slower, and billed as a details add-on per enriched record. Paid add-on: skipped on free Apify plans. Contact fields, workhead, grade and tendering limit are collected without it.
nameQuerystringno(empty)Only return contractors whose company name contains this text (case-insensitive), for example engineering or a specific firm name.
proxyConfigurationobjectno(none)Standard Apify proxy configuration. Optional; enable Apify Residential proxy (country SG) if results come back empty.

Filters combine with logical AND. If you pass no filters, the actor collects every registered-contractor workhead and grade in the directory.

Output reference

One dataset item per company and workhead. Types: string, object[], or null when the source value is absent (or when withDetails is off for the enrichment fields).

FieldTypeDescription
companyNamestringRegistered company name.
uenstringUnique Entity Number (UEN) of the company.
workheadstringWorkhead code the company is listed under for this record, for example CW01.
workheadDescriptionstringHuman-readable workhead title, for example General Building.
gradestringGrade held for this workhead, for example A1. null for single-grade workheads.
tenderingLimitstringBCA CRS public-sector tendering limit for this grade, for example Unlimited, S$50 million or S$0.8 million (BCA published schedule, validity period through 30 Jun 2027). null for single-grade or ungraded workheads.
registrationExpirystringRegistration expiry date for this workhead (DD/MM/YYYY). Populated only when withDetails is enabled, otherwise null.
registrationStatusstringActive or Expired, derived from registrationExpiry. null when withDetails is off.
registrationsobject[]The company's complete registration profile: every workhead, description, grade, tendering limit, expiry and status it holds. null when withDetails is off.
builderLicencesobject[]Any Licensed Builder licences the company holds (code, description, expiry, status). null when withDetails is off or none are held.
addressstringFull registered address including postal code.
postalCodestringSingapore postal code parsed from the address.
phonestringContact phone number.
faxstringContact fax number.
companyUrlstringDirect link to the company's BCA directory profile page.
licenceTypestringRegistration type. Always Registered Contractor for this actor.
sourcestringData source label. Always Singapore BCA Contractors Directory.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringPresent only on a failed run: a single item with a populated error field is written instead of results.

Example output record

Real record from a live run (input {"workheads":["CW01"],"grades":["A1"],"withDetails":true,"maxContractors":5}):

{
"companyName": "BHCC CONSTRUCTION PTE. LTD.",
"uen": "200311975W",
"workhead": "CW01",
"workheadDescription": "General Building",
"grade": "A1",
"tenderingLimit": "Unlimited",
"registrationExpiry": "01/07/2028",
"registrationStatus": "Active",
"registrations": [
{ "workhead": "CR13", "workheadDescription": "Waterproofing Installation", "grade": "L2", "tenderingLimit": "S$1.6 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "CW01", "workheadDescription": "General Building", "grade": "A1", "tenderingLimit": "Unlimited", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "CW02", "workheadDescription": "Civil Engineering", "grade": "B1", "tenderingLimit": "S$50 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "ME01", "workheadDescription": "Air-Conditioning, Refrigeration & Ventilation Works", "grade": "L4", "tenderingLimit": "S$8 million", "expiry": "01/07/2028", "status": "Active" },
{ "workhead": "ME05", "workheadDescription": "Electrical Engineering", "grade": "L5", "tenderingLimit": "S$16 million", "expiry": "01/07/2028", "status": "Active" }
],
"builderLicences": [
{ "code": "GB1", "description": "General Builder Class 1", "expiry": "16/06/2027", "status": "Active" }
],
"address": "1 TAMPINES NORTH DRIVE 3 #08-01 BHCC SPACE SINGAPORE 528499",
"postalCode": "528499",
"phone": "66594666",
"fax": "66594555",
"companyUrl": "https://www.bca.gov.sg/eBACS/BCA_DIRECTORY/Company/CompanyDetails?uenNo=200311975W",
"licenceType": "Registered Contractor",
"source": "Singapore BCA Contractors Directory",
"observedAt": "2026-08-15T10:02:38.180Z"
}

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-bca-contractors-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"workheads":["CW01"],"grades":["A1"],"withDetails":true,"maxContractors":25}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~singapore-bca-contractors-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"workheads":["ME05"],"maxContractors":100}'

Apify CLI:

apify call scrapers_lat/singapore-bca-contractors-scraper \
--input '{"workheads":["CW01"],"withDetails":true}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per record returned (result event). See the pricing tab for the current per-result price.
  • Optional details add-on. When withDetails is enabled, each record that receives company-profile enrichment (registrations or builder licences) is billed one additional details event. Listing-only records are not charged the add-on.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 records per run. Upgrade for higher maxContractors.

FAQ and troubleshooting

A run returned 0 records. Why? The workhead or grade combination matched nothing, or the directory was temporarily unavailable. Remove grades to include every grade, check the workhead code, or enable proxyConfiguration with Apify Residential proxy (country SG). Zero-result runs are not charged.

How do I get the registration expiry and full profile? Set withDetails to true. The actor then opens each company page and fills registrationExpiry, registrationStatus, registrations, and builderLicences.

What is a workhead? A BCA registration category, for example CW01 (General Building) or ME05 (Electrical Engineering). Companies hold one or more workheads, each at a specific grade.

What is the tendering limit? The maximum value of a public-sector contract a firm may tender for at that grade, from BCA's published CRS tendering-limit schedule (for example grade A1 is Unlimited, B1 is S$50 million, C3 is S$0.8 million). It is included for every graded workhead, even without withDetails.

Do I need an API key or a BCA account? No. The actor reads the public BCA contractor directory directly. There is no API key, login, or BCA account to set up.

Can I look up a company by UEN or name? Every record includes the company UEN, and nameQuery lets you filter by company name. To resolve a specific firm, search its name and read the UEN, address and registration profile from the result.

Why is registrationExpiry null? You ran without withDetails. Contact and listing fields are always returned; the expiry and profile fields require the company-page fetch enabled by withDetails.

Can I search for one firm? Yes. Use nameQuery with part of the company name (case-insensitive) to keep only matching contractors.

Is this an official BCA tool? No. This actor is independent and has no affiliation with the Building and Construction Authority. It reads only data that is publicly available through the BCA contractor directory.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with the Building and Construction Authority (BCA). Accesses only publicly available BCA contractor directory data.