IPO Guru
v2 · Live IPO data, updated through the day

The Indian IPO
data API

GMP, subscription, anchor allocations, OFS and pre-IPO prices — as clean JSON, from a source that has been tracking every Mainboard and SME issue since 2019. Ship your IPO feature this afternoon.

50k+
GMP data points
300+
IPOs tracked
<100ms
Typical response
99.9%
Uptime target
ipoguru — api/v2
$ curl -H "X-API-KEY: $IPOGURU_KEY" \
    https://www.ipoguru.in/api/v2/gmp?status=open

{
  "success": true,
  "plan": "standard",
  "count": 2,
  "data": [
    {
      "slug": "example-industries-ipo",
      "name": "Example Industries Ltd",
      "type": "Mainboard",
      "status": "Open",
      "gmp": {
        "price": "35",
        "percentage": "29.17%",
        "estimated_listing_price": 155,
        "updated_at_label": "22 Sep, 11:05 AM IST"
      }
    }
  ]
}
Every response stamped with your plan IST timestamps on every value

Depth, not just the ticker

Anyone can scrape today’s GMP. We hold the archive behind it — 52,000+ readings, sampled three times a day, going back across 300+ issues.

One call, every live IPO

/gmp returns the current premium for every open and upcoming issue in a single request. No N+1 polling loop, no wasted quota.

Normalised, not raw

Price bands, lot sizes and money fields arrive parsed. No “₹1,008 – ₹1,062” strings for you to regex at 2am.

Honest failure modes

402 when your plan lacks a scope, with the plan that unlocks it. 429 with retry_after. Never a silent empty array.

Pricing

Priced so you can just start

Pay monthly, or annually and get 2 months free. Every plan reads the same API — the difference is depth and throughput, not a different product.

Free
Free
Evaluation only

Try the API. IPO calendar, basic details and the current GMP.

Start free
10
req / day
1
req / min
  • IPO calendar & search
  • IPO details, dates, price band
  • Live GMP
Basic
₹99 /mo
₹990/yr save ₹198

Full IPO details and live GMP for a small site or app.

Get Basic
250
req / day
10
req / min
  • IPO calendar & search
  • IPO details, dates, price band
  • Live GMP
  • Company, financials, promoters
Most popular
Standard
₹299 /mo
₹2,990/yr save ₹598

Day-wise GMP history, live subscription and anchor data.

Get Standard
1,000
req / day
20
req / min
  • IPO calendar & search
  • IPO details, dates, price band
  • Live GMP
  • Company, financials, promoters
  • Day-wise GMP history
  • Live subscription by category
  • Anchor investor allocations
Everything
Pro
₹499 /mo
₹4,990/yr save ₹998

The complete archive — intraday GMP, day-wise subscription, OFS and pre-IPO prices.

Get Pro
3,000
req / day
40
req / min
  • IPO calendar & search
  • IPO details, dates, price band
  • Live GMP
  • Company, financials, promoters
  • Day-wise GMP history
  • Live subscription by category
  • Anchor investor allocations
  • Intraday GMP timeline
  • Day-wise subscription history
  • OFS issues & live bid book
  • Unlisted / pre-IPO prices
Enterprise

Need more than Pro?

Higher throughput, webhooks on allotment-out and GMP moves, bulk historical exports, white-label terms and a signed contract. Priced against your use case.

Talk to us

Keys are issued manually — email ipoguru.in [at] gmail.com with your name, project and chosen plan. Usually same-day.

What each plan unlocks

Capability Free Basic Standard Pro
IPO calendar & search
IPO details, dates, price band
Live GMP
Company, financials, promoters —
Day-wise GMP history — —
Live subscription by category — —
Anchor investor allocations — —
Intraday GMP timeline — — —
Day-wise subscription history — — —
OFS issues & live bid book — — —
Unlisted / pre-IPO prices — — —
Requests / day 10 250 1,000 3,000
Requests / minute 1 10 20 40

Allotment status checking is not sold on any plan

Checking whether a PAN received an allotment handles personal data and depends on live registrar lookups, so it stays reserved for the IPO Guru website and app. Everything above is market data IPO Guru collects and maintains itself.

Reference

API documentation

Twelve endpoints, one auth scheme, no SDK required. Every example below was captured from a live call, not written by hand.

v2

Base URL

https://www.ipoguru.in/api/v2

All endpoints are GET, return application/json, and are read-only. HTTPS is required. There are no webhooks, no write operations and no SDK — a plain HTTP client is all you need.

Deprecated /api/v1 was deprecated on 30 September 2026 and now returns a v1_retired error. Use the same key on /api/v2.

Authentication

Send your key as a header (recommended) or a query parameter. Keys are long-lived and are not rotated automatically — treat one like a password: keep it server-side, out of version control, and never in browser or mobile code where it can be read.

Header — recommended
X-API-KEY: your_api_key
Query parameter
?api_key=your_api_key

Convenient for a quick browser test. Avoid in production — query strings land in proxy and server logs.

Plans & scopes

Each endpoint is gated on a scope. Your plan carries a set of them, and a request for a scope you do not hold returns 402 naming the plan that would unlock it. GET /me returns the scopes your key currently holds.

Scope Unlocks From plan
calendar IPO calendar and list Free
details IPO detail document Free
details_full Company, financials, promoters, documents and contacts Basic
gmp Current GMP Free
gmp_history Day-wise GMP trend series Standard
gmp_intraday Intraday GMP timeline (11 AM / 5 PM / 10 PM points) Pro
subscription Live subscription by category Standard
subscription_history Day-wise subscription build-up Pro
anchors Anchor investor allocations Standard
ofs Offer For Sale issues and live bids Pro
unlisted Unlisted / pre-IPO share prices Pro

Rate limits

