๊ณต์ ๋ฌธ์: https://site.financialmodelingprep.com/developer/docs
Base URL: https://financialmodelingprep.com/stable
Query Parameter: apikey={FMP_API_KEY}
ํ๊ฒฝ๋ณ์:
FMP_API_KEY=
์ง์ฐ: 15๋ถ
๋ฐ์ดํฐ: ํ์คํ ๋ฆฌ์ปฌ OHLCV
GET /stable/historical-chart/{timeframe}?symbol={symbol}&apikey={key}
Timeframe ๋งคํ
| Siglens Timeframe | FMP Timeframe |
|---|---|
| 5Min | 5min |
| 15Min | 15min |
| 30Min | 30min |
| 1Hour | 1hour |
| 4Hour | 4hour |
Query Parameters
| ํ๋ผ๋ฏธํฐ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
| symbol | string | โ | ์ข ๋ชฉ ์ฌ๋ณผ (path๊ฐ ์๋ query param) |
| apikey | string | โ | FMP API ํค |
| from | string | - | YYYY-MM-DD ํ์ ์์์ผ |
| to | string | - | YYYY-MM-DD ํ์ ์ข ๋ฃ์ผ |
Request ์์
GET /stable/historical-chart/5min?symbol=AAPL&apikey={key}&from=2024-01-01&to=2024-01-15
Response
interface FmpBar {
date: string; // "2024-01-15 09:30:00" (UTC, timezone ์ ๋ณด ์์)
open: number;
high: number;
low: number;
close: number;
volume: number;
}
// ์๋ต: FmpBar[] (newest-first ์ ๋ ฌ โ ascending์ผ๋ก reverse ํ์)์ฃผ์์ฌํญ
- ์๋ต์ newest-first ์ ๋ ฌ โ
toReversed()ํ์ฌ ascending order ๋ฐํ dateํ๋๋ timezone ์ ๋ณด ์์ โ UTC๋ก ๊ฐ์ฃผ (+ ' UTC'ํ์ฑ)vwapํ๋ ์์beforeํ๋ผ๋ฏธํฐ โto์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ณํ (ISO string โ "YYYY-MM-DD")
GET /stable/historical-price-eod/full?symbol={symbol}&apikey={key}
Query Parameters
| ํ๋ผ๋ฏธํฐ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
| symbol | string | โ | ์ข ๋ชฉ ์ฌ๋ณผ |
| apikey | string | โ | FMP API ํค |
| from | string | - | YYYY-MM-DD ํ์ ์์์ผ |
| to | string | - | YYYY-MM-DD ํ์ ์ข ๋ฃ์ผ |
Request ์์
GET /stable/historical-price-eod/full?symbol=AAPL&apikey={key}&from=2023-01-01&to=2024-01-15
Response
interface FmpDailyBar {
date: string; // "2025-02-04" (YYYY-MM-DD)
open: number;
high: number;
low: number;
close: number;
volume: number;
}
// ์๋ต: FmpDailyBar[] (newest-first ์ ๋ ฌ โ ascending์ผ๋ก reverse ํ์)์ฃผ์์ฌํญ
- Daily ์ ์ฉ ์๋ํฌ์ธํธ โ intraday(
historical-chart) ์๋ ๋ณ๋ dateํ๋๋YYYY-MM-DDํ์ (์๊ฐ ์์)- ์๋ต์ newest-first ์ ๋ ฌ โ
toReversed()ํ์ฌ ascending order ๋ฐํ
GET /stable/quote?symbol={symbol}&apikey={key}
๋น์ผ ๊ฑฐ๋ ์ค ์ค์๊ฐ ์์ธ๋ฅผ ์กฐํ. EOD ์๋ํฌ์ธํธ๊ฐ ๋น์ผ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์๋ ์ฅ์ค์ ํธ์ถํ์ฌ ์ผ๋ด ๋ฐ์ดํฐ์ appendํ๋ค.
Query Parameters
| ํ๋ผ๋ฏธํฐ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
| symbol | string | โ | ์ข ๋ชฉ ์ฌ๋ณผ |
| apikey | string | โ | FMP API ํค |
Response
interface FmpQuote {
price: number; // ํ์ฌ๊ฐ (๋น์ผ bar์ close๋ก ์ฌ์ฉ)
open: number; // ๋น์ผ ์๊ฐ
dayHigh: number; // ๋น์ผ ๊ณ ๊ฐ
dayLow: number; // ๋น์ผ ์ ๊ฐ
volume: number; // ๋น์ผ ๊ฑฐ๋๋
timestamp: number; // Unix timestamp (์ด ๋จ์)
}
// ์๋ต: FmpQuote[] (๋ฐฐ์ด ํํ, ๋จ์ผ ์ฌ๋ณผ์ด๋ฏ๋ก [0]๋ง ์ฌ์ฉ)์ฃผ์์ฌํญ
- ์ฅ ๋ง๊ฐ ํ EOD ์๋ํฌ์ธํธ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๋น์ผ ๋ฐ์ดํฐ๊ฐ ์ค๋ณต๋ ์ ์์ผ๋ฏ๋ก, ๋ง์ง๋ง EOD ๋ด์ time๊ณผ ๋น๊ตํ์ฌ ์ค๋ณต ์ append ์๋ต
- ์คํจ(non-ok, ๋น ๋ฐฐ์ด, ๋คํธ์ํฌ ์ค๋ฅ) ์ EOD ๋ฐ์ดํฐ๋ง์ผ๋ก graceful degradation
# Market Data
FMP_API_KEY=
# AI
GEMINI_CHAT_API_KEY=
ANTHROPIC_CHAT_API_KEY=
OPENAI_CHAT_API_KEY=
GEMINI_CHAT_FREE_API_KEY=
TRANSLATE_API_KEY=
TRANSLATE_FREE_API_KEY=
TRANSLATE_MODEL=
# Cache
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
UPSTASH_REDIS_REST_READONLY_TOKEN=
# Database
DATABASE_URL=
# Authentication
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
KAKAO_REST_API_KEY=
KAKAO_CLIENT_SECRET=
OAUTH_REDIRECT_BASE_URL=
OAUTH_TOKEN_ENCRYPTION_KEY=
LLM_API_KEY_ENCRYPTION_KEY=
OAUTH_STATE_HMAC_SECRET=
CRON_SECRET=
# Email
RESEND_API_KEY=
EMAIL_FROM=
# Site
NEXT_PUBLIC_SITE_URL=
# AdSense
NEXT_PUBLIC_ADSENSE_PUBLISHER_ID=
NEXT_PUBLIC_ADSENSE_SLOT_PROGRESS=
NEXT_PUBLIC_ADSENSE_SLOT_PANEL_BOTTOM=
NEXT_PUBLIC_ADSENSE_ENABLED=false
# Package Registry
SIGLENS_GITHUB_TOKEN=
# Worker
WORKER_URL=
WORKER_SECRET=
# Debug
DEBUG_VERBOSE_LOGS=.env.local์ ์์ฑ. ์ ๋ ์ปค๋ฐํ์ง ์๋๋ค.
GET https://financialmodelingprep.com/stable/search-symbol?query={query}&limit=20&apikey={FMP_API_KEY}
GET https://financialmodelingprep.com/stable/search-name?query={query}&limit=20&apikey={FMP_API_KEY}
interface FmpSearchResult {
symbol: string;
name: string;
currency: string;
exchangeFullName: string;
exchange: string;
}FMP_API_KEY= # ํ์. ์์ผ๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ ๋น ๋ฐฐ์ด ๋ฐํ
ํ๊ตญ์ด ์ด๋ฆ ๋งคํ์ด ์๋ ์ข ๋ชฉ์ waitUntil์ผ๋ก ๋ฒ์ญ.
TRANSLATE_API_KEY= # ํ์. ์์ผ๋ฉด ๋ฒ์ญ ๋นํ์ฑํ
TRANSLATE_MODEL=gemini-2.5-flash # ๊ธฐ๋ณธ๊ฐ
Worker(/worker)๋ siglens-core์ submitAnalysis / submitBriefing / cancelAnalysisJob์ด ํธ์ถํ๋ ๋ด๋ถ ์๋น์ค์ด๋ค.
Headers
| ์ด๋ฆ | ํ์ | ์ค๋ช |
|---|---|---|
X-Worker-Secret |
โ | WORKER_SECRET env์ ์ผ์นํด์ผ ํ๋ค. |
X-AI-API-KEY |
์กฐ๊ฑด๋ถ | model์ด siglens ์ ๊ณต ๋ชจ๋ธ(์๋ ํ)์ด ์๋๋ฉด ํ์. siglens ์ ๊ณต ๋ชจ๋ธ์ด๋ฉด ๋ฌด์๋๊ณ ์ ๋ฃ ํค ์ฌ์ฉ. |
Body
interface AnalyzeRequest {
jobId: string;
prompt: string;
model: AIModel; // siglens-core์ TierModel โ ์๋ 11์ข
์ค ํ๋
}์ง์ ๋ชจ๋ธ ๋ฐ ํค ์ ์ฑ
| ๋ชจ๋ธ | Provider | siglens ์ ๊ณต (์ ๋ฃ ํค) |
|---|---|---|
gemini-2.5-flash |
Gemini | โ |
gemini-2.5-flash-lite |
Gemini | โ |
claude-haiku-4-5 |
Claude | โ |
gpt-5-mini |
ChatGPT | โ |
gemini-2.5-pro |
Gemini | โ user key |
gemini-3-flash-preview |
Gemini | โ user key |
gemini-3.1-pro-preview |
Gemini | โ user key |
claude-sonnet-4-6 |
Claude | โ user key |
claude-opus-4-7 |
Claude | โ user key |
gpt-5.4 |
ChatGPT | โ user key |
gpt-5.5 |
ChatGPT | โ user key |
siglens ์ ๊ณต ๋ชจ๋ธ์ siglens-core์ TIER_CONFIG.models.free์ ๋์ผํ๋ค. ๊ฐฑ์ ์ worker models.ts์ SIGLENS_PROVIDED_MODELS๋ ์๋ ๋๊ธฐํ๋๋ค.
Response
| ์ฝ๋ | Body |
|---|---|
| 200 | { status: 'done', jobId } |
| 400 | { error: '...' } โ model ๋๋ฝ/๋ฏธ์ง์ ๋๋ user key ๋๋ฝ |
| 401 | { error: 'Unauthorized' } |
| 500 | { status: 'error', jobId } |
์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ Upstash Redis์ job:{jobId}:status / job:{jobId}:result ํค๋ก ์ ์ฅ๋๋ฉฐ ํธ์ถ ์ธก์ pollAnalysisAction์ผ๋ก ์กฐํํ๋ค.
Headers: X-Worker-Secret๋ง ์ฌ์ฉ. user key ์์.
Body: { jobId, prompt }
Provider: AI_PROVIDER env์ ์ํด ๊ฒฐ์ (claude | gemini).
Model: BRIEFING_CLAUDE_MODEL ๋๋ BRIEFING_GEMINI_MODEL env๋ก ๊ฒฐ์ .
Headers: X-Worker-Secret๋ง ์ฌ์ฉ.
Body: { jobId }
์คํ ์ค์ธ job์ AbortController.abort()๋ฅผ ํธ์ถํ๋ค.