Docs
Singapore Company Check
Overview
One question: is this Singapore entity real, active and safe to deal with? Give a UEN (Unique Entity Number) and get a verdict:
| Verdict | Meaning |
|---|---|
| fail | Closed, insolvent or sanctioned: struck off, dissolved, in liquidation, under a winding-up order or provisional liquidator, or listed on a sanctions list. Also returned for a UEN that isn't in the register. |
| review | Warning signs a person should look at: a winding-up application, judicial management, a scheme of arrangement, a voluntary liquidation, a pending strike-off, or a possible sanctions name match. |
| pass | None of the above found in any source. |
Every verdict comes with the reasons behind it, and each reason links to its evidence. Sources: the ACRA register, Government Gazette notices, OFAC / UK / EU sanctions lists and GeBIZ awards. See Data & coverage for what each contains and how fresh it is.
Connect
The MCP server uses Streamable HTTP at:
https://company.cura8.ai/mcp
No account or key is needed during the beta.
Claude
In Claude (web or desktop), open Settings → Connectors → Add custom connector and paste the URL. For Claude Code:
claude mcp add --transport http cura8 https://company.cura8.ai/mcp
ChatGPT
With developer mode enabled, add a connector and paste the URL. Availability depends on your ChatGPT plan.
Cursor, VS Code and other clients
// Cursor: ~/.cursor/mcp.json
{ "mcpServers": { "cura8": { "url": "https://company.cura8.ai/mcp" } } }
// VS Code: .vscode/mcp.json
{ "servers": { "cura8": { "type": "http", "url": "https://company.cura8.ai/mcp" } } }
Clients that only launch local (stdio) servers can use the mcp-remote bridge:
{ "mcpServers": { "cura8": { "command": "npx", "args": ["-y", "mcp-remote", "https://company.cura8.ai/mcp"] } } }
MCP tools
search_companies
Find Singapore entities by name or UEN. Returns up to 10 candidates with UEN and register status, including closed entities and former names. Live entities rank first.
| Input | Type | Notes |
|---|---|---|
query | string, 2–120 chars | A company name (Crimsonlogic) or UEN (199806033K). Legal suffixes like "Pte Ltd" are optional. |
Each result has uen, name, status, status_category, entity_type and match: uen, exact, former_name or fuzzy.
check_company
The full check for one entity. Returns the check response.
| Input | Type | Notes |
|---|---|---|
uen | string | A UEN, case-insensitive, e.g. 201730858K. |
Both tools are read-only and declare output schemas, so clients can validate structuredContent.
HTTP API
Base URL https://company.cura8.ai. JSON responses, CORS enabled. Machine-readable spec: openapi.json (OpenAPI 3.1).
| Request | Returns |
|---|---|
GET /v1/sg/companies/search?q= | Search results, as search_companies. |
GET /v1/sg/companies/{uen}/check | The check response, as check_company. |
GET /health | Database reachability and each source's as_of date. |
GET /openapi.json | The OpenAPI document. |
curl https://company.cura8.ai/v1/sg/companies/201318724N/check curl "https://company.cura8.ai/v1/sg/companies/search?q=wefic"
Errors
| Status | error | When |
|---|---|---|
| 400 | invalid_query | q missing or shorter than 2 characters. |
| 400 | invalid_uen | The path segment isn't a UEN. |
| 502 | database_unavailable | Temporary. Retry after a short wait. |
A well-formed UEN that isn't in the register is not an error: it returns 200 with verdict fail and reason NOT_FOUND.
Response
| Field | Contents |
|---|---|
verdict | pass, review or fail: the most severe reason. |
reasons[] | Most severe first. Each has code, severity (fail / review / info), message and evidence (source, date, url). |
company | Register record: name, former names, entity and company type, raw status and normalised status_category, registration date, address, industry codes, officer count, annual return and accounts dates. null if the UEN isn't registered. |
signals.gazette[] | Company notices, newest first: notice_type, title, date, case number and the official notice url. uens_from_name: true marks a notice matched by company name because it printed no UEN. |
signals.sanctions[] | Matching list entries with the basis of the match: registration_number, exact_name or fuzzy_name. |
signals.gebiz | Government contract summary: award count, total S$, first and last award, agencies. null if none. |
sources[] | The as_of date of every source used. |
attribution[], disclaimer | Licence attributions and the service disclaimer. Keep them with the data. |
status_category
ACRA uses about 25 status strings. They are normalised to: live, distressed (receivership or judicial management), closing (e.g. gazetted to be struck off), in_liquidation, struck_off, dissolved, terminated, converted (amalgamated or transferred) and other.
Example
check_company("201318724N"), recorded 15 Sep 2026 (abridged: one of two notices shown, attribution shortened):
{
"uen": "201318724N",
"verdict": "review",
"reasons": [
{
"code": "GAZETTE_JUDICIAL_MANAGEMENT",
"severity": "review",
"message": "Under judicial management.",
"evidence": {
"source": "eGazette",
"url": "https://www.egazette.gov.sg/2026/government%20gazette/advertisements/26adv6812.pdf",
"date": "2026-09-04"
}
},
{
"code": "ANNUAL_RETURN_OVERDUE",
"severity": "info",
"message": "Last annual return on 2018-11-29.",
"evidence": { "source": "ACRA", "date": "2026-08-14" }
}
],
"company": {
"uen": "201318724N",
"name": "SINGAPORE WEFIC OCEAN TECHNOLOGIES PTE. LTD.",
"former_names": ["KERUI OILFIELD SOLUTIONS (SINGAPORE)"],
"entity_type": "Local Company",
"status": "Live Company",
"status_category": "live",
"registered_on": "2013-07-10",
"annual_return_date": "2018-11-29",
…
},
"signals": {
"gazette": [
{
"notice_type": "judicial_management",
"title": "Notice of Appointment of Judicial Manager by Resolution of Company’s Creditors - Singapore Wefic Ocean Technologies Pte. Ltd.",
"published_on": "2026-09-04",
"uens": ["201318724N"],
"case_no": null,
"url": "https://www.egazette.gov.sg/2026/government%20gazette/advertisements/26adv6812.pdf"
}
],
"sanctions": [],
"gebiz": null
},
"sources": [
{ "source": "acra", "as_of": "2026-08-14" },
{ "source": "gazette", "as_of": "2026-09-11" },
{ "source": "ofac_sdn", "as_of": "2026-09-14" },
{ "source": "uk", "as_of": "2026-09-11" },
…
],
"attribution": ["Contains information from ACRA Information on Corporate Entities …", …],
"disclaimer": "Automated check from public sources, for information only. …",
"checked_at": "2026-09-15T03:07:17.277Z"
}
Reason codes
| Code | Severity | Meaning |
|---|---|---|
NOT_FOUND | fail | No entity with this UEN in the register. |
STATUS_STRUCK_OFF, STATUS_DISSOLVED, STATUS_TERMINATED, STATUS_IN_LIQUIDATION | fail | The register status shows the entity is closed or being wound up. |
STATUS_DISTRESSED, STATUS_CLOSING, STATUS_CONVERTED, STATUS_OTHER | review | Receivership or judicial management; pending closure; amalgamated or converted; an unrecognised status. |
GAZETTE_WINDING_UP_ORDER | fail | A court ordered the company wound up. |
GAZETTE_PROVISIONAL_LIQUIDATOR | fail | A provisional liquidator was appointed. |
GAZETTE_STRUCK_OFF | fail | Gazetted as struck off. |
GAZETTE_WINDING_UP_APPLICATION | review | Someone applied to court to wind the company up. |
GAZETTE_JUDICIAL_MANAGEMENT | review | A judicial manager (or interim one) runs the company. |
GAZETTE_SCHEME_OF_ARRANGEMENT | review | A restructuring with creditors. |
GAZETTE_CREDITORS_VOLUNTARY_LIQUIDATION | review | An insolvent company is winding itself up. |
GAZETTE_MEMBERS_VOLUNTARY_LIQUIDATION, GAZETTE_LIQUIDATION_MEETING, GAZETTE_DIVIDEND_OR_PROOF_OF_DEBT | review | A liquidation is under way (solvent or not). |
GAZETTE_STRIKE_OFF_INTENT | review | The registrar intends to strike the company off. |
GAZETTE_RESTORED | info | Restored to the register. Adverse notices published before it are downgraded to info. |
SANCTIONS_REGISTRATION_MATCH | fail | The UEN appears in a sanctions list entry. |
SANCTIONS_NAME_MATCH | fail / review | The exact name is listed: fail with a Singapore address on the entry, review otherwise. |
SANCTIONS_POSSIBLE_MATCH | review | A similar name is listed. Often a false positive. |
RECENTLY_REGISTERED | info | Registered in the last 90 days. |
ANNUAL_RETURN_OVERDUE | info | A live local company whose last annual return is over 18 months old. |
GOVERNMENT_SUPPLIER | info | Has won GeBIZ contracts. |
Gazette notices older than 24 months don't affect the verdict. New codes may be added; treat unknown codes by their severity.
Guidance for agents
- Name first, then UEN. If you only have a name, call
search_companies, confirm the right entity (check the status and former names), then callcheck_company. - Explain with evidence. Quote the reason messages and link the official notices in
evidence.url. - Review is not fail. A members' voluntary liquidation can be a solvent closure. Surface review results to a person rather than deciding alone.
- Sanctions name matches need a human. Only a registration-number match is conclusive.
- Mind the dates. Say how current the answer is using
sources[].as_of. - Keep attribution and the disclaimer with anything you show or store.
Limits & versions
- Beta: free, with fair-use rate limits. Paid plans (x402 per check, API keys) will be announced before the beta ends.
- Versioning:
/v1changes are additive: new fields and reason codes, never removed or renamed ones. Breaking changes get a new version. - Coverage: Singapore only for now. Known gaps are listed on Data & coverage.
Questions or wrong data: connect@navan.ai.