A burst limit and a daily quota apply together. The daily quota resets at midnight IST. Both are counted per key, and

Plan Per minute Per day
Free 1 10
Basic 10 250
Standard 20 1,000
Pro 40 3,000
Response headers
X-Plan
The plan this response was served under.
X-RateLimit-Limit
Your daily quota.
X-RateLimit-Remaining
Requests left today. Watch this instead of waiting for a 429.
Retry-After
Seconds to wait. Sent only on a burst 429.

Conventions

Read this once and the rest of the reference will hold no surprises.

The envelope

Every success returns success: true and plan, the plan it was served under. Collections add count and a data array; single resources return a data object.

Money is a string

GMP, prices and share counts arrive as strings, because that is how the exchanges and grey market publish them — sometimes with commas, occasionally malformed. Where a clean number matters we add a parsed twin: price → price_value, times → times_value, price_band → price_min/price_max. Prefer the parsed field.

Null means unknown

A null means we have no value — not zero. A GMP of "0" is a real reading that the grey market priced at nil. Do not conflate the two when you render.

Dates and times

Plain dates are YYYY-MM-DD. Timestamps ending in Z are UTC ISO-8601. Any field suffixed _label is the same moment pre-formatted in IST for display. The business day, quota reset and all slot hours are IST.

Slugs are the identifier

Use slug everywhere. Numeric ids are not exposed in v2 and names are not stable.

Absent vs empty

Plan-gated blocks are omitted from the payload and named in a locked object — except timeline, which stays an empty array so loops need no null check.

IPOs

2 endpoints
GET /ipos Free

IPO calendar

Every Mainboard and SME issue, newest first. This is the endpoint most integrations build their listing page on.

Parameters
type string Optional mainboard or sme (case-insensitive). Omit for both boards.
status string Optional open, upcoming, closed or listed. Case-insensitive; any other value returns 422. upcoming means an open date after today, so it is empty between announcements.
search string Optional Matches company name, display name or slug (partial, case-insensitive).
months integer Optional Only issues that opened within the last N months. Defaults to 3 (no limit when search is given); pass 0 for no date limit.
limit integer Optional Cap the number of rows returned. Applied per board, then to the merged result.
Response fields
slug string Stable identifier. Use it for every other IPO endpoint — never the name.
name string Legal-ish company name as IPO Guru records it.
display_name string Shorter name for UI. Falls back to name.
type string Mainboard or SME.
sub_type string|null Instrument — usually Equity.
status string Upcoming, Open or Closed, computed against today in IST.
is_listed boolean True once the listing date has passed.
logo string|null Absolute URL. Hotlinking is fine.
open_date … listing_date string|null Dates as YYYY-MM-DD. Null until scheduled.
price_band string|null As published, e.g. "140-148". Free text — parse the two fields below instead.
price_min / price_max number|null Band parsed for you. price_max is the cap price all derived maths uses.
issue_price string|null Final issue price once fixed.
issue_size string|null In ₹ crore, as published.
lot_size integer|null Shares per lot.
min_investment number|null lot_size × price_max, precomputed.
gmp object Current GMP block — see /ipos/{slug}/gmp.
subscription_total string|null Overall subscription in times, e.g. "71.25".
listing_price string|null Listing-day open. Null before listing.
listing_gain_percent number|null Listing price vs issue price, 2dp.
cmp string|null Current market price for listed issues.
current_gain_percent number|null CMP vs issue price, 2dp.
web_url string Canonical page on ipoguru.in — useful for attribution links.
Example response
{
  "success": true,
  "plan": "standard",
  "count": 1,
  "data": [
    {
      "slug": "varmora-granito-ipo",
      "name": "Varmora Granito",
      "display_name": "Varmora Granito",
      "type": "Mainboard",
      "sub_type": "Equity",
      "status": "Open",
      "is_listed": false,
      "logo": "https://www.ipoguru.in/storage/logos/varmora-granito-ipo.webp",
      "open_date": "2026-09-22",
      "close_date": "2026-09-24",
      "allotment_date": "2026-09-25",
      "listing_date": "2026-09-29",
      "price_band": "140-148",
      "price_min": 140,
      "price_max": 148,
      "issue_price": "148",
      "issue_size": "708.02",
      "lot_size": 101,
      "min_investment": 14948,
      "gmp": {
        "price": "7.5",
        "percentage": "5.07",
        "kostak": null,
        "subject_to_sauda": "700,,9800",
        "estimated_listing_price": 155.5,
        "updated_at": "2026-09-22T07:06:09.000000Z",
        "updated_at_label": "22 Sep 2026, 12:36 PM IST"
      },
      "subscription_total": "0.07",
      "listing_price": null,
      "listing_gain_percent": null,
      "cmp": null,
      "current_gain_percent": null,
      "web_url": "https://www.ipoguru.in/ipo/varmora-granito-ipo"
    }
  ]
}
Notes
  • There is no pagination. The default 3-month window keeps the payload small; widen it with months and cap it with limit.
  • Rows are sorted by open_date descending across both boards.
GET /ipos/{slug} Free

IPO detail

The full document for one issue: timeline, issue terms, GMP, subscription summary and listing performance — plus the editorial sections on paid plans.

