Every financial data source your AI needs.
One connection.

Connect AI agents, research systems and applications to 90+ vendors, regulators and exchanges through one Python SDK, one REST API and one MCP endpoint. QuantJourney keeps provider provenance, dates, identifiers and request-level traceability attached to the data while maintaining the underlying connections.

  • 90+ sources · 641 routesfilings, prices, macro, derivatives, crypto — same envelope, same names
  • SDK · REST · MCPJupyter and pipelines, any HTTPS client, Claude / ChatGPT / Cursor
  • Three MCP toolsinstead of hundreds of schemas; discover routes when needed
  • Hosted or Privatemanaged service or deployment inside your own perimeter
  • 99.5% SLAmonthly uptime commitment, with service credits
  • Keys stay inside the gatewayvendor credentials are resolved server-side, not sent to the agent
90+sources & venues
641stable routes
99.5%uptime SLA, with credits
≤ 3 daysto ship a connector fix
4 hP1 response
v4.51current release · changelog ↗

Same question. Different evidence.

Give the same financial question to a generic AI and to an AI connected to QuantJourney. The language may look similar. The evidence underneath is not.

Question

How much short interest is there in NVDA?

Generic AI

Without connected financial data

Illustrative answer
“Short interest appears relatively low, suggesting limited bearish positioning.”

What you cannot verify

  • Which short-interest dataset?
  • Which observation / settlement date?
  • What denominator defines “low”?
  • Compared with float, institutional holdings, peers or history?
  • Is unavailable coverage being interpreted as zero?
  • Can the result be reproduced later?

An illustrative comparison, not a captured response from a specific AI model. Good language is not the same thing as good financial evidence.

AI + QuantJourney

Connected evidence

NVDA · saved example · not a live quote
Short interest
298.3M shares
Days to cover
2.14

Coverage is explicit. Missing coverage stays missing — it is not converted to zero.

Missing ≠ zero

If FINRA does not cover an instrument, return the coverage gap rather than 0 short interest.

Current ≠ comparable

A current short-interest observation and quarter-end 13F holdings do not automatically describe the same point in time.

Citation ≠ provenance

A link tells you where text came from. Financial provenance should also preserve the provider, method/route, relevant date and request trace.

What changes when AI has an evidence layer

DimensionGeneric AI without connected financial dataAI + QuantJourney
Data accessWeb/search/model context or manually connected sourcesFINRA, SEC, Cboe, BLS, exchanges and commercial providers through one gateway
TimeCan combine observations from different dates without making the distinction obviousObservation/reporting dates remain attached where supplied by the source
Missing dataCan infer across a missing value or ambiguous coverageMissing or unsupported coverage remains explicit
ProvenanceA citation may identify a webpageProvider + route + metadata + request_id
ReproducibilityThe answer can be difficult to recreate exactlyRe-run the same route and parameters; retain request-level traceability. Live data may change.
CoverageThe model may not know what a dataset excludesDataset/source boundaries can be preserved in the response
Multi-source workSeparate searches, APIs or toolsOne MCP endpoint and one route contract across 90+ sources

Are you asking your AI questions like these?

Real multi-source questions assembled through the same Gateway.

Prompt:Is AMD actually expensive here? Bull and bear case from the numbers — and tell me if anyone is betting against it.AnswerClose

1 domain · 3 vendors · 3 methods · fmp · eod · finra

Saved example · not a live response.

equity.ratios.get_pe_ratio_ttmequity.ratios.get_quarterly_revenue_growth_yoyequity.shorting.get_short_interest
Show the SDK calls
pe = d.equity.ratios.get_pe_ratio_ttm(symbol="AMD")
g  = d.equity.ratios.get_quarterly_revenue_growth_yoy(symbol="AMD")
si = d.equity.shorting.get_short_interest(symbol="AMD")
Answer

Bull: the saved semiconductor screen reports AMD revenue growth of 50.1% year over year. Bear: its trailing P/E is 142.1×, so the growth comes with a high earnings multiple. That multiple alone does not establish fair value; a fuller valuation needs forward earnings, margins and cash flow.

Who is betting against it? The same screen reports 41.7 million shares short, up 4.1%, with 2.49 days to cover. There is a measurable short position; these figures alone do not reveal the short sellers' thesis or establish that a squeeze is likely.

Saved example, not a live quote. These are the AMD observations already shown in the semiconductor screen: valuation from FMP, revenue growth from EOD and short interest from FINRA. That example also includes the peer comparison.

Prompt:How crowded is NVDA in 13F land, is the sell-side still raising targets, and is anyone short?AnswerClose

