IPO API

Base URL https://fin.ejiapi.com. All endpoints are GET and return JSON, with the same key and response format as the Market Data API. Also in the explorer, as formulas in Google Sheets and as ipo_ tools in the MCP server. Mainboard and SME issues, from 2012.

Quickstart

Request a key (the same key works for every finance API) and send it in the x-api-key header.

curl
curl -H "x-api-key: YOUR_KEY" "https://fin.ejiapi.com/api/ipo?status=open"
curl -H "x-api-key: YOUR_KEY" "https://fin.ejiapi.com/api/ipo/VPFL/subscription?history=true"
Information only, not investment advice. Figures can be late or wrong; check the exchange before you act.

Endpoints

List IPOs

GET/api/ipokey

IPOs by opening date, newest first. For upcoming and open issues, issues that NSE has not listed yet but whose dates are known are included, marked onNse: false with no symbol.

ParameterTypeDescription
statusstringupcoming, open, closed or listed
segmentstringmainboard or sme
yearintegerYear the issue opened
startdateOpened on or after
enddateOpened on or before
qstringPart of the company name or symbol
limitintegerRows to return. Default 50, up to 500
offsetintegerRows to skip
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo?status=listed&limit=1"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "IPOs fetched successfully",
  "data": [
    {
      "symbol": "VPFL",
      "company": "Vedant Poly Fabs Limited",
      "segment": "sme",
      "status": "listed",
      "openDate": "2026-11-02",
      "closeDate": "2026-11-04",
      "allotmentDate": "2026-11-05",
      "refundDate": "2026-11-06",
      "listingDate": "2026-11-09",
      "priceBandLow": 88.0,
      "priceBandHigh": 94.0,
      "issuePrice": 94.0,
      "lotSize": 1200,
      "issueSizeCr": 56.68,
      "minInvestment": 112800.0,
      "subscriptionTimes": 1.85,
      "source": "NSE",
      "onNse": true
    }
  ]
}

One IPO

GET/api/ipo/{symbol}key

Everything about one issue: dates, price band, lot, size, ISIN, lead managers, registrar and links to the offer documents.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/BCSSL"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "IPO fetched successfully",
  "data": {
    "symbol": "BCSSL",
    "company": "Bombay Coated and Special Steels Limited",
    "segment": "mainboard",
    "status": "listed",
    "openDate": "2026-10-29",
    "closeDate": "2026-11-02",
    "allotmentDate": "2026-11-03",
    "refundDate": "2026-11-04",
    "listingDate": "2026-11-05",
    "priceBandLow": 78.0,
    "priceBandHigh": 82.0,
    "issuePrice": 82.0,
    "lotSize": 182,
    "issueSizeCr": 183.06,
    "minInvestment": 14924.0,
    "subscriptionTimes": 60.772412189624006,
    "source": "NSE",
    "onNse": true,
    "isin": "INE0XFY01011",
    "faceValue": 10.0,
    "issueType": "Book Building",
    "issueSizeText": "Initial Public Offer comprising of Fresh Issue aggregating upto Rs. 1,830.57 million (including Anchor reservation portion of 65,97,500 Equity Shares)",
    "leadManagers": [
      "Smart Horizon Capital Advisors Private Limited"
    ],
    "registrar": {
      "name": "KFin Technologies Limited",
      "email": "bombaycoated.ipo@kfintech.com",
      "allotmentUrl": "https://ipostatus.kfintech.com/"
    },
    "sponsorBank": "Kotak Mahindra Bank Limited",
    "documents": {
      "ratios": "https://nsearchives.nseindia.com/content/ipo/RATIOS_BCSSL.zip",
      "rhp": "https://nsearchives.nseindia.com/content/ipo/RHP_BCSSL.zip",
      "bidding": "https://nsearchives.nseindia.com/content/ipo/BIDDING_CENTERS_BCSSL.zip",
      "forms": "https://nsearchives.nseindia.com/content/ipo/FORMS_BCSSL.zip",
      "preanchor": "https://nsearchives.nseindia.com/content/ipo/PREANCHOR_PARAMETERS_BCSSL.zip",
      "postanchor": "https://nsearchives.nseindia.com/content/ipo/POSTANCHOR_PARAMETERS_BCSSL.zip",
      "anchor": "https://nsearchives.nseindia.com/content/ipo/ANCHOR_BCSSL.zip"
    },
    "asOf": "2026-11-13T19:53:48+05:30"
  }
}

Subscription

GET/api/ipo/{symbol}/subscriptionkey

