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 -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"
Endpoints
List IPOs
/api/ipokeyIPOs 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.
| Parameter | Type | Description |
|---|---|---|
status | string | upcoming, open, closed or listed |
segment | string | mainboard or sme |
year | integer | Year the issue opened |
start | date | Opened on or after |
end | date | Opened on or before |
q | string | Part of the company name or symbol |
limit | integer | Rows to return. Default 50, up to 500 |
offset | integer | Rows to skip |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo?status=listed&limit=1"
{
"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
/api/ipo/{symbol}keyEverything about one issue: dates, price band, lot, size, ISIN, lead managers, registrar and links to the offer documents.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/BCSSL"
{
"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
/api/ipo/{symbol}/subscriptionkeyBids 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.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
history | boolean | true for every stored update instead of the latest |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/BCSSL/subscription"
{
"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
/api/ipo/{symbol}/performancekeyListing-day open, high, low and close against the issue price, then the close 7, 30 and 180 days later. Past data, not a forecast.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/BCSSL/performance"
{
"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
/api/ipo/{symbol}/allotmentkeyDates, 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.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/BCSSL/allotment"
{
"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
/api/ipo/{symbol}/documentskeyLinks to the RHP, ratios, anchor letter and forms on NSE, and SEBI's filing pages. We do not host the documents.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/BCSSL/documents"
{
"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
/api/ipo/{symbol}/gmpkeyUnofficial grey-market premium history for one issue. Not a price, not a forecast, not advice.
| Parameter | Type | Description |
|---|---|---|
symbol | string required | NSE symbol such as VPFL, or the ISIN |
openDate | date | YYYY-MM-DD. Picks the issue when a symbol was used more than once |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/VPFL/gmp"
{
"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
/api/ipo/gmpkeyThe latest GMP for every recent issue, including ones NSE has not listed yet. Unofficial.
| Parameter | Type | Description |
|---|---|---|
status | string | upcoming, open, closed or listed |
days | integer | Issues opening in the last N days or later. Default 14, up to 90 |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/gmp?days=14"
{
"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
/api/ipo/calendarkeyOpening, closing, allotment, refund and listing days in a window. Allotment and refund days are estimates.
| Parameter | Type | Description |
|---|---|---|
start | date | Default today |
end | date | Default 30 days after start |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/calendar"
{
"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
/api/ipo/filingskeyDraft and red herring filings listed by SEBI, newest first. The earliest public sign that a company plans to list.
| Parameter | Type | Description |
|---|---|---|
kind | string | drhp, udrhp, rhp, addendum, notice or abridged |
q | string | Part of the company name |
limit | integer | Default 50, up to 200 |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/filings?limit=2"
{
"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
/api/ipo/statskeyPer year and segment: issues, how many listed, and the average and median listing-day gain.
| Parameter | Type | Description |
|---|---|---|
segment | string | mainboard or sme |
curl -H "x-api-key: YOUR_KEY" \ "https://fin.ejiapi.com/api/ipo/stats?segment=sme"
{
"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
/api/ipo/coverageno keyRows and newest date per table, and the recent runs of the loader. Needs no key; the status page reads it.
No parameters.
curl \ "https://fin.ejiapi.com/api/ipo/coverage"
{
"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.
| Formula | Returns |
|---|---|
=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.
// 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
- Issue data and subscription: NSE's public pages. GMP: investorgain.com (unofficial). Listing prices and later performance: NSE end-of-day files. Draft and final offer documents: SEBI's public filings list.
- Not covered: issues listed only on BSE, bids made on BSE, debt, InvIT and REIT issues.
- Updates: about every 30 minutes on working days between 08:00 and 20:00 IST, every few hours otherwise.
- Documents are links to NSE and SEBI. Nothing here is hosted prospectus content.