IDX market data

End-of-day Indonesia Stock Exchange data — prices, indices, brokers, investor flow, corporate actions, financials and announcements — as a REST API and an MCP server for AI assistants.

Get an API key

Quick start

Sign in with Google (you are on the free tier straight away), accept the terms and create a key. Send it as a bearer token:

curl -H "Authorization: Bearer mr_YOUR_KEY" \
  "https://api.manadoresearch.com/idx/v1/stocks/BBCA/daily?from=2026-10-01"

Every list answers { "data": [ … ], "meta": { "count": 2, "next": "…" } }. When next is not null, pass it back as cursor for the next page.

Use it from an AI assistant (MCP)

Claude Code:

claude mcp add --transport http manado-idx https://api.manadoresearch.com/idx/mcp \
  --header "Authorization: Bearer mr_YOUR_KEY"

Clients that take a JSON config (Claude Desktop via a remote-MCP bridge, Cursor, VS Code, …):

{
  "mcpServers": {
    "manado-idx": {
      "type": "http",
      "url": "https://api.manadoresearch.com/idx/mcp",
      "headers": {
        "Authorization": "Bearer mr_YOUR_KEY"
      }
    }
  }
}

Streamable HTTP, stateless, JSON responses (no SSE). All tools are read-only.

ToolWhat it doesArguments (required)
search_companiesFind listed companies by part of the code or name; filter by status, sector or board.q, code, status, sector, board, limit, order, cursor
get_companyOne company: listing data, sector, shares, profile (directors, commissioners, shareholders, subsidiaries, auditors, contacts) and special notation.code
get_stock_pricesDaily end-of-day prices (OHLC), volume, value, frequency, foreign buy/sell of one stock, newest first. Use from/to.code, from, to, limit, order, cursor
get_market_dayEvery stock's end-of-day row on one trading day, A–Z by code (paged).code, date, limit, cursor
list_indicesEvery IDX index (COMPOSITE, LQ45, IDX30, …) with its latest value.limit, order, cursor
get_index_pricesDaily values of one index, newest first.code, from, to, limit, order, cursor
get_broker_activityDaily total value, volume and frequency per broker (whole market, not per stock).code, from, to, limit, order, cursor
get_investor_flowDaily trading of domestic vs foreign investors.investor, from, to, limit, order, cursor
get_corporate_actionsDividends, stock splits, rights issues, additional listings or IPOs (pick with kind), newest first.kind, code, from, to, limit, order, cursor
get_financial_ratiosAssets, equity, sales, profit, EPS, PER, PBV, DER, ROA, ROE, NPM per company and statement date (period).code, sector, sharia, from, to, limit, order, cursor
get_financial_reportsFiled financial reports per company, year and period, with links to the PDF/XLSX files on IDX.code, year, period, limit, order, cursor
get_announcementsCompany and exchange announcements (disclosures) with links to their files on IDX, newest first. publishedAt is when the company filed it (the filing time); firstSeenAt is when this service first stored it (null for rows stored before 2026-10-15). Withdrawn ones are hidden unless status=withdrawn or all; replacedBy is the id of the announcement that superseded a withdrawn one.code, status, from, to, limit, order, cursor
get_rankingsIDX monthly top gainers, losers and most active stocks.list, code, from, to, limit, order, cursor
get_calendarIDX corporate calendar: shareholder meetings (RUPS, bondholder RUPO), dividend dates, public expose, rights issues (HMETD), buyback reports, bond maturities and listings. date is the day the entry sits on in IDX's calendar; what that day is depends on the entry and is only stated in description (Indonesian): "tanggal cum/ex/DPS/Pembayaran Dividen …" → that dividend date (cum, ex, recording, payment); "Pemberitahuan/PANGGILAN RUPS …", "RENCANA/PANGGILAN Rupo …" → the meeting day; "Rencana public expose …" → the day the plan was filed (publicExposeAt is when the public expose takes place); "Laporan Pembelian Kembali Saham (Buyback)", "Materi public expose …", "Hasil …" → the day of the report or result; "Jatuh Tempo …" → the maturity day. meetingAt is the meeting's date and time when given. Entries carry no amounts: for dividend amounts use get_corporate_actions or get_announcements. firstSeenAt is when this service first saw the entry, not when it was filed (null for entries stored when their month was first collected). Entries IDX removed (e.g. replaced after a correction) are hidden unless status=withdrawn or all.code, type, status, from, to, limit, order, cursor
get_coverageHow fresh each dataset is: latest day or month collected and when it was last updated.

