Skip to main content

briskapi

English | 日本語

An unofficial, pybrisk-style Python API and brisk command line for BRiSK auction data. Consume a live feed, query recordings at any point in time, pull shared recordings from a public archive, and use SBI BRiSK or Tachibana e-shiten BRiSK Next with your own account, signing in with a passkey if you like. This is an independent project, not affiliated with or endorsed by BRiSK, Tachibana, SBI, TSE or JPX.

Data sources:

  • No account needed: the public BRiSK Next demo of 27 September 2021 (one pre-open snapshot and the first three minutes after the open), replayed at its recorded pace. This is not live market data.
  • With an SBI Securities BRiSK subscription: SBI BRiSK market data (candles, margin, alerts, schedule, watchlist) and an experimental live feed.
  • With Tachibana e-shiten BRiSK Next: the same, kept on your computer.

Install

Python 3.12+. Live feeds and recording also need Node 22+, because BRiSK's own decoder is a WebAssembly module that runs under Node.

pip install 'briskapi[pandas]'      # `import briskapi` and the `brisk` command

BRiSK's decoder and demo data are downloaded at runtime; the package doesn't include them. Optional prebuilt Rust tools (brisk_quote_ingest, brisk_recording) for Linux, macOS and Windows are attached to each GitHub release. To work from source, clone the repository and run pip install -e '.[pandas]'.

Live feed

import briskapi

feed = briskapi.connect(web=True, codes=["7203", "6758"])   # returns once initial state is in
toyota = briskapi.Ticker("7203")
toyota.quote()        # current quote, updated as each frame arrives
toyota.auction()      # indicative price/volume and market-order imbalance

feed.on_quote(lambda q: print(q["code"], q["indicative_price"]), codes="6758")
for q in feed.quotes("7203"):       # one item per update; ends with the session
    if q["last_price"]:
        print("opened at", q["last_price"], q["time"])
        break

briskapi.Market().imbalances(top=10).to_pandas()
feed.wait()           # or feed.close(); `with briskapi.connect(...) as feed:` also works

Options: web=True (fetch from the demo site) or cache=DIR (a local copy of the demo assets), codes, speed (1 real time, 0 as fast as possible) and history=True (keep updates for Ticker.history()). Callbacks and iterators first receive each security's current quote, then every update in order. A slow consumer slows the feed instead of losing updates.

Recordings and the archive

recordings = briskapi.recordings(source="historical_mock")   # no AWS account needed
if recordings:
    briskapi.pull(recordings[0]["prefix"])      # verify, decode and cache; becomes the default
else:
    briskapi.record("recordings/my-session", web=True)   # record the demo if the archive is empty
# Or briskapi.load("recordings/my-session") for a local recording folder (or an older events.jsonl[.gz]).

briskapi.Ticker("7203").quote(at="08:59:59.9999")             # available pre-open quote, in JST
briskapi.Ticker("7203").history(start="09:00", end="09:01")   # every update in a window
briskapi.Market().snapshot(at="09:00:00").to_pandas()

A recording is a folder of Parquet tables laid out like a NautilusTrader v2 catalog: data/order_book_depths.parquet (every quote update: v2's OrderBookDepth, then BRiSK's other quote fields), data/equity.parquet (the securities master, as v2 Equity) and data/custom/BriskBatch.parquet (per-frame timing). The complete demo replay takes about 34 MB. pandas, Polars and DuckDB read the tables directly; brisk export writes a NautilusTrader catalog or JSONL. ARCHITECTURE.md lists every column.

Time queries use each quote's timestamp. Toyota's first demo quote is at 08:59:59.993551 JST; an earlier query raises NotFoundError. Market().summary() returns both start and end, including for local recordings and live feeds. Archive listings skip invalid or unsupported recordings with a warning. Demo recordings may be absent; synthetic_test entries are publication probes. The legacy sample data uses the SBI wire format for protocol research and requires a wire-format decoder.

SBI BRiSK

For SBI Securities customers with a BRiSK subscription. Log in on sbi.brisk.jp in your browser, then pass its session cookies: copy them from DevTools, or use pycookiecheat's chrome_cookies("https://sbi.brisk.jp"). Or let briskapi sign in with your passkey (below).

from briskapi import sbi

