v1.0 · Bursa Malaysia Depository

Decode Bursa Malaysia CDS documents into structured investor data.

Upload a CDS Statement of Account or Account Opening Notice — and receive normalized JSON: 15-digit account number, holder profile, ADA broker reference, stock holdings (with prices, balance units, and Shariah flag), and transaction history. Ready for broker onboarding, portfolio aggregation, KYC, or fund compliance.

🔒 HTTPS · Bearer / X-API-Key 📄 PDF up to 20MB ⚡ Rate-limited · 10 req/min 🗑️ No persistent storage

Restricted access

Sign in with the demo password to open the CDS analyzer.

Don't have access? Contact the administrator.

Two document types, one schema

Type A

CDS Statement of Account

The periodic Penyata Akaun / Statement of Account issued by Bursa Malaysia Depository to investors.

  • Statement period & account status
  • Stock holdings with last price & market value
  • Shariah-compliant flag per holding
  • Transaction history with debit / credit / balance
Type B

CDS Account Opening Notice

The one-time Notis Pembukaan Akaun issued when an investor opens a CDS account.

  • NRIC / registration number & nationality
  • Race / ownership category
  • Bank account for dividend payments
  • Joint account flag

Anything that isn't a CDS document (bank statements, payslips, tax forms, etc.) is automatically rejected with HTTP 422 and never wastes an extraction call.

What you get

PDF → JSON

POST a multipart upload and receive a strict-schema JSON object with every CDS field, ready to drop into your pipeline.

Full holdings & transactions

Every stock holding row and every transaction row is extracted as a typed array — numbers as numbers, dates preserved, Shariah flag per holding.

Account number normalized

The 15-digit CDS account number is returned without dashes — clean, hashable, ready to index.

Auto-rejects non-CDS

If the upload isn't a Bursa Malaysia CDS document, the API responds with HTTP 422 and a clear error — no silent wrong-extraction.

Rate limited & observable

10 requests / minute with per-request request_id correlation in every response — easy to debug and trace.

Privacy by default

Uploads are processed in a private temp directory and removed after the request. Nothing retained on disk by default.

How it works

1

Upload a PDF

POST multipart/form-data with a single pdf field (≤ 20MB).

2

Classify & extract

The service first confirms it's a CDS document, then extracts the right schema for Type A or Type B.

3

Get normalized JSON

Receive a fixed-schema payload with typed numbers, a clean account number, and a request_id.

Extracted fields

{
  "result": {
    "Document Type": "CDS Statement",
    "CDS Account Number": "078004071479570",
    "Account Holder Name": "AHMAD BIN ABDULLAH",
    "Statement Period": "01.01.2024 - 31.12.2024",
    "Account Status": "ACTIVE",
    "Stock Holdings Summary": {
      "Total Stocks Held": 3,
      "Total Balance Units": 125000,
      "Total Market Value MYR": 42850.00
    },
    "Stock Holdings": [
      {
        "Stock Code": "0259",
        "Stock Name": "SNS NETWORK TECHNOLOGY BERHAD",
        "Shariah Compliant": true,
        "Balance Units": 100000,
        "Last Price MYR": 0.245,
        "Market Value MYR": 24500.00
      }
    ],
    "Transactions": [ /* … */ ]
  },
  "request_id": "a7b3c9d1e2f4"
}