IPOVest API Reference

A fast, read-only JSON API for IPOs, grey-market premium (GMP), offer-for-sale (OFS) and pre-IPO data in the Indian market. Everything you need to integrate, in one place.

REST · JSONHTTPS onlyVersion v1Refreshed every 30 minKey-based auth

Introduction

The IPOVest API gives you structured access to current and past IPOs, live GMP, OFS issues and unlisted-share prices. All endpoints are GET, return application/json, and are served over HTTPS from Cloudflare's global edge network.

Base URLhttps://api.ipovest.com/v1
Auth headerX-API-KEY
Formatapplication/json
MethodsGET (read-only)
  • No SDK required — any HTTP client works.
  • No webhooks; poll at the cadence described in Data freshness.
  • CORS is open (Access-Control-Allow-Origin: *), but never expose your key in browser code.

Quickstart

1. Create a free account to get a key.   2. Send it in the X-API-KEY header.   3. Parse the JSON.

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/gmp?status=Open"

Check what your key can do at any time with GET /me.

Authentication

Authenticate every request with your personal API key. Keys look like ipv_ followed by 32 characters.

X-API-KEY: ipv_your_api_key

Keep it secret. Treat the key like a password: store it in an environment variable on your server, keep it out of version control, and never ship it in a website or mobile app. If it leaks, press Regenerate key in the dashboard — the old key stops working immediately. Keys are stored hashed, so we can show a key only once.

Query-string keys (?api_key=) are not supported, to keep keys out of server and proxy logs.

Plans & access

Each endpoint requires a minimum plan. Calling an endpoint your plan does not include returns 402 plan_required with the plan you need.

EndpointFreeBasicPro
GET /me✓✓✓
GET /ipos✓✓✓
GET /gmp✓✓✓
GET /ipos/{slug}—✓✓
GET /ofs · /ofs/{slug}—✓✓
GET /unlisted · /unlisted/{slug}——✓
GET /ipos/{slug}/gmp/history——✓

When a paid plan expires, the key keeps working on the Free plan. See pricing to upgrade.

Rate limits

Limits apply per API key, on a per-minute and a per-day basis (day = UTC calendar day).

PlanPer minutePer dayPrice
Free10100Free
Basic302,000₹499 / month
Pro6010,000₹1,499 / month

Rate-limit headers

FieldTypeDescription
X-RateLimit-Limit-DayintegerYour daily allowance.
X-RateLimit-Remaining-DayintegerRequests left today (never below 0).
X-RateLimit-Limit-MinuteintegerYour per-minute allowance.
Retry-AftersecondsSent with a per-minute 429; wait this long before retrying.

Every authenticated request to a valid endpoint counts toward your limits — including 402 and 404 (unknown slug) responses. Requests to unknown paths and requests with a missing or invalid key are not counted.

Response format

List endpoints wrap results in data together with paging fields. Detail endpoints return a single object in data.

List response
{
  "data": [ { /* IPO object */ } ],
  "limit": 100,
  "offset": 0
}

Conventions

  • Dates are ISO 8601 — YYYY-MM-DD for calendar dates and full UTC timestamps (2026-11-04T09:31:15.000000Z) for moments in time.
  • Numbers that represent money or ratios (e.g. issue_price, subscription_total, gmp.price) may be returned as strings. Always parse them (parseFloat / float()) before arithmetic.
  • Missing values are null, never an empty string. Don't assume any field is present — e.g. an upcoming IPO has no listing_price.
  • Currency is Indian rupees (₹) unless stated; issue_size is in ₹ crore.
  • Treat unknown extra fields as additive, non-breaking changes.

Pagination & filters

List endpoints (/ipos, /gmp, /ofs, /unlisted) accept the following query parameters:

ParameterTypeDescription
statusstringExact, case-sensitive match on the record's status — e.g. Open or Closed for IPOs, open/closed (lowercase) for OFS.
limitintegerPage size. Default 100, min 1, max 500.
offsetintegerNumber of records to skip. Default 0.