Good to know

REST endpoints

Base URL https://api.manadoresearch.com/idx · machine-readable: OpenAPI 3.1 (no key needed).

GET /v1/companies Search listed companies

Every security IDX lists (also delisted and suspended ones), with sector classification and latest listed shares.

ParameterTypeMeaning
qstringPart of the code or name, e.g. "bank"
codestringStock code, e.g. BBCA
statuslisted | delisted | suspendedListing status
sectorstringIDX-IC sector name, exactly as returned
boardstringListing board, e.g. Utama, Pengembangan
limitintegerRows per page, default 100, at most 1000
orderasc | descBy code; default asc
cursorstringmeta.next of the previous page

Fields: code, name, listingDate, board, sector, subSector, industry, subIndustry, shares, status, delistingDate

GET /v1/companies/{code} One company: listing data, profile and special notation
ParameterTypeMeaning
{code}codeCode, e.g. BBCA
GET /v1/companies/{code}/history Changes to a company (name, board, sector, status)

Company history: one row per stretch of time the content stayed the same (observedFrom = first seen by us, observedTo = last day before it changed; null = current).

ParameterTypeMeaning
{code}codeCode, e.g. BBCA
limitintegerRows per page, default 100, at most 500
orderasc | descBy observedFrom; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, observedFrom, observedTo, name, listingDate, board, sector, subSector, industry, subIndustry, status, delistingDate

GET /v1/companies/{code}/history/profile Changes to a company profile (directors, shareholders, …)

Company profile history: one row per stretch of time the content stayed the same (observedFrom = first seen by us, observedTo = last day before it changed; null = current).

ParameterTypeMeaning
{code}codeCode, e.g. BBCA
limitintegerRows per page, default 100, at most 500
orderasc | descBy observedFrom; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, observedFrom, observedTo, name, address, bae, sector, subSector, industry, subIndustry, email, fax, phone, website, npwp, businessActivity, listingDate, board, secretary, directors, commissioners, auditCommittee, shareholders, subsidiaries, auditors

GET /v1/companies/{code}/history/notation Changes to special notations

Special notation history: one row per stretch of time the content stayed the same (observedFrom = first seen by us, observedTo = last day before it changed; null = current).

ParameterTypeMeaning
{code}codeCode, e.g. BBCA
limitintegerRows per page, default 100, at most 500
orderasc | descBy observedFrom; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, observedFrom, observedTo, notation, umaDate, corpAction, corpActionDate

GET /v1/notations Special notations of every stock

IDX special notation codes, last unusual-market-activity (UMA) date and pending corporate action, per stock (latest).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
limitintegerRows per page, default 100, at most 1000
orderasc | descBy code; default asc
cursorstringmeta.next of the previous page

Fields: code, notation, umaDate, corpAction, corpActionDate

GET /v1/stocks/{code}/daily Daily prices of one stock

End-of-day OHLC, volume, value, frequency, best bid/offer, foreign buy/sell and shares per stock and trading day. Prices and values in whole IDR.

ParameterTypeMeaning
{code}codeCode, e.g. BBCA
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, code, name, remarks, previous, open, high, low, close, change, firstTrade, volume, value, frequency, bid, bidVolume, offer, offerVolume, foreignBuy, foreignSell, listedShares, tradableShares, weightForIndex, individualIndex, nonRegularVolume, nonRegularValue, nonRegularFrequency, delistingDate

GET /v1/market/{date} Every stock on one trading day

End-of-day OHLC, volume, value, frequency, best bid/offer, foreign buy/sell and shares per stock and trading day. Prices and values in whole IDR.

ParameterTypeMeaning
{date}YYYY-MM-DDTrading day (Asia/Jakarta)
codestringStock code, e.g. BBCA
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, code, name, remarks, previous, open, high, low, close, change, firstTrade, volume, value, frequency, bid, bidVolume, offer, offerVolume, foreignBuy, foreignSell, listedShares, tradableShares, weightForIndex, individualIndex, nonRegularVolume, nonRegularValue, nonRegularFrequency, delistingDate

GET /v1/indices Every index with its latest value

Every IDX index with its latest value (current = the close once the market has closed).