Bids by category (QIB, NII, retail and their parts). NSE bids only. With history=true you get every update we stored, so you can see how bidding built up.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
historybooleantrue for every stored update instead of the latest
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/BCSSL/subscription"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Subscription fetched successfully",
  "data": {
    "asOf": "2026-11-02T19:00:00",
    "totalTimes": 60.772412189624006,
    "categories": [
      {
        "code": "1",
        "category": "Qualified Institutional Buyers(QIBs)",
        "offered": 4798588,
        "bid": 170330524,
        "times": 35.49596756379168,
        "applications": null
      },
      {
        "code": "1(a)",
        "category": "Foreign Institutional Investors(FIIs)",
        "offered": null,
        "bid": 36768550,
        "times": null,
        "applications": null
      },
      "..."
    ]
  },
  "symbol": "BCSSL",
  "coverage": "NSE bids only",
  "source": "NSE"
}

Listing performance

GET/api/ipo/{symbol}/performancekey

Listing-day open, high, low and close against the issue price, then the close 7, 30 and 180 days later. Past data, not a forecast.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/BCSSL/performance"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Performance fetched successfully",
  "data": {
    "symbol": "BCSSL",
    "issuePrice": 82.0,
    "listingDate": "2026-11-05",
    "listing": {
      "open": 91.0,
      "high": 95.55,
      "low": 91.0,
      "close": 94.81,
      "volume": 7896023,
      "gainOnOpenPct": 10.98,
      "gainOnClosePct": 15.62
    },
    "d7": {
      "date": "2026-11-12",
      "close": 81.72,
      "sinceIssuePct": -0.34
    },
    "d30": null,
    "d180": null,
    "latest": {
      "date": "2026-11-13",
      "close": 81.08,
      "sinceIssuePct": -1.12
    }
  },
  "source": "NSE end-of-day data"
}

Allotment information

GET/api/ipo/{symbol}/allotmentkey

Dates, the registrar and its own status page, and the final subscription. Allotment and refund days are worked out as T+1 and T+2. It never takes a PAN or application number.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/BCSSL/allotment"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Allotment information fetched successfully",
  "data": {
    "symbol": "BCSSL",
    "company": "Bombay Coated and Special Steels Limited",
    "stage": "allotment done",
    "closeDate": "2026-11-02",
    "allotmentDate": "2026-11-03",
    "refundDate": "2026-11-04",
    "listingDate": "2026-11-05",
    "datesDerived": true,
    "registrar": {
      "name": "KFin Technologies Limited",
      "email": "bombaycoated.ipo@kfintech.com",
      "statusUrl": "https://ipostatus.kfintech.com/"
    },
    "otherCheckUrls": [
      "https://www.bseindia.com/investors/appli_check.aspx"
    ],
    "finalSubscription": [
      {
        "category": "Qualified Institutional Buyers(QIBs)",
        "offered": 4798588,
        "bid": 170330524,
        "times": 35.49596756379168
      },
      {
        "category": "Foreign Institutional Investors(FIIs)",
        "offered": null,
        "bid": 36768550,
        "times": null
      },
      "..."
    ],
    "howToCheck": "Open the registrar's status page, pick this issue and enter your PAN, application number or DP/client ID. We do not collect these."
  },
  "note": "Allotment and refund days are T+1 and T+2 working days after the close unless the offer document says otherwise."
}

Documents

GET/api/ipo/{symbol}/documentskey

Links to the RHP, ratios, anchor letter and forms on NSE, and SEBI's filing pages. We do not host the documents.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/BCSSL/documents"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Documents fetched successfully",
  "data": [
    {
      "kind": "ratios",
      "title": "RATIOS",
      "url": "https://nsearchives.nseindia.com/content/ipo/RATIOS_BCSSL.zip",
      "source": "NSE"
    },
    {
      "kind": "rhp",
      "title": "RHP",
      "url": "https://nsearchives.nseindia.com/content/ipo/RHP_BCSSL.zip",
      "source": "NSE"
    },
    "..."
  ],
  "note": "Links only. Anchor investor lists are inside NSE's ANCHOR zip as a PDF."
}

GMP, one issue

GET/api/ipo/{symbol}/gmpkey

Unofficial grey-market premium history for one issue. Not a price, not a forecast, not advice.

