CorpSecTech API

Registry-event middleware for corporate secretaries. Base URL https://api.openedd.com. JSON in, JSON out. Version 5 — Singapore and Hong Kong live. Every path is jurisdiction-scoped: /v1/sg/… for Singapore (ACRA), /v1/hk/… for Hong Kong (Companies Registry).

Authentication

Send your key in the X-API-Key header. Keys are issued per firm (client) and stored only as a SHA-256 hash. Request one at hello@openedd.com.

curl -H "X-API-Key: oe_live_…" "https://api.openedd.com/v1/sg/check?uen=201836081W"

Quotas and errors

Each key has a daily quota (Developer 10; Professional 10,000; Platform per contract) and paid keys have a daily export cap on rows returned by bulk check and the daily feed. Every response carries X-RateLimit-Limit and X-RateLimit-Used. Errors are JSON with an error field: 401 missing, invalid or suspended key, 403 endpoint not on your plan, 422 bad input (for example an invalid UEN), 429 quota or export cap reached, 500 unexpected.

Keys that enumerate the register (many consecutive UENs in a short window) are suspended automatically. Check the entities you administer; if you need a whole-register view, ask about a Platform licence.

Statuses and the traffic light

statusriskMeaning
GAZETTED_FIRSTwatchIn the ACRA First Gazette; will be struck off 60 days after publication unless an objection is lodged. objection_deadline is returned.
STRUCK_OFFcriticalFinal Gazette: struck off with effect from struck_off_date.
WITHDRAWNnoneThe striking-off application was withdrawn; entity remains on the register.
RESTOREDnoneRestored to the register after having been struck off.
NOT_GAZETTEDnoneNo gazette notice on record for this UEN (2016 to data_as_of).
Status is derived from the sequence of notices, latest first. A restored entity that is later gazetted again shows GAZETTED_FIRST; the full history is always in timeline.

Check one entity

GET /v1/sg/check?uen={UEN}

Returns the entity's current status, dates, deadline, explanation and the complete event timeline. On Professional and Platform plans each timeline entry also carries source_url and notice_label (the official source reference); Developer keys receive the events and dates only.

{
  "uen": "201836081W", "found": true, "entity_name": "GULIVR PTE. LTD.", "entity_type": "COMPANY",
  "status": "GAZETTED_FIRST", "risk": "watch", "status_date": "2026-07-26",
  "first_gazette_date": "2026-07-26", "struck_off_date": null, "withdrawn_date": null, "restored_date": null,
  "objection_deadline": "2026-09-24",
  "explanation": "Listed in the ACRA First Gazette on 2026-07-26: the entity will be struck off 60 days after publication unless an objection is lodged or the application is withdrawn.",
  "timeline": [ { "kind": "first", "publication_date": "2026-07-26", "struck_off_date": null, "event_date": null,
                  "notice_label": "…", "source_url": "…"   /* Professional and Platform only */ } ],
  "data_as_of": "2026-09-02T12:18:19+00:00"
}

Bulk check (portfolio sweep)

POST /v1/sg/check/bulk

Professional and Platform. Body {"uens": ["201836081W", "197200737R"]}, up to 500 UENs per call (configurable per contract). Returns an array in the same shape as a single check. Invalid UENs come back with status: null and an explanation rather than failing the batch. Rows count toward the daily export cap.

GET /v1/sg/search?q={text}&limit=20

Fuzzy search over gazetted entity names (minimum 3 characters). Returns uen, entity_name, status, status_date. Developer keys get up to 5 results, paid keys up to 100. Only entities that appear in a gazette are searchable.

Daily feed

GET /v1/sg/entries?kind=first&from=2026-08-16&to=2026-08-31&entity_type=COMPANY&limit=1000&offset=0

Professional and Platform. Every entity gazetted in a date range. kind is first, final, withdrawn or restored. Use it to build your own screens or to load a month into a spreadsheet. Rows count toward the daily export cap.

Watchlist

GET /v1/sg/watchlist
POST /v1/sg/watchlist
DELETE /v1/sg/watchlist?uen={UEN}
GET /v1/sg/watchlist/events?since=2026-08-01