2 domains · 2 vendors · 4 routes · fmp · finra

Saved example · not a live response.

regulatory.ownership.get_institutional_holdersequity.estimates.get_price_target_summaryequity.market.get_quoteequity.shorting.get_short_interest
Show the SDK calls
h  = d.regulatory.ownership.get_institutional_holders(symbol="NVDA")
pt = d.equity.estimates.get_price_target_summary(symbol="NVDA")
q  = d.equity.market.get_quote(symbol="NVDA")
si = d.equity.shorting.get_short_interest(symbol="NVDA")

top10 = sum(x.sharesNumber for x in sorted(h.data, key=lambda x: -x.sharesNumber)[:10])
breadth = sum(1 for x in h.data if x.changeInSharesNumber > 0) / len(h.data)
Answer

Institutions hold 14.47bn shares and shorts hold 298M — a 48-to-1 long-to-short ratio with breadth on a knife edge at 51%. The vendor gave you the crowd; the regulator gave you the absence of a counterweight. You never touched an EDGAR parser.

Read with rung 03: a 48:1 long-to-short ratio on 51% breadth is the profile of a name that gaps on flow, not on fundamentals.

Q2 2026 filings, quarter-end price $200.09. One call returned 100 filers across 4,816 lines of JSON.

Institutional shares fmp14.47bnacross 100 filers
Top-10 concentration56.3%BlackRock alone 8.0%
Breadth51%51 added / 49 cut
Net share change+829M3 new, 0 sold out
Short interest finra298.3M2.1% of institutional holdings
Days to cover finra2.14on 139M average volume
Consensus target fmp$341.9522 targets, last 30 days
Implied upside+53.8%vs $222.27 spot
Prompt:Screen semis above $100bn. Who's cheapest relative to growth — and where are the shorts actually sitting?AnswerClose

1 domain · 3 vendors · 4 methods · fmp · eod · finra

Saved example · not a live response.

equity.reference.get_stock_screenerequity.ratios.get_pe_ratio_ttmequity.ratios.get_quarterly_revenue_growth_yoyequity.shorting.get_short_interest
Show the SDK calls
rows = d.equity.reference.get_stock_screener(
           industry="Semiconductors", marketCapMoreThan=100_000_000_000, limit=12)

for r in rows.data:
    pe = d.equity.ratios.get_pe_ratio_ttm(symbol=r.symbol)
    g  = d.equity.ratios.get_quarterly_revenue_growth_yoy(symbol=r.symbol)
    si = d.equity.shorting.get_short_interest(symbol=r.symbol)
    print(r.symbol, pe.data, g.data, si.data[0].days_to_cover)
Answer

The valuation ranking and the positioning ranking disagree, which is the whole point of joining them: Micron is the cheapest name on the fastest growth and the least shorted at 1.16 days to cover, while shorts grew 12.2% in a month on Intel — the only name in the group with no trailing earnings. One vendor ranked them; a regulator said who was actually leaning.

Positioning is the column that changes the trade. Cheap-and-unshorted (Micron) and expensive-and-shorted (AMD) are different setups, even when the valuation screen ranks them side by side.

NameMarket capP/E ttmRevenue y/yShort interest finraDays to cover finra
Micron · MU$1.15tn22.7×+345.7%29.7M · −1.0%1.16
NVIDIA · NVDA$5.38tn28.0×+105.9%298.3M · +4.3%2.14
Broadcom · AVGO$1.70tn44.4×+85.5%not in FINRA file—
TSMC · TSM$2.25tn28.5×+36.0%ADR — not covered—
AMD$0.91tn142.1×+50.1%41.7M · +4.1%2.49
Intel · INTC$0.55tnn/m+25.4%152.2M · +12.2%1.69

The screen itself is one vendor's job and we don't pretend otherwise — fmp returns the universe, the multiple and the market cap in three calls. The column FMP cannot produce is the last two: FINRA's consolidated short-interest file, published by the regulator on a settlement cycle. Blank cells are blank on purpose — ADRs and some issues are not in that file, and we would rather show the gap than invent a number.

Prompt:How big is stablecoin float now, what share of crypto is it, what does its collateral earn at the front end — and what is the perp carry paying?AnswerClose

2 domains · 4 vendors · 4 routes · defillama · coingecko · fmp · ccxt

Saved example · not a live response.