ParameterTypeMeaning
limitintegerRows per page, default 100, at most 1000
orderasc | descBy code; default asc
cursorstringmeta.next of the previous page

Fields: code, previous, current, change, percent, time

GET /v1/indices/{code}/daily Daily values of one index

End-of-day open/high/low/close, volume, value, frequency and market cap per index.

ParameterTypeMeaning
{code}codeCode, e.g. BBCA
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, code, previous, open, high, low, close, change, volume, value, frequency, marketCap, numberOfStocks

GET /v1/brokers Exchange members

Brokers, participants and primary dealers.

ParameterTypeMeaning
qstringPart of the code or name
limitintegerRows per page, default 200, at most 1000
orderasc | descBy code; default asc
cursorstringmeta.next of the previous page

Fields: code, name, license, isBroker, isParticipant, isPrimaryDealer

GET /v1/brokers/daily Daily activity per broker

Total value, volume and frequency traded per broker and trading day (whole market, not per stock).

ParameterTypeMeaning
codestringBroker code, e.g. YP
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, brokerCode, brokerName, value, volume, frequency

GET /v1/investor-flow Daily trading by domestic and foreign investors

Daily trading by investor type: for investor = domestic, with* = domestic trading with domestic / with foreign; for foreign, the same from the foreign side.

ParameterTypeMeaning
investordomestic | foreignInvestor type
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, investor, withDomesticVolume, withDomesticValue, withDomesticFrequency, withForeignVolume, withForeignValue, withForeignFrequency

GET /v1/market-summary Daily totals per market segment

Daily totals per market segment (volume, value, frequency).

ParameterTypeMeaning
segmentstringMarket segment, exactly as returned
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, segment, volume, value, frequency

GET /v1/rankings Monthly top gainers, losers and most active

IDX's monthly top gainers, top losers and most active stocks by volume, value and frequency.

ParameterTypeMeaning
listgainer | loser | active_volume | active_value | active_freqWhich list
codestringStock code, e.g. BBCA
fromYYYY-MMFirst month, inclusive
toYYYY-MMLast month, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy month; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: month, list, rank, code, name, previous, previousCa, close, dilution, change, changePercent, volume, value, frequency, volumePercent, valuePercent, frequencyPercent, tradingDays

GET /v1/industries Monthly sector and sub-sector statistics

Month-end snapshot per IDX-IC sector and sub-sector: members, shares, market cap, trading, PER and PBV (amounts in IDX units for this table).

ParameterTypeMeaning
levelsector | sub_sectorSector or sub-sector rows
codestringSector or sub-sector code, e.g. A, A1
sectorstringSector code of a sub-sector, e.g. A
fromYYYY-MMFirst month, inclusive
toYYYY-MMLast month, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy month; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: month, code, level, date, name, sectorCode, members, delisted, shares, marketCap, volume, value, frequency, per, pbv

GET /v1/corporate-actions/dividends Dividends

Dividends (IDX statistics, by exDate).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
fromYYYY-MM-DDFirst exDate, inclusive
toYYYY-MM-DDLast exDate, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy exDate; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, exDate, name, cashDividend, currency, cumDate, recordDate, paymentDate, note, stockDividend, stockDividendRatio

GET /v1/corporate-actions/stock-splits Stock splits and reverse splits

Stock splits and reverse splits (IDX statistics, by listingDate).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
fromYYYY-MM-DDFirst listingDate, inclusive
toYYYY-MM-DDLast listingDate, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy listingDate; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, listingDate, name, type, ratio, oldNominal, newNominal, additionalShares, listedShares

GET /v1/corporate-actions/rights-issues Rights issues

Rights issues (IDX statistics, by exDate).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
fromYYYY-MM-DDFirst exDate, inclusive
toYYYY-MM-DDLast exDate, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy exDate; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, exDate, name, ratio, sharesIssued, exercisePrice, fundRaised, recordDate, tradingPeriod

GET /v1/corporate-actions/additional-listings Additional listings

Additional listings (IDX statistics, by startDate).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
fromYYYY-MM-DDFirst startDate, inclusive
toYYYY-MM-DDLast startDate, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy startDate; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, startDate, type, name, shares, lastDate

GET /v1/corporate-actions/ipos IPOs

IPOs (new listings) (IDX statistics, by listingDate).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
fromYYYY-MM-DDFirst listingDate, inclusive
toYYYY-MM-DDLast listingDate, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy listingDate; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, listingDate, name, listedShares, offeringShares, offeringPrice, nominal, fundRaised

