Infoway Python SDK
Official Infoway Python SDK for REST market data, fundamentals, and WebSocket streams.
If api_key is omitted, the SDK reads INFOWAY_API_KEY. InfowayClient is a context manager.
Contents
Install
Quick start
Symbols
Client
REST
Typed results
WebSocket
Error codes
Changelog
REST paths
Install
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
api_key
INFOWAY_API_KEY
API key
base_url
https://data.infoway.io
REST base URL
timeout
15
Per-request timeout (seconds)
max_retries
3
Retry count
parse
False
Normalize trades / depth / candles
stock / crypto / japan / india / korea / taiwan / common
Trade, depth, candles
basic / packages
Symbols, calendar, plan
market / plate
Overview, sectors
stock_info / financial
Fundamentals, statements
Prefer enums: KlineType, SymbolType, Market, Lang, NewsLang, PeriodType, Business, RankSort, SortOrder, ScheduleType.
REST
Join symbols with commas. Rate limits: REST API Limitation.
Quotes
get_trade(codes)
Latest trade
get_depth(codes)
Order book
get_kline(codes, kline_type, count, timestamp=None)
Candles
Trade fields: s symbol, p price, v volume, vw turnover, t milliseconds, td side. 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. get_trading_hours is deprecated; use get_trading_schedule.
Overview / sectors / stock info / financials
Rank key values come from get_rank_categories. Financial methods require symbol and type. period_type: fq quarter, fy year, fh half-year.
Typed results
Set parse=True on the client or per call.
Price / volume as strings
Decimal
Trade / depth t in ms; candle t in seconds
timezone-aware datetime
REST pc / WS pfr
change_percent
Candle respList
flattened list
Book a/b columns
(price, qty)
vw
turnover
WebSocket
Quotes
business must match the symbol market. connect() blocks — run it as a task. 60 frames per minute per connection. See WebSocket Limitation.
Equity trade types: subscribe_trade(codes, include_ty=True).
Heartbeat
10010 every 30 seconds; server does not reply
Reconnect
Replays the current subscription set
on_reconnect
After a later successful open
on_disconnect
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 stale_after (default 90s, 0 disables) resends the subscriptions
Subscribe fail:
A plain-text subscribe failure is delivered to on_error as SUBSCRIBE_FAIL
out
10000 / 10003 / 10006
Subscribe trade / depth / kline
out
11000 / 11001 / 11002
Unsubscribe
out
10010
Heartbeat
in
10002 / 10005 / 10008
Push
in
11010
Unsubscribe ack
in
200
Connected
An ack means the request was accepted. Merge symbols into one comma-separated string.
News
wss://data.infoway.io/news requires a separate entitlement. One news connection per key.
Subscribe 10020, unsubscribe 11020, push 10022. 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. An invalid key raises InfowayAuthError 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 on_error as SUBSCRIBE_FAIL. After a 505 the watchdog stops resending, and the resend gap widens automatically when many subscription groups are open. New stale_after (default 90s, 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 — Client-side request limits (≤ 100 symbols, ≤ 500 kline bars for one symbol, ≤ 2 bars per symbol when batched; raises InfowayAPIError), financial type validated locally, RestErrorCode.classify() recovers business codes wrapped in ret=500, WsErrorCode.is_terminal() stops reconnecting on non-retryable errors, resolve_api_key() unifies key resolution (an explicit empty string no longer falls back to the environment), sync callbacks accepted, calls after close raise InfowayIoError.
0.3.0 — packages, financial, Korea / Taiwan clients, RestErrorCode / WsErrorCode, enum parameters, InfowayIoError.
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