crypto.stablecoins.get_stablecoinscrypto.market.get_global_databenchmarks.treasury.get_treasury_ratescrypto.funding.get_funding_rate
Show the SDK calls
sc  = d.crypto.stablecoins.get_stablecoins()
glb = d.crypto.market.get_global_data()
ust = d.benchmarks.treasury.get_treasury_rates(start_date="2026-09-18", end_date="2026-09-18")
fr  = d.crypto.funding.get_funding_rate(symbol="BTC/USDT:USDT", exchange="binance")

float_usd = sum(s.circulating.peggedUSD for s in sc.data)
carry     = float_usd * ust.data.rates[0].month3 / 100
perp_apr  = fr.data.fundingRate * 3 * 365
Answer

A $311.9bn float sitting mostly in short-dated Treasuries earns roughly $12.9bn a year at a 4.14% three-month bill — which is why the front end and stablecoin supply are now the same trade seen from two sides. And with perp funding at 8.04%, the leveraged long pays almost double what the collateral earns. Four vendors: an on-chain analytics firm, a market aggregator, a rates source and an exchange connector. No equity data vendor sells any of this.

It also means the front end is now partly a crypto-demand market — a $30bn change in stablecoin float is a $30bn change in bill demand, visible through these same routes.

Total pegged float defillama$311.9bnacross 427 issuers
USDT defillama$183.3bnon 130 chains
USDC defillama$74.4bnon 157 chains
Share of crypto cap coingecko9.2%of $2.78tn total
3-month bill fmp4.14%18 Sep · +22bp in Sep
Implied annual carry~$12.9bnfloat × front-end yield
BTC perp funding ccxt+8.04%annualised, 8h basis
BTC dominance coingecko58.3%ETH 11.5%
Prompt:Classify the current volatility regime. Is the market cheap or complacent — and does anything else agree?AnswerClose

4 domains · 4 vendors · 6 methods · cboe · fmp · bls · polymarket

Saved example · not a live response.

macro.us.get_cpiderivatives.vol.get_vix_dataderivatives.vol.get_vvix_dataderivatives.vol.get_skew_index_databenchmarks.treasury.get_treasury_ratespredictions.markets.search_markets
Show the SDK calls
cpi = d.macro.us.get_cpi(start_date="2026-01-01", end_date="2026-08-31")
win  = dict(start_date="2026-08-18", end_date="2026-09-18")

vix  = d.derivatives.vol.get_vix_data(**win)
vvix = d.derivatives.vol.get_vvix_data(**win)
skew = d.derivatives.vol.get_skew_index_data(**win)
ust  = d.benchmarks.treasury.get_treasury_rates(start_date="2026-09-01", end_date="2026-09-18")
odds = d.predictions.markets.search_markets(query="Fed rate", limit=5)

ratio = float(vvix.data[-1].close) / float(vix.data[-1].close)
Answer

The regime is cheap spot vol with expensive tails. VIX and VVIX both sit below where August started, but SKEW is 3% above it and set its high on 11 September — after the VIX spike had passed. A VVIX/VIX ratio of 5.90 is the month's highest: convexity is bid even though the level is not. Put that beside a front end repricing 37bp and prediction markets flipping to a hike, and the classification writes itself — this is not calm, it is unhedged.

Practically: protection here is cheap on level and expensive on skew, so the efficient hedge is a spread rather than an outright put.

VIXVVIXSKEW

All three rebased to 100 at 18 August 2026, so they share one axis — three different scales never belong on two y-axes. Cboe publishes all three; the gateway returns them in the same shape.

VIX cboe14.816.5% below the Aug base
VVIX cboe87.45.9% below the Aug base
SKEW cboe148.13.1% above the Aug base
VVIX / VIX5.90the month's high ratio
SKEW peak154.511 Sep — after the VIX spike
2s10s fmp+25bpflattened 15bp in Sep
CPI y/y bls3.35%accelerating since March
Oct hike polymarket54.5%+17pt in a week

Why one gateway is faster and cheaper than multiple MCP servers.