Parameters
{slug} string Required Path segment. Take it from /ipos.
Response fields
images object logo and feature absolute URLs.
timeline object open_date, close_date, allotment_date, refund_date, credit_to_demat_date, listing_date.
issue object Size, price band (raw + parsed), face value, lot size, minimum investment, sale type, exchanges, bse_scrip_code, nse_symbol.
gmp object Current GMP block.
subscription_summary object Flat category totals plus applications and freshness stamps.
listing object Listing price, CMP and both gain percentages.
lot_calculator array Basic+. Retail / S-HNI / B-HNI application tiers with lots, shares and rupee amounts.
reservation array Basic+. Category-wise reservation of the issue.
shares_offered object Basic+. Shares offered to QIB / NII / Retail.
company object Basic+. About, description, strengths[], risks[], objects of issue, financials (headers + rows, ₹ crore), kpis[], promoter profiles and holding pattern.
contacts object Basic+. Company, registrar (with status_page and driver) and lead managers.
documents object Basic+. RHP, DRHP, anchor and basis-of-allotment links. Frequently null.
locked object Present only on Free, listing which blocks were withheld and why.
Example response
{
  "success": true,
  "plan": "basic",
  "data": {
    "slug": "skyways-air-services-ipo",
    "name": "Skyways Air Services",
    "type": "Mainboard",
    "status": "Closed",
    "is_listed": true,
    "timeline": {
      "open_date": "2026-08-24",
      "close_date": "2026-08-27",
      "allotment_date": "2026-08-28",
      "refund_date": "2026-08-31",
      "credit_to_demat_date": "2026-08-31",
      "listing_date": "2026-09-01"
    },
    "issue": {
      "issue_size": "582.8",
      "issue_price": "138",
      "price_band": "131-138",
      "price_min": 131,
      "price_max": 138,
      "face_value": "10",
      "lot_size": 100,
      "min_investment": 13800,
      "sale_type": "Fresh capital cum OFS",
      "listing_on": "BSE, NSE",
      "bse_scrip_code": "7903",
      "nse_symbol": "SKYWAYS.NS"
    },
    "listing": {
      "listing_price": "124",
      "listing_gain_percent": -10.14,
      "cmp": "126.46",
      "current_gain_percent": -8.36
    },
    "lot_calculator": [
      { "label": "Retail (Min)", "lots": 1,  "shares": 100,  "amount": 13800 },
      { "label": "Retail (Max)", "lots": 14, "shares": 1400, "amount": 193200 }
    ],
    "company": {
      "about": "Skyways Air Services Limited is an Indian logistics …",
      "strengths": ["Sales have more than doubled in two years. …"],
      "risks": ["Debt is high and has kept rising, from Rs 357.34 crore …"],
      "financials": {
        "headers": ["31 Mar 2026", "31 Mar 2025", "31 Mar 2024"],
        "rows": [{ "metric": "Assets", "data": ["1,508.24", "1,321.64", "790.35"] }],
        "unit": "Rs. Crore"
      }
    },
    "contacts": {
      "registrar": {
        "name": "Bigshare Services Private Limited",
        "slug": "bigshare-services",
        "status_page": "https://ipo.bigshareonline.com/ipo_status.html",
        "supports_in_app": true
      }
    },
    "web_url": "https://www.ipoguru.in/ipo/skyways-air-services-ipo"
  }
}
Notes
  • On the Free plan the response omits lot_calculator, reservation, shares_offered, company, contacts and documents, and adds a locked block naming them. It is still a 200, not a 402.
  • company.financials and objects_of_issue carry a text fallback when the underlying value is prose rather than structured data. Check rows/items first, then text.
  • SME issues have no kpis column upstream, so that array is empty for them.

GMP

3 endpoints
GET /gmp Free

Current GMP, all live IPOs

Grey Market Premium for every open and upcoming issue in a single call. Built so you never need one request per IPO.

Parameters
type string Optional mainboard or sme (case-insensitive).
status string Optional open or upcoming (case-insensitive; any other value returns 422).
Response fields
slug / name / type string Identity of the issue.
status string Upcoming / Open / Closed.
price_band string|null As published.
issue_price string|null Final issue price where fixed.
gmp object The GMP block, documented on the next endpoint.
Example response
{
  "success": true,
  "plan": "free",
  "count": 12,
  "data": [
    {
      "slug": "varmora-granito-ipo",
      "name": "Varmora Granito",
      "type": "Mainboard",
      "status": "Open",
      "price_band": "140-148",
      "issue_price": "148",
      "gmp": {
        "price": "7.5",
        "percentage": "5.07",
        "kostak": null,
        "subject_to_sauda": "700,,9800",
        "estimated_listing_price": 155.5,
        "updated_at": "2026-09-22T07:06:09.000000Z",
        "updated_at_label": "22 Sep 2026, 12:36 PM IST"
      }
    }
  ]
}
Notes
  • Scoped to issues that opened within the last three months, so it stays a small response even on a busy week.
  • This is the right endpoint to poll. Polling /ipos/{slug}/gmp in a loop will exhaust your quota for no extra data.
GET /ipos/{slug}/gmp Free

Current GMP, one IPO

The latest grey-market reading for a single issue.

Parameters
{slug} string Required IPO slug.
Response fields
gmp.price string|null Premium in ₹ over the cap price, as recorded. String, because the source publishes it as text.
gmp.percentage string|null Premium as a percentage of the cap price.
gmp.kostak string|null Kostak rate — the flat price paid for an application regardless of allotment. Tracked for featured issues only, so usually null.
gmp.subject_to_sauda string|null Price paid for an application conditional on allotment. Tracked for roughly 30 issues at a time. May contain multiple comma-separated figures exactly as published.
gmp.estimated_listing_price number|null price_max + gmp.price, precomputed. Arithmetic, not a forecast.
gmp.updated_at string|null UTC ISO-8601 timestamp of the reading.
gmp.updated_at_label string|null The same moment formatted in IST for display.
Example response
{
  "success": true,
  "plan": "free",
  "data": {
    "slug": "skyways-air-services-ipo",
    "name": "Skyways Air Services",
    "type": "Mainboard",
    "gmp": {
      "price": "32",
      "percentage": "23.19",
      "kostak": null,
      "subject_to_sauda": null,
      "estimated_listing_price": 170,
      "updated_at": "2026-09-01T02:54:03.000000Z",
      "updated_at_label": "01 Sep 2026, 08:24 AM IST"
    }
  }
}
Notes
  • A GMP of "0" is a real reading — the grey market priced it at nil. It is not a missing value. A missing value is null.
  • Always surface updated_at to your users. A premium from yesterday evening looks identical to one from five minutes ago unless you show the stamp.
