Ajaib Data API: IDX, Crypto and US Stock Endpoints
Ajaib: Stock, Crypto, US Stock is an Android investment app from Ajaib Technologies for Indonesian retail investors, bringing IDX shares, crypto, US-listed stocks, reksadana mutual funds and government bonds into one account. Users can open an RDN cash account with e-KTP verification, follow stock order books, place regular and day-trade orders, fund purchases through virtual accounts and move between investment products. Google sign-in, a six-digit PIN and trusted-device checks support account access. The Indonesia-focused app has a 4.01 Google Play rating from 163,849 reviews and competes with Stockbit, Bibit, Bareksa and Pluang.
RDN cash snapshots and cross-asset wealth totals connect investmentType to totalInvestedAmount, totalPortfolioAmount, pnlAmount and pnlPercentage, alongside staleData and websocketIntegration flags on each category card. IDX account records distinguish holdCash, regularBuyingPower and tradeLimitBuyingPower, with regPortfolioValueWithHaircut and dtPortfolioValueWithHaircut keeping collateral-adjusted values separate; IDX buy receipts carry orderNo, idxOrderNo and executedLot for the submitted tickerCode, lot and board. Crypto records add tradeLimit, buyingPower, cashAvailable and withdrawable, while order receipts track quantityFilled, fee and status.
US-stock positions retain symbol, amount, averagePrice, investedPrice and assetReturnPct for cost-basis and return calculations. Mutual-fund records add fundTypeLabel and pending cash movements; bond positions add bondType, bondCategory and expirationDate. Wealth aggregators can reconcile these asset groups, risk teams can compare cash with buying power, and tax-lot tools can keep USD positions separate from IDR holdings. openData Studio turns these data structures into callable open data for portfolio reporting and integrations.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
PIN login session
POST
/v1/investment-session/startosintSigns the investor in and returns pinToken, pinRefresh and trusted-device flags for subsequent account access.
Auth: Unauthenticated sign-in. The returned pinToken is used as Authorization: jwt <pinToken>; pinRefresh renews the PIN session.
- pinToken
- pinRefresh
- haveTrustedDevice
- isTrustedDevice
- userId
POST /v1/investment-session/start HTTP/1.1 Content-Type: application/json { "email": "<example-investor-email>" }{ "pinToken": "<example-pin-token>", "pinRefresh": "<example-pin-refresh>", "haveTrustedDevice": true, "isTrustedDevice": true, "user": { "userId": "example-investor-001" } }Refresh access token
POST
/v1/investment-session/renewopenbankingRotates the signed-in session and returns a new accessToken and refreshToken pair.
Auth: The request body carries the signed-in session refreshToken; the response supplies a renewed accessToken and refreshToken.
- accessToken
- refreshToken
POST /v1/investment-session/renew HTTP/1.1 Content-Type: application/json { "refreshToken": "<example-refresh-token>" }{ "accessToken": "<example-access-token>", "refreshToken": "<example-next-refresh-token>" }Wealth-center portfolio summary
GET
/v1/multi-asset-wealth/overviewopenfinanceReads the unified wealth card with per-category invested and portfolio totals, profit and loss, nested investmentType groups and asset positions.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- category
- displayName
- websocketIntegration
- staleData
- totalInvestedAmount
- totalPortfolioAmount
- pnlAmount
- pnlPercentage
- investmentType
- assets
- symbol
- quantity
- averagePrice
- lastPrice
- investedAmount
GET /v1/multi-asset-wealth/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "category": "STOCK", "displayName": "Saham", "websocketIntegration": true, "staleData": false, "totalInvestedAmount": "9250000", "totalPortfolioAmount": "9500000", "pnlAmount": "250000", "pnlPercentage": "2.70", "investments": [ { "investmentType": "STOCK_REGULAR", "totalInvestedAmount": "9250000", "totalPortfolioAmount": "9500000", "pnlAmount": "250000", "pnlPercentage": "2.70", "assets": [ { "symbol": "BBCA", "quantity": "1000", "averagePrice": "9250", "lastPrice": "9500", "investedAmount": "9250000", "pnlAmount": "250000" } ] } ] }IDX regular cash sleeve
GET
/v1/idx-capital/availabilityopenbankingReads IDX regular-account cash, regular and trade-limit buying power, regular/day-trade portfolio values before and after haircuts, and the global-limit flag.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- holdCash
- regularBuyingPower
- tradeLimitBuyingPower
- maxFee
- regMaxFee
- closeBalance
- fee
- loanAmount
- portfolioValue
- multiplier
- regPortfolioValue
- dtPortfolioValue
- regPortfolioValueWithHaircut
- dtPortfolioValueWithHaircut
- globalLimitHit
GET /v1/idx-capital/availability HTTP/1.1 Authorization: jwt <example-pin-token>{ "holdCash": 25000000.0, "regularBuyingPower": 24150000.0, "tradeLimitBuyingPower": 18000000.0, "maxFee": 15000.0, "regMaxFee": 12000.0, "closeBalance": 24850000.0, "fee": 8500.0, "loanAmount": 0.0, "portfolioValue": 9500000.0, "multiplier": 1.0, "regPortfolioValue": 9500000.0, "dtPortfolioValue": 0.0, "regPortfolioValueWithHaircut": 8550000.0, "dtPortfolioValueWithHaircut": 0.0, "globalLimitHit": false }IDX stock portfolio summary
GET
/v1/idx-holdings/overviewopenfinanceLists IDX holdings with symbol, quantity, averagePrice, lastPrice and investedAmount alongside portfolio-level profit and loss.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- totalInvestedAmount
- totalPortfolioAmount
- pnlAmount
- pnlPercentage
- symbol
- name
- quantity
- averagePrice
- lastPrice
- investedAmount
- portfolioAmount
- currency
GET /v1/idx-holdings/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "totalInvestedAmount": "9250000", "totalPortfolioAmount": "9500000", "pnlAmount": "250000", "pnlPercentage": "2.70", "assets": [ { "symbol": "BBCA", "name": "Bank Central Asia", "quantity": "1000", "averagePrice": "9250", "lastPrice": "9500", "investedAmount": "9250000", "portfolioAmount": "9500000", "pnlAmount": "250000", "pnlPercentage": "2.70", "currency": "IDR" } ] }Place IDX regular buy
POST
/v1/idx-purchases/createopenfinancePlaces an IDX regular buy using tickerCode, lot, price and board, returning orderNo, idxOrderNo and fill status.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- affiliateId
- board
- lot
- period
- price
- tickerCode
- automationOrders
- tradingMode
- orderNo
- idxOrderNo
- stockName
- executedLot
- status
- type
- orderType
- total
POST /v1/idx-purchases/create HTTP/1.1 Authorization: jwt <example-pin-token> Content-Type: application/json { "affiliateId": "example-affiliate", "board": "RG", "lot": 10, "period": "DAY", "price": 9500.0, "tickerCode": "BBCA", "automationOrders": [], "tradingMode": "REGULAR", "metadata": null, "advancedOrder": null }{ "orderNo": "example-idx-order-001", "idxOrderNo": "example-exchange-order-001", "stockName": "BBCA", "price": 9500.0, "lot": 10, "executedLot": 0, "status": "OPEN", "type": "BUY", "orderType": "LIMIT", "total": 9500000.0 }Coin homepage portfolio
GET
/v1/digital-assets/overviewopenfinanceReads the crypto home wallet with labelled total, invested and return amounts plus userBalance.tradeLimit.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- portfolioSummary
- totalLabel
- investedLabel
- returnAmountLabel
- returnPercentageLabel
- currencySymbol
- userBalance
- tradeLimit
- tradeLimitLabel
- userCampaignNetWorth
GET /v1/digital-assets/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "portfolioSummary": { "totalLabel": "Rp 12.500.000", "investedLabel": "Rp 11.200.000", "returnAmountLabel": "Rp 1.300.000", "returnPercentageLabel": "+11.61%", "currencySymbol": "Rp" }, "userBalance": { "tradeLimit": 8500000.0, "tradeLimitLabel": "Rp 8.500.000" }, "userCampaignNetWorth": null }Place crypto buy
POST
/v1/digital-asset-purchases/createopenfinancePlaces a crypto buy using code, orderType, price, quantity and subtotal, returning order details including ajaibId, quantityFilled, fee and status.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- code
- orderType
- currency
- price
- quantity
- subtotal
- tradingType
- ajaibId
- assetId
- assetName
- fee
- feePercentage
- id
- orderNumber
- party
- quantityFilled
- side
- status
- total
- type
POST /v1/digital-asset-purchases/create HTTP/1.1 Authorization: jwt <example-pin-token> Content-Type: application/json { "code": "BTCIDR", "orderType": "LIMIT", "currency": "IDR", "price": 1450000000.0, "quantity": 0.001, "subtotal": 1450000.0, "tradingType": "SPOT" }{ "ajaibId": 1001, "assetId": "btc", "assetLogo": "/media/bitcoin-example.svg", "assetName": "Bitcoin", "createdAt": "2026-10-26T07:12:01Z", "currency": "IDR", "fee": 2175.0, "feePercentage": 0.15, "id": "example-crypto-order-001", "orderNumber": 1001, "party": "AJAIB", "price": 1450000000.0, "quantity": 0.001, "quantityFilled": 0.0, "side": "BUY", "status": "OPEN", "total": 1450000.0, "type": "LIMIT", "updatedAt": "2026-10-26T07:12:01Z" }Crypto account balances
GET
/v1/digital-asset-cash/availabilityopenbankingReads buyingPower and cashAvailable for the signed-in crypto wallet.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- buyingPower
- cashAvailable
GET /v1/digital-asset-cash/availability HTTP/1.1 Authorization: jwt <example-pin-token>{ "buyingPower": 8500000.0, "cashAvailable": 8200000.0 }Crypto withdrawable cash
GET
/v1/digital-asset-cash/transfer-capacityopenbankingReturns withdrawable crypto-wallet cash and the minAmount withdrawal floor.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- withdrawable
- minAmount
GET /v1/digital-asset-cash/transfer-capacity HTTP/1.1 Authorization: jwt <example-pin-token>{ "withdrawable": 7800000.0, "minAmount": 10000.0 }US-stock portfolio summary
GET
/v1/us-equity-positions/overviewopenfinanceLists US-stock positions with symbol, amount, averagePrice, investedPrice, currentPrice and assetReturnPct.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- symbol
- amount
- returnChange
- returnPct
- image
- company
- averagePrice
- investedPrice
- currentPrice
- assetReturnPrice
- assetReturnPct
- currency
GET /v1/us-equity-positions/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "holdings": [ { "symbol": "AAPL", "amount": 12.0, "returnChange": 185.4, "returnPct": 8.67, "image": "/media/us-equity-example.svg", "company": "Apple Inc.", "averagePrice": 178.25, "investedPrice": 2139.0, "currentPrice": 193.7, "assetReturnPrice": 185.4, "assetReturnPct": 8.67, "currency": "USD" } ] }Place US-stock buy
POST
/v1/us-equity-purchases/createopenfinanceSubmits a US-stock buy with id, symbol, total and additionalInfo.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- id
- symbol
- total
- additionalInfo
POST /v1/us-equity-purchases/create HTTP/1.1 Authorization: jwt <example-pin-token> Content-Type: application/json { "id": "example-us-stock-order-001", "symbol": "AAPL", "total": 1937.0, "additionalInfo": null }{ "id": "example-us-stock-order-001", "symbol": "AAPL", "total": 1937.0, "additionalInfo": null }Mutual-fund wallet portfolio
GET
/v1/reksadana-positions/overviewopenfinanceLists reksadana positions with fundTypeLabel, pendingDepositAmount, pendingWithdrawalAmount and portfolio-level profit and loss.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- totalInvestedAmount
- totalPortfolioAmount
- pnlAmount
- pnlPercentage
- symbol
- name
- quantity
- averagePrice
- lastPrice
- investedAmount
- portfolioAmount
- fundTypeLabel
- pendingDepositAmount
- pendingWithdrawalAmount
- isVirtualFund
GET /v1/reksadana-positions/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "totalInvestedAmount": "15000000", "totalPortfolioAmount": "15300000", "pnlAmount": "300000", "pnlPercentage": "2.00", "assets": [ { "symbol": "EXAMPLE-MF", "name": "Example Money Market Fund", "quantity": "15000", "averagePrice": "1000", "lastPrice": "1020", "investedAmount": "15000000", "portfolioAmount": "15300000", "pnlAmount": "300000", "fundTypeLabel": "Pasar Uang", "pendingDepositAmount": "0", "pendingWithdrawalAmount": "0", "isVirtualFund": false } ] }Bond wallet portfolio
GET
/v1/bond-positions/overviewopenfinanceLists SBN and corporate-bond positions with bondType, bondCategory, expirationDate and portfolio-level profit and loss.
Auth: Authorization: jwt <pinToken> after login; use the session accessToken after renewal.
- totalInvestedAmount
- totalPortfolioAmount
- pnlAmount
- pnlPercentage
- symbol
- name
- quantity
- averagePrice
- lastPrice
- investedAmount
- portfolioAmount
- bondType
- bondCategory
- expirationDate
GET /v1/bond-positions/overview HTTP/1.1 Authorization: jwt <example-pin-token>{ "totalInvestedAmount": "10000000", "totalPortfolioAmount": "10115000", "pnlAmount": "115000", "pnlPercentage": "1.15", "assets": [ { "symbol": "FR0090", "name": "FR0090", "quantity": "10", "averagePrice": "1000000", "lastPrice": "1011500", "investedAmount": "10000000", "portfolioAmount": "10115000", "pnlAmount": "115000", "bondType": "SBN", "bondCategory": "PRIMARY", "expirationDate": "2031-07-15" } ] }
Data categories
- session tokens
- wealth totals
- IDX cash
- IDX holdings
- IDX orders
- crypto wallets
- crypto orders
- US-stock lots
- mutual-fund holdings
- bond holdings
Where teams use this data
Cross-sleeve wealth recon
Family-office ledgers pull totalInvestedAmount, totalPortfolioAmount, pnlAmount and pnlPercentage per investmentType so IDX, crypto, US-stock, reksadana and bond sleeves land in the same nightly rollup.
IDX cash versus haircut
Risk desks compare holdCash and regularBuyingPower with tradeLimitBuyingPower, then check regPortfolioValueWithHaircut / dtPortfolioValueWithHaircut and globalLimitHit before allowing another regular lot.
Crypto trade-limit watch
Treasury bots read userBalance.tradeLimit next to buyingPower / cashAvailable and withdrawable / minAmount so a coin buy is not submitted past the labelled wallet floor.
US-stock tax lots
Year-end harvest jobs page symbol, amount, averagePrice, investedPrice and assetReturnPct so USD lots keep a cost basis separate from IDX cash P&L.
Frequently asked questions
Which Ajaib wealth fields support a multi-asset portfolio report?
Wealth records group category and displayName with totalInvestedAmount, totalPortfolioAmount, pnlAmount and pnlPercentage. Nested investmentType groups and asset fields such as symbol, quantity, averagePrice and lastPrice support holdings-level reconciliation.
How do IDX cash and crypto wallet balances differ?
IDX account records separate holdCash, regularBuyingPower and tradeLimitBuyingPower, with regular and day-trade portfolio values before and after haircuts. Crypto records distinguish tradeLimit, buyingPower, cashAvailable and withdrawable, plus minAmount for the withdrawal floor. These fields describe different limits and should not be treated as interchangeable cash balances.
Which fields identify a US-stock position and a buy submission?
US-stock holdings include symbol, amount, company, averagePrice, investedPrice, currentPrice and assetReturnPct, with currency identifying USD positions. A buy submission uses id, symbol, total and additionalInfo. The examples separate position reporting from order submission.
How is session authentication represented in the API examples?
Sign-in returns pinToken, pinRefresh and trusted-device flags. Authenticated examples use the Authorization header with the jwt scheme and a placeholder token. Session renewal carries refreshToken in the request body and returns accessToken and refreshToken; PIN-session renewal uses pinRefresh. No live credentials are included. Paths and payloads are illustrative, not live Ajaib services or official developer documentation; account-specific integrations require appropriate authorization and an agreed access arrangement.
Apps similar to Ajaib: Stock, Crypto, US Stock
- Stockbit — Stockbit is PT Stockbit Sekuritas Digital's Android app for discussing, analyzing and trading Indonesia Stock Exchange (IDX) shares, with live quotes, Chartbit charts and in-app RDN opening.
- Bibit- Reksadana & Obligasi — Bibit is PT Bibit Tumbuh Bersama's OJK-licensed APERD app for Indonesian reksadana mutual funds, retail SBN, FR government bonds and beginner-oriented stocks.
- Bareksa — Bareksa is an OJK-licensed Indonesian investment app for stocks, more than 180 mutual funds, government bonds (SBN) and gold, with a robo advisor on the same client.
- Pluang — Pluang is an Indonesian investing app for IDX stocks, US stocks, crypto and digital gold, with group companies licensed and supervised by OJK, Bappebti and/or Bank Indonesia.
- tanamduit — tanamduit is an OJK-licensed APERD app for Indonesian mutual funds starting at Rp10,000, retail government bonds (SBN) and gold, with goal-based Tanam Mimpi plans.
- IPOT — IPOT is PT Indo Premier Sekuritas's Android client for investing and trading Indonesian stocks, from a brokerage registered with and supervised by OJK.
- Growin' — Growin' is Mandiri Sekuritas's investing app for Indonesian stocks, mutual funds across money-market, fixed-income, equity, balanced, index/ETF and sharia categories, and bonds.
- Pintu — Pintu is an OJK-supervised Indonesian crypto app for rupiah spot trading, leveraged futures and earn products across hundreds of coins.
Topics
- Ajaib API
- Ajaib portfolio data
- Ajaib IDX holdings
- Ajaib holdCash
- Ajaib crypto buyingPower
- Ajaib tradeLimit
- Ajaib US stock averagePrice
- Ajaib reksadana data
- Ajaib bond holdings
- Ajaib totalPortfolioAmount
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use