Results are ordered by most recently updated first. To page through everything, increase offset by limit until a response returns fewer than limit rows.

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ipos?limit=50&offset=50"

Endpoints

GET/v1/iposFree+

List IPOs

Returns every IPO we track — upcoming, open, closed and listed — Mainboard and SME.

Query parameters

ParameterTypeDescription
statusstringFilter by Open, Closed or Upcoming.
limitinteger1–500, default 100.
offsetintegerDefault 0.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ipos?status=Open&limit=10"

Response

Response · 200 OK
{
  "data": [
    {
      "slug": "manipal-payment-identity-solutions-ipo",
      "name": "Manipal Payment & Identity Solutions",
      "display_name": "Manipal Payment & Identity Solutions",
      "type": "Mainboard",
      "sub_type": "Equity",
      "status": "Closed",
      "stage": "live",
      "dates_tba": false,
      "is_listed": true,
      "logo": "https://api.ipovest.com/img/logos/manipal-payment-identity-solutions-ipo.webp",
      "open_date": "2026-09-09",
      "close_date": "2026-09-11",
      "allotment_date": "2026-09-15",
      "listing_date": "2026-09-17",
      "price_band": "322-339",
      "price_min": 322,
      "price_max": 339,
      "issue_price": "339",
      "issue_size": "805",
      "lot_size": 44,
      "min_investment": 14916,
      "gmp": {
        "price": "-6",
        "percentage": "-1.77",
        "kostak": null,
        "subject_to_sauda": null,
        "estimated_listing_price": 333,
        "updated_at": "2026-09-17T02:54:05.000000Z",
        "updated_at_label": "17 Sep 2026, 08:24 AM IST"
      },
      "subscription_total": "1.42",
      "listing_price": "330",
      "listing_gain_percent": -2.65,
      "cmp": "331.35",
      "current_gain_percent": -2.26
    }
  ],
  "limit": 10,
  "offset": 0
}

IPO object

FieldTypeDescription
slugstringUnique, URL-safe identifier. Use it in /ipos/{slug} and the GMP history route.
namestringCompany name.
display_namestringName as it should be displayed.
typestringMainboard or SME.
sub_typestringExchange or category, e.g. Equity, BSE SME, NSE SME.
statusstringOpen, Closed or Upcoming. Capitalised exactly like this.
stagestringLifecycle stage, e.g. live.
dates_tbabooleantrue if the dates are not announced yet.
is_listedbooleantrue once the shares have listed.
logostring | nullAbsolute URL of the company logo.
open_datestring | nullIssue opening date, YYYY-MM-DD.
close_datestring | nullIssue closing date.
allotment_datestring | nullAllotment finalisation date.
listing_datestring | nullExpected or actual listing date.
price_bandstring | nullPrice band text, e.g. "322-339".
price_minnumber | nullLower end of the band (₹).
price_maxnumber | nullUpper end of the band (₹).
issue_pricestring | nullFinal issue price (₹).
issue_sizestring | nullIssue size in ₹ crore.
lot_sizeinteger | nullShares per lot.
min_investmentinteger | nullMinimum retail investment per lot (₹).
gmpobject | nullLatest grey-market premium — see GMP object.
subscription_totalstring | nullTotal subscription, in times (e.g. "1.42").
listing_pricestring | nullPrice at listing (₹), once listed.
listing_gain_percentnumber | nullGain/loss at listing, in percent.
cmpstring | nullCurrent market price (₹) for listed IPOs.
current_gain_percentnumber | nullGain/loss versus issue price, in percent.
GET/v1/ipos/{slug}Basic+

Get an IPO

Returns the full record of a single IPO, identified by its slug.

Path parameters

ParameterTypeDescription
slugrequiredstringThe IPO's slug from the list endpoint.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ipos/manipal-payment-identity-solutions-ipo"

Response

Response · 200 OK
{
  "data": { /* IPO object — same fields as in the list */ }
}

Returns 404 not_found if the slug does not exist. On the Free plan you receive 402 plan_required (upgrade_to: "basic").

GET/v1/gmpFree+

Current GMP

A lightweight list of every IPO with its latest grey-market premium — ideal for dashboards and bots.