GET /ipos/{slug}/gmp/history Standard+

GMP history

The archive behind the live number: a day-wise series on Standard, plus the intraday timeline on Pro.

Parameters
{slug} string Required IPO slug.
days integer Optional Trim to the most recent N days. Cannot widen beyond what your plan allows.
Response fields
summary.current object The live GMP block.
summary.high / low object|null Peak and trough with the dates they occurred, across the returned window.
summary.first object|null The earliest reading in the window.
summary.days integer Number of daily points returned.
summary.points integer Number of intraday points returned. 0 below Pro.
summary.issue_price number|null Cap price used for the derived listing estimates.
trend[] array One point per day — that day’s last reading. Oldest first, ready to plot.
trend[].price_value number|null Numeric premium. Use this for maths; price is the raw string.
timeline[] array Pro. Intraday points sampled at 11 AM, 5 PM and 10 PM IST, plus a trailing live reading on the current day.
timeline[].slot integer|null Hour of the slot (11, 17, 22). Null on the trailing live point.
timeline[].recorded_at string When the reading was actually captured, which is near but not exactly the slot hour.
locked object Present below Pro, naming timeline as withheld.
truncated object Present only when a plan ceiling actually clipped the window.
Example response
{
  "success": true,
  "plan": "pro",
  "data": {
    "summary": {
      "current": { "price": "32", "percentage": "23.19", "estimated_listing_price": 170 },
      "high":  { "price": 39.5, "date": "2026-08-31" },
      "low":   { "price": 32,   "date": "2026-09-01" },
      "first": { "price": 32,   "date": "2026-08-31" },
      "days": 2,
      "points": 4,
      "issue_price": 138
    },
    "trend": [
      {
        "date": "2026-08-31",
        "price": "32",
        "price_value": 32,
        "percentage": "23.19",
        "kostak": null,
        "subject_to_sauda": null,
        "estimated_listing_price": 170
      }
    ],
    "timeline": [
      {
        "date": "2026-08-31",
        "slot": 11,
        "slot_label": "11 AM",
        "label": "31 Aug 2026, 11 AM",
        "recorded_at": "2026-08-31 10:48:02",
        "price_value": 39.5,
        "percentage": "28.62",
        "estimated_listing_price": 177.5
      }
    ]
  }
}
Notes
  • A single IPO’s GMP history only spans its own bidding window — typically two to four weeks, 31 days at the outside. There is no multi-year series for one issue.
  • Below Pro, timeline is an empty array rather than an absent key, so client code that iterates it needs no null check.

Subscription

3 endpoints
GET /ipos/{slug}/subscription Standard+

Live subscription

Bidding figures as they stand right now, as a category → sub-category tree.

Parameters
{slug} string Required IPO slug.
Response fields
summary object Flat totals per category plus applications and freshness stamps.
applications_source string|null Where the application count came from — boa once basis of allotment is out, otherwise the exchange feed.
categories[] array Ordered QIB, NII, Retail, Employee, Shareholder, Anchor, Total. Categories with no data are omitted entirely.
categories[].key string Stable machine key — see the category table below.
categories[].times string|null Subscription in times, as published.
categories[].times_value number|null The same figure parsed to a number.
categories[].shares_offered / shares_applied string|null Share counts, as published.
categories[].applications string|null Application count where the exchange reports it.
categories[].sub_categories[] array Finer buckets — FII, MF, bNII/sNII splits, cut-off vs price bids.
Example response
{
  "success": true,
  "plan": "standard",
  "data": {
    "slug": "skyways-air-services-ipo",
    "name": "Skyways Air Services",
    "type": "Mainboard",
    "summary": {
      "total": "71.25",
      "qib": "139.69",
      "nii": "87.24",
      "retail": "25.4",
      "employee": "0",
      "shareholder": "0",
      "anchor": null,
      "applications": "3364884",
      "updated_at": "2026-09-01T13:01:00.000000Z",
      "updated_at_label": "01 Sep 2026, 06:31 PM IST"
    },
    "applications_source": "boa",
    "categories": [
      {
        "key": "QIB",
        "label": "Qualified Institutional Buyers (QIB)",
        "times": "139.69",
        "times_value": 139.69,
        "shares_offered": "8432000",
        "shares_applied": "1177854000",
        "applications": "114",
        "amount": null,
        "sub_categories": [
          {
            "key": "FII",
            "label": "Foreign Institutional Investors",
            "times": "",
            "times_value": null,
            "shares_applied": "144198100"
          }
        ]
      }
    ]
  }
}
Notes
  • For Mainboard issues the consolidated NSE figure is used. Never add BSE and NSE numbers together — they are already consolidated, and summing them double-counts.
  • Empty strings appear in times where the exchange published a blank. Prefer times_value, which is null in that case.
GET /ipos/{slug}/subscription/history Pro+

Subscription history

How the book built up, day by day across the bidding window.

Parameters
{slug} string Required IPO slug.
Response fields
count integer Number of snapshots returned.
day_wise[] array Oldest first.
day_wise[].day integer|null Bidding day number — 1 is the opening day.
day_wise[].date string YYYY-MM-DD.
day_wise[].time string|null HH:MM:SS IST of the snapshot.
day_wise[].qib … total string|null Subscription in times per category at that moment.
Example response
{
  "success": true,
  "plan": "pro",
  "data": {
    "slug": "skyways-air-services-ipo",
    "name": "Skyways Air Services",
    "type": "Mainboard",
    "count": 4,
    "day_wise": [
      {
        "day": 1,
        "date": "2026-08-24",
        "time": "19:30:41",
        "qib": "0.46",
        "nii": "0.92",
        "retail": "1.65",
        "employee": "0",
        "shareholder": "0",
        "total": "1.16"
      }
    ]
  }
}
Notes
  • One snapshot per bidding day, taken near the close of the exchange window — not a continuous intraday series.