1Every server you connect re-sends its full tool schema on every turn — you pay for hundreds of tools the agent never calls. The Gateway keeps three tools resident and fetches a route only when it is used.
per turn50-turn analysis5 analysts × 50/day × month Twenty MCP servers ~100k tokens re-sent every turn $0.30$15.00$1,500 / mo QuantJourney Gateway ~400 tokens resident · routes on demand $0.0012$0.06$6 / mo 250× less spent on overhead before any data is fetched
2One name per thing. With twenty servers the agent picks from twenty overlapping quote tools and often picks wrong; with one catalog there is nothing to mis-pick, so the retry loop and the tokens it burns disappear.
One question, start to answer · width = tokens processed Twenty servers load 641 schemas · 70–160k read Q wrong get_quote retry vendor call answer every turn starts by re-reading the schemas — the orange block repeats QuantJourney Gateway 3 tools · 400 read Q describe route vendor call answer ← the difference, every turn no retry — one name per thing, so there is nothing to confuse it with Retry shown once; in practice mis-selection recurs across a multi-step analysis. Vendor latency is identical in both rows.
3One connection to keep alive. Twenty servers means twenty auth schemes, rate limits and failure modes that you own; through the Gateway the fan-out to 90+ sources is ours, under one SLA — and vendor keys never reach the agent.
Your agent / code holds 1 key SDKRESTMCP QuantJourney Gateway policy · route · provider envelope · vendor keys fmp · market & fundamentalsfinra · short interestcboe · volatilityecb · fx referencefred / bls · macrocftc · positioningfdic · bank datapolymarket · odds… 90+ sources
4Retries, rate limits and vendor drift are handled once, server-side. Per-provider limiters, exponential backoff, provider fallback by priority and schema normalisation live in the Gateway — your code and your agent see one contract, one error shape and a request_id for every call. When a vendor renames a field, we ship the fix; you do not redeploy.
5Hosted or Private deployment — identical routes, SDK and MCP endpoint in both. Multi-tenant for whole teams: one API key per data source, held once inside the Gateway and shared by every analyst and agent, never copied per user. Private runs inside your own perimeter, so vendor calls and keys never leave your network.

We test the connectors so your agent doesn't discover the break

Every connector is exercised against the live vendor on a schedule. When a provider renames a field, changes a rate limit or rotates an auth scheme, it shows up in our monitoring — not in your production trace. Fixes ship inside three business days on Hosted, five on Private.

One SLA instead of twenty terms-of-service pages

99.5% monthly uptime with credits, P1 response in four business hours, a named contact on Private. Twenty separate MCP servers give you twenty best-effort endpoints and no-one to escalate to — and a community MCP server has no SLA at all.

Prompt injection can't reach what isn't there

Every key an agent can see is a key an injected instruction can try to exfiltrate. Ours are resolved inside the gateway per tenant. The model sees route names, parameters and data — never a secret, on either plan.

You ask by domain, not by vendor. That is the orchestration.

Every route is a dot-path — d.<domain>.<subdomain>.<route> — named after what you want, never after who sells it. The Gateway picks the provider by priority, falls back when one is down, normalises the shape and stamps meta.provider on every answer. So macro.us.get_cpi is BLS today and FRED if BLS is late — and your code never changes.

d.equity.shorting.get_short_interest→meta.provider: finra
d.equity.
marketpricingfundamentalsratiosestimatesshortingfactorscalendarinsidernewsotc
d.macro.
useuglobalseriesindicatorscalendarpositioningforecast
d.crypto.
marketpricingfundingonchainstablecoinsyieldsmicrostructureexchange
d.regulatory.
filingsownershipinsidersbanking
d.derivatives.
optionsfuturesvolpricing
d.fixedincome.
curvescalendarreference
d.fx.
ratesglobal
d.commodities.
energyagriculturepositioning
d.predictions.
marketseventsseries
d.sentiment.
fear_greedinsidersocial
d.index.
constituentspricingquotesreference
d.reference.
identifiersinstrumentsymbologymapping
d.social.
redditstocktwits
d.futures.
pricingreferencesnapshotmicrostructure
d.options.
referencemicrostructure
d.market.
referencesnapshot
d.benchmarks.
treasury
  • Provider by priorityeach route has an ordered provider list; the best available answers
  • Fallback when one is downa vendor outage or rate limit is absorbed server-side, not in your trace
  • Provenance on every answermeta.provider, request_id, routed_at — auditable, re-runnable; macro series keep their revision history, so a backtest can ask what was known on the day

Easy access from any tool you already use.

The same route names, envelope and provenance from a Python SDK, a REST API and an MCP endpoint — pick the one your team already works in.

Python SDKnotebooks · research · pipelines
from quantjourney.sdk import QuantJourneyAPI
d = QuantJourneyAPI.from_env().domains

q = d.equity.market.get_quote(
        symbol="AAPL")

q.data.price        # 336.13
q.meta.provider     # "fmp"
q.meta.request_id   # audit trail
REST APIapps · services · any language
POST /d/equity.market.get_quote
Authorization: Bearer $QJ_KEY
Content-Type: application/json

{ "symbol": "AAPL" }