Query parameters

ParameterTypeDescription
statusstringFilter by Open, Closed or Upcoming.
limitinteger1–500, default 100.
offsetintegerDefault 0.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/gmp?status=Open"

Response

Response · 200 OK
{
  "data": [
    {
      "slug": "sfc-environmental-technologies-ipo",
      "name": "SFC Environmental Technologies",
      "type": "Mainboard",
      "status": "Closed",
      "stage": "live",
      "dates_tba": false,
      "price_band": "313-330",
      "issue_price": "330",
      "gmp": {
        "price": "15.5",
        "percentage": "4.70",
        "kostak": null,
        "subject_to_sauda": "500,,7000",
        "estimated_listing_price": 345.5,
        "updated_at": "2026-11-03T02:54:03.000000Z",
        "updated_at_label": "03 Nov 2026, 08:24 AM IST"
      }
    }
  ],
  "limit": 100,
  "offset": 0
}

GMP object

FieldTypeDescription
pricestring | nullGMP in ₹ per share. Negative means trading below issue price.
percentagestring | nullGMP as a percentage of the issue price.
kostakstring | nullKostak rate (₹ per application), when quoted.
subject_to_saudastring | nullSubject-to-sauda rate, when quoted.
estimated_listing_pricenumber | nullIssue price + GMP — an estimate, not a guarantee.
updated_atstringWhen the GMP was last updated (UTC ISO 8601).
updated_at_labelstringHuman-readable update time in IST.

GMP is an unofficial market indicator. It can change quickly and may differ from actual listing prices. It is not investment advice.

GET/v1/ipos/{slug}/gmp/historyPro+

GMP history

Time series of GMP snapshots we recorded for an IPO, oldest first. A snapshot is stored on each 30-minute refresh.

Path parameters

ParameterTypeDescription
slugrequiredstringThe IPO's slug.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ipos/vedant-poly-fabs-sme-ipo/gmp/history"

Response

Response · 200 OK
{
  "data": [
    { "captured_at": "2026-11-04T12:12:20.114Z", "gmp_price": 1 },
    { "captured_at": "2026-11-04T12:42:23.668Z", "gmp_price": 1 },
    { "captured_at": "2026-11-04T13:12:21.902Z", "gmp_price": 2 }
  ]
}
FieldTypeDescription
captured_atstringWhen IPOVest recorded the snapshot (UTC ISO 8601).
gmp_pricenumber | nullGMP in ₹ at that moment.

History starts from when IPOVest began recording. IPOs not yet seen return an empty data array. This endpoint is not paginated.

GET/v1/ofsBasic+

List OFS issues

Offer-for-sale (OFS) issues on the stock exchanges, split by category.

Query parameters

ParameterTypeDescription
statusstringLowercase, e.g. open or closed.
limitinteger1–500, default 100.
offsetintegerDefault 0.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ofs?status=closed"

Response

Response · 200 OK
{
  "data": [
    {
      "slug": "sri-lotus-developers-non-retail-nov-2026",
      "company": "Sri Lotus Developers and Realty",
      "short_name": "Sri Lotus Developers",
      "category": "Non-Retail",
      "status": "closed",
      "open_date": "2026-11-02T18:30:00.000000Z",
      "close_date": "2026-11-02T18:30:00.000000Z",
      "floor_price": 240,
      "discount": "0.00",
      "nse_symbol": "LOTUSDEV",
      "bse_scripcode": "544469",
      "subscription": 1.16
    }
  ],
  "limit": 100,
  "offset": 0
}

OFS object

FieldTypeDescription
slugstringUnique identifier.
companystringCompany name.
short_namestringShort display name.
categorystringInvestor category, e.g. Non-Retail or Retail.
statusstringopen, closed or upcoming (lowercase).
open_datestringOpening time (UTC).
close_datestringClosing time (UTC).
floor_pricenumberFloor price in ₹.
discountstringDiscount to the previous close, in percent.
nse_symbolstring | nullNSE trading symbol.
bse_scripcodestring | nullBSE scrip code.
subscriptionnumber | nullSubscription in times.
GET/v1/ofs/{slug}Basic+

