Skip to main content

Prerequisites

  • Node.js 18+
  • Get an API key
  • Have a CAS PDF ready (or use sandbox key)

1. Using fetch (Node.js 18+)

import fs from 'fs';

const formData = new FormData();
formData.append('file', new Blob([fs.readFileSync('cas.pdf')]));
formData.append('password', 'YOUR_PAN_NUMBER');

const response = await fetch('https://api.casparser.in/v4/smart/parse', {
  method: 'POST',
  headers: { 'x-api-key': 'YOUR_API_KEY' },
  body: formData
});

const data = await response.json();
console.log(`Investor: ${data.investor.name}`);
console.log(`Total Value: ₹${data.summary.total_value.toLocaleString()}`);

2. Using axios

npm install axios form-data
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';

const form = new FormData();
form.append('file', fs.createReadStream('cas.pdf'));
form.append('password', 'YOUR_PAN_NUMBER');

const response = await axios.post(
  'https://api.casparser.in/v4/smart/parse',
  form,
  {
    headers: {
      'x-api-key': 'YOUR_API_KEY',
      ...form.getHeaders()
    },
    timeout: 60000
  }
);

console.log(response.data);

TypeScript types

interface CASResponse {
  meta: {
    cas_type: 'CDSL' | 'NSDL' | 'CAMS_KFINTECH';
    statement_period: {
      from: string;  // YYYY-MM-DD
      to: string;    // YYYY-MM-DD
    };
    generated_at: string;  // ISO 8601
  };
  investor: {
    name: string;
    pan: string;
    email?: string;
    mobile?: string;
    address?: string;
    pincode?: string;
    cas_id?: string;
  };
  summary: {
    total_value: number;
    accounts: {
      demat: { count: number; total_value: number };
      mutual_funds: { count: number; total_value: number };
      insurance: { count: number; total_value: number };
      nps: { count: number; total_value: number };
    };
  };
  demat_accounts: DematAccount[];
  mutual_funds: MutualFundFolio[];
  insurance: {
    life_insurance_policies: LifeInsurancePolicy[];
  };
  nps: NPSAccount[];
}

interface DematAccount {
  demat_type: 'CDSL' | 'NSDL';
  dp_id: string;
  dp_name: string;
  client_id: string;
  bo_id?: string;
  value: number;
  linked_holders: Array<{ name: string; pan: string }>;
  holdings: {
    equities: Equity[];
    corporate_bonds: CorporateBond[];
    government_securities: GovernmentSecurity[];
    aifs: AIF[];
    demat_mutual_funds: DematMutualFund[];
  };
  additional_info: object;
}

interface Equity {
  isin: string;
  name: string;
  units: number;
  value: number;
}

Full example with error handling

import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';

const API_KEY = process.env.CASPARSER_API_KEY;
const API_URL = 'https://api.casparser.in/v4/smart/parse';

async function parseCAS(pdfPath: string, password: string): Promise<CASResponse> {
  const form = new FormData();
  form.append('file', fs.createReadStream(pdfPath));
  form.append('password', password);

  const response = await axios.post<CASResponse>(API_URL, form, {
    headers: {
      'x-api-key': API_KEY,
      ...form.getHeaders()
    },
    timeout: 60000
  });

  if (response.data.status === 'failed') {
    throw new Error(`Parsing failed: ${response.data.msg}`);
  }

  return response.data;
}

// Usage
const data = await parseCAS('cas.pdf', 'ABCDE1234F');
console.log(`Investor: ${data.investor.name}`);
console.log(`Total Value: ₹${data.summary.total_value.toLocaleString()}`);

Next steps