GET /ipos/{slug}/anchors Standard+

Anchor investors

Who was allotted in the anchor book, for how much, with a roll-up by fund house.

Parameters
{slug} string Required IPO slug.
Response fields
summary.total_anchors integer Number of anchor entities allotted.
summary.total_amount_cr number Total anchor book in ₹ crore.
summary.mutual_fund_count integer How many allottees are mutual funds — a quality signal readers look for.
summary.anchor_document string|null Link to the filed anchor allocation document, where available.
anchors[].name string|null Scheme or entity name as filed.
anchors[].group_entity string|null Parent fund house, used for the roll-up.
anchors[].shares_allotted integer|null Share count.
anchors[].amount_cr number|null ₹ crore.
anchors[].pct_allocated number|null Share of the anchor book.
anchors[].pct_allotment_of_issue number|null Share of the total issue.
groups[] array Aggregated by group_entity, largest first.
Example response
{
  "success": true,
  "plan": "standard",
  "data": {
    "slug": "skyways-air-services-ipo",
    "name": "Skyways Air Services",
    "type": "Mainboard",
    "summary": {
      "total_anchors": 17,
      "total_amount_cr": 174.54,
      "mutual_fund_count": 6,
      "anchor_document": null
    },
    "anchors": [
      {
        "name": "BANK OF INDIA SMALL CAP FUND",
        "group_entity": "BANK OF INDIA MUTUAL FUND",
        "shares_allotted": 1870000,
        "amount_cr": 25.81,
        "pct_allocated": 14.78,
        "pct_allotment_of_issue": 4.43
      }
    ],
    "groups": [
      { "group_entity": "BANK OF INDIA MUTUAL FUND", "anchors": 2, "amount_cr": 49.68 }
    ]
  }
}
Notes
  • Anchor allocation happens one working day before the issue opens, so this returns empty arrays for upcoming issues.

OFS

2 endpoints
GET /ofs Pro+

Offer For Sale issues

Every tracked OFS, newest first, with its current subscription.

Parameters
limit integer Optional Cap the number of rows.
Response fields
slug string Identifier for the detail endpoint.
company / short_name string Issuer.
category string|null Tranche — typically Retail or Non-Retail. An OFS runs as two tranches on consecutive days.
status string Effective status, computed from the offer dates.
open_date / close_date string|null ISO timestamps.
floor_price number|null Floor price in ₹.
discount string|null Retail discount, as published.
nse_symbol / bse_scripcode string|null Exchange identifiers.
subscription number|null Times subscribed from the latest stored snapshot.
Example response
{
  "success": true,
  "plan": "pro",
  "count": 22,
  "data": [
    {
      "slug": "knowledge-realty-trust-retail-sep-2026",
      "company": "Knowledge Realty Trust",
      "short_name": "Knowledge Realty Trust",
      "category": "Retail",
      "status": "closed",
      "open_date": "2026-08-31T18:30:00.000000Z",
      "close_date": "2026-08-31T18:30:00.000000Z",
      "floor_price": 108.51,
      "discount": "0.00",
      "nse_symbol": "KRT",
      "bse_scripcode": "544481",
      "subscription": 0.08
    }
  ]
}
GET /ofs/{slug} Pro+

OFS detail and bid book

One offer with its most recent bid snapshot, including the green-shoe split.

Parameters
{slug} string Required OFS slug.
Response fields
seller string|null Selling shareholders, as filed.
shares_offered string|null Base offer size, as published.
exchange string|null Which exchanges carry the offer.
has_green_shoe boolean Whether an oversubscription option exists.
green_shoe_size integer|null Green-shoe shares.
book.ltp number|null Last traded price of the underlying.
book.indicative_price number|null Indicative clearing price.
book.floor_price number|null Floor price.
book.base_cutoff number|null Cut-off on the base issue.
book.gs_cutoff number|null Cut-off including green shoe.
book.total_qty integer|null Quantity bid so far.
book.issue_size / gs_issue_size integer|null Base and green-shoe sizes in shares.
book.subscription_times / gs_subscription_times number|null Times subscribed, base and with green shoe.
book.status string|null Exchange-reported state of the book.
book.data_timestamp string|null When the exchange last published the snapshot.
Example response
{
  "success": true,
  "plan": "pro",
  "data": {
    "slug": "knowledge-realty-trust-retail-sep-2026",
    "company": "Knowledge Realty Trust",
    "category": "Retail",
    "status": "closed",
    "floor_price": 108.51,
    "seller": "BREP Asia SG L&T Holding, BREP Asia SG DRPL Holding …",
    "shares_offered": "7,40,00,000",
    "exchange": "BSE / NSE",
    "has_green_shoe": true,
    "green_shoe_size": 37000000,
    "book": {
      "symbol": "KRT",
      "offer_date": "01-Sep-2026",
      "ltp": null,
      "indicative_price": null,
      "floor_price": 108.51,
      "base_cutoff": 108.51,
      "gs_cutoff": 108.51,
      "total_qty": 6049780,
      "issue_size": 74000000,
      "gs_issue_size": 37000000,
      "subscription_times": 0.08,
      "gs_subscription_times": null,
      "status": "Active",
      "data_timestamp": null,
      "updated_at_label": null
    }
  }
}
Notes
  • Reads stored snapshots only. Calling this never triggers a fetch against NSE or BSE, so the freshness you get is the freshness of our last scheduled poll.
  • book is null for offers that never produced a snapshot.