Get an OFS issue

Returns a single OFS record by slug.

Path parameters

ParameterTypeDescription
slugrequiredstringThe OFS slug.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/ofs/sri-lotus-developers-non-retail-nov-2026"

Response

Response · 200 OK
{
  "data": { /* OFS object */ }
}
GET/v1/unlistedPro+

List pre-IPO / unlisted shares

Indicative prices for unlisted shares traded in the pre-IPO market, with dealer quotes and implied market cap.

Query parameters

ParameterTypeDescription
statusstringFilter on the record's status when present.
limitinteger1–500, default 100.
offsetintegerDefault 0.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/unlisted?limit=20"

Response

Response · 200 OK
{
  "data": [
    {
      "slug": "prabhudas-lilladher-advisory-services",
      "name": "Prabhudas Lilladher Advisory Services",
      "display_name": "Prabhudas Lilladher Advisory Services",
      "sector": "Financial Services",
      "isin": "INE894K01025",
      "logo": "https://api.ipovest.com/img/unlisted_logos/prabhudas-lilladher-advisory-services.webp",
      "ltp": 365,
      "ltp_updated_at": "2026-11-04T09:31:15.000000Z",
      "price_date": "2026-11-04",
      "price_source": "unlistedzone",
      "price_type": "indicative_dealer_quote",
      "is_stale": false,
      "week_52_high": 395,
      "week_52_low": 365,
      "lot_size": 500,
      "min_investment": 182500,
      "implied_market_cap_cr": 2289.07,
      "dealer_range": { "low": 365, "high": 375, "median": 370, "dealers": 2, "date": "2026-11-04" },
      "ipo_status": null,
      "ipo_journey_status": null
    }
  ],
  "limit": 20,
  "offset": 0
}

Unlisted object

FieldTypeDescription
slugstringUnique identifier.
name / display_namestringCompany name.
sectorstring | nullIndustry sector.
isinstring | nullISIN code.
logostring | nullLogo URL.
ltpnumber | nullLast traded / indicative price (₹).
ltp_updated_atstring | nullWhen ltp was updated (UTC).
price_datestring | nullDate of the price, YYYY-MM-DD.
price_sourcestring | nullWhere the price came from.
price_typestring | nulle.g. indicative_dealer_quote. Prices are indicative, not exchange prices.
is_stalebooleantrue if the price has not been refreshed recently.
week_52_high / week_52_lownumber | null52-week range (₹).
lot_sizeinteger | nullTypical lot size.
min_investmentnumber | nullLot size × price (₹).
implied_market_cap_crnumber | nullImplied market capitalisation in ₹ crore.
dealer_rangeobject | nulllow, high, median, number of dealers and quote date.
ipo_status / ipo_journey_statusstring | nullProgress towards an IPO, when announced.

Unlisted-share prices come from dealer quotes, are illiquid and can be stale. Always check is_stale and price_type.

GET/v1/unlisted/{slug}Pro+

Get an unlisted company

Returns a single unlisted-share record by slug.

Path parameters

ParameterTypeDescription
slugrequiredstringThe unlisted slug.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/unlisted/prabhudas-lilladher-advisory-services"

Response

Response · 200 OK
{
  "data": { /* Unlisted object */ }
}
GET/v1/meFree+

Account & usage

Returns your effective plan, limits and today's usage. Handy for health checks and quota monitoring.

Request

curl -H "X-API-KEY: $IPOVEST_KEY" \
  "https://api.ipovest.com/v1/me"

Response

Response · 200 OK
{
  "plan": "pro",
  "plan_label": "Pro",
  "plan_expires": "2026-12-04T23:59:59.000Z",
  "limits": { "per_minute": 60, "per_day": 10000 },
  "used_today": 128
}
FieldTypeDescription
planstringfree, basic or pro — your effective plan (expired paid plans show as free).
plan_labelstringDisplay name of the plan.
plan_expiresstring | nullExpiry timestamp for paid plans, otherwise null.
limitsobjectper_minute and per_day.
used_todayintegerRequests counted so far today (UTC), including this one.

