인증

퍼스톡 OpenAPI는 OAuth 2.0 Client Credentials Grant를 씁니다. API 키(client_id + client_secret)로 1시간짜리 access token을 받고, 모든 요청의 Authorization 헤더에 실어 보내요.

[API 키 발급 (웹, 1회)] → [POST /oauth2/token] → access_token (1시간)
                                                    ↓
                               Authorization: Bearer <access_token>

API 키 발급

  1. 퍼스톡에 Google 계정으로 로그인해요.
  2. 프로필 → OpenAPI 탭에서 키 이름을 적고 새 키 발급을 눌러요.
  3. 화면에 나온 client_id(fsk_로 시작)와 client_secret(fss_로 시작)을 복사해요.
규칙내용
secret 노출발급 직후 한 번만 보여요. 서버엔 해시만 저장돼서 다시 볼 수 없어요. 잃어버렸으면 폐기하고 새로 발급하세요.
개수계정당 활성 키 최대 5개
범위키는 발급한 본인 계정만 조작해요. 다른 사람 계정을 대신 조작하는 방법은 없어요.

access token 받기

POST https://api.furstock.trade/oauth2/token

OAuth 2.0 표준대로 application/x-www-form-urlencoded로 보내요. application/json도 받습니다.

필드필수설명
grant_type✅항상 client_credentials
client_id✅발급받은 client_id
client_secret✅발급받은 client_secret
curl -s https://api.furstock.trade/oauth2/token 
  -d grant_type=client_credentials 
  -d client_id=$FURSTOCK_CLIENT_ID 
  -d client_secret=$FURSTOCK_CLIENT_SECRET

응답 200

{ "access_token": "eyJhbGciOiJIUzI1NiIs...", "token_type": "Bearer", "expires_in": 3600 }
상태error의미
400invalid_request필드 누락·형식 오류
401invalid_clientclient_id/secret이 틀렸거나 폐기된 키
429rate_limited같은 client_id로 분당 30회 초과

토큰에는 refresh token이 없어요. 만료(expires_in초) 몇 분 전에 같은 요청으로 새 토큰을 받으세요. 요청마다 토큰을 새로 받지는 마세요. 분당 30회 제한에 걸립니다.

API 호출

모든 요청에 헤더를 붙여요.

GET /v1/accounts/holdings HTTP/1.1
Host: api.furstock.trade
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

시세·종목·커뮤니티 조회처럼 공개된 API는 토큰 없이도 호출돼요. 각 API 표의 인증 열을 보세요.

토큰이 유효한지는 GET /v1/me로 확인할 수 있어요.

{ "userId": "8b6b74e7-2bf7-42ad-8cfc-534ed05708b8", "isAdmin": false, "authMethod": "api_key" }

키 폐기

프로필 → OpenAPI 탭에서 폐기를 누르면:

  • 그 키로 새 토큰을 받을 수 없어요(401 invalid_client).
  • 이미 받은 토큰도 즉시 막혀요. 폐기 후 요청은 401이에요. 드물게 최대 30초까지 늦어질 수 있어요.
  • 되살릴 수 없어요. 필요하면 새로 발급하세요.

API 키로 할 수 없는 것

키가 유출돼도 피해가 커지지 않도록, 다음은 퍼스톡 웹에 로그인한 상태에서만 할 수 있어요. API 키 토큰으로 호출하면 403 session_required가 와요.

작업이유
API 키 발급·목록·폐기 (/v1/api-keys)유출된 키로 새 키를 만들어 계속 쓰는 걸 막기 위해
회원 탈퇴 (POST /v1/accounts/withdraw)되돌릴 수 없는 작업이라서
관리자 권한관리자 계정의 키라도 API에선 일반 사용자로 취급돼요

보안 수칙

  • client_secret은 코드에 직접 쓰지 말고 환경변수나 비밀 저장소로 관리하세요. .env는 .gitignore에 넣으세요.
  • 브라우저에서 동작하는 커스텀 클라이언트라면 secret이 사용자에게 그대로 노출돼요. 본인만 쓰는 도구에만 쓰고, 공개 웹앱에 secret을 넣지 마세요.
  • 봇마다 키를 따로 발급하면 문제가 생긴 봇만 골라서 폐기할 수 있어요.