sbi.login(cookies={"session_bfaf77a2": "v2.local..."})   # remember=True saves them (owner-only file)
toyota = briskapi.Ticker("7203")
toyota.candles("5m").to_pandas()   # price bars: 5m (today), 1d, 1w or 1mo
toyota.margin(days=30)             # margin balances and stock-lending fees
market = briskapi.Market()
market.turnover()     # turnover and shares outstanding, all stocks
market.lists()        # NK225, recent IPOs, …
market.events()       # basket orders, limit up/down, volume surges
market.schedule()     # trading date, status and session times
market.watchlist()    # your saved codes

feed = sbi.connect(codes=["7203"])          # live (experimental); timing sharing follows consent
toyota.quote()                              # same calls as any feed
# To share this session's market data too, first accept the current policy:
# briskapi.consent(accept=True, contributor="your-alias", license="CC0-1.0")
# feed = sbi.connect(codes=["7203"], share_market_data=True)

Results use the conventions below. Errors are sbi.SessionExpiredError (log in again), briskapi.NotFoundError, sbi.RateLimitError and sbi.APIError. Requests are limited to one per second.

The live feed runs SBI's own decoder under Node, downloaded with your session; no browser is involved. It follows the vendor client's connect sequence: it feeds the decoder from the first frame, catches the snapshot up to the stream, answers the server's pings through the decoder and watches the server heartbeat. It hasn't yet been validated against a live SBI session. The stream is expected to be a plain binary WebSocket, as in the Next client. Should the server open with Socket.IO instead, the host joins its /v2/user namespace with unverified parameters that sbi.connect(profile={...}) can set. See what the server answers with trace_protocol=True (every token redacted); anything unexpected stops with an explicit error rather than a guess. Please report what you see. Live sessions now get through sign-in, the data endpoints, the decoder download, the stock master and the snapshot (loaded with the session schedule). The WebSocket upgrade to api.brisk.jp was then answered with HTTP 502; those sessions didn't ask for the flex subprotocol the vendor client asks for, which this version does, and whether that is enough is not known yet. Your cookies go only to sbi.brisk.jp. SBI market data is shared only after an explicit choice for that capture; the Python API requires share_market_data=True. With contribution on, a timing summary is shared even when market-data sharing is declined.

Tachibana e-shiten BRiSK Next

e-shiten's BRiSK Next (next.e-shiten.brisk.jp) is the same app, so the same client serves it. Log in there in your browser and pass its cookies with site="e-shiten", or let briskapi sign in with your e-shiten passkey (below): brisk enroll --site e-shiten once, then brisk login before brisk live --site e-shiten.

sbi.login(cookies={...}, site="e-shiten")   # or BRISK_ESHITEN_COOKIES; remember=True keeps them apart from SBI's
feed = sbi.connect(codes=["7203"])           # live (experimental)

Everything above applies, sharing included (a timing summary under your saved choice, market data only if you opt in for that capture); its cookies go only to next.e-shiten.brisk.jp. e-shiten allows one BRiSK session at a time: opening it in a second tab or browser has stopped the first (message 10011), so the feed and BRiSK in your browser can end each other. Before you record or share, read what Tachibana's BRiSK Next terms say about storing and reusing its data.

Signing in with a passkey (experimental)

Many brokers now have you sign in with a passkey. If yours does, briskapi can do the sign-in for you and keep the BRiSK session cookies, instead of you copying them from a browser. It works with the BRiSK sites of SBI, Matsui, Monex, SMBC Nikko and Tachibana e-shiten, or any broker you add. It needs Chrome, Node 22+ and a safe place for the passkey: the macOS Keychain or Windows Credential Manager (on Linux, an owner-only file you opt into). It runs on macOS and Windows (run it from PowerShell or cmd so it uses Windows' own Chrome and Node, not WSL's) and is also tested on Linux.

How it works

A passkey is a pair of keys. The broker keeps the public half. The private half normally lives in your phone, laptop or password manager, where a fingerprint or PIN lets it sign a challenge the broker sends, which proves it is you. briskapi borrows that arrangement. It starts its own Chrome, which has a virtual authenticator: software that plays the part of your phone and signs without asking. The broker's site cannot tell the difference.

  1. Once, brisk enroll. You pick your broker. A separate Chrome window opens on its login page (a temporary profile, not your everyday Chrome). Sign in as you normally would, then register a new passkey in the broker's security settings, just as you would for a new phone. The virtual authenticator receives it. When the site says it is registered, press Enter in the terminal: briskapi saves the passkey and your broker choice in the macOS Keychain or Windows Credential Manager, and Chrome closes. At e-shiten, enroll first asks for your user ID, because its passkey form wants the ID before the passkey; it is saved with the passkey. The window opens at e-shiten's usual sign-in (user ID, PIN and phone-number authentication), and the passkey is registered on the screen shown after signing in or under お客様情報 › 設定情報 › パスキー認証.
  2. Each session, brisk login. The same Chrome opens with the saved passkey loaded, goes to the login page and presses the passkey button, and the virtual authenticator signs. Open BRiSK from the broker's site in that window (or pass --launch-url to have it opened for you). briskapi reads the BRiSK session cookies, saves them and closes Chrome.
  3. Then use it. For SBI and e-shiten, brisk live --sbi or brisk live --site e-shiten and the briskapi.sbi API use the saved cookies. For the other brokers briskapi has no data client yet, so the cookies are only saved (under ~/.config/brisk/cookies/) for your own use.

