Overview
The Warisan API is a REST interface for integrating with the Warisan estate resolution infrastructure. It exposes endpoints across six layers: identity verification, estate state machine management, asset registry, distribution calculation (Faraid & civil), SBT settlement issuance, and institutional case ingestion.
Beta notice. This API is in pre-production beta. Endpoints are stable but schema fields may be extended. All breaking changes are versioned and announced 30 days in advance. Use version prefix /v1/ for all requests.
Authentication
All API requests require Bearer token authentication. Tokens are institution-scoped — each partner organisation receives a unique token with defined permission scopes.
API Key HeaderAuthorization: Bearer wrs_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
X-Warisan-Institution: YOUR_INSTITUTION_ID
| Prefix | Environment | Usage |
|---|---|---|
| wrs_live_ | Production | Real estate cases, live SBT issuance |
| wrs_test_ | Sandbox | Test cases, dummy SBTs, no blockchain writes |
| wrs_ar_ | AR Integration | Amanah Raya node — elevated query permissions |
| wrs_fi_ | FI Verification | Read-only SBT verification for financial institutions |
Security. API keys must never be exposed client-side. All production calls must originate from your server. Keys are rotatable via the Warisan Partner Portal. Compromised keys should be revoked immediately.
Base URL & Versioning
# Production
https://api.warisan.com.my/v1
# Sandbox
https://sandbox.api.warisan.com.my/v1
All responses return JSON. Dates use ISO 8601 (2025-01-15T10:30:00Z). Currency amounts are in Malaysian Ringgit (MYR) as integers in sen (1 MYR = 100 sen) to avoid floating-point errors.
Rate Limits
| Tier | Requests/min | Requests/day | Notes |
|---|---|---|---|
| Pilot | 30 | 1,000 | 90-day AR sprint partners |
| Standard | 120 | 10,000 | FI integration tier |
| Enterprise | 600 | Unlimited | Amanah Raya, bulk processing |
Rate limit headers are returned on every response: X-RateLimit-Remaining, X-RateLimit-Reset. Exceeding limits returns HTTP 429 with a Retry-After header.
Error Codes
All errors return a consistent JSON envelope with a machine-readable code and a human-readable message.
{
"error": {
"code": "HAJB_BLOCKED",
"message": "Heir is blocked (Hajb Hirman) by a higher-priority relative.",
"details": { "blocked_heir_id": "heir_abc123", "blocked_by": "heir_def456" }
}
}
Identity Layer
All heirs and the deceased must be identity-verified before an estate can advance. Identity hashes are stored off-chain; only a cryptographic proof-of-inclusion is written to the consortium chain.
Submits identity details for verification against the JPN (Jabatan Pendaftaran Negara) registry. Returns a credential_hash that is stored on the consortium chain as proof-of-inclusion without exposing the raw IC data.
| Field | Type | Required | Description |
|---|---|---|---|
| ic_number | string | required | 12-digit Malaysian IC number (YYMMDDSSNNNG) |
| full_name | string | required | Full legal name as per IC |
| role | enum | required | DECEASED | HEIR | REPRESENTATIVE |
| religion | enum | required | ISLAM | CHRISTIAN | BUDDHIST | HINDU | OTHER |
| liveness_token | string | optional | Token from biometric liveness SDK (required for HEIR role in production) |
{
"identity_id": "idn_7x9k2m4p",
"credential_hash": "0x3a8f...c4b2",
"status": "VERIFIED",
"religion": "ISLAM",
"track_suggestion": "SYARIAH",
"verified_at": "2025-03-12T08:44:00Z"
}
Registers a death certificate and triggers JPN confirmation. This is a prerequisite before an estate can be created. The JPN confirmation may be asynchronous — poll GET /identity/{id} or listen on the identity.death_confirmed webhook.
| Field | Type | Required | Description |
|---|---|---|---|
| identity_id | string | required | Identity ID of the deceased (from /identity/verify) |
| death_cert_no | string | required | Official death certificate number (JPN format) |
| date_of_death | string | required | ISO 8601 date (2025-01-10) |
| place_of_death | string | optional | Hospital, city, or country |
{
"identity_id": "idn_7x9k2m4p",
"death_status": "PENDING_JPN_CONFIRMATION",
"death_cert_hash": "0xf7b1...22e9",
"jpn_case_ref": "JPN-2025-0382941"
}
Returns the current verification status of an identity record, including JPN confirmation status for deceased individuals.
Estate Management
The estate is the central object in Warisan. It progresses through a strict state machine. State transitions can only move forward and cannot be skipped.
Creates a new estate record. The deceased must already have a confirmed death certificate (DEATH_CONFIRMED status). The estate is created in PENDING_VERIFICATION state.
| Field | Type | Required | Description |
|---|---|---|---|
| deceased_identity_id | string | required | Identity ID of the deceased with confirmed death |
| track | enum | required | SYARIAH | CIVIL. Typically derived from deceased's religion. |
| heir_identity_ids | string[] | required | Array of identity IDs for all known heirs (min 1) |
| deceased_gender | enum | required | MALE | FEMALE. Required for Faraid calculation. |
| external_ref | string | optional | Your internal reference ID (e.g. AR case number, bank account ID) |
{
"estate_id": "est_m3k9p7xr",
"state": "PENDING_VERIFICATION",
"track": "SYARIAH",
"ipfs_hash": null,
"on_chain_id": null,
"filed_at": "2025-03-15T09:00:00Z",
"heirs": [
{ "identity_id": "idn_a1b2c3", "status": "PENDING" }
]
}
Returns the full estate record including current state, all heirs, all assets, distribution result (if computed), and settlement SBT references (if issued).
Advances the estate to the next state. The system validates all prerequisites before allowing the transition. For example, advancing from ASSET_MAPPED to SETTLEMENT_ISSUED requires a confirmed distribution calculation.
| Field | Type | Required | Description |
|---|---|---|---|
| target_state | enum | required | Target state. Must be the immediate next state. |
| notes | string | optional | Operator notes attached to this transition (immutable once written) |
PENDING_VERIFICATION → IDENTITY_VERIFIED
IDENTITY_VERIFIED → ASSET_MAPPED
ASSET_MAPPED → ARBITRATION (if dispute flag set)
ASSET_MAPPED → SETTLEMENT_ISSUED (undisputed path)
ARBITRATION → SETTLEMENT_ISSUED (after arbitrator resolution)
SETTLEMENT_ISSUED → DISTRIBUTED
Returns a paginated list of estates scoped to your institution. Supports filtering by state, track, and date range.
Query Parameters| Param | Type | Description |
|---|---|---|
| state | enum | Filter by estate state |
| track | enum | SYARIAH | CIVIL |
| from | date | Filed on or after (ISO 8601) |
| limit | integer | Max results per page (default 20, max 100) |
| cursor | string | Pagination cursor from previous response |
Asset Registry
Assets must be declared and mapped to an estate before distribution can be calculated. Each asset is assigned a UUID and linked to the estate's on-chain record. Supports all asset classes including illiquid assets with resolution mode assignment.
Registers a new asset against the estate. For illiquid assets, specify resolution_mode and urgency to enable liquidity discount calculation in the NDE computation.
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | required | Human-readable asset name |
| asset_type | enum | required | CASH | PROPERTY | VEHICLE | SHARES | BUSINESS | OTHER |
| appraised_value_sen | integer | required | Appraised value in Malaysian sen (e.g. 50000000 = RM 500,000) |
| resolution_mode | enum | optional | A (Collective Sale) | B (Buyout) | C (Co-ownership / Musya') |
| urgency | integer | optional | Sale urgency 0–3. 0=Voluntary, 1=Court Order, 2=Forced, 3=Distress. Used for liquidity discount. |
| external_ref | string | optional | Land title, vehicle reg, company reg, share cert number |
| valuation_source | string | optional | Name of licensed valuer, auditor, or appraiser |
{
"asset_id": "ast_k2p8n4xm",
"estate_id": "est_m3k9p7xr",
"asset_type": "PROPERTY",
"appraised_value_sen": 50000000,
"resolution_mode": "A",
"urgency": 0,
"liquidity_discount": 0.00,
"adjusted_value_sen": 50000000,
"on_chain_uuid": "0xa3f1...8b4c"
}
Queries the Amanah Raya asset database for unclaimed holdings linked to the given IC number. Requires wrs_ar_ or wrs_live_ token with ar:read scope. Returns a list of AR case numbers and asset summaries — not full asset values, which require a separate AR confirmation flow.
AR partnership required. This endpoint is only active for institutions operating under the Amanah Raya integration agreement. Sandbox mode returns synthetic test data.
{
"ic_number": "820315XXXXXX",
"ar_holdings": [
{
"ar_case_ref": "AR-2019-082341",
"asset_type": "CASH",
"status": "UNCLAIMED",
"est_value_band": "RM 10,000 – RM 50,000"
}
]
}
Updates the appraised value, resolution mode, or urgency of an asset. Only permitted while the estate is in IDENTITY_VERIFIED or ASSET_MAPPED state. Each update is recorded as an immutable audit event.
Distribution Engine
The distribution engine applies Faraid rules (Quran 4:11–12, 4:176, Shafi'i school) for the Syariah track, or Distribution Act 1958 for the civil track. Both engines output heir shares as basis points and calculated amounts.
Computes the Faraid distribution for a Syariah-track estate. Automatically applies Hajb (blocking) rules and identifies Asabah (residuary) heirs. Returns the full distribution matrix including blocked heirs and Bayt al-Mal residue if applicable.
Request Body| Field | Type | Required | Description |
|---|---|---|---|
| estate_id | string | required | Estate must be in ASSET_MAPPED state |
| heir_matrix | object | required | Heir relationship counts (see schema below) |
{
"husband": 0, // Max 1 (if deceased is female)
"wives": 1, // Max 4 (if deceased is male)
"sons": 2,
"daughters": 1,
"father": 1, // Max 1
"mother": 1, // Max 1
"full_brothers": 0,
"full_sisters": 0,
"paternal_gf": 0, // Paternal grandfather
"maternal_gm": 0 // Maternal grandmother
}
{
"estate_id": "est_m3k9p7xr",
"nde_sen": 48000000,
"heirs": [
{
"role": "WIFE",
"count": 1,
"fraction": "1/8",
"share_bps": 1250,
"total_sen": 6000000,
"per_person_sen":6000000,
"basis": "1/8 — descendants exist",
"type": "FIXED"
},
{
"role": "SON",
"count": 2,
"fraction": "residue",
"share_bps": 5833,
"total_sen": 28000000,
"per_person_sen":14000000,
"basis": "Asabah — 2x unit",
"type": "RESIDUARY"
}
],
"blocked_heirs": [],
"total_allocated_bps": 10000
}
Computes the Net Distributable Estate (NDE) from all registered assets. Applies liquidity discounts based on each asset's resolution mode and urgency, then deducts liabilities. The resulting NDE is the basis for all distribution calculations.
Request Body| Field | Type | Required | Description |
|---|---|---|---|
| estate_id | string | required | Estate ID with assets registered |
| liabilities_sen | integer | required | Total debts + funeral + admin costs in sen |
{
"gev_sen": 60000000, // Gross Estate Value
"adj_gev_sen": 55500000, // After liquidity discounts
"liabilities_sen":7500000, // Debts + costs
"nde_sen": 48000000, // Net Distributable Estate
"assets_breakdown": [
{
"asset_id": "ast_k2p8n4xm",
"appraised_sen": 50000000,
"discount_rate": 0.10,
"adjusted_sen": 45000000,
"resolution_mode": "A"
}
]
}
Locks the distribution calculation to the estate record. This is an irreversible action that writes the distribution to the consortium chain and is a prerequisite for SBT issuance. All heirs with HEIR role must have VERIFIED identity status before confirmation is permitted.
Settlement (SBT)
Settlement Soulbound Tokens are issued per heir after distribution is confirmed. Each SBT is non-transferable, anchored to Ethereum mainnet via Merkle proof, and accepted by Warisan partner FIs as proof of beneficial interest for collateralised financing.
Issues a Settlement SBT for a specific heir on a confirmed estate. The SBT is minted on the Warisan consortium chain and simultaneously anchored to Ethereum mainnet via OpenTimestamps Merkle proof. The process is asynchronous — poll GET /sbt/{sbt_id} or listen on the sbt.issued webhook.
| Field | Type | Required | Description |
|---|---|---|---|
| estate_id | string | required | Estate must be in SETTLEMENT_ISSUED state |
| heir_identity_id | string | required | Identity ID of the heir receiving the SBT |
{
"sbt_id": "sbt_p9x3k7mn",
"status": "MINTING",
"estate_id": "est_m3k9p7xr",
"heir_identity_id":"idn_a1b2c3",
"share_bps": 1250,
"check_url": "/v1/sbt/sbt_p9x3k7mn"
}
Returns the full SBT record including Ethereum anchor proof, IPFS hash, and heir entitlement breakdown per asset. This is the primary endpoint used by partner financial institutions to verify an heir's SBT before extending financing. Accessible with wrs_fi_ read-only tokens.
{
"sbt_id": "sbt_p9x3k7mn",
"status": "ISSUED",
"transferable": false,
"share_bps": 1250,
"nde_sen": 48000000,
"heir_amount_sen": 6000000,
"issued_at": "2025-03-22T14:30:00Z",
"ethereum_anchor": "0x7f3c...a8d1",
"ipfs_hash": "QmXz...kP9",
"jpn_attestation": "JPN-SIG-2025-0384",
"last_validated_at":"2026-03-22T00:00:00Z",
"asset_entitlements": [
{
"asset_id": "ast_k2p8n4xm",
"asset_type": "PROPERTY",
"resolution_mode": "A",
"entitlement_sen": 5625000
}
],
"fi_collateral_note": {
"max_ltv_pct": 85, // Mode A/B resolved; 40-60 if Mode C
"collateral_type":"BENEFICIAL_INTEREST"
}
}
Institutional API
The Institutional API allows partner organisations — banks, EPF, Bursa, insurers — to push unresolved estate cases to Warisan for resolution. Warisan resolves the estate and returns a settlement hash and SBT references via webhook.
Submits an unresolved estate case from a partner institution. Warisan creates an estate record, triggers identity verification, and notifies the institution via webhook at each state transition.
Request Body| Field | Type | Required | Description |
|---|---|---|---|
| institution_case_ref | string | required | Your internal case / account / policy reference |
| deceased_ic | string | required | IC number of the deceased account/policy holder |
| asset_type | enum | required | BANK_ACCOUNT | EPF_BALANCE | SHARES | INSURANCE_POLICY | OTHER |
| asset_value_sen | integer | required | Current balance / surrender value in sen |
| known_heirs | object[] | optional | Array of {ic_number, name, relationship} if known |
| webhook_url | string | optional | Override your account-level webhook URL for this case |
{
"warisan_case_id": "wcase_n8m3k2px",
"institution_case_ref": "ACC-2024-089234",
"estate_id": "est_m3k9p7xr",
"status": "INTAKE",
"estimated_resolution": "21-30 days"
}
Warisan posts a JSON payload to your registered webhook URL on every estate state transition. Verify authenticity with the X-Warisan-Signature header (HMAC-SHA256 of the raw body using your webhook secret).
| Event | Trigger |
|---|---|
| identity.death_confirmed | JPN confirms death certificate |
| estate.state_changed | Any state machine transition |
| estate.dispute_opened | A dispute flag is raised by a heir |
| distribution.confirmed | Distribution locked to chain |
| sbt.issued | SBT minted and Ethereum-anchored |
| estate.distributed | Final state — assets transferred |
| sbt.annual_revalidation | Annual re-attestation completed |
// Example webhook payload
{
"event": "sbt.issued",
"timestamp": "2025-03-22T14:35:00Z",
"data": {
"sbt_id": "sbt_p9x3k7mn",
"estate_id": "est_m3k9p7xr",
"heir_ic": "820315XXXXXX",
"share_bps": 1250,
"eth_anchor": "0x7f3c...a8d1"
}
}
Lightweight endpoint for financial institutions to quickly verify an SBT's validity and retrieve the collateral note. Returns a condensed response suitable for loan origination systems. No distribution details are exposed — only validity, heir entitlement amount, and recommended LTV.
Response 200{
"valid": true,
"sbt_id": "sbt_p9x3k7mn",
"heir_amount_sen": 6000000,
"recommended_ltv": 85,
"collateral_type": "BENEFICIAL_INTEREST",
"ethereum_verified":true,
"last_validated": "2026-03-22"
}
Enums & Constants
PENDING_VERIFICATION
IDENTITY_VERIFIED
ASSET_MAPPED
ARBITRATION
SETTLEMENT_ISSUED
DISTRIBUTED
CLOSED
SYARIAH // Faraid — Quran 4:11–12
CIVIL // Distribution Act 1958
Resolution Mode
A // Collective Sale (بيع جماعي)
B // Buyout (افتداء)
C // Co-ownership / Musya' (مشاع)
CASH
PROPERTY
VEHICLE
SHARES
BUSINESS
OTHER
0 // Voluntary (0% discount)
1 // Court Order (10–20%)
2 // Forced Sale (20–30%)
3 // Distress Auction (30–40%)
Changelog
/assets and /distribution/nde endpoints. Liquidity discount schedule live.sbt.annual_revalidation webhook event. last_validated_at field added to SBT schema./institutional/cases) released. Webhook system live with 7 event types./fi/sbt/verify endpoint released for FI-scoped read-only tokens. recommended_ltv field included.