Infoway Java SDK
Official Infoway Java SDK for REST market data, fundamentals, and WebSocket streams.
If apiKey is omitted, the SDK reads INFOWAY_API_KEY. Close InfowayClient when finished.
Contents
Install
Quick start
Symbols
Client
REST
Typed models
WebSocket
Error codes
Changelog
REST paths
Install
Maven:
Gradle:
Quick start
Symbols
US
{code}.US
AAPL.US
AAPL
Hong Kong
5-digit + .HK
00700.HK
700.HK
Shanghai
{code}.SH
600519.SH
600519.CN
Shenzhen
{code}.SZ
000001.SZ
000001.CN
Japan
{code}.JP
7203.JP
Korea
{code}.KS
005930.KS
India
{code}.IN
RELIANCE.IN
Taiwan
{code}.TW
2330.TW
Crypto
Pair
BTCUSDT
FX
Pair
USDJPY
basic() / financial() take a product type such as STOCK_US or CRYPTO, not a market code like US.
Client
apiKey(key)
INFOWAY_API_KEY
API key
baseUrl(url)
https://data.infoway.io
REST base URL
timeout(secs)
15
Per-request timeout (seconds)
maxRetries(n)
3
Retry count
stock() / crypto() / japan() / india() / korea() / taiwan() / common()
Trade, depth, candles
basic() / packages()
Symbols, calendar, plan
market() / plate()
Overview, sectors
stockInfo() / financial()
Fundamentals, statements
Prefer enums: KlineType, SymbolType, Market, Lang, NewsLang, PeriodType, WsBusiness, RankSort, SortOrder, ScheduleType. String overloads remain.
REST
Join symbols with commas. Rate limits: REST API Limitation.
Quotes
Same methods on stock / crypto / japan / india / korea / taiwan / common.
getTrade(codes)
Latest trade
getDepth(codes)
Order book
getKline(codes, type, count)
Candles
getKline(codes, type, count, timestamp)
Candles ending at a unix-seconds timestamp (minute / hour)
Trade fields: s symbol, p price, v volume, vw turnover, t milliseconds, td side (0 / 1 buy / 2 sell). Candles are under respList; t is seconds. Up to 500 bars per symbol; multi-symbol calls return 2 bars each.
MIN_1 / MIN_5 / MIN_15 / MIN_30
1–4
Minutes
HOUR_1 / HOUR_2 / HOUR_4
5–7
Hours
DAY / WEEK / MONTH / QUARTER / YEAR
8–12
Daily and above
Basic info
Dates use YYYYMMDD. getTradingHours is deprecated; use getTradingSchedule. getTradingScheduleByType accepts ENERGY / FOREX / FUTURES / METAL / INDICES.
packages().getInfo() returns packageName, expireTime, apiNumPerSec, maxWsConNum, maxNum, maxYearHisData, allWsNum.
Overview / sectors / stock info / financials
Rank key values come from getRankCategories. Financial methods require symbol and type. period_type: fq quarter, fy year, fh half-year. Optional stock-info lang: en / zh-CN.
Typed models
Default return type is JsonElement. Use getTradeParsed / getDepthParsed / getKlineParsed for normalized models.
Price / volume as strings
BigDecimal
Trade / depth t in ms; candle t in seconds
Instant
REST pc / WS pfr ("0.03%")
changePercent = 0.0003
Candle respList
List<Kline>
Book a/b as [[price…],[qty…]]
List<DepthLevel>
vw
turnover
WebSocket
Quotes
business must match the symbol market. Callbacks receive data. 60 frames per minute per connection (subscribe, unsubscribe, heartbeat). See WebSocket Limitation. Subscriptions issued before connect() are sent after open.
Equity trade types: subscribeTrade(codes, true) adds ty.
Heartbeat
10010 every 30 seconds; server does not reply
Reconnect
Replays the current subscription set
onReconnect
After a later successful open
onDisconnect
Unexpected drop only. close() does not fire it
HTTP 401
Stops reconnecting
Quota exceeded (516)
Retried on the same socket with backoff instead of closing it
Stale resubscribe
After a push has been seen, silence beyond staleAfterMs (default 90000, 0 disables) resends the subscriptions
Subscribe fail:
A plain-text subscribe failure is delivered to onError as SUBSCRIBE_FAIL
out
10000 / 10003 / 10006
Subscribe trade / depth / kline
out
11000 / 11001 / 11002
Unsubscribe
out
10010
Heartbeat (ack=1 yields 10011)
in
10001 / 10004 / 10007
Subscribe ack
in
10002 / 10005 / 10008
Push
in
11010
Unsubscribe ack
in
200
Connected
An ack means the request was accepted. A wrong business, unknown symbol, or closed market still acks and then stays silent. Merge symbols into one comma-separated string.
News
wss://data.infoway.io/news requires a separate entitlement. One news connection per key.
out
10020 / 11020
Subscribe / unsubscribe
in
10021 / 10022
Ack / push
Fields: dk, country, lang, route, title, published (seconds), urgency, provider, symbols[], link, content, sd. A later subscribe replaces the language.
Error codes
REST uses ret. WebSocket uses code. 508–514 mean different things on each side. Full tables: REST API Error Codes and WebSocket Error Codes.
REST budget is about 1200 calls/minute/key. HTTP 429, ret 501/502, or {"detail":"Rate limit exceeded"} are retried. An invalid key raises InfowayAuthException on REST; WebSocket handshake HTTP 401 does not reconnect.
REST ret
Description
200
Success
400
Bad request
500
Server error
501 / 502
Rate limit
503
Candle count exceeded
505
Symbol count exceeded
506 / 507
Invalid / missing parameter
508
Symbol not found
509
Permission expired
513
Timestamp outside plan history
514
No permission
WebSocket code
Description
501 / 502
Rate limit
505
Too many products on this connection (the SDK stops resending)
516
Account-wide subscription quota exceeded (the SDK retries with backoff)
506 / 507
Invalid / missing parameter
508–511
API key expired / invalid / empty / blacklisted
512
Connection count exceeded
513
Heartbeat timeout
515
Not JSON
517–521
Handshake failed
Changelog
0.4.1 — A subscribe quota rejection (516) no longer terminates the socket: subscriptions are retried on the same connection with backoff, and both the retries and the watchdog resends stay inside the 60-frames-per-minute budget. A plain-text Subscribe fail: reply is surfaced on onError as SUBSCRIBE_FAIL. After a 505 the watchdog stops resending, and the resend gap widens automatically when many subscription groups are open. New staleAfterMs (default 90000, 0 disables) resubscribes when a socket that had pushes goes silent. Outbound timestamps are capped at 256 entries. Japan and India examples now use .JP / .IN (Yahoo's .T / .NS return 508).
0.4.0 — New QuoteLimits client-side request limits (MAX_SYMBOLS 100, MAX_KLINE_BARS 500, MAX_KLINE_BARS_WHEN_BATCHED 2 when batched), financial type validated locally, RestErrorCode.classify() recovers business codes wrapped in ret=500, WsErrorCode.isTerminal() stops reconnecting on non-retryable errors, unified ApiKeys resolution (an explicit empty string no longer falls back to the environment), a shared daemon connection pool so close() no longer shuts down a process-wide thread pool.
0.3.0 — packages().getInfo(), getTradingScheduleByType, InfowayIoException, Korea / Taiwan / financial clients, RestErrorCode / WsErrorCode, enum parameters, printFrames off by default, news onNewsParsed.
0.2.0 — basic() parameters fixed (breaking):
getSymbols("US")
getSymbols(SymbolType.STOCK_US)
getSymbolInfo("AAPL.US")
getSymbolInfo(SymbolType.STOCK_US, "AAPL.US")
getAdjustmentFactors("AAPL.US")
getAdjustmentFactors("AAPL.US", "US", "20260801", "20260815")
getTradingDays("US")
getTradingDays("US", "20260801", "20260815")
getTradingHours("US")
getTradingSchedule()
WebSocket callbacks now receive data. unsubscribeKline is per interval. An invalid key stops reconnecting.
REST paths
{market} = stock / crypto / japan / india / korea / taiwan / common. Full list: Endpoints.
Latest trade
GET /{market}/batch_trade/{codes}
Order book
GET /{market}/batch_depth/{codes}
Candles
POST /{market}/v2/batch_kline
Symbols / calendar / financials
GET /common/basic/*
Overview / sectors / stock info
GET /common/v2/basic/*
Package
GET /package/info
License
MIT. API key: infoway.io.
Last updated