Pre-IPO

2 endpoints
GET /unlisted Pro+

Unlisted / pre-IPO shares

Every tracked unlisted company with its last traded price and 52-week band.

Parameters
search string Optional Matches company name, display name, slug or ISIN (partial, case-insensitive).
Response fields
slug string Identifier for the detail endpoint.
name / display_name string Company name.
sector string|null Broad sector, where recorded.
isin string|null ISIN, useful for matching against your own instrument master.
logo string|null Absolute URL.
ltp number|null Last traded price in ₹ on the unlisted market.
ltp_updated_at string|null UTC ISO-8601 time we last refreshed the price (up to three times a day). Not the date of the quote — see price_date.
price_date string|null Date of the quote at the source, YYYY-MM-DD.
price_source string unlistedzone (scraped daily) or manual (entered by our team).
price_type string Always indicative_dealer_quote: one indicative price per day from dealers, not an order book, so there is no bid/ask.
is_stale boolean True when there is no price, or the quote is more than 7 days old. Treat a stale price as unreliable.
week_52_high / week_52_low number|null High and low of the stored daily prices over the trailing year, recalculated on every refresh.
lot_size integer|null Minimum tradeable quantity.
min_investment number|null Where recorded.
ipo_status string|null Where the company is in its listing journey, if known.
Example response
{
  "success": true,
  "plan": "pro",
  "count": 23,
  "data": [
    {
      "slug": "apollo-green-energy-limited",
      "name": "Apollo Green Energy Limited",
      "display_name": "Apollo Green Energy Limited",
      "sector": null,
      "isin": "INE838A01015",
      "logo": "https://www.ipoguru.in/storage/unlisted_logos/apollo-green-energy-limited.webp",
      "ltp": 64,
      "ltp_updated_at": "2026-10-06T11:38:31.000000Z",
      "price_date": "2026-10-06",
      "price_source": "unlistedzone",
      "price_type": "indicative_dealer_quote",
      "is_stale": false,
      "week_52_high": 188,
      "week_52_low": 56,
      "lot_size": 1000,
      "min_investment": null,
      "ipo_status": null
    }
  ]
}
Notes
  • Unlisted prices come from the grey/unlisted market and are indicative. They are not exchange-traded quotes and carry no regulatory backing.
  • Prices refresh at 09:00, 15:00 and 21:00 IST. Dealers usually move a quote at most once a day, and many names go days without a change.
  • A company drops out of this list once its IPO lists — it trades on the exchange from then on; use the IPO endpoints for it.
  • Some companies have no current quote (ltp null, is_stale true) because no dealer is quoting them. They stay listed so your instrument master does not churn.
  • The ahimsa classification IPO Guru publishes on its own pages is not exposed here — it is an editorial judgement, and it would carry none of its context republished elsewhere.
GET /unlisted/{slug} Pro+

Unlisted share detail

One company with its valuation snapshot, listing outlook and full price history.

Parameters
{slug} string Required Unlisted share slug.
days integer Optional Return only the most recent N price readings. Omit for the entire series.
Response fields
sector / sub_sector / isin string|null Classification.
website / headquarters / founded_year string|null Company profile.
about string|null Narrative description.
price.ltp number|null Last traded price in ₹.
price.updated_at string|null UTC ISO-8601 time we last refreshed the price.
price.price_date / price_source / price_type / is_stale mixed Quote provenance, as in the list endpoint.
price.week_52_high / week_52_low number|null Computed from the stored series over the trailing year.
price.face_value / lot_size / min_investment mixed Trading parameters.
valuation object market_cap, p_e_ratio, p_b_ratio, roce — as recorded, frequently partial.
ipo object outlook, status, anticipated_year, lockin_months.
price_history[] array date, price, note. Always oldest first, so it plots directly.
web_url string Canonical page on ipoguru.in.
Example response
{
  "success": true,
  "plan": "pro",
  "data": {
    "slug": "apollo-green-energy-limited",
    "name": "Apollo Green Energy Limited",
    "sector": null,
    "isin": "INE838A01015",
    "price": {
      "ltp": 64,
      "updated_at": "2026-10-06T11:38:31.000000Z",
      "price_date": "2026-10-06",
      "price_source": "unlistedzone",
      "price_type": "indicative_dealer_quote",
      "is_stale": false,
      "week_52_high": 188,
      "week_52_low": 56,
      "face_value": "10.00",
      "lot_size": 1000,
      "min_investment": null
    },
    "valuation": {
      "market_cap": "268.00",
      "p_e_ratio": "7.89",
      "p_b_ratio": "0.32",
      "roce": null
    },
    "ipo": {
      "outlook": null,
      "status": null,
      "anticipated_year": null,
      "lockin_months": 6
    },
    "price_history": [
      { "date": "2026-10-03T18:30:00.000000Z", "price": 66, "note": null },
      { "date": "2026-10-04T18:30:00.000000Z", "price": 64, "note": null },
      { "date": "2026-10-05T18:30:00.000000Z", "price": 64, "note": null }
    ],
    "web_url": "https://www.ipoguru.in/pre-ipo-shares/apollo-green-energy-limited"
  }
}
Notes
  • days returns the most recent N readings, then sorts them oldest-first for plotting.
  • The 52-week band is computed from the readings we hold, so on a recently added company it widens as history accumulates. After a split, bonus or other change of share basis, readings before it are left out of the band but stay in price_history.
  • A company whose IPO has listed returns 404.
  • valuation fields are strings and often null — these are reported figures, not computed ones.

Account

2 endpoints
GET /me Free

Key introspection

What this key is allowed to do, and how much of today is left. Answers most support questions before they are asked.

No parameters.

