주가지수 API 레퍼런스
18개 지수의 지수 수준과 이력
개요
주가지수와 변동성 지수 18개의 지수 수준과 수준 이력입니다. 모든 요청에 Bearer 키가 필요하며 REST와 MCP는 하나의 크레딧 잔액을 함께 사용합니다.
id는 지수의 표준 코드입니다. SPX는 S&P 500, NDX는 Nasdaq-100, DJI는 Dow Jones Industrial Average를 뜻합니다. 대소문자는 구분하지 않습니다. 목록 경로는 모든 id를 이름, 지역, 통화와 함께 반환합니다.
지수의 일별 이력이 들어오면 가격에 전일 종가, 변동, 퍼센트 단위의 변동이 함께 담깁니다.
기본 URL: https:/. MCP 도구: indices, with one action 를 아래 각 라우트에 대응해 둡니다.
모든 계정에 제공되는 것
| 항목 | 모든 계정 |
|---|---|
| 최신 지수 수준 | 라이브 |
| 일일 바 | 전체 이력 |
| 1분봉 | 최근 12개월 |
| 지수 목록 | 포함 |
확인 요금 페이지에서 호출당 비용을 확인할 수 있습니다. 라우트에 별도 안내가 없으면 요청은 해당 API의 가격으로 청구됩니다.
- 이력은 보유하고 있는 시점부터 시작됩니다. S&P 500은 2023년 2월부터입니다.
- 변동성 지수(VIX, OVX, GVZ)는 금액이 아니므로 응답에 통화가 없습니다.
- market_session은 지수의 공시된 거래 시간에 따라 open 또는 closed가 됩니다. closed 지수는 마지막 수준으로 응답하며 stale이 아닙니다. open 지수는 수준이 15분을 넘으면 stale입니다.
- 일봉은 거래일 하루이며 00:00 UTC에 나타납니다. 오늘의 미완성 봉은 표시되지 않습니다.
- 봉에는 거래량이 없습니다. 1분봉은 12개월 동안 보관되며 요청 한 번으로 최대 5일까지 조회할 수 있습니다.
- 배치에는 최대 50개의 id를 담을 수 있으며 수준이 반환된 id마다 호출 1회로 계산됩니다. 알 수 없는 id는 errors에 나열되고 계산되지 않습니다.
엔드포인트
모든 경로는 GET이며, 키를 다음 헤더에 담아 보내야 합니다: Authorization: Bearer 헤더입니다. 예시는 응답의 형태를 보여 줄 뿐이며 실시간 데이터가 아닙니다.
가격을 제공하는 지수
GET /v1/indices
가격을 제공하는 모든 지수 시리즈를 id별로 이름, 단위와 함께 반환합니다. 자체 목록에서 읽으므로 모든 계정에서 사용할 수 있고 호출 1회로 계산됩니다.
MCP: 도구 indices, action list.
매개변수
이 라우트는 파라미터가 없습니다.
응답 필드
| 필드 | 유형 | 전송 | 의미 |
|---|---|---|---|
indices | 객체 목록 | 항상 | 가격을 제공하는 모든 지수를 id별로 반환합니다. |
indices[].id | 문자열 | 항상 | 지수 코드입니다. 예: SPX. |
indices[].name | 문자열 | 항상 | 지수의 이름입니다. |
indices[].region | us, uk, europe, global, asia 중 하나 | 항상 | 구성 종목이 거래되는 지역입니다. |
indices[].currency | 문자열 | 선택 | 지수가 표시되는 통화입니다. 금액이 아닌 변동성 지수에서는 생략됩니다. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/indices"{
"indices": [
{
"id": "SPX",
"name": "S&P 500",
"region": "us",
"currency": "USD"
},
{
"id": "VIX",
"name": "Cboe Volatility Index",
"region": "us"
}
]
}지수 시리즈 하나의 최신 가격
GET /v1/indices/{id}/price
최신 가격입니다. market_은 시리즈의 거래 시간에 따라 open 또는 closed가 됩니다. closed 시리즈는 최종 가격으로 응답하며, stale은 open 시리즈에 최근 15분 이내의 가격이 없을 때만 true입니다. previous_는 직전 거래일의 종가이고 change_는 퍼센트 단위입니다.
MCP: 도구 indices, action price.
매개변수
| 매개변수 | 위치 | 필수 | 유형 | 의미 |
|---|---|---|---|---|
id | 경로 | 예 | 문자열 | 지수 id입니다. 예: SPX, NDX, DJI. 대소문자는 구분하지 않습니다. |
응답 필드
| 필드 | 유형 | 전송 | 의미 |
|---|---|---|---|
id | 문자열 | 항상 | 지수 코드입니다. |
name | 문자열 | 항상 | 자체 심볼 목록에 있는 그대로의 이름입니다. |
currency | 문자열 | 선택 | 지수가 표시되는 통화입니다. 금액이 아닌 변동성 지수에서는 생략됩니다. |
price | 문자열 | 항상 | 지수의 마지막 수준입니다. |
previous_ | 문자열 | 선택 | 직전 거래일의 종가입니다. 알 수 없으면 생략됩니다. |
change | 문자열 | 선택 | price에서 previous_를 뺀 값입니다. |
change_ | 문자열 | 선택 | 퍼센트 단위의 변동입니다(1.5는 1.5%를 뜻합니다). change가 생략되면 함께 생략됩니다. |
market_ | open, closed 중 하나 | 항상 | 시리즈가 공시된 거래 시간에 거래되는 동안은 open, 그 외에는 closed입니다. closed 시리즈도 최종 가격으로 응답하며, 거래 시간 안에 있는 휴일은 open으로 표시되고 stale로 나타납니다. |
timestamp | 날짜·시간 | 항상 | 가격이 유효했던 시각(UTC, 초 단위). |
stale | 불리언 | 항상 | 시리즈가 open이고 가격이 15분을 넘었거나 갱신하지 못했으면 true입니다. closed 시리즈는 stale이 아닙니다. |
delayed | 항상 true | 선택 | 전송되지 않음: 모든 계정에서 가격은 실시간입니다. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/indices/SPX/price"{
"id": "SPX",
"name": "S&P 500",
"currency": "USD",
"price": "7696.46",
"previous_close": "7681.2",
"change": "15.26",
"change_percent": "0.2",
"market_session": "open",
"timestamp": "2026-10-29T18:38:00Z",
"stale": false
}최대 50개 지수 시리즈의 최신 가격
GET /v1/indices/prices
나열된 각 id의 최신 가격입니다. 가격이 반환된 id마다 호출 1회로 계산하며 한 번에 차감합니다. 조회에 성공한 id의 비용을 잔액으로 감당할 수 없으면 요청 전체가 402 insufficient_credits로 거부됩니다. 가격이 반환되지 않은 id는 errors에 (id로) 나열되며 비용이 들지 않습니다. 조회에 성공한 id가 하나도 없어도 응답은 200이며 prices가 비어 있습니다. previous_는 직전 거래일의 종가이고 change_는 퍼센트 단위입니다.
최대 50개의 ID를 보낼 수 있습니다. 배치는 한 번에 과금됩니다. 확인된 ID의 비용을 잔액으로 감당할 수 없으면 전체 요청이 402 insufficient_credits를 반환합니다.
MCP: 도구 indices, action prices.
매개변수
| 매개변수 | 위치 | 필수 | 유형 | 의미 |
|---|---|---|---|---|
ids | 쿼리 | 예 | 문자열 | 쉼표로 구분한 id이며 중복을 제거한 뒤 최대 50개입니다. 각 id는 단건 가격 경로와 같은 규칙을 따릅니다. 가격이 반환된 id마다 호출 1회로 계산됩니다. |
응답 필드
| 필드 | 유형 | 전송 | 의미 |
|---|---|---|---|
prices | 객체 목록 | 항상 | 확인된 ID별 시세 하나씩. |
prices[].id | 문자열 | 항상 | 지수 코드입니다. |
prices[].name | 문자열 | 항상 | 자체 심볼 목록에 있는 그대로의 이름입니다. |
prices[].currency | 문자열 | 선택 | 지수가 표시되는 통화입니다. 금액이 아닌 변동성 지수에서는 생략됩니다. |
prices[].price | 문자열 | 항상 | 지수의 마지막 수준입니다. |
prices[].previous_ | 문자열 | 선택 | 직전 거래일의 종가입니다. 알 수 없으면 생략됩니다. |
prices[].change | 문자열 | 선택 | price에서 previous_를 뺀 값입니다. |
prices[].change_ | 문자열 | 선택 | 퍼센트 단위의 변동입니다(1.5는 1.5%를 뜻합니다). change가 생략되면 함께 생략됩니다. |
prices[].market_ | open, closed 중 하나 | 항상 | 시리즈가 공시된 거래 시간에 거래되는 동안은 open, 그 외에는 closed입니다. closed 시리즈도 최종 가격으로 응답하며, 거래 시간 안에 있는 휴일은 open으로 표시되고 stale로 나타납니다. |
prices[].timestamp | 날짜·시간 | 항상 | 가격이 유효했던 시각(UTC, 초 단위). |
prices[].stale | 불리언 | 항상 | 시리즈가 open이고 가격이 15분을 넘었거나 갱신하지 못했으면 true입니다. closed 시리즈는 stale이 아닙니다. |
prices[].delayed | 항상 true | 선택 | 전송되지 않음: 모든 계정에서 가격은 실시간입니다. |
errors | 객체 목록 | 항상 | 시세를 반환하지 않은 ID. 과금되지 않습니다. |
errors[].id | 문자열 | 항상 | 요청한 그대로의 ID. |
errors[].code | 항상 "not_found" | 항상 | not_found: 해당하는 시리즈가 없습니다. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/indices/prices?ids=SPX,NDX,DJI"{
"prices": [
{
"id": "SPX",
"name": "S&P 500",
"currency": "USD",
"price": "7696.46",
"previous_close": "7681.2",
"change": "15.26",
"change_percent": "0.2",
"market_session": "open",
"timestamp": "2026-10-29T18:38:00Z",
"stale": false
},
{
"id": "NDX",
"name": "Nasdaq-100",
"currency": "USD",
"price": "27310.5",
"previous_close": "27264.9",
"change": "45.6",
"change_percent": "0.17",
"market_session": "open",
"timestamp": "2026-10-29T18:38:00Z",
"stale": false
}
],
"errors": [
{
"id": "XX",
"code": "not_found"
}
]
}지수 시리즈 하나의 가격 봉
GET /v1/indices/{id}/bars
일봉(1d, 거래일당 봉 1개) 또는 1분봉(1m)을 오래된 순으로 반환합니다. 하루치 봉은 그날 이후 00:00 UTC에 나오며 오늘의 미완성 봉은 표시되지 않습니다. 1분봉은 12개월 동안 보관됩니다. 이력은 모든 계정에 전체 기간이 제공됩니다. 한 페이지에 최대 5,000개의 봉이 담기며 next_가 함께 반환됩니다. 페이지당 호출 1회입니다.
MCP: 도구 indices, action bars.
매개변수
| 매개변수 | 위치 | 필수 | 유형 | 의미 |
|---|---|---|---|---|
id | 경로 | 예 | 문자열 | 지수 id입니다. 예: SPX, NDX, DJI. 대소문자는 구분하지 않습니다. |
interval | 쿼리 | 아니요 | 다음 중 하나: 1d, 1m | 1d(거래일당 봉 1개이며 해당 거래일 날짜로 표시) 또는 1m(1분봉이며 12개월 동안 보관). 그 외의 값은 400 invalid_interval입니다. |
start | 쿼리 | 아니요 | 문자열 | 첫 봉. 1d: 날짜(YYYY-MM-DD), 해당 일 포함, 생략하면 가장 오래된 봉. 1m: UTC 시각(YYYY-MM-DDTHH:MM:SSZ, 또는 00:00 UTC를 뜻하는 날짜), 포함, 생략하면 end의 하루 전. |
end | 쿼리 | 아니요 | 문자열 | 마지막 봉입니다. 1d는 날짜이며 해당 날짜를 포함하고, 생략하면 마감된 가장 최근 날을 뜻합니다. 1m은 UTC 시각이며 해당 시각을 포함하지 않고, 생략하면 현재 시각 또는 start로부터 5일 뒤를 뜻합니다. 1m은 start와 end의 간격이 최대 5일입니다(400 range_too_large). |
cursor | 쿼리 | 아니요 | 문자열 | 이전 페이지의 next_이며 파라미터는 동일하게 보내야 합니다. |
응답 필드
| 필드 | 유형 | 전송 | 의미 |
|---|---|---|---|
id | 문자열 | 항상 | |
currency | 문자열 | 선택 | 지수가 표시되는 통화입니다. 금액이 아닌 변동성 지수에서는 생략됩니다. |
start | 문자열 | 선택 | 전송되지 않음: start는 이동되지 않습니다. |
end | 문자열 | 선택 | 전송되지 않음: 일봉은 잘리지 않습니다. |
bars | 객체 목록 | 항상 | 한 페이지에 최대 5,000개의 봉. |
bars[].timestamp | 날짜·시간 | 항상 | 봉 기간의 시작 시각(UTC)입니다. 일봉은 해당 거래일의 00:00, 1분봉은 해당 분입니다. |
bars[].open | 문자열 | 항상 | 해당 기간의 첫 가격입니다. |
bars[].high | 문자열 | 항상 | 해당 기간의 최고가입니다. |
bars[].low | 문자열 | 항상 | 해당 기간의 최저가입니다. |
bars[].close | 문자열 | 항상 | 해당 기간의 마지막 가격입니다. |
next_ | 문자열 | 항상 | 다음 페이지를 읽으려면 이 값을 다시 전달합니다. 마지막 페이지에서는 null입니다. |
curl -H "Authorization: Bearer $NARWHAL_API_KEY" \
"https://api.narwhalapi.com/v1/indices/SPX/bars?interval=1d&start=2026-10-01"{
"id": "SPX",
"currency": "USD",
"bars": [
{
"timestamp": "2026-10-28T00:00:00Z",
"open": "7655.1",
"high": "7702.4",
"low": "7640.8",
"close": "7681.2"
}
],
"next_cursor": null
}오류
오류는 공통 문제 형식을 사용하며, 다음 필드를 포함합니다: request_. 확인 API 오류 코드와 크레딧 형식과 크레딧 헤더에 대한 설명이 있습니다. 실패한 요청에는 요금이 부과되지 않습니다.
| 코드 | 상태 | 의미 |
|---|---|---|
invalid_ | 400 | 매개변수가 없거나, 알 수 없거나, 중복되었거나, 범위를 벗어났습니다. |
invalid_ | 400 | id 또는 페어가 이 API에서 요구하는 형식과 다릅니다. |
too_ | 400 | 배치에 50개를 넘는 id가 들어 있습니다. |
invalid_ | 400 | interval이 1d 또는 1m이 아니거나, 이 상품에서는 사용할 수 없습니다. |
range_ | 400 | 기간이 이 경로에서 허용하는 길이를 넘었습니다. |
not_ | 404 | 해당하는 종목, 펀드 또는 페어가 없습니다. |
invalid_ | 400 | 이 요청이 반환한 커서가 아니거나, 다른 요청의 커서입니다. |
insufficient_ | 402 | 크레딧 잔액이 요청 비용보다 적습니다. |
area_ | 503 | 이 영역은 지금 응답할 수 없습니다. |
이 페이지가 도움이 되었나요?