| Plan | Price | Credits/min | Credits/day | Best For |
|---|---|---|---|---|
| Basic | Free | 8 | 800 | Development/testing |
| Grow | $79/mo | 55+ | ~5,500 | N/A (personal use only) |
| Pro | $229/mo | 610+ | ~61,000 | Production (commercial OK for US equities) |
| Ultra | $999/mo | 2,584+ | ~258,400 | High-volume production |
| Enterprise | $1,999/mo | 10,000+ | ~1,000,000 | Full-scale commercial |
| Endpoint | Credits | Min Plan |
|---|---|---|
/time_series |
1/symbol | Basic |
/quote |
1/symbol | Basic |
/price |
1/symbol | Basic |
/symbol_search |
1/request | Basic |
/profile |
10/symbol | Grow |
/statistics |
10/symbol | Grow |
/insider_transactions |
200/symbol | Pro |
/institutional_holders |
1500/symbol | Ultra |
/mutual_funds/world/sustainability |
200/request | Ultra |
WebSocket /quotes/price |
1 WS credit/symbol | Grow |
Current Implementation:
GET https://query2.finance.yahoo.com/v8/finance/chart/{symbol}?interval={interval}&range={range}GET https://fastquote.fidelity.com/service/marketdata/historical/chart/jsonTwelve Data Replacement:
GET https://api.twelvedata.com/time_series?symbol={symbol}&interval={interval}&outputsize={outputsize}Interval Mapping:
| Current (Yahoo) | Twelve Data | Notes |
|---|---|---|
1d |
1day |
|
1h |
1h |
|
30m |
30min |
|
15m |
15min |
|
5m |
5min |
|
1m |
1min |
|
1wk |
1week |
|
1mo |
1month |
Range → outputsize Mapping:
| Current (Yahoo range) | Twelve Data approach |
|---|---|
1d |
outputsize=1 with intraday interval |
5d |
outputsize=5 with 1day or use start_date/end_date |
1mo |
outputsize=22 with 1day |
3mo |
outputsize=66 with 1day |
6mo |
outputsize=132 with 1day |
1y |
outputsize=252 with 1day |
2y |
outputsize=504 with 1day |
5y |
outputsize=1260 with 1day |
ytd |
Use start_date=YYYY-01-01 |
max |
outputsize=5000 (max) |
Response Format Differences:
chart.result[0].indicators.quote[0].{open,high,low,close,volume} + chart.result[0].timestampvalues[].{datetime,open,high,low,close,volume} (array of objects, newest first)meta.{symbol,interval,currency,exchange,type}Files Affected:
src/robinhood_options_mobile/functions/src/market-data.ts — getMarketData() function (primary target)src/robinhood_options_mobile/lib/services/yahoo_service.dart — getMarketIndexHistoricals(), getHistoricals()src/robinhood_options_mobile/lib/services/fidelity_service.dart — getInstrumentHistoricals() (delegates to Yahoo)Consumers (server-side via getMarketData):
agentic-trading.ts, agentic-trading-cron.ts, agentic-trading-intraday-cron.tsmacro-agent.tsbacktesting.tsalpha-factor-discovery.tscustom-alerts-cron.ts, watchlist-alerts-cron.tspaper-trading-cron.tsrebalancing-cron.tsalpha-agent.tsriskguard-agent.tsCurrent Implementation:
GET https://query2.finance.yahoo.com/v7/finance/quote?symbols={symbols}GET https://fastquote.fidelity.com/service/quote/json?productid=embeddedquotes&symbols={symbols}Twelve Data Replacement (REST):
GET https://api.twelvedata.com/quote?symbol={symbol}Twelve Data Replacement (WebSocket for real-time streaming):
wss://ws.twelvedata.com/v1/quotes/priceTwelve Data Lightweight Alternative:
GET https://api.twelvedata.com/price?symbol={symbol}Files Affected:
src/robinhood_options_mobile/functions/src/market-data.ts — getQuotes() functionsrc/robinhood_options_mobile/functions/src/riskguard-agent.ts — getSymbolInfo() (uses /v7/finance/quote for sector/beta/PE)src/robinhood_options_mobile/lib/services/yahoo_service.dart — getQuote(), getQuotesByIds(), getInstruments(), getFundamentals()src/robinhood_options_mobile/lib/services/fidelity_service.dart — getQuotesFromFidelity(), getQuoteByIds()Current Implementation:
GET https://query2.finance.yahoo.com/v7/finance/options/{symbol}Twelve Data Replacement: NONE
Twelve Data does NOT have an options chain endpoint. This is the biggest gap in the migration.
Recommended Alternatives:
Files Affected:
src/robinhood_options_mobile/functions/src/options-flow-utils.ts — fetchYahooOptions() (entire options flow feature)src/robinhood_options_mobile/lib/services/yahoo_service.dart — getOptionChain()Features Impacted:
Current Implementation:
GET https://query2.finance.yahoo.com/v1/finance/search?q={query}Twelve Data Replacement:
GET https://api.twelvedata.com/symbol_search?symbol={query}Differences:
quotes[].{symbol, longname, shortname, typeDisp, exchDisp, quoteType}data[].{symbol, instrument_name, exchange, mic_code, country, type}type values: Common Stock, ETF, Index, etc.Files Affected:
src/robinhood_options_mobile/lib/services/yahoo_service.dart — search()Current Implementation:
GET https://query2.finance.yahoo.com/v10/finance/quoteSummary/{symbol}?modules=assetProfileTwelve Data Replacement:
GET https://api.twelvedata.com/profile?symbol={symbol}Additional Fundamentals:
GET https://api.twelvedata.com/statistics?symbol={symbol}percent_held_by_insiders, percent_held_by_institutions (lightweight alternative to full institutional holders)Files Affected:
src/robinhood_options_mobile/functions/src/options-flow-utils.ts — fetchYahooQuoteSummary() (sector lookup)src/robinhood_options_mobile/lib/services/yahoo_service.dart — getAssetProfile()Current Implementation:
GET https://query2.finance.yahoo.com/v1/finance/screener/predefined/saved?scrIds={screenerId}Twelve Data Replacement: NONE
Twelve Data does not have a stock screener API.
Recommended Alternatives:
/stocks list endpoint + /quote batch callsFiles Affected:
src/robinhood_options_mobile/lib/services/yahoo_service.dart — getStockScreener(), getMovers()Current Implementation:
GET https://query2.finance.yahoo.com/v10/finance/quoteSummary/{symbol}?modules=insiderTransactionsTwelve Data Replacement:
GET https://api.twelvedata.com/insider_transactions?symbol={symbol}Files Affected:
src/robinhood_options_mobile/lib/services/yahoo_service.dart — getInsiderTransactions()Current Implementation:
GET https://query2.finance.yahoo.com/v10/finance/quoteSummary/{symbol}?modules=institutionOwnership,majorHoldersBreakdownTwelve Data Replacement:
GET https://api.twelvedata.com/institutional_holders?symbol={symbol}Cost-Effective Alternative:
/statistics endpoint (10 credits, Grow plan) which includes percent_held_by_insiders and percent_held_by_institutionsFiles Affected:
src/robinhood_options_mobile/lib/services/yahoo_service.dart — getInstitutionalOwnership()Current Implementation:
GET https://query2.finance.yahoo.com/v10/finance/quoteSummary/{symbol}?modules=esgScoresTwelve Data Replacement:
GET https://api.twelvedata.com/mutual_funds/world/sustainabilityRecommended Alternatives:
Files Affected:
src/robinhood_options_mobile/lib/services/yahoo_service.dart — getESGScores()Current Implementation:
GET https://cdn.cboe.com/data/us/options/market_statistics/daily/{date}_daily_optionsMigration: None required. CBOE is a free public endpoint and is independent of Yahoo/Fidelity.
Files Affected:
src/robinhood_options_mobile/functions/src/market-data.ts — fetchFromCBOE()Current Implementation:
GET https://query2.finance.yahoo.com/v1/test/getcrumb (with cookie from fc.yahoo.com or finance.yahoo.com)Twelve Data Replacement:
?apikey={your_api_key}Files Affected:
src/robinhood_options_mobile/functions/src/options-flow-utils.ts — fetchCrumb()src/robinhood_options_mobile/lib/services/yahoo_service.dart — _fetchCrumb(), getJson()| Functional Group | Yahoo Endpoint | Twelve Data Endpoint | Credits | Plan | Status |
|---|---|---|---|---|---|
| Historical OHLCV | /v8/finance/chart |
/time_series |
1 | Basic | ✅ Direct replacement |
| Real-Time Quotes | /v7/finance/quote |
/quote or /price |
1 | Basic | ✅ Direct replacement |
| Real-Time Streaming | N/A | WebSocket /quotes/price |
1 WS | Grow | ✅ Upgrade |
| Options Chains | /v7/finance/options |
— | — | — | ❌ Not available |
| Symbol Search | /v1/finance/search |
/symbol_search |
1 | Basic | ✅ Direct replacement |
| Company Profile | /v10/.../assetProfile |
/profile |
10 | Grow | ✅ Direct replacement |
| Statistics | /v7/finance/quote (partial) |
/statistics |
10 | Grow | ✅ Direct replacement |
| Stock Screeners | /v1/.../screener |
— | — | — | ❌ Not available |
| Insider Transactions | /v10/.../insiderTransactions |
/insider_transactions |
200 | Pro | ✅ Direct replacement |
| Institutional Holders | /v10/.../institutionOwnership |
/institutional_holders |
1500 | Ultra | ⚠️ Very expensive |
| ESG Scores | /v10/.../esgScores |
/mutual_funds/.../sustainability |
200 | Ultra | ⚠️ Mutual funds only |
| Put/Call Ratios | CBOE (free) | Keep CBOE | 0 | — | ✅ No change |
| Auth/Session | Crumb + Cookie | API Key param | 0 | — | ✅ Simpler |
| Feature | Frequency | Symbols | Credits/Run | Daily Credits |
|---|---|---|---|---|
| Agentic Trading Cron | 1x/day (4PM) | ~50 | 50 | 50 |
| Agentic Intraday Cron | Every 15min (market hours) | ~50 | 50 | 1,400 |
| Macro Agent | 1x/day | ~10 | 10 | 10 |
| Options Flow Cron | Every 15min | ~100 | 100 | 2,800 |
| Custom Alerts Cron | Every 5min | ~200 | 200 | 11,200 |
| Watchlist Alerts Cron | Hourly (market hours) | ~100 | 100 | 700 |
| Rebalancing Cron | 1x/day | ~30 | 30 | 30 |
| Paper Trading Cron | 1x/day | ~20 | 20 | 20 |
| Alpha Agent | On-demand | ~20 | 20 | ~100 |
| RiskGuard Agent | On-demand | ~5 | 5 | ~50 |
| Server Total | ~16,360 |
| Feature | Frequency | Credits/User/Day | Est. Users | Daily Credits |
|---|---|---|---|---|
| Home Widget (quotes) | App open | ~10 | 100 | 1,000 |
| Instrument Detail | Per view | ~5 | 100 | 500 |
| Search | Per query | 1 | 100 | 100 |
| Portfolio Analytics | Per view | ~20 | 50 | 1,000 |
| Insider Activity | Per view | 200 | 20 | 4,000 |
| Client Total | ~6,600 |
Target: market-data.ts → getMarketData()
Effort: 1-2 days
Steps:
Target: market-data.ts → getQuotes(), riskguard-agent.ts → getSymbolInfo()
Effort: 1-2 days
Steps:
getQuotes() with Twelve Data /quote endpointgetSymbolInfo() in riskguard-agent to use Twelve Data /quote or /profileTarget: yahoo_service.dart, fidelity_service.dart
Effort: 3-5 days
Steps:
twelve_data_service.dart implementing the same interfacegetHistoricals(), getMarketIndexHistoricals() → /time_seriesgetQuote(), getQuotesByIds() → /quotesearch() → /symbol_searchgetAssetProfile() → /profilegetInsiderTransactions() → /insider_transactionsgetInstitutionalOwnership() → /statistics (summary only) or keep Yahoo for detailed listfidelity_service.dart to use new Twelve Data service instead of Yahoo as fallbackEffort: 1-2 days
Steps:
| Feature | Reason | Recommendation |
|---|---|---|
| Options Chains | Twelve Data has no options API | Keep Yahoo (server-side) or switch to Tradier |
| ESG Scores | Twelve Data only covers mutual funds | Keep Yahoo |
| Stock Screeners | Twelve Data has no screener API | Keep Yahoo or build custom |
| Institutional Holders (detailed) | 1500 credits/symbol on Ultra plan | Use /statistics for summary, keep Yahoo for detail |
| Risk | Impact | Mitigation |
|---|---|---|
| Twelve Data rate limits | Cron jobs fail | Existing Firestore cache layer absorbs most load; keep Yahoo/Fidelity as fallbacks |
| Credit budget exceeded | API calls rejected | Monitor usage; upgrade plan if needed; optimize with /price instead of /quote where possible |
| Options chain gap | Options flow feature breaks | Keep Yahoo for options or add Tradier as dedicated options provider |
| Response format differences | Data parsing errors | Transform Twelve Data responses to Yahoo-compatible format in adapter layer |
| Commercial licensing issues | App store rejection | Confirm with Twelve Data sales before launch; Pro plan should cover US equities |