BestFolio computes every strategy's monthly signal once, in one place. You can read it on the strategy page or in the monthly email, or hand it straight to the tools you already use. There are 3 ways to do that: a read-only API, a webhook that pushes each new signal to you, and an MCP connector that lets Claude or ChatGPT answer questions about your strategies and portfolios.
Why I built it
Generating a good signal is only half the job. The other half is executing it, month after month, without fumbling a trade or talking yourself out of it at the worst possible moment. In my experience, the trades are where people quietly give back the edge their backtest promised. A few members were rebuilding our strategies by hand in QuantConnect, which is tedious and easy to get subtly wrong. It is much cleaner to compute the signal once and let everything downstream read it. I kept the keys read-only on purpose, so a leaked one can never move your money.
The Signals API
One read-only endpoint returns a strategy variant's signal as JSON or CSV:
curl -H "X-API-Key: bf_live_..." \
"https://bestfolio.app/api/variants/1/signal/export?format=json&limit=6"
Here is one row as the API returns it, the HAA Standard signal dated 29 May 2026 that I used as the example when the API launched in June:
| Field | Value |
|---|---|
signal_date | 2026-05-29 |
regime | aggressive |
| IWM | 0.25 |
| QQQ | 0.25 |
| PDBC | 0.25 |
| VEA | 0.25 |
Each row carries the signal date, the regime and the target weight of every ETF. It is the same signal you see on the site and in the monthly email, in a shape a QuantConnect algorithm, an IBKR script or a spreadsheet can read. The same key reaches your own portfolios too. The OpenAPI spec lists every route if you want to generate a client.
| What you can read | Route | Scope |
|---|---|---|
| Every strategy with its current signal and the next-month preview | /api/strategies/summary | Catalog |
| One strategy: variants, metrics, signals | /api/strategies/slug/{slug} | Catalog |
| A variant's signal history, JSON or CSV | /api/variants/{id}/signal/export | Catalog |
| The processed and execution-ready allocation | /api/portfolios/{id}/processed-allocation, /rollup/execution | Your portfolios |
| Drift and an actionable trade list | /api/portfolios/{id}/drift, /trade-list | Your portfolios |
| The blended backtest and the walk-forward NAV | /api/portfolios/{id}/backtest, /wf-nav | Your portfolios |
The one thing to get right before you automate
Here is the catch, and it really matters once code places the trades. The API returns the active signal and, near the end of the month, a preview of the next one. The preview is recomputed every trading morning until its cutoff close, so it is not actionable yet.
So never just grab the most recent row: that is often the preview. The JSON response names both explicitly, with a top-level current_signal for the active allocation and next_signal for the preview, and every row carries its status, its effective date and the dates it is meant to be held. Act on the current signal, check its holding period, and treat anything marked provisional as information only. The API reference walks through it.
Webhooks: the signal comes to you
If you would rather not poll, add an HTTPS webhook in Settings. Each new signal is posted to it, and it works with ntfy, Pushover, Gotify, Slack, Discord or your own receiver. Every ticker in the payload says whether its weight increases or decreases, next to the buy or sell action.
Connect your AI assistant over MCP
BestFolio also runs a remote MCP server. Add https://bestfolio.app/mcp to Claude or ChatGPT as a custom connector and sign in with your BestFolio account when it asks. There is no key to paste: the connector is authorised against your account, and you can disconnect it at any time. Then ask about your strategies, signals and portfolios in plain language.
The server exposes 10 read-only tools. The catalog tools answer for any paid member; the portfolio tools only see portfolios that belong to your own account.
| Tool | What it returns | Scope |
|---|---|---|
list_strategies | The catalog with variant ids | Catalog |
get_strategy_detail | One strategy by slug: variants, metrics, signals | Catalog |
get_strategy_signal | A variant's current signal, the next-month preview and past months | Catalog |
get_portfolio_allocation | The processed ticker-to-weight allocation | Your portfolios |
get_portfolio_execution | The execution-ready allocation | Your portfolios |
get_portfolio_rollup | Net exposure analytics | Your portfolios |
get_portfolio_drift | Target-vs-actual drift, sleeve by sleeve | Your portfolios |
get_portfolio_trade_list | A buy, sell and hold list | Your portfolios |
get_portfolio_backtest | The blended backtest: NAV, returns, metrics, drawdown | Your portfolios |
get_portfolio_walkforward | The walk-forward NAV series and metrics | Your portfolios |
Claude does this in a couple of clicks. ChatGPT keeps custom connectors behind Developer mode, which needs a paid ChatGPT plan, and Business or Enterprise workspaces need an admin to allow it first. Terminal clients such as Claude Code can present an API key instead of signing in.
Getting started
The API, webhooks and the connector are part of the Pro plan. Generate a key yourself in Settings, under API Keys, then read the API reference. On the free plan, you can upgrade any time on the pricing page. And if you wire BestFolio into something clever, send me a link. I would genuinely love to see it.