Object reference

Field tables are shown next to each endpoint: IPO, GMP, OFS, Unlisted. Types use | null when the value may be absent. Future versions may add fields; build parsers that ignore unknown keys.

Errors

Errors use standard HTTP status codes and a JSON body with a machine-readable error code and, usually, a human-readable message.

Example · 402 Payment Required
{
  "error": "plan_required",
  "message": "This endpoint needs the Basic plan.",
  "upgrade_to": "basic",
  "upgrade_url": "https://api.ipovest.com/plans"
}
StatuserrorMeaning & what to do
401missing_api_keyNo key was sent. Add the X-API-KEY header.
401invalid_api_keyThe key is wrong or has been regenerated. Copy the current key from the dashboard.
402plan_requiredYour plan doesn't include this endpoint. upgrade_to names the cheapest plan that does.
404not_foundUnknown endpoint, or no record with that slug.
405method_not_allowedOnly GET (and CORS OPTIONS) are supported.
429rate_limitedPer-minute limit hit. Wait for Retry-After seconds.
429daily_quota_exceededDaily quota used up; it resets at 00:00 UTC. Upgrade for a higher quota.
500server_errorUnexpected problem on our side. Retry with backoff; contact us if it persists.

Best practices

  • Cache. Data refreshes every 30 minutes, so polling more often wastes quota. Cache responses for at least 5–15 minutes on your server.
  • Fetch once, serve many. Call the API from your backend on a schedule and serve your own users from your cache or database.
  • Back off on errors. Retry 429/5xx with exponential backoff and jitter; honour Retry-After. Never retry 401/402/404 in a loop.
  • Set timeouts (5–10 s) on every request.
  • Monitor quota through the X-RateLimit-Remaining-Day header or GET /me.
  • Parse defensively. Convert numeric strings, treat every field as nullable, and ignore unknown fields.
  • Protect your key. Server-side only, in environment variables; rotate it if exposed.
import time, random, requests

def get(path, **params):
    for attempt in range(5):
        r = requests.get(f"https://api.ipovest.com/v1{path}", params=params, timeout=10,
                         headers={"X-API-KEY": KEY})
        if r.status_code in (429, 500, 502, 503, 504):
            wait = int(r.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait + random.random())
            continue
        r.raise_for_status()
        return r.json()
    raise RuntimeError("IPOVest API unavailable")

Data freshness

IPOVest refreshes its dataset every 30 minutes. GMP snapshots are recorded on the same cycle. Fields such as gmp.updated_at and ltp_updated_at tell you when the underlying value last changed at the source, which can be earlier than our last refresh.

New IPOs and status changes (e.g. Upcoming → Open → Closed) appear after the next sync. There is no real-time streaming.

Usage & terms

  • Data is provided for information only and may contain errors or delays. It is not investment advice; GMP and unlisted prices are unofficial indicators.
  • Keep your key private and use it only for your own applications. Don't resell or redistribute the raw dataset as a competing API, and don't attempt to bypass rate limits.
  • We may pause keys that abuse the service.

FAQ

Why do I get 402 on an endpoint?

Your plan doesn't include it. Check the plan matrix and upgrade from the pricing page.

Why are some numbers strings?

Values like prices and percentages are passed through from the source with their original precision. Parse them before doing maths.

How do I get the list of Open IPOs only?

Use GET /ipos?status=Open (note the capital “O”).

What happens when my plan expires?

The key keeps working on the Free plan limits and endpoints. Renew any time; renewing early extends your current period.

I regenerated my key — can I recover the old one?

No. Keys are stored hashed and are shown once. Generate a new key and update your apps.

Is there a sandbox or test key?

The Free plan is the sandbox — it's free forever, with a small daily quota.

Changelog

v1Nov 2026Initial release: IPOs, GMP (current + history), OFS, unlisted shares, account endpoint.

Breaking changes will ship under a new version path (/v2); /v1 will keep working.

Ready to build?

Get a free API key in seconds.

Get your API key