Your existing passkeys on your phone or in a password manager are not touched. The broker simply lists one more passkey, which you can delete in its security settings.

What to know

  • The saved passkey is a credential. Whoever has it can sign in to your broker account with no further check. It is kept only in the Keychain or Credential Manager (BRISK_PASSKEY_STORE=file keeps it in an owner-only file instead, which is weaker; on Windows that file's privacy comes from your user profile folder, which only you and administrators can read), never leaves your machine and is never shown in a log. For e-shiten your user ID is kept with it, in the same place. brisk forget deletes it here; remove it at the broker too.
  • It is experimental. Each broker's login page, passkey button text and BRiSK launch come from its public pages, and none has been tried against a live account. Override them with --login-url, --passkey-button and --launch-url, or in sites.json below, and please report what fails.
  • A broker may refuse it. Chrome tells the site it is being automated. Check that your broker's terms allow this before relying on it.

Commands

brisk sites                    # the brokers you can pick, and where their BRiSK lives
brisk enroll [--site matsui]   # once; you are asked to choose a broker if you don't say
brisk login                    # each session; the broker is the one you enrolled with
brisk forget                   # delete the saved passkey

From Python: passkey.enroll(site="matsui") (for e-shiten, passkey.enroll(site="e-shiten", user_id="...")) and signin = passkey.login(), where signin.cookies are the BRiSK cookies and signin.client is the data client for sites that have one.

To add a broker, or correct a built-in one, edit ~/.config/brisk/sites.json:

{"sites": [{"id": "mybroker", "name": "My Broker", "login_url": "https://broker.example/login",
            "cookie_host": "mybroker.brisk.jp", "passkey_button": "Sign in with a passkey"}]}

Other keys: cookie_prefix, launch_url, enroll_url (where enroll starts, if the first sign-in is on another page than the passkey one) and user_field (a CSS selector for a user ID box that must be filled before the passkey control works; enroll then asks for the ID).

How it works inside: ARCHITECTURE.md.

API reference

Call Returns
briskapi.connect(...) Live Feed; becomes the default source
Ticker(code).info() Name, lot size, tick type, base price and daily limits
Ticker(code).quote(at=None) Bid/ask with their quantities and orders, the ten best book levels per side (bids, asks), indicative price/volume, market-order and closing quantities, last trade, turnover, issue status
Ticker(code).auction(at=None) Indicative auction state with market_order_imbalance (market buy minus sell)
Ticker(code).history(start, end) Every update in order
Market().stocks() Master for every security
Market().snapshot(at=None) Every security's quote
Market().imbalances(at=None, top=None) Securities ranked by absolute market-order imbalance
Market().summary() Source, date, coverage and clock range
Feed.quotes(codes) / Feed.on_quote(fn, codes) Live updates as they arrive
briskapi.recordings() / .pull() / .load() Archive listing, verified download, local file
briskapi.record(output, web=True, ...) A recording of the demo, shared per your choice
briskapi.consent(...) Your sharing choice
Ticker(code).candles(interval) / .margin(days) Broker BRiSK (SBI, e-shiten) price bars; margin balances and lending fees
Market().turnover() / .lists() / .events() / .schedule() / .watchlist() Broker BRiSK market data
briskapi.sbi.login(site=...) / .connect() SBI (default) or e-shiten BRiSK session and live feed
briskapi.passkey.enroll() / .login() / .forget() Passkey sign-in to your broker's BRiSK

Prices are yen floats, with None for the vendor's zero "unavailable" value. Times are JST datetimes on the trading date. Quantities are shares; side, flag and status codes are raw vendor values. raw=True returns vendor fields (*_price10 in tenths of a yen, *_us in microseconds since JST midnight). Tabular results are lists of dicts with .to_pandas(). Errors are briskapi.BriskError and briskapi.NotFoundError. The first whole-market query reads a recording's tables into memory (about two seconds for the complete demo); one security's history is read on its own.

Command line

brisk live --web --codes 7203,6758          # one JSON object per quote update (--raw for vendor fields)
brisk sites | enroll | login | forget       # sign in to your broker's BRiSK with a passkey through Chrome (experimental)
brisk live --sbi --codes 7203               # SBI BRiSK; cookies from BRISK_SBI_COOKIES (JSON) or `brisk login`; --trace-protocol shows the handshake, wire details in BRISK_SBI_PROFILE
brisk live --site e-shiten --codes 7203     # Tachibana e-shiten BRiSK Next; cookies from BRISK_ESHITEN_COOKIES (JSON) or `brisk login`
brisk record --web --output recordings/s1   # record a replay (shared if you agreed)
brisk list --date 20210927 --source historical_mock
brisk pull PREFIX --output recordings/downloaded   # use a prefix returned by brisk list
brisk export recordings/s1 --nautilus catalog      # a NautilusTrader v2 catalog (or --jsonl FILE)
brisk consent [--accept | --revoke]         # show or change sharing
brisk upload recordings/s1                  # retry sharing a recording

Each command has --help. pull verifies everything before writing and never overwrites an existing folder.

At the beginning of each interactive brisk live --sbi or --site e-shiten capture with contribution enabled, you are asked whether to publish that session's market data; Enter opts in. The choice is not saved. Use --share-market-data to opt in explicitly in a script, or --no-share-market-data to decline without prompting. A clean session end is required to publish a recording. brisk list --source sbi_live (or eshiten_live) lists shared broker recordings; their market content is contributor-declared.

Sharing recordings

The first time you record or start a demo live session from the command line, the tool shows what would be shared and asks once; Enter accepts. After that, every complete demo session is uploaded and published automatically. The Python API never asks: until you decide, sessions stay on your computer.

  • Broker timing sharing (SBI, e-shiten): percentiles of decode time, data age at receipt and frame spacing, a stall count, the frame count, the trading date, the first and last minute, and your alias and license. briskapi.Archive().timing() lists everyone's reports.
  • Optional broker market sharing: an explicit choice at the start of each capture adds the decoded securities master, prices, quantities, codes and local timing to the public archive. Cookies, tokens and connection diagnostics are excluded.
  • What a demo session shares: the market data you recorded, local timing measurements (including your computer's clock, which shows when you recorded), and a public alias (random anon-… by default) and license. Your IP address is used only to rate limit uploads.
  • Visibility: published recordings are public and permanent, and you cannot delete them yourself. See PRIVACY.md.
  • Opting out: brisk consent --revoke, BRISK_CONTRIBUTE=0, or --no-upload for one run.
  • License: accepting declares that you may redistribute the recordings under the chosen data license (CC0-1.0 or CC-BY-4.0). This project's open-source license gives no rights to vendor or exchange data. If you can't make that declaration, turn sharing off.
  • Partial replays (--limit-frames) and sessions closed early are never shared.

More documentation

Software is MIT licensed.

Metadata

Release files for briskapi 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for briskapi 0.9.0
File Size Uploaded
briskapi-0.9.0.tar.gz 228.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for briskapi 0.9.0
File Interpreter ABI Platform
briskapi-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 419.7 kB

Release files / briskapi-0.9.0.tar.gz

Download URL briskapi-0.9.0.tar.gz
Size 228.3 kB
Tags Source
SHA-256 checksum
How to use checksums
033f990b78afda0217fb950aca0d5406674d669bc8511868016b9ccbd9619daa
BLAKE2b-256 checksum
How to use checksums
55efd92f6a9c3335be0a926512f4a356b54ef03fce376ef512ebb3345bf3c93b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release files / briskapi-0.9.0-py3-none-any.whl

Download URL briskapi-0.9.0-py3-none-any.whl
Size 191.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4f4166170dbdb2aaf231ed2d5bd7066fa697713713efb1a3e7b2e227e9d84329
BLAKE2b-256 checksum
How to use checksums
ea8a076dfb1fa7c2baeb0251e170c003de142d4bda81363d2b7379bef9965a05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release history Release notifications | RSS feed

1.7.2

6 release files

1.7.1

6 release files

1.7.0

6 release files

1.6.3

6 release files

1.6.2

6 release files

1.6.1

6 release files

1.6.0

6 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.10.0

2 release files

This release

0.9.0 This release

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page