ParameterTypeDescription
symbolstring requiredNSE symbol such as VPFL, or the ISIN
openDatedateYYYY-MM-DD. Picks the issue when a symbol was used more than once
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/VPFL/gmp"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "GMP fetched successfully",
  "data": {
    "symbol": "VPFL",
    "latest": {
      "asOf": "2026-11-09T09:37:00",
      "gmp": 1.0,
      "source": "investorgain.com",
      "gmpPct": 1.06,
      "impliedPrice": 95.0
    },
    "history": [
      {
        "asOf": "2026-11-09T09:37:00",
        "gmp": 1.0,
        "source": "investorgain.com",
        "gmpPct": 1.06,
        "impliedPrice": 95.0
      }
    ]
  },
  "warning": "Unofficial grey-market premium collected from investorgain.com and noted by us: not a price at which any regulated trade happens, not a forecast and not advice. May be wrong, late or missing."
}

GMP, recent issues

GET/api/ipo/gmpkey

The latest GMP for every recent issue, including ones NSE has not listed yet. Unofficial.

ParameterTypeDescription
statusstringupcoming, open, closed or listed
daysintegerIssues opening in the last N days or later. Default 14, up to 90
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/gmp?days=14"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "GMP fetched successfully",
  "data": [
    {
      "name": "Watrana Rentals",
      "symbol": null,
      "board": "NSE SME",
      "status": "upcoming",
      "openDate": "2026-11-19",
      "issuePrice": 245.0,
      "lotSize": 600,
      "gmp": null,
      "gmpPct": null,
      "gmpLow": 0.0,
      "gmpHigh": 0.0,
      "impliedPrice": null,
      "asOf": "2026-11-13T17:32:00",
      "source": "investorgain.com"
    },
    {
      "name": "Crystal Crop Protection",
      "symbol": null,
      "board": "IPO",
      "status": "upcoming",
      "openDate": "2026-11-18",
      "issuePrice": 272.0,
      "lotSize": 55,
      "gmp": 45.0,
      "gmpPct": 16.54,
      "gmpLow": 45.0,
      "gmpHigh": 45.0,
      "impliedPrice": 317.0,
      "asOf": "2026-11-13T17:37:00",
      "source": "investorgain.com"
    },
    "..."
  ],
  "warning": "Unofficial grey-market premium collected from investorgain.com and noted by us: not a price at which any regulated trade happens, not a forecast and not advice. May be wrong, late or missing."
}

Calendar

GET/api/ipo/calendarkey

Opening, closing, allotment, refund and listing days in a window. Allotment and refund days are estimates.

ParameterTypeDescription
startdateDefault today
enddateDefault 30 days after start
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/calendar"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "IPO calendar fetched successfully",
  "data": [
    {
      "date": "2026-11-13",
      "event": "listing",
      "symbol": "ESFL",
      "company": "Essen Speciality Films Limited",
      "segment": "sme",
      "estimated": false
    }
  ],
  "note": "Allotment and refund days are worked out as T+1 and T+2 working days after the close; exchange holidays are not considered."
}

SEBI filings

GET/api/ipo/filingskey

Draft and red herring filings listed by SEBI, newest first. The earliest public sign that a company plans to list.

ParameterTypeDescription
kindstringdrhp, udrhp, rhp, addendum, notice or abridged
qstringPart of the company name
limitintegerDefault 50, up to 200
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/filings?limit=2"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Filings fetched successfully",
  "data": [
    {
      "filedOn": "2026-11-13",
      "company": "Sitaram Denims India Ltd",
      "kind": "abridged",
      "title": "Sitaram Denims India Ltd - Draft Abridged Prospectus",
      "url": "https://www.sebi.gov.in/filings/public-issues/nov-2026/sitaram-denims-india-ltd-drhp_105736.html",
      "source": "SEBI"
    },
    {
      "filedOn": "2026-11-12",
      "company": "Crystal Crop Protection Limited",
      "kind": "abridged",
      "title": "Crystal Crop Protection Limited - Abridged Prospectus",
      "url": "https://www.sebi.gov.in/filings/public-issues/nov-2026/crystal-crop-protection-limited-rhp_105734.html",
      "source": "SEBI"
    }
  ]
}

Statistics

GET/api/ipo/statskey

Per year and segment: issues, how many listed, and the average and median listing-day gain.

