Skip to main content
Portfolio Connect is a white-label UI widget for importing Indian portfolios. One component handles file upload, Gmail import, and CDSL OTP fetch.

Live Demo

Try the widget at connect.casparser.in
Drag and drop CAS PDFs or browse files

Supported Statements

StatementCoversMethods
CAMS / KFintech CASMutual FundsPDF upload, Email request via KFintech, Gmail Inbox integration
CDSL eCASAll holdings (CDSL + NSDL): Stocks, ETFs, Bonds, SGBs, Demat/Non-Demat MFs, AIFsPDF upload, OTP fetch, Gmail Inbox integration
NSDL eCASAll holdings (NSDL + CDSL): Stocks, ETFs, Bonds, SGBs, Demat/Non-Demat MFs, AIFsPDF upload, Gmail Inbox integration
Cross-depository coverage: Both CDSL and NSDL eCAS statements contain holdings from both depositories, not just the issuing depository.

Installation

npm install @cas-parser/connect

Quick Start

React / Next.js

import { PortfolioConnect } from '@cas-parser/connect';

function App() {
  return (
    <PortfolioConnect
      accessToken="your_access_token"
      config={{
        enableGenerator: true,   // MF email fetch
        enableCdslFetch: true,   // CDSL OTP fetch
        enableInbox: true,       // Gmail inbox import
      }}
      onSuccess={(data) => console.log(data.holdings)}
    >
      {({ open }) => <button onClick={open}>Import Investments</button>}
    </PortfolioConnect>
  );
}

Vanilla JavaScript

<script src="https://cdn.jsdelivr.net/npm/@cas-parser/connect/dist/portfolio-connect.standalone.min.js"></script>
<button id="import-btn">Import Portfolio</button>

<script>
document.getElementById('import-btn').onclick = async () => {
  try {
    const { data, metadata } = await PortfolioConnect.open({
      accessToken: 'your_access_token',
      config: { enableCdslFetch: true }
    });
    console.log('Holdings:', data.holdings);
  } catch (error) {
    if (error.message === 'Widget closed by user') {
      console.log('User cancelled');
    } else {
      console.error('Error:', error.message);
    }
  }
};
</script>

Access Tokens

Never expose your API key to the frontend. Generate short-lived access tokens from your backend.
# Backend: Generate access token
import requests

response = requests.post(
    "https://api.casparser.in/v1/token",
    headers={"x-api-key": "your_api_key"},
    json={"expiry_minutes": 60}
)
access_token = response.json()["access_token"]
# Pass this at_ prefixed token to your frontend
Access tokens:
  • Are prefixed with at_ for easy identification
  • Valid for up to 60 minutes
  • Can be used in place of API keys on all v4 endpoints
  • Cannot be used to generate other access tokens

Response Data

See full schema: API Reference
interface ParsedData {
  cas_type: 'CAMS_KFINTECH' | 'CDSL' | 'NSDL';
  status: 'success' | 'failed';
  investor_info?: {
    name: string;
    email?: string;
    pan?: string;
  };
  summary?: {
    total_value: number;
    as_on_date: string;
  };
  // ... folios, holdings, etc.
}

Security

FeatureDetails
Data Hosting100% India-hosted (DigitalOcean Bangalore)
EncryptionTLS 1.3 in transit, AES-256 at rest
Data RetentionPDFs deleted immediately after parsing
CredentialsWe never store user passwords

Full Configuration Guide

Complete configuration options, events, error handling, and framework examples