Public API v1

Bitcoin Treasury Company Data Feed

CEBE Tracker publishes one free JSON endpoint with the latest verified balance sheet and CEBE computation for every company on the tracker: BTC holdings, debt, preferred stock, cash, share counts, Senior Claims %, CEBE in satoshis per share, and CEBE mNAV. No API key. CORS is enabled for any origin. Free to use with attribution to cebetracker.io.

Endpoint

GET https://cebetracker.io/api/v1/companies.json

Try it:

curl -s https://cebetracker.io/api/v1/companies.json

# CEBE per share and Senior Claims % for every company
curl -s https://cebetracker.io/api/v1/companies.json \
  | jq '.companies[] | {ticker, cebe_sats, senior_claims_pct, cebe_mnav}'

Methods: GET, HEAD, OPTIONS. The response is JSON with Access-Control-Allow-Origin: *, so browser apps can call it directly.

The two price bases

The feed serves the same construction on two explicit bases, and every price is dated.

Snapshot basis (filing-anchored)

Balance sheet figures come from each company's latest verified snapshot, sourced from primary filings (see the per-company source field). btc_price is the BTC/USD price on as_of, and senior_claims_pct, cebe_sats, and cebe_mnav are computed at that price. A dated price is not stale data; it is the price at which the filing-anchored figures were anchored.

Live basis

btc_price_live is the current BTC/USD price (CoinGecko, timestamped by btc_price_live_as_of). The senior_claims_pct_live, cebe_sats_live, and cebe_mnav_live fields recompute the identical formula at that price, so fiat claims re-convert and the whole lens moves together. Live-basis fields are null when no live BTC price is available.

The formula

Senior claims and CEBE are computed the same way on either basis. btc_price_basis is btc_price on the snapshot basis and btc_price_live on the live basis.

claims    = max(0, (debt_usd + preferred_usd - cash_usd - strc_holdings_usd)
                / btc_price_basis
                + btc_claim_static) / btc_holdings        # capped to [0, 1]

cebe_sats = btc_holdings * (1 - claims) / basic_shares    # in satoshis

cebe_mnav = market_cap_usd / (btc_holdings * (1 - claims) * btc_price_basis)

senior_claims_pct is claims expressed as a percent, 0 to 100. The full measurement rules live on the methodology page.

Response shape

Top-level fieldMeaning
versionContract version. Currently 1.
as_ofISO timestamp when the response was generated.
licenseLicense line: free to use with attribution to cebetracker.io.
methodologyURL of the methodology page.
btc_price_liveCurrent BTC/USD price, or null when unavailable.
btc_price_live_as_ofTimestamp of the live price.
notesMachine-readable description of the bases, formula, and contract.
companiesArray of per-company objects, documented below.

Per-company field dictionary

FieldTypeMeaning
tickerstringCanonical ticker used across the site. Exchange aliases resolve to this key.
namestringCompany display name.
as_ofstringDate of the latest verified balance sheet snapshot (YYYY-MM-DD).
btc_holdingsnumberBTC held as of the snapshot date.
debt_usdnumber, nullDebt outstanding, USD.
preferred_usdnumber, nullPreferred stock outstanding at face, USD.
cash_usdnumber, nullCash and equivalents, USD. Nets against senior claims.
strc_holdings_usdnumber, nullSTRC preferred held as an asset, USD. Nets against senior claims.
btc_claim_staticnumberBTC-denominated senior claims for BTC-indexed issuers. Price independent.
basic_sharesnumberBasic common shares outstanding.
btc_pricenumberBTC/USD price the snapshot figures were anchored at.
btc_price_as_ofstringDate of btc_price. Equals as_of.
senior_claims_pctnumberShare of BTC holdings consumed by net senior claims at btc_price. Percent, 0 to 100.
cebe_satsintegerCommon Equity Bitcoin Exposure per share, in satoshis, snapshot basis.
stock_pricenumber, nullLast available trade or close in USD, from the same quote pipeline the site uses (Finnhub for US and OTC listings, Yahoo Finance for international venues, non-USD prices converted at fetched cross rates). Never a live tick.
stock_price_as_ofstring, nullTimestamp of the quote.
stock_price_sourcestring, nullWhich quote pipeline produced the price.
market_cap_usdnumber, nullstock_price times basic_shares.
cebe_mnavnumber, nullMarket cap over the USD value of common equity BTC at btc_price. Accretion threshold is 1.0.
senior_claims_pct_livenumber, nullSenior Claims % recomputed at btc_price_live.
cebe_sats_liveinteger, nullcebe_sats recomputed at btc_price_live.
cebe_mnav_livenumber, nullcebe_mnav recomputed at btc_price_live.
wrapper_annual_usdnumber, nullAnnual carry cost of the wrapper (interest plus preferred dividends), USD.
wrapper_annual_usd_verifiedboolean, nulltrue when the wrapper figure is filing-verified, false when estimated, null when no flag is recorded.
sourcestring, nullPrimary filing reference for the snapshot.

Stock-derived fields (stock_price, market_cap_usd, cebe_mnav and its live twin) are null when no dated quote is available. The feed withholds a quote rather than serving it on a wrong currency basis.

Caching and limits

Responses are CDN-cached for about five minutes (s-maxage=300, stale-while-revalidate=600). Behind the cache, requests are rate-limited to 100 per minute per IP; over-limit requests receive 429 with Retry-After: 60. Error responses are never cached. If upstream garbage rows were stripped server-side, the response carries an X-CEBE-Integrity header and caches for 60 seconds so a cleanup propagates fast.

Versioning contract

The v1 response shape is a published contract: additive changes only. Fields are never renamed or removed. New fields may appear at any time, so parse tolerantly.

License and attribution

The feed is free to use with attribution to cebetracker.io. Every figure traces to a primary filing; the per-company source field carries the reference. If you publish numbers from this feed, link back to cebetracker.io and note the basis (snapshot or live) and the as_of date alongside them, since every CEBE figure is a function of a dated BTC price.