Response fields
name string The client name on the key.
plan string Plan in force — this reads free if a paid plan has lapsed.
plan_label string Display name.
expires_at string|null YYYY-MM-DD, or null for a plan that does not lapse.
lapsed boolean True when a paid plan has expired and free limits are being applied.
scopes[] array Scope keys this key can reach.
limits object per_minute, per_day and gmp_history_days.
usage_today object used, remaining and resets_at (IST).
Example response
{
  "success": true,
  "plan": "standard",
  "data": {
    "name": "Acme Fintech",
    "plan": "standard",
    "plan_label": "Standard",
    "expires_at": "2027-03-31",
    "lapsed": false,
    "scopes": [
      "calendar", "details", "details_full", "gmp",
      "gmp_history", "subscription", "anchors"
    ],
    "limits": { "per_minute": 20, "per_day": 1000, "gmp_history_days": 90 },
    "usage_today": { "used": 143, "remaining": 857, "resets_at": "23 Sep 2026, 12:00 AM IST" }
  }
}
Notes
  • This call counts against your quota like any other.
GET /plans Free

Plan catalogue

The published plans, their prices and their scopes — read from the same config the API enforces.

No parameters.

Response fields
yearly_months_free integer Months waived when paying annually.
data[].key string Plan key used elsewhere in the API.
data[].price_monthly / price_yearly integer INR.
data[].yearly_saving integer Rupees saved by paying annually.
data[].requests_per_day / requests_per_min integer Limits.
data[].gmp_history_days integer|null 0 = current reading only, null = no ceiling.
data[].scopes[] array What the plan unlocks.
Example response
{
  "success": true,
  "plan": "free",
  "yearly_months_free": 2,
  "data": [
    {
      "key": "standard",
      "label": "Standard",
      "price_monthly": 299,
      "price_yearly": 2990,
      "currency": "INR",
      "yearly_saving": 598,
      "requests_per_day": 1000,
      "requests_per_min": 20,
      "gmp_history_days": 90,
      "scopes": ["calendar", "details", "details_full", "gmp", "gmp_history", "subscription", "anchors"],
      "blurb": "Day-wise GMP history, live subscription and anchor data."
    }
  ]
}

Subscription category keys

The complete vocabulary used by categories[].key and sub_categories[].key. Keys are stable; switch on them rather than on the label.

Categories
TOTAL Total
ANCHOR Anchor Investors
QIB Qualified Institutional Buyers (QIB)
NII Non-Institutional Investors (NII)
RETAIL Retail Individual Investors (RII)
EMPLOYEE Employee
SHAREHOLDER Shareholder
Sub-categories
FII Foreign Institutional Investors
DFI Domestic Financial Institutions
MF Mutual Funds
OTHERS Others
BNII bNII — bids above ₹10 Lakh
BNII_CORP bNII — Corporates
BNII_IND bNII — Individuals
BNII_OTHERS bNII — Others
SNII sNII — bids ₹2 Lakh to ₹10 Lakh
SNII_CORP sNII — Corporates
SNII_IND sNII — Individuals
SNII_OTHERS sNII — Others
CUTOFF Cut-off price bids
PRICE Price bids

Errors

Errors are JSON with success: false and a stable machine-readable error code. Branch on the code, never on the message — messages are written for humans and may be reworded.

