Singapore BCA Registered Contractors Scraper avatar

Singapore BCA Registered Contractors Scraper

Pricing

Pay per event

Go to Apify Store
Singapore BCA Registered Contractors Scraper

Singapore BCA Registered Contractors Scraper

Export registered Singapore BCA contractors from data.gov.sg by workhead, grade, UEN, expiry, address, postal code, and phone.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Export registered Singapore Building and Construction Authority (BCA) contractors from the official data.gov.sg dataset. The actor returns one row per company, workhead, and grade registration, including UEN, expiry date, address, postal code, phone number, and source metadata.

Use it when you need a repeatable, API-friendly contractor list for vendor sourcing, compliance checks, procurement enrichment, or market research in Singapore's construction sector.

What does Singapore BCA Registered Contractors Scraper do?

This actor reads the public Listing of Registered Contractors dataset from data.gov.sg and saves normalized contractor records to an Apify dataset.

It supports:

  • ๐Ÿ—๏ธ BCA workhead filtering such as CR06, CW01, ME01, or FM02
  • ๐Ÿ“Š Grade filtering such as L1, L2, C1, or A1
  • ๐Ÿงพ UEN/company registration lookups
  • ๐Ÿข Company name search
  • ๐Ÿ“… Expiry date filtering
  • ๐Ÿ“ Clean address assembly into fullAddress
  • ๐Ÿ” Pagination via offset for larger exports

Who is it for?

Procurement and vendor sourcing teams

Find contractors registered for a specific BCA workhead and grade before inviting bids or issuing RFQs.

Compliance and risk teams

Verify that a contractor appears in the public BCA list, inspect expiry dates, and keep evidence in a structured dataset.

Construction suppliers and distributors

Build lead lists of Singapore contractors by workhead, grade, address, postal code, and phone number.

Data teams

Automate recurring contractor-data snapshots without maintaining CKAN/data.gov.sg API code in-house.

Why use this actor?

The source API is public, but raw records use source-specific field names and require pagination, filters, and normalization. This actor packages those steps into a simple Apify workflow with typed output, charging, examples, and integrations.

Data source

The actor uses Singapore data.gov.sg's public CKAN-style datastore API.

  • Source: data.gov.sg
  • Agency: Building and Construction Authority
  • Dataset: Listing of Registered Contractors
  • Resource ID: d_dcda79be4aded5f9e769b8e23ff69b47
  • Authentication: none required

Output data

Each dataset item represents one BCA contractor registration row.

FieldDescription
companyNameRegistered company name
uenSingapore UEN / registration number
workheadBCA workhead code
gradeBCA grade
additionalInfoSource additional info when present
expiryDateRegistration expiry date as published
buildingNoBuilding number
streetNameStreet name
unitNoUnit number
buildingNameBuilding name
postalCodeSingapore postal code
telephonePublished telephone number
fullAddressNormalized joined address
sourceRecordIdSource _id
sourceDatasetIddata.gov.sg resource ID
sourceUrlAPI URL used for the record page
scrapedAtISO timestamp for the actor run

Example output

{
"companyName": "#1 DESIGN STUDIO PTE. LTD.",
"uen": "201925566H",
"workhead": "CR06",
"grade": "L1",
"additionalInfo": null,
"expiryDate": "01/02/2028",
"buildingNo": "1085",
"streetName": "EUNOS AVENUE 7A",
"unitNo": "#03-10",
"buildingName": "EUNOS INDUSTRIAL ESTATE",
"postalCode": "409535",
"telephone": "84885022",
"fullAddress": "1085, EUNOS AVENUE 7A, #03-10, EUNOS INDUSTRIAL ESTATE, 409535",
"sourceRecordId": 1,
"sourceDatasetId": "d_dcda79be4aded5f9e769b8e23ff69b47",
"sourceUrl": "https://data.gov.sg/api/action/datastore_search?...",
"scrapedAt": "2026-07-03T00:00:00.000Z"
}

How much does it cost to scrape Singapore BCA registered contractors?

This actor uses pay-per-event pricing:

  • Start event: $0.005 per run
  • Contractor record event: tiered per saved contractor registration row
  • Bronze reference price: $0.000026617 per record before platform tier discounts

Apify shows the final price for your plan before you start a run.

Input options

InputTypeDefaultDescription
maxItemsinteger20Maximum contractor registration rows to save
offsetinteger0Source pagination offset
workheadstringCR06Exact BCA workhead code
gradestringL1Exact BCA grade
companyNamestringemptyFull-text company-name search
uenstringemptyFull-text UEN search
expiryDatestringemptyExact expiry date in DD/MM/YYYY format