Register the UENs your firm administers once. POST accepts {"uens": ["201836081W", {"uen": "202603696G", "label": "Client B"}]} (up to 5,000 per call, upsert). GET returns the list with each entity's current status. events lists gazette events on the watchlist since a date that have not yet been alerted.

Alerts

POST /v1/sg/alerts/run?dry_run=1&days=8

Alerts run automatically every morning at 07:30 Singapore time after the ACRA sync and go to the firm's alert email and webhook (set when the key is issued). Each event is alerted once. Call this endpoint to preview (dry_run=1) or send now. Webhook payload: {"subject": "...", "events": [ { uen, entity_name, kind, event_date, deadline, source_url, label } ]}.

Evidence pack (PDF)

GET /v1/sg/evidence?uen={UEN}

Professional and Platform. Returns application/pdf: entity, status, explanation, deadline, every event with its official source reference and file hash, data_as_of, generation time and your firm's name. File it in the CDD record as proof of the check you ran.

Entity profile and annual-return deadline

GET /v1/sg/entity?uen={UEN}

Professional and Platform. The registry profile for any of the ~2.1 million registered entities (not only gazetted ones): ACRA status, entity and company type, registration date, registered address, principal activity (SSIC), officer count, former names, last annual return filed and next_annual_return_due with days_to_annual_return_due and annual_return_overdue. The same block is returned as profile inside every /v1/sg/check response.

{ "uen": "192600019W", "found": true,
  "profile": { "entity_name": "PRICEWATERHOUSECOOPERS CM SERVICES PTE. LTD.", "acra_status": "Live Company",
               "entity_type": "Local Company", "registration_date": "1926-06-22",
               "primary_ssic_code": "70201", "primary_ssic": "COMPANY SECRETARIAL, PAYROLL AND ACCOUNTING AND BOOK-KEEPING SERVICES",
               "last_annual_return_filed": "2026-02-24", "next_annual_return_due": "2027-01-30",
               "days_to_annual_return_due": 150, "annual_return_overdue": false, "profile_as_of": "2026-09-02T16:59:04Z" } }
Deadline logic: the registry profile carries the next annual-return due date per entity; CorpSecTech counts down to it and flags overdue. Confirm on BizFile before filing; profiles refresh monthly.

Watchlist deadlines

GET /v1/sg/watchlist/deadlines?days=30

Every live entity on your watchlist whose annual return is due within days (or already overdue), soonest first. The Monday morning alert includes the 14-day view automatically.

Stats

GET /v1/sg/stats

Counts of entities, events and notices plus last_pipeline_run. Use it for a "data current as of" badge.

Hong Kong (Companies Registry)

Company Registry striking-off, deregistration and restoration notices from the HKSAR Government Gazette, under the Companies Ordinance (Cap. 622) Part 15. Companies are identified by their 8-digit CR number (Companies Registry number), passed as cr. Same auth, quotas, plan gating and error shape as the Singapore endpoints.

Facts only. Hong Kong e-Gazette notices are not reproduced or stored: each event carries the official source_url and a document hash, never the document text. Verify at the source link or with the Companies Registry.
statusriskMeaning (Cap. 622)
GAZETTED_FIRSThighNotice of intention to strike off (s.744/745). Dissolved 3 months after publication unless cause is shown. objection_deadline is returned.
DEREGISTRATION_PROPOSEDhighDeregistration applied for (s.751(1)). 3-month objection window from publication.
STRUCK_OFFcriticalStruck off and dissolved (s.746/747).
DEREGISTEREDcriticalDeregistered on the company's own application and dissolved (s.751(3)).
RESTOREDmediumRestored to the Companies Register.
NOT_GAZETTEDnoneNo striking-off, deregistration or restoration notice on record for this CR number.

Check one company

GET /v1/hk/check?cr={CR}

Current status, dates, deadline, explanation and the full event timeline. Professional and Platform responses add statutory_section, source_url, document_sha256 and document_bytes per event; the Chinese company name is returned as entity_name_zh when known.

