Awaiting admin approval. You can browse documentation; key creation opens after approval. Existing keys are unchanged.
Loading API availability…
Your workspace starts here.
Sign in with Google to create keys and see account activity.
01 / YOUR DATA WORKSPACE
The data ledger.
Stored history. Your credentials. Recorded activity.
The underlying record
| Dataset | Interval | History starts | Latest eligible bar | State |
|---|---|---|---|---|
| Daily OHLCVAuthoritative series | 1d | — | — | Not checked |
| Hourly OHLCVIndependent intraday series | 1h | — | — | Not checked |
| Session aggregatesComputed from complete 1h inputs | 2h / 4h | Uses hourly history | Complete session groups only | Read-time |
| Calendar aggregatesComputed from complete daily inputs | 1w / 1mo | Uses daily history | Closed weeks/months only | Read-time |
WIB boundaries. Stored coverage is not a completeness audit. No synthetic candles; hourly aggregation does not guarantee daily parity.
Request activity
Six intervals. Two stored series.
1d- Authoritative daily candles. Prior WIB dates only.
1h- Independent hourly candles. Today’s settled bars are eligible.
2h / 4h- Complete 1h groups, within each morning or afternoon session.
1w / 1mo- Complete daily groups: closed Monday-start WIB weeks and calendar months. Available for candles, indicators, research and screening.
Connect your application
Start with a credential. Build against a clear contract.
- 1
Create an API key
Your key is shown once. Keep it on your server.
- 2
Choose your data
Symbols, candles, technicals, screener, or coverage.
- 3
Send your first request
Add your key to the Authorization header.
curl --get 'https://api.investdx.biz.id/v1/candles/BBCA' \ --data-urlencode 'interval=1h' \ --data-urlencode 'limit=2' \ --header "Authorization: Bearer $INVESTDX_API_KEY"
{ "symbol": "BBCA", "interval": "1h",
"timezone": "Asia/Jakarta",
"volume_unit": "shares", "data": [] }02 / ACCESS & CREDENTIALS
API keys
Credentials for your applications. Secrets are shown once, stored as hashes.
Your credentials
HASH-ONLY STORAGE| Name / key | Status | Created | Last used | Requests (7 days) | Requests/sec | Actions |
|---|
No API keys yet
Create a credential for your notebook, script, or service.
05 / ADMIN RESEARCH CONSOLE
Your market, your conditions
Admin-only visual workspace. The same configurable research and screening are available to approved users through the public API.
1h / 1dIndependent stored series2h / 4hComplete 1h session aggregates1w / 1moComplete daily calendar aggregatesWIB / UTC+7Closed bars; missing inputs omit groups.Technical indicators
Inspect a symbol to see up to 200 observed candles. No synthetic gap filling.
Filters match only sufficient, current, gap-free inputs.
Build your screen
Run your conditions against the full selected universe.
04 / THE INTERFACE
API reference
Endpoints, authentication, data boundaries, and request examples.
01 / AUTHENTICATION
Bearer authentication
Create a key in the console. Send it in the Authorization header, never a URL. The secret is shown once; only its hash is stored.
Authorization: Bearer invdx_your_secret_key
Keys do not expire unless an expiry is selected; revoke unused credentials. Google accounts manage their own keys and usage. Admin can inspect all keys and adjust account limits. API keys cannot manage accounts. Expired or revoked keys return 401.
API requests require an active key. Google registration requires admin approval before creating keys, including the starter key. Additional keys can be managed after approval.
02 / ENDPOINTS
Available endpoints
/v1/symbolsSearch with q. Pagination: limit 1–500, cursor. Full catalog, not a trading-board filter.
/v1/candles/{symbol}interval: 1d, 1h, 2h, 4h, 1w, 1mo. Daily: prior WIB dates only. Intraday: settled source hours through today; five-minute delay.
2h/4h derive from complete 1h groups, never across lunch or overnight. Short-session groups are labeled and report duration_minutes (label to end) plus session_minutes (scheduled session time in the bucket); incomplete groups are omitted. Weekly/monthly derive from daily: Monday–Sunday weeks and calendar months in WIB. Only closed, complete periods; labels use period-start midnight, including holidays/weekends. Date windows omit partial boundary periods.
start / end: YYYY-MM-DD, maximum 366 days. Omit both for the full stored history, paged with cursor (beyond-window cursors return 422). limit: 1–2,000. sort: asc (default) or desc (newest first). Follow next_cursor.
/v1/technicals/{symbol}Latest snapshot on the selected interval. RSI(14), ATR(14), MACD(12,26,9), stochastic(14,3,3). Up to 200 observed bars; 35 required for signal readiness. Decimal strings, null warm-up values, explicit stale/gap status.
/v1/screenerinterval, signal, limit 1–100, cursor + scan_id. Conditions: all, rsi_oversold, rsi_overbought, macd_bullish_cross, macd_bearish_cross, stoch_bullish_cross, stoch_bearish_cross. Every call scans the full ready universe server-side, then pages matches only (pagination_scope: matches); excluded_unready counts withheld symbols. Page 0 returns scan_id; pass it with later cursors until next_cursor is null. Unknown/repeated query parameters return 422; cursor without scan_id or expired scan returns 409.
/v1/coverageEstimated stored counts and date bounds. Derived intervals do not duplicate storage. Coverage is not completeness.
No matching endpoints.
Broker summary, concentration, foreign flow and Wyckoff are available through API keys.
Broker activity & market context
/v1/broker-summary/{symbol}Daily broker breakdown plus concentration.buy / concentration.sell: top-1/3/5 percentages, HHI (0–10,000), reported broker count and total net value. Each side uses its own reported net-value denominator, not gross turnover or beneficial ownership. Duplicate codes are combined; empty or invalid inputs return null metrics with status. Legacy detector percentages remain separate.
start, end: WIB dates, default last 90 calendar days, maximum 366-day window. limit: 1–365, default 90. Newest dates first; today's WIB date excluded.
/v1/foreign-flow/{symbol}Stored daily foreign buy/sell/net IDR values. Same date/limit contract as broker summary; no current WIB date.
/v1/wyckoff/{symbol}Daily OHLCV event detection and current phase, enriched with same-day raw broker concentration. lookback_days: 1–365, default 180. Concentration is context, not a smart-money label. Missing broker context is explicit; no stored daily phase-history promise.
/v1/datasets/{symbol}Maintained public dataset pointers and observed freshness. No internal URLs or operational routes. Counts are not proof of completeness.
All market reads require an API key and share account RPS. Market context is served natively by idx-research from SELECT-only stored reads plus Go computation. One shared compute slot; busy returns 429, deadline 20 seconds, response cap 8 MiB, stored contexts cached 60s per principal. Operational, admin and token-sync routes remain protected.
Configurable research & screening
All six intervals—1h, 2h, 4h, 1d, 1w, 1mo—are available for candles, technical indicators, research and screening. Weekly/monthly indicators count complete aggregated bars, not daily inputs; insufficient history returns null values or unready status.
/v1/research/{symbol}Latest values plus up to 200 observed chart bars. Shares volume, Decimal strings, explicit readiness. Same settings and 1,000-bar seed as dynamic screening.
/v1/screenerScan the selected universe, combine conditions with AND/OR, globally sort matches, then paginate. Existing GET routes remain compatible.
{
"interval": "1d",
"parameters": {"source": "close", "rsi": 14},
"columns": ["close", "rsi", "sma_200", "volume", "vol_sma_20"],
"conditions": [
{"field": "rsi", "op": "lt", "value": "35"},
{"field": "close", "op": "gt", "other": "sma_200"},
{"field": "volume", "op": "gt", "other": "vol_sma_20", "multiplier": "1.5"}
],
"mode": "and", "sort_by": "rsi", "sort_direction": "asc"
}
Metrics: OHLC, volume, value, change_pct, rsi, atr, macd, macd_signal, macd_histogram, stoch_k, stoch_d, sma_N, ema_N, vol_sma_N (N 1–800). Parameters: RSI/ATR lengths; MACD fast/slow/signal; stochastic period/K/D (1–200). Sources: open/high/low/close/hl2/hlc3/ohlc4. ATR, stochastic and change always use actual OHLC/close.
Operators: gt/gte/lt/lte/eq/between/crosses_above/crosses_below. Between takes numeric value and upper; crossings compare the prior and latest observed bars. Thresholds and multipliers must be decimal strings or integers, not JSON floats. No scripts or arbitrary expressions.
Maximum 12 conditions, 16 columns, 1,000 selected symbols, 32 KiB request body. Defaults: all catalog symbols, 25 matches/page; limit 1–100. Later pages repeat the definition with next_cursor as cursor and the returned scan_id. Results expire after 60 seconds or cache eviction; 409 means rerun. Only ready inputs match; excluded_unready reports withheld symbols. One scan at a time per gateway worker; 429 means busy, 503 means a three-minute scan timeout or unavailable data. Smoothed values may differ from full-history charts and legacy 200-bar snapshots.
03 / REQUEST EXPLORER
Request builder
Generate an authenticated API request. No live request or saved secret.
Your request will appear here.
Indicators per candle
GET /v1/candles/BBCA?interval=1d&start=2026-09-01&end=2026-10-02&indicators=all
Optional indicators: all or comma-separated names. Omit it for the unchanged OHLCV response; OHLCV stay top-level candle fields (open, high, low, close, volume, value), not indicator names. Raw OHLCV names here return 422. Each candle gains an indicators object; values are Decimal strings or null.
Names: change_pct, vol_sma_5, vol_sma_20, sma_5, sma_8, sma_21, sma_60, sma_100, sma_200, sma_400, sma_800, rsi_14, atr_14, macd (line), macd_signal, macd_histogram, stoch_k, stoch_d.
Change is percent versus the prior observed close; a zero prior close yields null. Volume averages use shares. SMA periods count selected-interval candles, not calendar days. RSI/ATR: Wilder(14); MACD: (12,26,9); stochastic: slow (14,3,3).
Up to 800 pre-start candles seed calculations; derived intervals use a bounded source lookback. Every page uses the same seed. Changing start can change smoothed values; latest snapshots use a separate 200-bar seed. Null means insufficient observations or undefined change. indicator_calculation reports seed bounds, warm-up count and missing requested slots. No gap filling, no signal flags. Unknown names return 422. Authenticated data access is released.
04 / DATA CONTRACT
Data contract
- Prices & value
- Decimal strings in IDR. Parse with Decimal, never floating-point money arithmetic.
- Volume
- Integer shares for every interval. Daily lots are converted at the API boundary.
- Daily boundary
- Prior WIB dates only, even after today’s close. Midnight identifies the session, not an execution time.
- Intraday boundary
- Today’s settled hours are allowed after five minutes; the final 16:00 source bar becomes eligible at 16:20 WIB. 2h/4h wait for every constituent source bar and their session-limited end.
- Aggregation
- Morning and afternoon stay separate. A short session bucket is final, not a forming candle;
short_sessionandsource_barsdescribe it. - Weekly / monthly
1w/1moaggregate canonical daily candles. WIB Monday-start weeks and calendar months; current periods excluded. Missing daily inputs omit the entire period. No extra stored series.- Missing candles
- Never synthesized. Gaps suppress signal flags; stale or insufficient data is labeled.
- Calculation
- Latest snapshots use 200 observed bars; optional candle history uses up to 800 pre-start bars with a fixed seed across pages. EMA starts from its period’s SMA; RSI/ATR use Wilder smoothing; flat RSI/stochastic use neutral 50. Windowed values can differ from full-history charts.
- Daily authority
- Hourly aggregates never replace daily OHLCV. No parity guarantee.
05 / ERRORS & LIMITS
Errors and limits
401 | Missing, invalid, expired, or revoked key. Check your credential. |
|---|---|
422 | Invalid symbol, date range, interval, or pagination. Correct the request. |
429 | Account rate exceeded or computation busy. Respect Retry-After. |
503 | Publication held or data temporarily unavailable. Retry later. |
Default: 10 requests/second per user, shared across keys in a rolling-second window. Admin can set 1–1,000 RPS. There is no per-key daily request quota; Cold computations and market reads also have bounded concurrency; a busy service returns 429.
06 / AGENT-NATIVE
For AI agents
Harnesses can consume this API without the HTML console:
GET /llms.txt— concise machine-readable guide (also served as Markdown at/docswithAccept: text/markdownor?format=md).GET /openapi.json— OpenAPI 3 schema; generate a typed client from this.GET /agents/openapi.json— flattened operation catalog (method, path, params, auth) for tool harnesses.
All data endpoints are plain HTTP with Authorization: Bearer <key>; responses are JSON with decimal strings. Dynamic /v1/screener and /v1/research/{symbol} expose the full indicator set for programmatic screening.
03 / RECORDED REQUESTS
API usage
Seven-day request history across your keys. Real activity only.
Request activity
UTCSign in to see your API activity.
By endpoint (7 days)
REQUESTSYour requests will appear here.
06 / ACCESS CONTROL
Users & limits
One request budget per account. Shared across every user-owned key.
Registered accounts
GOOGLE VERIFIED| Name | Verified email | Approval | Shared requests/sec |
|---|
New users need admin approval before creating keys. Pausing approval blocks new keys, not existing keys. Only the operator can assign admin status. Rate changes apply to all keys owned by the account.