Skip to main content
Personally identifiable information (PII) is encrypted at rest and masked on every read. Plaintext is available only through a per-field unmask endpoint that writes an audit record for every access.

What is masked, and how

GET /api/investors/v1/:id (and every other investor read) returns these fields masked: Values of 4 characters or fewer mask to **** entirely. Masking is applied to: primary_holder (pan, email, mobile), every joint_holders[] entry (pan, email, mobile), guardian.pan, every nominees[].pan and nominees[].guardian.pan, contact (email, mobile), and every bank_accounts[].account_no. KYC-status responses mask the PAN too.
Aadhaar is never collected by this API, so there is no Aadhaar field to mask.

Revealing a single field

Response:

Fields

Allowed field values

<n> is a zero-based index; <account_id> is a bank account’s bnk_... ID. Any other value returns 400 VALIDATION_FAILED — “unknown or non-unmaskable field”.
Unmasking is intended to require the pii:read scope. Request it during onboarding if your integration needs plaintext PII.

Audit trail

Every unmask call writes an append-only record. If the audit write fails, the value is withheld and the call returns 500 INTERNAL — access is never granted without a recorded trail.

Platform-side protections

  • Access logs record only request_id, account, route, method and status — never request bodies, headers or query strings.
  • Exchange call logs redact PAN, bank account numbers, uploaded file contents and authorization headers before storage.
  • Secrets and credentials are never returned by any endpoint, including GET /api/auth/v1/me.