{
  "cr": "71094901", "jurisdiction": "HK", "found": true,
  "entity_name": "AP GARDEN LIMITED", "entity_name_zh": null,
  "status": "DEREGISTERED", "risk": "critical",
  "deregistered_date": "2026-08-28", "objection_deadline": null,
  "explanation": "Deregistered on the company's own application with effect from 2026-08-28, and dissolved on deregistration. Cap. 622 s.751(3) …",
  "timeline": [ { "kind": "deregistered", "kind_label": "Deregistered and dissolved", "event_date": "2026-08-28",
                  "statutory_section": "Cap. 622 s.751", "source_url": "…"  /* Professional and Platform only */ } ],
  "notice_count": 1, "data_as_of": "2026-08-28T…",
  "source": "Companies Registry notices in the HKSAR Government Gazette"
}

Bulk check

POST /v1/hk/check/bulk

Professional and Platform. Body {"crs": ["71094901", "07186083"]}, up to your plan's bulk limit. Returns an array in the same shape as a single check. Rows count toward the daily export cap.

GET /v1/hk/search?q={text}&limit=20

Search over Hong Kong company names, English and Chinese (minimum 3 characters). Returns cr, entity_name, entity_name_zh, status, status_date.

Daily feed

GET /v1/hk/entries?kind=first&from=2026-08-01&to=2026-08-31&limit=1000&offset=0

Professional and Platform. Every company gazetted in a date range. kind is first, struck_off, dereg_proposed, deregistered or restored. Rows count toward the daily export cap.

Stats

GET /v1/hk/stats

Counts of Hong Kong companies and notices plus the last pipeline run.

Jurisdictions

GET /v1/meta/jurisdictions

No key required. Lists the jurisdictions that are live and on the roadmap, the events each registry emits, and whether documents are stored or facts-only. Use it to discover coverage programmatically.

Public check (no key)

GET /v1/public/sg/check?uen={UEN}
GET /v1/public/hk/check?cr={CR}

Powers the search box on corpsectech.com. Browser-verified (Cloudflare Turnstile), rate-limited per IP. Returns a teaser only: gazette status, risk, entity name and the latest event. The objection deadline, ACRA/registry detail, full timeline and source references require an API key. Not for integrations; use a key.

Google Sheets

Add the function below in Extensions → Apps Script, set your key, then use =CORPSEC_STATUS(A2) in any cell. It returns status | risk | date | deadline.

const KEY = "oe_live_…";
function CORPSEC_STATUS(uen) {
  if (!uen) return "";
  const r = UrlFetchApp.fetch("https://api.openedd.com/v1/sg/check?uen=" + encodeURIComponent(String(uen).trim()),
    { headers: { "X-API-Key": KEY }, muteHttpExceptions: true });
  const d = JSON.parse(r.getContentText());
  if (d.error) return "ERROR: " + d.error;
  return [d.status, d.risk, d.status_date || "", d.objection_deadline || ""].join(" | ");
}

Plans

PlanCalls / dayEndpointsSource documents
Developer (free)10check, search (5 results), statsNo
Professional10,000All: bulk, feed, entity, watchlist, deadlines, alerts, evidenceYes — source reference and file hash on every event
PlatformPer contractAll, plus higher bulk and export caps, white-labelYes

Upgrade or request a key at hello@openedd.com. Use of the API is subject to the API terms: results are licensed for your firm's own compliance work and may not be redistributed or used to build a competing dataset.

Provenance

Every event is taken from the official record, verified against the register's own figures and stored with a file hash so it can be re-checked later; the verification result is recorded per source document. Coverage: companies, LLPs, VCCs, VCC sub-funds and foreign branches from 2016 to today, refreshed daily. Professional and Platform responses carry the source reference and hash; the public search and Developer keys carry status and dates only. The data is a monitoring aid and does not replace an ACRA BizFile extract. Facts are deterministic; no status or deadline is generated by AI.

CorpSecTech is an Openedd brand · openedd.com · hello@openedd.com