# → { data,
#     meta{ provider, request_id },
#     warnings }
MCP endpointClaude · ChatGPT · any MCP client
# three tools. not six hundred.
api_domains_list_routes()
api_domains_describe_route(route)
api_domains_call(route, params)

# the agent discovers what it needs,
# when it needs it — and your vendor
# keys never enter its context.

MCP:Claude · Claude Code · ChatGPT · Codex · Perplexity · Cursor · Windsurf · VS Code Copilot · Gemini CLI · any MCP client

SDK / REST:Jupyter · Python pipelines · FastAPI · Node · mobile apps · Excel · BI tools · any HTTPS client

Simpler access, less code, faster answers.

“Apple's price, its trailing P/E and last quarter's revenue.” Three numbers, three vendors, three date conventions.

Without a gateway28 lines · 3 SDKs · 3 keys
# three vendors, three auth schemes, three shapes
import os, time, requests, fmpsdk
import yfinance as yf
from fredapi import Fred

FMP = os.environ["FMP_API_KEY"]
EOD = os.environ["EODHD_TOKEN"]

def norm(t):            # BRK.B / BRK-B / BRK/B
    return t.replace(".", "-").upper()

def retry(fn, n=3):
    for i in range(n):
        try:    return fn()
        except Exception:
            time.sleep(2 ** i)   # rate limit
    raise

q  = retry(lambda: fmpsdk.quote(FMP, norm("AAPL")))[0]
pe = q["pe"]                    # sometimes null
r  = retry(lambda: requests.get(
        "https://eodhd.com/api/fundamentals/AAPL.US",
        params={"api_token": EOD}, timeout=20)).json()
inc = r["Financials"]["Income_Statement"]["quarterly"]
k   = sorted(inc, reverse=True)[0]   # "2026-06-27"
rev = float(inc[k]["totalRevenue"])  # str, not float

# whose fiscal quarter is "2026-06-27"?
# FMP says pe=38.37, EOD says 38.9. Which one ships?
With the gateway3 lines · 1 key
from quantjourney.sdk import QuantJourneyAPI
d = QuantJourneyAPI.from_env().domains

q   = d.equity.market.get_quote(symbol="AAPL")
pe  = d.equity.ratios.get_pe_ratio_ttm(symbol="AAPL")
inc = d.equity.fundamentals.get_income_statement(
          symbol="AAPL", period="quarter", limit=4)

# q.meta.provider     -> "fmp"
# q.meta.request_id   -> audit trail, per call
# inc.data[0].period  -> "Q3", fiscalYear "2026"
# fiscal calendar, tickers and dates already normalised
# vendor key resolved server-side, never in the notebook
# provider pinned, or resolved by priority with fallback
# a vendor renames a field -> we ship the fix, not you

The left-hand code is representative, not a strawman: ticker normalisation, backoff, string-typed numbers and fiscal-calendar ambiguity are what actually consumes the week.

List of 90+ data sources and exchange venues.

72 source connectors plus exchange venues through CCXT. Of the source connectors, 51 need no data licence — source terms still apply. Commercial datasets need your own vendor account.

51included — no data licence needed
ECBBundesbankOECDIMFEurostatWorld BankBISBLSNY FedSNBRBABoCUS TreasuryOFRDBnomicsSEC EDGARSEC advisersSEC fails-to-deliverFINRACFTCFDICOpenFDAPolymarketKalshiManifoldDefiLlamaMorphoBlockscoutmempoolCoinGeckoDeribitCboeOFACGLEIFESMANasdaq TraderGDELTStockTwitsApeWisdomCNN Fear & GreedWikimediaFama-FrenchyfinancestooqmultplOpenSkyUSAspendingHouse disclosuresCATblockchainalternative
21with your own vendor key
FMPEODMassive (Polygon)TiingoTwelve DataDatabentoFinnhubFREDBEACensusEIAUSDAHUDEmberOpenFIGITradingEconomicsTipRanksQuiverRedditCongress.govSAM.govCCXT venues

A key is not always a paid plan — FRED, BEA, Census and several official sources issue them free. Paid vendors keep their own terms.

Need a source that isn't here? Standard catalog additions are reviewed within five business days; bespoke integrations are scoped separately.

The limits, before you ask.

We license software and maintain connectors — we do not sell market data. Vendor, exchange and dataset fees stay between you and the vendor.

We normalise the envelope, dates and identifiers — not every payload. Source-specific fields and semantics still apply.

Hosted allows 20 active connectors; Private has no cap.

QuantJourney API

Share product feedback

✓

Thank you.

Your note is now in the QuantJourney inbox.