# ACRA Singapore Companies Scraper (UEN) (`scrapyx/acra-sg-companies-scraper`) Actor

Singapore registered companies and businesses from ACRA's official open data: UEN, name, entity and company type, status, registration date, SSIC industry, address and postal code. Find new companies by industry and date, or look up UENs.

- **URL**: https://apify.com/scrapyx/acra-sg-companies-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.84 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## ACRA Singapore Companies Scraper (UEN)

Singapore's registered companies, sole proprietorships and partnerships
from **ACRA's official open data**: UEN, name, entity and company type,
status, registration date, primary and secondary SSIC industry, full
address with postal code, number of officers, former names and audit firms.

Find **newly registered companies** by industry (SSIC code) and date, list
every live company at a postal code, or look up UENs. Official open data on
data.gov.sg: no key, no login, no proxy.

### What it is for

- **Lead lists of new Singapore businesses** — incorporation services,
  accounting, banking, insurance, payroll and office providers all sell to
  companies in their first months.
- **Industry mapping** — every live company under an SSIC code.
- **KYC and enrichment** — look up UENs for name, status, address and
  industry.

### Input

| field | what it does |
| --- | --- |
| `registeredFrom` / `registeredTo` | Registration date window (`YYYY-MM-DD`). |
| `ssicCodes` | 5-digit primary SSIC codes, e.g. `62011` software development, `56112` cafés. |
| `entityTypes` | `local_company`, `sole_proprietorship_partnership`, `llp`, `lp`, `foreign_company_branch`. |
| `status` | `active` (default for searches) or `any` (default for UEN lookups). |
| `postalCodes` | 6-digit postal codes. |
| `nameStartsWith` | Fastest name search — reads one of ACRA's 27 files. |
| `nameContains` | Part of the name (combine with another filter; slow alone). |
| `uens` | Look up up to 100 UENs; stops as soon as all are found. |
| `maxItems` | Default 500, newest registrations first. `0` = everything, file by file. |

### Things about this data worth knowing

#### 1. It is a monthly snapshot, a few weeks behind

ACRA's open data is refreshed monthly. The file updated on 16 September 2026
had registrations up to 31 August 2026. Companies registered this week are
not in it yet; the summary shows `newestRegistrationSeen`.

#### 2. "Active" is spelled two ways

Companies are `Live Company`; sole proprietorships and partnerships are
`Live`. Filtering on one silently drops the other kind. `status: active`
covers both, and `isActive` is set on every row.

#### 3. Filter on the SSIC code, not the description

ACRA's "SSIC description" is the company's own wording, not the official
industry title: code 56112 appears as "CAFE", "CAFES" and "EATING HOUSE";
code 46900 as "TRADING", "GENERAL TRADING" and more. And it is empty on
every 2026 registration sampled and on 54–70% of older ones, while the code
is always there. So filter and group on `primarySsicCode`; the description
is passed on as written (or `null`), never borrowed from another company.

#### 4. A missing secondary activity copies the primary one

On older records with no secondary SSIC code, the secondary description is
often the primary's (12–25% of rows). Read naively, those companies appear
under their main industry twice. The Actor leaves the secondary description
empty when there is no secondary code.

#### 5. Empty values are the text "na"

Every empty field in ACRA's file is `"na"`. The typed fields turn these
into `null`; the original record is kept under `acra`.

### Output

One `ENTITY` row per UEN, then one `SEARCH_SUMMARY`.

```json
{
  "recordType": "ENTITY",
  "uen": "202640059E",
  "entityName": "SOTTOTABLE PTE. LTD.",
  "entityType": "Local Company",
  "companyType": "Exempt Private Company Limited by Shares",
  "status": "Live Company",
  "isActive": true,
  "registrationDate": "2026-08-31",
  "primarySsicCode": "62011",
  "primarySsicDescription": null,
  "address": "229 UPPER PAYA LEBAR ROAD, #15-18, BOTANIQUE AT BARTLEY, SINGAPORE 533871",
  "postalCode": "533871",
  "numberOfOfficers": 2
}
```

### Speed

ACRA publishes the registry as 27 files (by first letter of the name).
data.gov.sg limits anonymous callers, so requests are 6 seconds apart:
a search across all files takes about 3 minutes; a `nameStartsWith` or
UEN search that finds everything early is faster.

### Limits

- No officer or shareholder names — ACRA's open data has officer counts only.
- No financial statements.

# Actor input Schema

## `registeredFrom` (type: `string`):

YYYY-MM-DD. Use it to list NEW entities. ACRA's open data is a monthly snapshot, a few weeks behind.

## `registeredTo` (type: `string`):

YYYY-MM-DD.

## `ssicCodes` (type: `array`):

5-digit SSIC codes, e.g. 62011 (software development), 56112 (cafes), 70201 (management consultancy).

## `entityTypes` (type: `array`):

Any of: local\_company, sole\_proprietorship\_partnership, llp, lp, foreign\_company\_branch. Empty = all.

## `status` (type: `string`):

Default: active for searches, any for UEN lookups.

## `postalCodes` (type: `array`):

6-digit postal codes (e.g. one building).

## `nameStartsWith` (type: `string`):

Reads only that letter's file -- fastest way to find a company by name.

## `nameContains` (type: `string`):

Checked as rows arrive; slow on its own (combine with another filter).

## `uens` (type: `array`):

Look up specific entities (up to 100). Stops as soon as all are found.

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

Newest registrations first across all files. 0 = every match, delivered file by file.

## `minRequestInterval` (type: `number`):

data.gov.sg rate-limits anonymous callers; 6 s was measured to avoid it.

## Actor input object example

```json
{
  "registeredFrom": "2026-08-01",
  "ssicCodes": [
    "62011"
  ],
  "maxItems": 500,
  "minRequestInterval": 6
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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 = {
    "registeredFrom": "2026-08-01",
    "ssicCodes": [
        "62011"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/acra-sg-companies-scraper").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 = {
    "registeredFrom": "2026-08-01",
    "ssicCodes": ["62011"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/acra-sg-companies-scraper").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 '{
  "registeredFrom": "2026-08-01",
  "ssicCodes": [
    "62011"
  ]
}' |
apify call scrapyx/acra-sg-companies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapyx/acra-sg-companies-scraper"
        }
    }
}
```

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/ejD8PBzSYeoBnhjen/builds/2XCb09BAaWYJ17NjC/openapi.json