Status Code Meaning & what to do
401 missing_key No key was sent. Add the X-API-KEY header.
403 invalid_key The key is unknown or has been deactivated. Do not retry — contact us.
402 plan_upgrade_required Authenticated, but your plan lacks the scope. The body carries required_scope, your_plan and upgrade_to. Also returned when a paid plan has lapsed, in which case the message says so.
429 rate_limited Burst limit hit. Wait retry_after seconds and retry.
429 daily_quota_reached Daily quota exhausted. The body carries resets_at (IST). Retrying before then will not help.
404 — Unknown slug, or an endpoint that does not exist. Returns {\"success\": false, \"message\": …}.
422 — A query parameter failed validation. The body names the offending field.
HTTP 402 plan_upgrade_required
{
  "success": false,
  "error": "plan_upgrade_required",
  "message": "Day-wise GMP trend series is not included in the Basic plan. Upgrade to Standard to access it.",
  "required_scope": "gmp_history",
  "your_plan": "basic",
  "upgrade_to": "standard",
  "upgrade": "https://www.ipoguru.in/ipo-gmp-details-developer-api#pricing"
}
HTTP 429 daily_quota_reached
{
  "success": false,
  "error": "daily_quota_reached",
  "message": "Daily limit of 1,000 requests reached on the Standard plan.",
  "plan": "standard",
  "resets_at": "23 Sep 2026, 12:00 AM IST",
  "upgrade": "https://www.ipoguru.in/ipo-gmp-details-developer-api#pricing"
}

Quickstart

Fetch the current GMP for every open IPO.

curl -H "X-API-KEY: $IPOGURU_KEY" \
  "https://www.ipoguru.in/api/v2/gmp?status=open"
use Illuminate\Support\Facades\Http;

$res = Http::withHeaders(['X-API-KEY' => config('services.ipoguru.key')])
    ->timeout(10)
    ->retry(2, 500)
    ->get('https://www.ipoguru.in/api/v2/gmp', ['status' => 'open'])
    ->throw()
    ->json();

foreach ($res['data'] as $ipo) {
    // price_value is the parsed twin; price is the raw published string
    echo "{$ipo['name']} — GMP ₹{$ipo['gmp']['price']}"
       . " (as of {$ipo['gmp']['updated_at_label']})\n";
}
import os, requests

r = requests.get(
    "https://www.ipoguru.in/api/v2/gmp",
    headers={"X-API-KEY": os.environ["IPOGURU_KEY"]},
    params={"status": "open"},
    timeout=10,
)

if r.status_code == 429:
    raise SystemExit(f"rate limited: {r.json().get('message')}")

r.raise_for_status()

for ipo in r.json()["data"]:
    gmp = ipo["gmp"]
    print(f"{ipo['name']} — GMP ₹{gmp['price']} ({gmp['updated_at_label']})")
const res = await fetch(
  "https://www.ipoguru.in/api/v2/gmp?status=open",
  { headers: { "X-API-KEY": process.env.IPOGURU_KEY } }
);

if (res.status === 402) {
  const { upgrade_to } = await res.json();
  throw new Error(`Needs the ${upgrade_to} plan`);
}
if (!res.ok) throw new Error(`IPO Guru API: ${res.status}`);

const { data } = await res.json();
console.log(`${data.length} live IPOs`,
  `· quota left: ${res.headers.get("X-RateLimit-Remaining")}`);

Check what a key can do at any time with GET /api/v2/me.

Best practices

  • Cache on your side

    GMP moves a handful of times a day and subscription follows exchange releases. A 5–15 minute cache costs your users nothing in freshness and cuts your quota use by an order of magnitude.

  • Use the collection endpoints

    One call to /gmp replaces a loop over /ipos/{slug}/gmp. The single-IPO endpoints are for detail pages, not for building lists.

  • Watch the header, not the error

    Back off when X-RateLimit-Remaining gets low rather than waiting for a 429. On a burst 429, honour Retry-After — retrying sooner just burns the window again.

  • Show the timestamp

    Every GMP and subscription block carries updated_at_label. Displaying it is the difference between informing your users and misleading them, especially outside market hours.

  • Never present it as advice

    GMP is an unregulated, unofficial signal. Label it as such. Presenting it as a prediction of listing gains is both against these terms and a regulatory problem for you.

  • Fail soft

    Registrars and exchanges go down. Treat a missing field as unknown and keep rendering the rest of the page rather than erroring the whole view.

Glossary

Indian primary-market vocabulary, for anyone integrating from outside the market.

GMP
Grey Market Premium — the unofficial price at which an unlisted IPO application or share trades before listing. Indicative sentiment, not a regulated quote.
Kostak
A flat price paid for an IPO application, payable whether or not it receives an allotment.
Subject to Sauda
A price paid for an application only if it receives an allotment. Usually higher than kostak.
Mainboard vs SME
Mainboard issues list on the NSE/BSE main platform; SME issues list on the NSE Emerge or BSE SME platforms, with smaller sizes and larger lots.
QIB
Qualified Institutional Buyers — banks, insurers, mutual funds and FIIs.
NII / HNI
Non-Institutional Investors, applying above ₹2 lakh. Split into sNII (₹2–10 lakh) and bNII (above ₹10 lakh).
RII / Retail
Retail Individual Investors, capped at ₹2 lakh per application.
Anchor investor
An institution allotted shares one working day before the issue opens, at a fixed price, with a lock-in. A strong anchor book is read as a confidence signal.
Lot size
The minimum number of shares per application. Applications must be in whole multiples of it.
Basis of allotment (BoA)
The registrar’s published document showing how shares were allotted across categories once the issue closes.
OFS
Offer For Sale — existing shareholders selling through the exchange bidding mechanism, run as separate retail and non-retail tranches.
Green shoe
An over-allotment option letting the seller place additional shares if demand exceeds the base size.

Terms of use

  • Not investment advice

    The API returns factual market data. It must not be presented to your users as advice, a recommendation, or a prediction of listing gains.

  • Attribution

    Credit IPO Guru as the data source wherever the data is displayed.

  • No resale

    Raw responses may not be resold, redistributed, or republished as a competing data feed.

  • One key per client

    Keys are not to be shared across organisations or embedded in public client-side code.

  • Availability

    Data comes from exchanges, registrars and grey-market sources and may lag or be unavailable. No warranty of accuracy or uptime is given, and no liability is accepted for decisions taken on it.

  • Free tier

    For evaluation and non-commercial use only.

FAQ

Questions, answered

Something not covered? Ask us directly — a human replies.

How much does the API cost?

Plans start at ₹99/month (Basic), then ₹299/month (Standard) and ₹499/month (Pro). Paying annually gives 2 months free — ₹990, ₹2,990 and ₹4,990 a year respectively.

Is there a free tier?

10 requests a day at 1 request per minute, covering the IPO calendar, basic details and the current GMP. It exists so you can evaluate the API before paying — production and commercial use needs a paid plan.

Does the API check allotment status?

No, and it is not sold on any plan. Allotment checking handles PAN data and depends on live registrar lookups, so it stays reserved for the IPO Guru website and app. What the API sells is market data — GMP, subscription, anchors and OFS.

What actually separates Standard from Pro?

Standard returns the day-wise GMP series — one point per day, that day’s closing reading. Pro adds the intraday timeline sampled at 11 AM, 5 PM and 10 PM IST (roughly 3× the data points, and the same resolution our own charts use), plus the day-wise subscription build-up, the OFS bid book and unlisted pre-IPO prices.

How fresh is the data?

GMP is refreshed several times a day through the bidding window. Subscription figures follow the exchange releases. Every GMP and subscription block carries an updated_at timestamp in IST, so you always know how stale a value is rather than guessing.

What happens to my existing v1 key?

/api/v1 was deprecated on 30 September 2026, and v1 requests now return a v1_retired error. Your key does not change: the same key works on /api/v2. Switch your base URL, move your calls to the v2 endpoints above and pick a plan, or get in touch and we will attach a plan to your key.

Can I use it commercially?

Yes, on any paid plan, with attribution to IPO Guru. You may not resell or redistribute raw responses as a competing data feed, and the data must not be presented to your users as investment advice.

Start with the free tier

10 requests a day, no card. Upgrade when your project outgrows it — plans start at ₹99/month.