Example input: CR06 L1 contractors

{
"maxItems": 100,
"offset": 0,
"workhead": "CR06",
"grade": "L1"
}

Example input: company lookup

{
"maxItems": 20,
"companyName": "DESIGN"
}

Example input: UEN lookup

{
"maxItems": 10,
"uen": "201925566H"
}

How to run it

  1. Open the actor on Apify.
  2. Enter the workhead, grade, company, UEN, or expiry-date filter you need.
  3. Set maxItems to the number of rows you want.
  4. Start the run.
  5. Download the dataset as JSON, CSV, Excel, or connect it to an integration.

Tips for better results

  • Use exact workhead and grade filters when building procurement lists.
  • Leave filters empty if you need a broad export from the official dataset.
  • Use offset to continue from a previous run without re-exporting the first rows.
  • Keep maxItems small for testing, then increase it for production exports.
  • Treat expiryDate as an exact source string in DD/MM/YYYY format.

Integrations

Use this actor with:

  • Google Sheets for vendor-review spreadsheets
  • Airtable for contractor CRM workflows
  • Zapier or Make for compliance alerts
  • Data warehouses for periodic Singapore construction-market snapshots
  • Internal procurement dashboards for RFQ candidate lists

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/singapore-bca-registered-contractors-scraper').call({
maxItems: 100,
workhead: 'CR06',
grade: 'L1'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('APIFY_TOKEN')
run = client.actor('automation-lab/singapore-bca-registered-contractors-scraper').call(run_input={
'maxItems': 100,
'workhead': 'CR06',
'grade': 'L1',
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

API usage with cURL

curl -X POST "https://api.apify.com/v2/acts/automation-lab~singapore-bca-registered-contractors-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"maxItems":100,"workhead":"CR06","grade":"L1"}'

MCP: use from Claude and other assistants

You can expose this actor through Apify MCP tools.

Claude Desktop configuration:

{
"mcpServers": {
"apify": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server", "--actors", "automation-lab/singapore-bca-registered-contractors-scraper"]
}
}
}

MCP URL pattern:

https://mcp.apify.com/?tools=automation-lab/singapore-bca-registered-contractors-scraper

Claude Code CLI setup:

$claude mcp add --transport http apify-bca-contractors "https://mcp.apify.com/?tools=automation-lab/singapore-bca-registered-contractors-scraper"

Example prompts for MCP usage:

  • "Use the Singapore BCA Registered Contractors Scraper to find 100 CR06 L1 contractors and summarize their postal-code distribution."
  • "Use this MCP tool to check whether UEN 201925566H appears in the BCA registered contractors dataset."
  • "Run the BCA contractors scraper for ME01 contractors and prepare a supplier shortlist spreadsheet."

Reliability

The actor uses a public JSON API rather than browser automation. No proxy is required, and anti-bot risk is low. If data.gov.sg is temporarily unavailable, retry the run later.

Data freshness

The actor returns the dataset as published by data.gov.sg at run time. It does not independently validate whether BCA has updated the upstream dataset that day.

Limitations

  • It returns public dataset rows, not private licensing documents.
  • It does not enrich records with websites, emails, or directors.
  • companyName and uen use source API full-text search behavior.
  • expiryDate is an exact string filter.

Legality

This actor accesses a public government open-data API and returns the public fields published there. Users remain responsible for using the data lawfully, respecting privacy obligations, and following applicable procurement or compliance rules.

Yes, the actor uses the official public data.gov.sg API for a public BCA dataset. Users should still apply the data only for lawful sourcing, compliance, and research workflows.

FAQ

Does this actor require a data.gov.sg API key?

No. The dataset endpoint is public and works without authentication.

Can I export all contractors?

Yes. Leave filters empty and set maxItems high enough, or use offset across multiple runs.

Why did I get fewer rows than expected?

Your filters may be too narrow, or the source dataset may contain fewer matching rows than maxItems.

Does one company appear multiple times?

Yes. The output keeps one row per company/workhead/grade registration because the same company can have multiple BCA registrations.

Troubleshooting

If a run returns no items, remove filters and run a small test with only maxItems. If that works, add filters back one at a time. If the source API returns an error, check the run logs for the exact HTTP status and retry later.

Changelog

0.1

Initial version for the Singapore BCA registered contractors data.gov.sg dataset.