XFINLAB
Financial market intelligence via MCP — market events, sentiment, technical indicators, and macro data tools for AI agents. Free tier available instantly.
Hosted MCP Server
npx add-mcp 'https://api.xfinlab.com/api/mcp'Installs into Claude Code, Codex, Cursor, VS Code and more
Documentation
Real market intelligence, structured for developers
20+ JSON endpoints — market events, FinBERT sentiment, multi-agent AI debate, company network intelligence, fundamentals, and cross-industry macro context (energy, agriculture, real estate, supply chain, consumer demand) — built on the same real data and anti-fabrication principles behind XFINLAB's own product. Free tier keys are issued instantly and automatically; Pro/Enterprise are still set up personally.
Quickstart
1
Get a free API key
Issued instantly and automatically, no waiting on a human. Request one below →
2
Make your first call
One endpoint, one header. Swap in your own key and ticker.
curl -H "X-API-Key: xfl_..." \ "https://api.xfinlab.com/api/intelligence/v1/sentiment?ticker=AAPL"
3
See a real result
Trimmed example — your actual response includes per-headline sentiment too.
{ "success": true, "data": { "ticker": "AAPL", "aggregate_sentiment": "neutral", "aggregate_score": 0.04, "headline_count": 8 } }
Prefer Python or Node? Same endpoint, one method call. See the official SDKs →
Try it live
Paste your API key, pick an endpoint, and see a real response — right here, no code required. Don't have one? Get a free key ↓
Response will appear here.
This runs directly from your browser against the live API. Your key is sent only to XFINLAB's API — never stored or logged by this page.
Nineteen endpoints, one API key
Every response is AI-structured JSON — never raw scraped article text. View OpenAPI spec → Download Postman collection →
Every authenticated response includes X-RateLimit-Limit and X-RateLimit-Remaining headers, so you can pace requests instead of guessing from a 429.
1x
GET /v1/events
Events
Recent market/company headlines by ticker or globally — title, source, publish time, and link. No fabricated summaries of articles we can't retain in full.
Response fields
data array — one entry per headline
title string
source string — publisher name (e.g. GlobeNewswire, PR Newswire, or a GDELT source label)
kind string — "company_announcement" or "market_news"
published_at string|null — ISO 8601, null if the source feed had no parseable date
url string
tickers string[] — batch mode only, which requested symbols this event matched
meta.count int
meta.ticker string|null — single-ticker or no-ticker mode
meta.tickers string[] — batch mode, replaces meta.ticker
`ticker` also accepts a comma-separated list, up to 10 symbols (e.g. "AAPL,MSFT,TSLA"), for watchlist-style queries — results are merged and deduplicated across all requested tickers. Quota weight scales with the number of tickers requested.
1x
GET /v1/sentiment
Sentiment
FinBERT-scored sentiment across a ticker's recent headlines — per-headline label/confidence plus an aggregate score. Honestly reports "unavailable" rather than guessing when the model is unreachable.
Response fields
data.ticker string
data.average_score number|null — 0-100 aggregate bullishness; absent when no headlines matched
data.results array — one entry per headline
headline string
label string — "positive" | "neutral" | "negative"
confidence_pct number
score number
meta.articles_analyzed int, meta.source "finbert"
When zero headlines are found, the shape shifts slightly: articles_analyzed moves into data (data.articles_analyzed) instead of meta, and average_score is omitted entirely — worth handling as its own case in your client code.
`ticker` also accepts a comma-separated list, up to 10 symbols. Batch requests return `data.results_by_ticker` (keyed by symbol) instead of the flat ticker/average_score/results shape above, since averaging sentiment across unrelated tickers would be a misleading number. Quota weight scales with the number of tickers requested.
5x
GET /v1/debate
AI Debate
A 4-call Bull / Bear / Risk-Manager / Arbiter debate grounded in real technical data for a ticker — synthesized into one verdict.
Response fields
data.available bool — always true on a 200 (a 503 is raised instead if the debate engine itself is unreachable)
data.arguments object|null — {bull, bear, risk_manager}, each a string; null if the debate failed partway through
data.verdict string|null
data.disclaimer string — present only when the debate completed fully
data.error string|null — set if a call failed mid-debate
meta.ticker string
8x
GET /v1/intel/latest · /v1/intel/{ticker}
AI Intelligence Feed
Original structured intelligence, not raw news: same-event headlines clustered, then enriched with entities, sentiment, real technical/historical-analog signals, a non-causal cross-asset co-movement read, and an AI-written narrative — every number traceable to a real computation, never a fabricated confidence score. The most compute-intensive endpoint.
Response fields
data array — one entry per event cluster, newest first
id, title string
summary string|null — AI-generated fact summary; null if that AI call failed
entities, affected_assets array<string> — extracted tickers
sentiment string|null — "bullish"|"bearish"|"neutral"; sentiment_confidence number|null
importance number — 0-100 heuristic; source_count int
impact_score, confidence, probability number|null — quant read-through, null while quant_pending is true
risk_level string|null — "high"|"medium"|"low"; time_horizon string|null
quant_pending bool
event_chain array|null — possible downstream-impact candidates with historical win-rate stats; per-candidate fields vary (some carry an error or note instead of stats)
quant_signals object — per_asset is dynamically keyed by ticker, each value's fields vary by what resolved; see a live response rather than a fixed list here
citations array — {title, link, source, published_at}
narrative string|null — AI-written summary paragraph; narrative_lang string
generated_at string — ISO 8601
meta.count int; meta.ticker string on the /intel/{ticker} variant only
The most dynamic response on this API — quant_signals and event_chain fields depend on what data resolved for each cluster. Everything null-able above is genuinely conditional, not a fixed schema you can assume is always fully populated.
3x
GET /v1/technical/{ticker}
Technical & Market Structure
Confluence direction/confidence, trend, MACD, volume, chart-pattern detection, and market structure (break-of-structure, change-of-character, liquidity sweeps, order flow, volume profile, institutional footprint) for any ticker — the same engine behind XFINLAB's own chart analysis.
Response fields
data.symbol, data.last_close, data.trend, data.rsi string|number|null
data.macd object — {macd_line, signal_line, histogram, trend}
data.support, data.resistance object|null — {level, touches}
data.indicators object — ema20/ema50/sma20/sma50/atr14, plus nullable sub-objects for bollinger, obv, vwap, supertrend, ichimoku, donchian, keltner
data.confluence object — {score (-100..100), direction, confidence, confidence_pct, signals_counted, bullish_signals[], bearish_signals[]}
data.decision_levels object|null — {bias, entry, stop_loss, take_profits[], risk_reward, risk_pct}; null if confluence has no clear directional bias
data.market_structure object|null — break-of-structure/change-of-character events, liquidity pools, order flow, volume profile, institutional footprint; null if there isn't enough swing data yet
data.patterns object — fixed set of chart-pattern keys, each "可能" (possible) or "不可能" (not present)
data.data_points, data.period, data.interval
Raw OHLC price bars are deliberately never included in this response — every price-derived field above is a computed result, not the underlying feed (see Data Sourcing below). String-valued fields (trend, confluence.direction, pattern labels, etc.) are localized based on the lang query param.
3x
POST /v1/stress-test
Monte Carlo Stress Test
A real historical-bootstrap simulation — resamples a symbol's own real daily returns thousands of times to report percentile ending values and drawdowns for a given horizon. Never an LLM-estimated number.
Response fields
data.available true
data.symbol, data.horizon_days, data.n_simulations, data.n_real_observations, data.starting_amount
data.ending_value_p5 / p25 / p50 / p75 / p95 number — percentile ending portfolio values
data.max_drawdown_p50_pct, data.max_drawdown_p5_pct number — negative values
data.method, data.note string — methodology disclosure, returned verbatim, never stripped
meta.symbol string
3x
GET /v1/regime-signal/{ticker}
Regime-Aware Signal
Current causal market regime for a ticker, plus whichever composed signal combo has historically performed best in that same regime — backed by real walk-forward-validated backtests, not a fabricated pick. Honestly reports "not enough data yet" for tickers not yet covered by the scheduled scan.
Response fields
data.current_regime object — {symbol, regime, as_of_date, note}
data.regime_used string — your regime query param if given, else current_regime.regime
data.available bool
data.best_candidate object — only when available is true: {label, trade_count, win_rate_pct, avg_return_pct}
data.runner_up_candidates array — up to 5, same shape as best_candidate, only when available is true
data.reason string — only present when available is false
data.caveats array<string> — present either way, different text
meta.ticker string
4x
GET /v1/forecast/{ticker}
Probabilistic Forecast
A Bear/Base/Bull price-path fan chart — the 10th/50th/90th percentile of a real historical-return bootstrap, day by day, not just a final value — plus an independently-validated ML up-probability cross-check and a capital-flow/liquidity regime reading. Never a fabricated fixed probability split.
Response fields
data.available true
data.symbol, data.horizon_days, data.last_close
data.bear_path / base_path / bull_path number[] — one value per horizon day, 10th/50th/90th percentile across simulations
data.band_note string — states what the percentiles mean (e.g. "80% of simulated outcomes fall between Bear and Bull") — always returned verbatim, never stripped
data.ml_cross_check object|null — {available, up_probability_pct, holdout_accuracy_pct, trained_at}; null when no validated model exists for this symbol yet
data.capital_flow_context object|null — {score, direction}; null until the background refresh job has populated it
data.method, data.disclaimer string
meta.ticker, meta.horizon_days
horizon_days accepts 1-60 (query param, default 5). This endpoint never fabricates a fixed bull/base/bear probability split — the returned band_note explains the honest statistical interpretation of the percentile band instead.
3x
GET /v1/insider/{ticker}
Insider Trading
SEC Form 4 insider-trading transactions, cross-indexed under the issuer's own EDGAR CIK — not just what the issuer itself filed. Non-derivative open-market activity from the most recent filings, with a buy/sell summary. 24h server-side cached.
Response fields
data.ticker, data.attribution string
data.transactions array — most recent filings, newest first
insider_name, officer_title string|null
is_director, is_officer, is_ten_percent_owner bool
transaction_date, transaction_code, transaction_label string
shares, price_per_share, shares_owned_after number|null — gifts/some grants have no price
acquired_disposed "A"|"D"
data.summary object — {buy_count, sell_count, net_shares, net_value_usd}; net_value_usd only sums rows with both a price and share count
meta.ticker string
Covers non-derivative (direct open-market stock) transactions only — not option/RSU activity, and not a complete trading history. Returns data:null with an error string for tickers not resolvable to a US EDGAR CIK.
2x
GET /v1/short-interest/{ticker}
Short Interest
FINRA's bi-weekly equity short-interest report — current/previous reported short shares, average daily volume, days-to-cover, and period-over-period change. From FINRA's genuinely free public flat file, not the member-firm-gated Query API.
Response fields
data.ticker, data.issue_name, data.attribution string
data.settlement_date string — ISO 8601, the biweekly reporting date this snapshot covers
data.current_short_shares, data.previous_short_shares, data.avg_daily_volume number
data.days_to_cover, data.change_pct number
meta.ticker string
A `data:null` response for a covered ticker is a real, honest "not currently shorted at reportable levels" result, not necessarily an error — check the accompanying error string to tell the two cases apart.
2x
GET /v1/energy/{ticker}
Energy Fundamentals
EIA physical-market context for energy-linked tickers — WTI crude spot, Henry Hub natural-gas spot, and Lower-48 working natural-gas storage. Only populated for tickers with a real crude/nat-gas linkage (currently USO, UNG).
Response fields
data.matched_ticker, data.attribution string
data.series object — dynamically keyed by EIA series (e.g. wti_crude_spot_usd_bbl), each value or null
label, unit, period string
value number
meta.ticker string
Returns data:null for any ticker without a real physical-market linkage — never a fabricated reading for an unrelated symbol. Coverage is USO (WTI crude) and UNG (Henry Hub + storage) today.
2x
GET /v1/exchange/{ticker}
Exchange Comparison
The same crypto ticker's live 24h stats from two real spot exchanges — Binance and Coinbase — side by side. Only populated for the tracked crypto tickers both venues cover.
Response fields
data.binance, data.coinbase object|null — either can independently be null on a venue-specific miss
ticker, last_price, price_change_pct_24h, high_24h, low_24h, volume_24h
binance_symbol string — Binance object only; coinbase_product_id string — Coinbase object only
quote_volume_24h number — Binance (real); quote_volume_24h_usd_est number + quote_volume_is_estimated: true — Coinbase (derived, not a real per-trade figure)
meta.ticker string
Both binance and coinbase are null together only when the ticker isn't tracked by either venue — the response never mixes a real reading from one exchange with a fabricated one from the other.
3x
GET /v1/fundamentals/{ticker}
Company Fundamentals
Latest annual (10-K) financial-statement facts straight from SEC XBRL — revenue, net income, diluted EPS, total assets/liabilities, operating cash flow. The first real fundamentals data in this API. 24h server-side cached.
Response fields
data.ticker, data.cik, data.attribution string
data.facts object — dynamically keyed (revenue, net_income, eps_diluted, total_assets, total_liabilities, operating_cash_flow), each present only if that concept had a usable 10-K value
label, unit, end_date, form string
value number
meta.ticker string
A missing concept key means that company has never reported that specific XBRL tag on a 10-K — never a fabricated zero or null placeholder mixed in with real figures.
1x
GET /v1/vix-term-structure
VIX Term Structure
CBOE VIX9D/VIX/VIX3M/VIX6M term structure, plus a contango/backwardation regime read. Not ticker-specific — one market-wide snapshot per call.
Response fields
data.attribution string
data.term_structure object — keyed vix9d/vix/vix3m/vix6m, each {label, date, close} or null
data.structure "contango"|"backwardation"|"flat"|null
data.vix3m_minus_vix number|null
Backwardation (near-term vol priced above medium-term) has historically coincided with market stress episodes — this is a regime read, not a price prediction.
2x
GET /v1/bank-health/{ticker}
Bank Health
FDIC Call Report health (ROA, ROE, assets, equity, net income) for a major bank holding company's lead insured subsidiary. Covers JPM, BAC, WFC, C, USB, PNC, TFC today.
Response fields
data.ticker, data.attribution string
data.bank object — {cert, bank_name, report_date, asset, equity, net_income, roa, roe}
meta.ticker string
Reflects the regulated lead bank subsidiary's own Call Report, not consolidated GAAP financials for the holding company's stock — use /v1/fundamentals for that.
2x
GET /v1/agriculture/{ticker}
Agriculture Prices
USDA price-received-by-farmers data for corn, wheat, and soybeans — pairs with CORN/WEAT/SOYB the same way /v1/energy pairs with USO/UNG.
Response fields
data.matched_ticker, data.attribution string
data.series object — one key, e.g. corn_price_received_usd_bu
label, unit, period string
value number
meta.ticker string
Returns data:null for any ticker without a real commodity linkage. Coverage is CORN, WEAT, SOYB today.
Pro
POST /v1/webhooks/subscribe · GET /v1/webhooks · DELETE /v1/webhooks/{id}
Webhooks (Push Notifications)
Get notified the moment a real event happens instead of polling. Three event types today: vix_regime_change (market-wide contango/backwardation flip), new_13d_filing (per-ticker, fires when a watched ticker's activist-filing count increases), and opportunity_radar_shift (market-wide, fires when an Opportunity Radar industry's net improving/worsening lean flips). All three are backed by daily scheduled refresh jobs, so delivery is same-day, never a fabricated "real-time" claim. Pro-tier only -- a free-tier key gets a 403.
Response fields
data.id number -- your new subscription's id, used to unsubscribe
GET /webhooks returns data.webhooks array -- every subscription on your own key, with fail_count / last_delivered_at / last_status_code
Delivered payload: {"event", "ticker", "data", "delivered_at"} POSTed to your URL
A subscription auto-deactivates after 5 consecutive delivery failures (check GET /webhooks for fail_count) -- re-subscribe once your endpoint is back up. Delivery is best-effort and fire-and-forget: a slow/dead receiver never blocks or retries indefinitely.
2x
GET /v1/real-estate/{ticker}
Real Estate
FRED US housing-market context -- 30-year fixed mortgage rate, Case-Shiller home price index, housing starts, existing home sales. Only populated for housing-linked tickers (homebuilders, REITs, a mortgage originator, housing-sector ETFs).
Response fields
data.matched_ticker, data.matched_name, data.attribution string
data.indicators object -- dynamically keyed (mortgage_rate_30y_pct, home_price_index, housing_starts_thousands, existing_home_sales_thousands), each value or null
label, unit, date string
value number
meta.ticker string
Returns data:null for any ticker without a real housing-market linkage -- never a fabricated reading for an unrelated symbol. Coverage: DHI, LEN, PHM, NVR, TOL, KBH, MTH, O, SPG, PLD, PSA, AVB, EQR, RKT, VNQ, XHB, ITB today.
2x
GET /v1/supply-chain/{ticker}
Supply Chain
FRED US manufacturing/supply-chain context -- inventory/sales ratio, manufacturing new orders, durable goods orders, industrial production, manufacturing employment. Only populated for freight/logistics-linked tickers (carriers, railroads, transportation ETFs).
Response fields
data.matched_ticker, data.matched_name, data.attribution string
data.indicators object -- dynamically keyed (inventory_sales_ratio, manufacturing_new_orders_musd, durable_goods_orders_musd, industrial_production_manufacturing_index, manufacturing_employment_thousands), each value or null
label, unit, date string
value number
meta.ticker string
Returns data:null for any ticker without a real freight/logistics linkage -- never a fabricated reading for an unrelated symbol. Coverage: FDX, UPS, XPO, JBHT, CHRW, ODFL, GXO, EXPD, CSX, UNP, NSC, IYT, XTN today.
2x
GET /v1/consumer-demand/{ticker}
Consumer Demand
FRED US consumer-spending context -- retail sales, personal consumption expenditures, durable goods consumption. Not Google Trends search-interest data -- no officially licensed, commercial-use-safe search-trends API exists; real spending data is the more reliable proxy. Only populated for consumer-spending-linked tickers (large retailers, e-commerce, consumer-discretionary ETFs).
Response fields
data.matched_ticker, data.matched_name, data.attribution string
data.indicators object -- dynamically keyed (retail_sales_total_musd, retail_sales_goods_only_musd, personal_consumption_expenditures_busd, durable_goods_consumption_busd), each value or null
label, unit, date string
value number
meta.ticker string
Returns data:null for any ticker without a real consumer-spending linkage -- never a fabricated reading for an unrelated symbol. Coverage: WMT, TGT, COST, HD, LOW, AMZN, BBY, TJX, ROST, XRT, XLY today.
6x
GET /v1/opportunity-radar
Opportunity Radar
Global (no ticker) snapshot across real estate, supply chain, consumer demand, energy and agriculture, plus a US macro backdrop -- each indicator's own real % change (latest vs. oldest of its trailing observations) and improving/worsening label. No fabricated cross-industry score: industries are never ranked or blended against each other.
Response fields
data.as_of, data.attribution, data.methodology_note string
data.macro_backdrop.indicators object -- fed_funds_rate_pct, unemployment_pct, yield_curve_10y2y_pct, jobless_claims_initial (direction-only, no improving label)
data.industries object -- real_estate, supply_chain, consumer_demand, energy, agriculture, each with label, indicators, indicators_available, improving_count, worsening_count, flat_count, summary string
each indicator: label, unit, latest_date, latest_value, compare_date, compare_value, pct_change, direction (up/down/flat), improving (true/false/null)
5 industries, each gated independently on its own data source's key (FRED_API_KEY for real estate/supply chain/consumer demand, EIA_API_KEY for energy, USDA_NASS_API_KEY for agriculture). An industry whose key isn't configured still appears with an empty indicators object and an honest "not configured" summary -- it never takes the rest of the response down, and never fabricates a placeholder reading.
3x
GET /v1/consumer-safety/{ticker}
Consumer Safety (openFDA)
FDA-regulated food/drug/device recall and food adverse-event (CAERS) context, trailing 12 months, via openFDA. No API key required on openFDA's own side. Only populated for tickers with a real brand/manufacturer keyword linkage.
Response fields
data.matched_ticker, data.matched_keywords array, data.attribution, data.lookback_days number
data.datasets object -- food_recalls, drug_recalls, device_recalls, food_adverse_events, each with count, recent array, fetch_error boolean
recall items: recall_number, date, status, classification, recalling_firm, product_description, reason_for_recall
adverse-event items: report_number, date, product_brand, reactions, outcomes
Per openFDA's own disclaimer: a report existing is not proof of causation, and this data should not be used to estimate incidence or risk. Returns data:null for any ticker without a real brand/manufacturer linkage.
2x
GET /v1/product-recalls/{ticker}
Product Recalls (CPSC)
CPSC general consumer product recall context (toys, appliances, furniture, electronics, tools), trailing 12 months. Broader scope than Consumer Safety's FDA-regulated categories. No API key required. Only populated for tickers with a real manufacturer keyword linkage.
Response fields
data.matched_ticker, data.matched_keywords array, data.attribution, data.lookback_days number, data.count number, data.fetch_error boolean
data.recent array -- recall_id, recall_number, date, title, product_name, manufacturer, hazard, remedy, url
CPSC's own live backend has shown intermittent reliability issues -- surfaced honestly as fetch_error:true in the response body, never a fabricated zero-recalls reading. Returns data:null for any ticker without a real manufacturer linkage.
Where the data comes from
Every source below is licensed for commercial redistribution — verified directly against each provider's own published terms, not assumed.
News & events
GDELT's global news monitoring (public-domain, 100+ languages, unlimited commercial use) plus official company press-release wires (GlobeNewswire, PR Newswire). No feed in this pipeline carries a personal/non-commercial-use restriction.
US price data
US-listed symbols: Alpaca Markets' licensed feed. Explicitly permits commercial redistribution — no unofficial scrapers in this path.
Taiwan & other markets
Taiwan-listed symbols: the Taiwan Stock Exchange's own official open-data API — fully licensed for commercial redistribution, same standard as the US feed. Hong Kong and other non-US, non-Taiwan symbols currently use a best-effort fallback source while we evaluate a licensed provider — disclosed here, not hidden. And regardless of source, no endpoint re-exports raw price bars: every price-derived field (trend, RSI, support/resistance, market structure) is a computed result, not the underlying feed.
Asia-Pacific coverage is a widely-reported gap for most developer-facing financial data APIs. XFINLAB's Taiwan feed is a real, officially licensed exchange connection — not a scraped or best-effort source pretending otherwise.
Official SDKs
Thin, zero-magic wrappers — one method per endpoint, the same JSON you'd get from a raw HTTP call. Not yet on PyPI/npm (no paying developers yet to justify that maintenance overhead) — install straight from the repo for now.
pip install "git+https://github.com/lnanology/Xfinlab.git#subdirectory=sdk/python"
from xfinlab_intelligence import XfinlabClient client = XfinlabClient(api_key="xfl_...") client.sentiment("AAPL")
npm install "github:lnanology/Xfinlab#path:sdk/js"
const { XfinlabClient } = require('xfinlab-intelligence'); const client = new XfinlabClient('xfl_...'); await client.sentiment('AAPL');
No SDK needed — every endpoint is plain JSON over HTTPS.
curl -H "X-API-Key: xfl_..." \ "https://api.xfinlab.com/api/intelligence/v1/sentiment?ticker=AAPL"
MCP Server — for AI agents & Claude
The same 7 endpoints above, exposed as Model Context Protocol tools — so an AI agent (Claude, or any MCP-compatible client) can call them directly instead of you writing the HTTP glue yourself.
Most MCP servers don't say anything about the quality of the data behind their tool calls. This one does, in public — see the live status of every underlying data source at xfinlab.com/trust.html.
Streamable HTTP endpoint: https://api.xfinlab.com/api/mcp
{ "mcpServers": { "xfinlab": { "url": "https://api.xfinlab.com/api/mcp", "headers": { "X-API-Key": "xfl_..." } } } }
Prefer raw JSON-RPC? A GET to the same URL returns a human-readable info page; every tool call is a single stateless POST — no session handshake beyond the standard MCP "initialize" method.
get_market_events
Recent market/company headlines, optionally filtered by ticker.
get_sentiment
FinBERT sentiment score for a ticker's recent headlines.
get_technical_analysis
Confluence direction, trend, MACD, volume, patterns and market-structure signals from real OHLC data.
get_intelligence_feed
AI-structured, clustered event intelligence with a narrative summary — never a directional trading signal or probability estimate.
get_global_market_map
Cross-region macro + news + sentiment snapshot across 10 regions (US, Europe, Japan, Korea, China, HK, Taiwan, SE Asia, Middle East, LatAm).
Auth and quota are identical to the REST API above — same X-API-Key, same free tier, same weighted daily limit. No separate free ride through MCP.
Changelog
What's shipped, chronologically. View as JSON →
Roadmap
What's next — nothing here is a promise of a ship date, just what's actually being considered. View as JSON →
Plans
Free is instant and automated. Pro/Enterprise are still set up personally — pricing below is what we're launching with, and may be adjusted based on feedback from the first real developers using it.
Free
$0
For evaluating the API and prototyping.
- ✓ 200 weighted calls / day
- ✓ Events + Sentiment endpoints
- ✕ AI Debate endpoint
- ✕ AI Intelligence Feed endpoint
- ✕ Priority support
Enterprise
Custom
For higher volume or dedicated needs.
- ✓ Unlimited calls
- ✓ All 4 endpoints, incl. AI Debate + AI Intelligence Feed
- ✓ White-label: clean JSON with no XFINLAB branding, plus fully unbranded embed widgets (badge removed)
- ✓ Dedicated support
- ✓ SLA on request
Every endpoint above returns plain JSON with no XFINLAB branding — safe to resell under your own product name. Pro/Enterprise keys can also re-skin the free embed widgets (colors, logo, co-brand or fully removed badge) — ask us to configure it once you have a key.
Get an API Key
Choose Free below and your key is emailed instantly — no waiting. Choose Pro or Enterprise and we'll follow up personally with pricing that fits.