ParameterTypeDescription
segmentstringmainboard or sme
Request
curl -H "x-api-key: YOUR_KEY" \
  "https://fin.ejiapi.com/api/ipo/stats?segment=sme"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "IPO statistics fetched successfully",
  "data": [
    {
      "year": 2026,
      "segment": "sme",
      "issues": 69,
      "listed": 66,
      "withListingData": 66,
      "avgListingDayGainPct": 13.63,
      "medianListingDayGainPct": 2.03,
      "positivePct": 57.6
    },
    {
      "year": 2025,
      "segment": "sme",
      "issues": 117,
      "listed": 117,
      "withListingData": 115,
      "avgListingDayGainPct": 25.29,
      "medianListingDayGainPct": 11.15,
      "positivePct": 63.5
    },
    "..."
  ],
  "note": "Listing-day gain is the first day's close against the issue price, from NSE end-of-day data we hold; issues without it are not counted."
}

Coverage

GET/api/ipo/coverageno key

Rows and newest date per table, and the recent runs of the loader. Needs no key; the status page reads it.

No parameters.

Request
curl \
  "https://fin.ejiapi.com/api/ipo/coverage"
Response (shortened)
{
  "status": "success",
  "statusCode": 200,
  "message": "Coverage fetched successfully",
  "data": {
    "tables": {
      "ipo_issue": {
        "rows": 1360,
        "firstDate": "2012-09-04",
        "latestDate": "2026-11-02"
      }
    },
    "jobs": [
      {
        "job": "ipo_load",
        "lastRun": 1794581113,
        "ok": true,
        "lastSuccess": 1794581113,
        "runs": "..."
      }
    ]
  }
}

Dates are YYYY-MM-DD; amounts are rupees, and fields ending in Cr are rupees crore. Rows are in data; every reply also carries a disclaimer.

Coverage

GET /api/ipo/coverage needs no key. It returns rows and the first and newest date per table, and when the loader last ran. The status page reads it.

Subscription

NSE publishes only the latest state of an issue's bids, refreshed about hourly while bidding is open (10:00 to 17:00 IST). We store a snapshot each time NSE's own update time changes, which is what ?history=true returns. It covers bids placed on NSE; bids on BSE are not included. For SME issues NSE does not send an offered quantity per category, so times is empty there and only the total is given.

Allotment

An allotment result belongs to one applicant and sits on the registrar's page behind your PAN, application number or DP/client ID. This API never asks for or checks those. /allotment gives the dates, the registrar's own status page, and the final subscription. Allotment and refund days are worked out as T+1 and T+2 working days after the close (datesDerived: true); exchange holidays are not considered.

GMP

Grey-market premium is an unofficial figure quoted off-exchange. It is not a price at which any regulated trade happens, not a forecast and not advice, and it can be wrong, late or missing. We collect it from investorgain.com, keep each update with its time so you can see how it moved, and keep it apart from the issue data. /api/ipo/gmp lists the latest for every recent issue (including ones NSE has not listed yet); /api/ipo/{symbol}/gmp gives one issue's history. Each row says where it came from.

Google Sheets

Use IPO data as formulas in your own sheet. The quickest way is the Sheets Lab: type the formulas in its grid to see live results, tick the ones you want, and copy the Apps Script it generates. The script adds an EJI API menu (Set API key, Check setup, Refresh values) and keeps your key in the script's properties, never in a cell. Paste it under Extensions → Apps Script, save, and reload the sheet.

FormulaReturns
=IPOSTATUS("VPFL")upcoming, open, closed or listed
=IPOPRICE("VPFL")Issue price, or the top of the price band while it is open
=IPOLOT("VPFL")Lot size (shares per application)
=IPODATE("VPFL", "listing")A date: open, close, allotment, refund or listing (allotment and refund are worked out)
=IPOSUBS("BCSSL") or =IPOSUBS("BCSSL", "retail")Times subscribed, in total or for qib, nii or retail (NSE bids)
=IPOLISTGAIN("BCSSL")Percent change of the listing-day close against the issue price
=IPOGMP("VPFL")Unofficial grey-market premium in rupees; empty when there is none. Not a price, not advice

A single formula without the menu works too: store your key as EJI_KEY under Project Settings → Script properties.

Apps Script
// Extensions → Apps Script. Store the key under Project Settings → Script properties as EJI_KEY.
function IPOSUBS(symbol) {
  const key = PropertiesService.getScriptProperties().getProperty("EJI_KEY");
  const res = UrlFetchApp.fetch("https://fin.ejiapi.com/api/ipo/" + symbol + "/subscription",
    { headers: { "x-api-key": key } });
  return JSON.parse(res.getContentText()).data.totalTimes;
}
// In a cell: =IPOSUBS("BCSSL")

Results are cached for six hours so a sheet does not spend your quota on every recalculation; Refresh values clears the cache. The formulas need the same key as the rest of the API.

Sources and limits