Node.js Quickstart

Upload and parse an eCAS PDF with Node.js using fetch or axios.

Parse your first eCAS file with Node.js using fetch or axios.

Prerequisites

  • Node.js 18+
  • An access token from auth login
  • An eCAS PDF and its password

1. Using fetch (Node.js 18+)

import fs from "fs";
 
const formData = new FormData();
formData.append("pdf", new Blob([fs.readFileSync("ecas.pdf")]));
formData.append("password", "YOUR_PAN_OR_PDF_PASSWORD");
 
const response = await fetch("https://kniwealthtech.ai/api/v1/ecas/upload/", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.ACCESS_TOKEN}`,
  },
  body: formData,
});
 
const data = await response.json();
console.log(`Investor: ${data.investor_name}`);
console.log(`Total Value: ${data.total_portfolio_value}`);

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("pdf", fs.createReadStream("ecas.pdf"));
form.append("password", "YOUR_PAN_OR_PDF_PASSWORD");
 
const response = await axios.post(
  "https://kniwealthtech.ai/api/v1/ecas/upload/",
  form,
  {
    headers: {
      Authorization: `Bearer ${process.env.ACCESS_TOKEN}`,
      ...form.getHeaders(),
    },
    timeout: 60000,
  },
);
 
console.log(response.data);

TypeScript types

interface HoldingRecord {
  id: number;
  depository: string;
  dp_name: string;
  dp_id: string;
  client_id: string;
  bo_id: string;
  isin: string;
  security_name: string;
  symbol: string;
  asset_type: string;
  quantity: number;
  pledged_quantity: number;
  free_quantity: number;
  face_value: number;
  market_price: number;
  value: number;
}
 
interface MFHoldingRecord {
  id: number;
  isin: string;
  scheme_name: string;
  amc_name: string;
  folio_no: string;
  units: number;
  nav: number;
  value: number;
  invested: number;
}
 
interface ExtractionSession {
  id: number;
  source: string;
  investor_name: string;
  pan: string;
  period_from: string;
  period_to: string;
  total_portfolio_value: number;
  created_at: string;
  updated_at: string;
  holdings: HoldingRecord[];
  mf_holdings: MFHoldingRecord[];
}

Full example with error handling

import axios from "axios";
import FormData from "form-data";
import fs from "fs";
 
const ACCESS_TOKEN = process.env.ACCESS_TOKEN;
const API_URL = "https://kniwealthtech.ai/api/v1/ecas/upload/";
 
async function uploadEcas(pdfPath: string, password: string) {
  const form = new FormData();
  form.append("pdf", fs.createReadStream(pdfPath));
  form.append("password", password);
 
  const response = await axios.post(API_URL, form, {
    headers: {
      Authorization: `Bearer ${ACCESS_TOKEN}`,
      ...form.getHeaders(),
    },
    timeout: 60000,
    validateStatus: () => true,
  });
 
  if (response.status !== 201) {
    throw new Error(
      `Upload failed (${response.status}): ${JSON.stringify(response.data)}`,
    );
  }
 
  return response.data as ExtractionSession;
}
 
const data = await uploadEcas("ecas.pdf", "ABCDE1234F");
console.log(`Investor: ${data.investor_name}`);
console.log(`Holdings: ${data.holdings.length}`);

Next steps

  • Upload eCAS PDF — full request/response schema
  • Add more language guides under content/documentation/quickstart/ and register them in content/meta.ts