GET /v1/listing-events Delistings, listings, suspensions

Delistings, new listings, relistings, suspensions and their lifting, as IDX announces them.

ParameterTypeMeaning
codestringStock code, e.g. BBCA
typestringEvent type, e.g. delist, listing, relist, suspend, unsuspend, upt
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, type, eventAt, date, name, title, sourceUrl, board, listedShares, marketCap, regularPrice, lastTradingDate, listingDate

GET /v1/share-issuance Share issuance history

Changes in listed shares per stock (type of issuance, shares added, total after).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
typestringIssuance type, exactly as returned
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, date, type, shares, totalShares

GET /v1/financials/ratios Financial ratios per statement date

Per company and statement date (period): assets, liabilities, equity, sales, profit, EPS, book value, PER, PBV, DER, ROA, ROE, NPM (amounts in IDX units for this table).

ParameterTypeMeaning
codestringStock code, e.g. BBCA
sectorstringSector name, exactly as returned
shariaS'S' = sharia-compliant only
fromYYYY-MM-DDFirst period, inclusive
toYYYY-MM-DDLast period, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy period; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, period, name, sector, subSector, industry, subIndustry, subIndustryCode, sharia, fiscalYearEnd, audit, opinion, assets, liabilities, equity, sales, ebt, profit, profitAttrOwner, eps, bookValue, per, pbv, der, roa, roe, npm

GET /v1/financials/reports Filed financial reports with file links

Filed financial statements per company, year and period (Audit = annual, TW1–TW3 = quarters), with links to the files on IDX.

ParameterTypeMeaning
codestringStock code, e.g. BBCA
yearintegerReport year
periodAudit | TW1 | TW2 | TW3Audit (annual) or TW1–TW3
limitintegerRows per page, default 50, at most 500
orderasc | descBy year; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: code, year, period, name, idxModifiedAt, attachments

GET /v1/announcements Announcements with file links

Company and exchange announcements (disclosures) with links to their files on IDX, newest first. publishedAt is when the company filed it (the filing time); firstSeenAt is when this service first stored it (null for rows stored before 2026-10-15). Withdrawn ones are hidden unless status=withdrawn or all; replacedBy is the id of the announcement that superseded a withdrawn one.

ParameterTypeMeaning
codestringStock code, e.g. BBCA
statuslive | withdrawn | alllive (default), withdrawn or all
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 50, at most 500
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: id, date, code, number, title, type, subject, formId, isStock, isBond, publishedAt, firstSeenAt, withdrawnAt, replacedBy, attachments

GET /v1/calendar Corporate calendar

IDX corporate calendar: shareholder meetings (RUPS, bondholder RUPO), dividend dates, public expose, rights issues (HMETD), buyback reports, bond maturities and listings. date is the day the entry sits on in IDX's calendar; what that day is depends on the entry and is only stated in description (Indonesian): "tanggal cum/ex/DPS/Pembayaran Dividen …" → that dividend date (cum, ex, recording, payment); "Pemberitahuan/PANGGILAN RUPS …", "RENCANA/PANGGILAN Rupo …" → the meeting day; "Rencana public expose …" → the day the plan was filed (publicExposeAt is when the public expose takes place); "Laporan Pembelian Kembali Saham (Buyback)", "Materi public expose …", "Hasil …" → the day of the report or result; "Jatuh Tempo …" → the maturity day. meetingAt is the meeting's date and time when given. Entries carry no amounts: for dividend amounts use get_corporate_actions or get_announcements. firstSeenAt is when this service first saw the entry, not when it was filed (null for entries stored when their month was first collected). Entries IDX removed (e.g. replaced after a correction) are hidden unless status=withdrawn or all.

ParameterTypeMeaning
codestringStock code, e.g. BBCA
typestringEvent type, exactly as returned
statuslive | withdrawn | alllive (default), withdrawn or all
fromYYYY-MM-DDFirst date, inclusive
toYYYY-MM-DDLast date, inclusive
limitintegerRows per page, default 100, at most 1000
orderasc | descBy date; default desc (newest first)
cursorstringmeta.next of the previous page

Fields: date, code, type, description, location, step, year, meetingAt, publicExposeAt, firstSeenAt, withdrawnAt

GET /v1/coverage How fresh each dataset is