공통 규칙

요청과 응답

  • Base URL: https://api.furstock.trade
  • 요청 바디는 application/json이에요. 이미지 업로드(상장 신청, 갤러리)만 multipart/form-data예요.
  • 응답은 항상 JSON이고, 필드명은 camelCase예요. 삭제 API 일부는 바디 없이 204를 돌려줘요.
  • 금액·가격은 전부 정수 “원”이에요. 퍼스톡 가상 화폐이고, 소수점은 없어요.
  • 시각은 ISO 8601 UTC 문자열이에요(예. 2026-09-24T03:00:00.000Z). 예외로 시세 스냅샷·체결의 ts는 epoch 밀리초, 캔들의 time은 epoch 초예요.
  • 종목 식별자(symbol)는 캐릭터 이름 그 자체예요. 영문 티커가 아니라 한글일 수도 있어요(예. 보팔래빗). 경로에 넣을 땐 URL 인코딩하세요(/v1/stocks/%EB%B3%B4%ED%8C%94%EB%9E%98%EB%B9%97). 1~20자이고 유니코드 문자·숫자와 기호 - . _ ~ ( )로만 이루어져요(공백·/·? 등은 없어요). ( )는 인코딩하지 않아도 되지만, encodeURIComponent로 통째로 인코딩해도 괜찮아요.
  • 모든 응답에 X-Request-Id 헤더가 있어요. 문의할 때 이 값을 알려주시면 빨리 찾을 수 있어요.

오류

오류 응답은 모두 같은 모양이에요.

{ "error": "not_found", "message": "사람이 읽는 설명(없을 수도 있음)" }
상태대표 error의미
400invalid_request파라미터·바디 형식 오류. issues에 상세가 붙기도 해요
401unauthorized, invalid_client토큰 없음·만료·무효, 폐기된 키
403forbidden권한 없음(예. 남의 종목에 뉴스 작성)
403session_requiredAPI 키로는 할 수 없는 작업(인증 참고)
404not_found대상 없음(없는 종목, 남의 주문 등)
409not_pending, duplicate_symbol, too_many_keys 등현재 상태와 충돌
429rate_limited요청 한도 초과
500internal_error서버 오류. reqId와 함께 문의해 주세요

주문 거부는 오류가 아니에요. 잔고 부족처럼 주문이 거부돼도 HTTP는 200이고, 응답 바디의 status: "rejected"와 rejectReason으로 알려줘요. 주문을 보세요.

요청 한도

대상한도
API 키로 받은 토큰의 모든 요청키당 초당 10회, 순간 최대 20회(토큰 버킷)
POST /oauth2/tokenclient_id당 분당 30회

한도를 넘으면 429와 Retry-After(초) 헤더가 와요. 그만큼 기다렸다 다시 보내세요. 정상 응답엔 X-RateLimit-Limit(초당 허용 횟수), X-RateLimit-Remaining(지금 남은 여유) 헤더가 붙어요.

여러 종목 시세를 자주 봐야 한다면 종목마다 폴링하지 말고 실시간 시세 WebSocket을 쓰세요. WebSocket 수신은 요청 한도에 포함되지 않아요.

멱등성 (주문 중복 방지)

POST /v1/orders는 clientToken(UUID)을 필수로 받아요.

  • 새 주문마다 새 UUID를 만드세요.
  • 타임아웃이나 네트워크 오류로 결과를 못 받았다면 같은 clientToken으로 다시 보내세요. 서버가 이미 처리한 주문이면 새로 체결하지 않고 처음 결과를 그대로 돌려줘요.

페이지네이션

목록 API는 대부분 고정 상한만 있어요(예. 커뮤니티 최신 200개). 예외:

API방식
GET /v1/orders커서. limit(최대 200) + before(이전 페이지 마지막 항목의 createdAt)
GET /v1/stocks/{symbol}/gallery페이지 번호. page(1부터), 응답의 totalCount, pageSize

CORS

모든 origin에서 호출할 수 있어요. 쿠키 없이 Authorization 헤더만 쓰는 구조라서 그래요. 단, 브라우저 코드에 client_secret을 넣으면 그대로 노출된다는 점에 주의하세요.

시장 규칙

API로 하는 거래도 웹과 똑같은 규칙을 따라요.

규칙값
가입 시 지급300,000원 (입출금 없음)
운영 시간24시간 연속. 휴장 없음
세션KST 00·03·06·09·12·15·18·21시마다 새 세션. 직전 종가가 새 시작가가 돼요
가격 제한폭세션 시작가 ±30% (최저가 500원)
서킷브레이커세션 시작가 대비 ±15% 움직이면 그 종목 5분 거래정지(방향별 세션당 1회)
수수료체결 금액의 0.15% (매수·매도 모두)
세금매도 체결 금액의 0.2%
체결 방식실제 주문장이 아닌 가격 곡선(본딩 커브) 모델. 사는 만큼 오르고 파는 만큼 내려요
지정가대기했다가 가격이 닿으면 전량 체결(부분체결 없음). 세션 정산 때 미체결분은 자동 취소
거래정지 종목tradingHalted: true인 종목은 주문이 거부돼요(admin_halted)
관리종목·숨김hidden: true면 검색·순위에서 빠지지만 거래는 돼요(관리자 지정·상장주 숨김 둘 다)