Skip to content

Latest commit

ย 

History

History
338 lines (247 loc) ยท 7.74 KB

File metadata and controls

338 lines (247 loc) ยท 7.74 KB

API


FMP (Financial Modeling Prep) Market Data API

๊ณต์‹ ๋ฌธ์„œ: https://site.financialmodelingprep.com/developer/docs

Base URL: https://financialmodelingprep.com/stable

์ธ์ฆ

Query Parameter: apikey={FMP_API_KEY}

ํ™˜๊ฒฝ๋ณ€์ˆ˜:

FMP_API_KEY=

ํ”Œ๋žœ ์ œํ•œ (Free Tier)

์ง€์—ฐ:     15๋ถ„
๋ฐ์ดํ„ฐ:   ํžˆ์Šคํ† ๋ฆฌ์ปฌ OHLCV

FMP ์‚ฌ์šฉ ์—”๋“œํฌ์ธํŠธ

1. Historical Chart (Intraday: 5Min ~ 4Hour)

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")

2. Historical Price EOD Full (Daily: 1Day)

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 ๋ฐ˜ํ™˜

3. Quote (๋‹น์ผ ์‹ค์‹œ๊ฐ„ ์‹œ์„ธ)

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์— ์ž‘์„ฑ. ์ ˆ๋Œ€ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.


FMP (Financial Modeling Prep) API

ํ‹ฐ์ปค ์‹ฌ๋ณผ ๊ฒ€์ƒ‰

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=    # ํ•„์ˆ˜. ์—†์œผ๋ฉด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋นˆ ๋ฐฐ์—ด ๋ฐ˜ํ™˜

Gemini Translation API

ํ•œ๊ตญ์–ด ์ด๋ฆ„ ๋งคํ•‘์ด ์—†๋Š” ์ข…๋ชฉ์„ waitUntil์œผ๋กœ ๋ฒˆ์—ญ.

ํ™˜๊ฒฝ๋ณ€์ˆ˜

TRANSLATE_API_KEY=              # ํ•„์ˆ˜. ์—†์œผ๋ฉด ๋ฒˆ์—ญ ๋น„ํ™œ์„ฑํ™”
TRANSLATE_MODEL=gemini-2.5-flash  # ๊ธฐ๋ณธ๊ฐ’

Worker Internal API

Worker(/worker)๋Š” siglens-core์˜ submitAnalysis / submitBriefing / cancelAnalysisJob์ด ํ˜ธ์ถœํ•˜๋Š” ๋‚ด๋ถ€ ์„œ๋น„์Šค์ด๋‹ค.

POST /analyze

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์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.

POST /briefing

Headers: X-Worker-Secret๋งŒ ์‚ฌ์šฉ. user key ์—†์Œ. Body: { jobId, prompt } Provider: AI_PROVIDER env์— ์˜ํ•ด ๊ฒฐ์ • (claude | gemini). Model: BRIEFING_CLAUDE_MODEL ๋˜๋Š” BRIEFING_GEMINI_MODEL env๋กœ ๊ฒฐ์ •.

POST /cancel

Headers: X-Worker-Secret๋งŒ ์‚ฌ์šฉ. Body: { jobId } ์‹คํ–‰ ์ค‘์ธ job์˜ AbortController.abort()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.