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 keyQuick 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.
| Tool | What it does | Arguments (required) |
|---|---|---|
search_companies | Find listed companies by part of the code or name; filter by status, sector or board. | q, code, status, sector, board, limit, order, cursor |
get_company | One company: listing data, sector, shares, profile (directors, commissioners, shareholders, subsidiaries, auditors, contacts) and special notation. | code |
get_stock_prices | Daily 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_day | Every stock's end-of-day row on one trading day, A–Z by code (paged). | code, date, limit, cursor |
list_indices | Every IDX index (COMPOSITE, LQ45, IDX30, …) with its latest value. | limit, order, cursor |
get_index_prices | Daily values of one index, newest first. | code, from, to, limit, order, cursor |
get_broker_activity | Daily total value, volume and frequency per broker (whole market, not per stock). | code, from, to, limit, order, cursor |
get_investor_flow | Daily trading of domestic vs foreign investors. | investor, from, to, limit, order, cursor |
get_corporate_actions | Dividends, stock splits, rights issues, additional listings or IPOs (pick with kind), newest first. | kind, code, from, to, limit, order, cursor |
get_financial_ratios | Assets, 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_reports | Filed financial reports per company, year and period, with links to the PDF/XLSX files on IDX. | code, year, period, limit, order, cursor |
get_announcements | 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. | code, status, from, to, limit, order, cursor |
get_rankings | IDX monthly top gainers, losers and most active stocks. | list, code, from, to, limit, order, cursor |
get_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. | code, type, status, from, to, limit, order, cursor |
get_coverage | How fresh each dataset is: latest day or month collected and when it was last updated. |
Good to know
- Unofficial. Collected from IDX's public website. Verify anything important against idx.co.id before acting on it.
- End-of-day, not real-time.
/v1/coverageshows the latest day or month each dataset holds. - Units. Prices, volumes and rupiah values are whole numbers in IDR unless a description says "IDX units for this table".
- Time. Dates are Asia/Jakarta days (
YYYY-MM-DD), monthsYYYY-MM, instants ISO 8601 with+07:00. - Credits. Each REST data call and each MCP tool call costs 1 credit per 100 rows it returns, at least 1 (101 rows = 2 credits). The free tier has 10 credits a day, back at 00:00 Asia/Jakarta, plus 100 welcome credits for the first week. The docs, OpenAPI, errors,
initializeandtools/listare free. Every answer saysX-Credits-ChargedandX-Credits-Left. - Limits. 60 requests per minute per key. Out of credits or over the rate you get
429withRetry-After. - Errors are JSON
{ "error": "…" }: 400 bad parameters (the message says which), 401 missing or unknown key, 403 account blocked, 404 not found, 429 limits.
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.
| Parameter | Type | Meaning |
|---|---|---|
q | string | Part of the code or name, e.g. "bank" |
code | string | Stock code, e.g. BBCA |
status | listed | delisted | suspended | Listing status |
sector | string | IDX-IC sector name, exactly as returned |
board | string | Listing board, e.g. Utama, Pengembangan |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By code; default asc |
cursor | string | meta.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
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, 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).
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, e.g. BBCA |
limit | integer | Rows per page, default 100, at most 500 |
order | asc | desc | By observedFrom; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, e.g. BBCA |
limit | integer | Rows per page, default 100, at most 500 |
order | asc | desc | By observedFrom; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, e.g. BBCA |
limit | integer | Rows per page, default 100, at most 500 |
order | asc | desc | By observedFrom; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By code; default asc |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, e.g. BBCA |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
{date} | YYYY-MM-DD | Trading day (Asia/Jakarta) |
code | string | Stock code, e.g. BBCA |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By code; default asc |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
{code} | code | Code, e.g. BBCA |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
q | string | Part of the code or name |
limit | integer | Rows per page, default 200, at most 1000 |
order | asc | desc | By code; default asc |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Broker code, e.g. YP |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
investor | domestic | foreign | Investor type |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
segment | string | Market segment, exactly as returned |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
list | gainer | loser | active_volume | active_value | active_freq | Which list |
code | string | Stock code, e.g. BBCA |
from | YYYY-MM | First month, inclusive |
to | YYYY-MM | Last month, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By month; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
level | sector | sub_sector | Sector or sub-sector rows |
code | string | Sector or sub-sector code, e.g. A, A1 |
sector | string | Sector code of a sub-sector, e.g. A |
from | YYYY-MM | First month, inclusive |
to | YYYY-MM | Last month, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By month; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
from | YYYY-MM-DD | First exDate, inclusive |
to | YYYY-MM-DD | Last exDate, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By exDate; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
from | YYYY-MM-DD | First listingDate, inclusive |
to | YYYY-MM-DD | Last listingDate, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By listingDate; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
from | YYYY-MM-DD | First exDate, inclusive |
to | YYYY-MM-DD | Last exDate, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By exDate; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
from | YYYY-MM-DD | First startDate, inclusive |
to | YYYY-MM-DD | Last startDate, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By startDate; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
from | YYYY-MM-DD | First listingDate, inclusive |
to | YYYY-MM-DD | Last listingDate, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By listingDate; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
type | string | Event type, e.g. delist, listing, relist, suspend, unsuspend, upt |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
type | string | Issuance type, exactly as returned |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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).
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
sector | string | Sector name, exactly as returned |
sharia | S | 'S' = sharia-compliant only |
from | YYYY-MM-DD | First period, inclusive |
to | YYYY-MM-DD | Last period, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By period; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
year | integer | Report year |
period | Audit | TW1 | TW2 | TW3 | Audit (annual) or TW1–TW3 |
limit | integer | Rows per page, default 50, at most 500 |
order | asc | desc | By year; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
status | live | withdrawn | all | live (default), withdrawn or all |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 50, at most 500 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.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.
| Parameter | Type | Meaning |
|---|---|---|
code | string | Stock code, e.g. BBCA |
type | string | Event type, exactly as returned |
status | live | withdrawn | all | live (default), withdrawn or all |
from | YYYY-MM-DD | First date, inclusive |
to | YYYY-MM-DD | Last date, inclusive |
limit | integer | Rows per page, default 100, at most 1000 |
order | asc | desc | By date; default desc (newest first) |
cursor | string | meta.next of the previous page |
Fields: date, code, type, description, location, step, year, meetingAt, publicExposeAt, firstSeenAt, withdrawnAt