# SDK와 실행 예제

예제의 기본 REST 주소는 `https://api.btxpro.co.kr`입니다. 외부 WS 주소는 `wss://api-ws.btxpro.co.kr`이며, 현재 Go SDK는 운영 REST 주소에서 두 WS 경로를 자동으로 선택합니다.

## Go SDK

현재 SDK는 BTX 저장소의 `backend-base/sdk/btx` 패키지로 제공됩니다. 별도 공개 모듈로 배포된 상태는 아니므로 저장소 접근 권한이 필요하며, 사용할 backend-base 모듈 커밋을 고정해야 합니다.

```go
package main

import (
    "context"
    "log"
    "os"
    btx "git.svc.childlycorp.com/childlycorp/btx-main.git/backend-base/sdk/btx"
)

func main() {
    client, err := btx.NewClient(btx.Config{
        BaseURL: "https://api.btxpro.co.kr",
        APIKey: os.Getenv("BTX_API_KEY"),
        SecretKey: os.Getenv("BTX_SECRET_KEY"),
    })
    if err != nil { log.Fatal(err) }
    account, err := client.GetAccount(context.Background())
    if err != nil { log.Fatal(err) }
    log.Printf("account=%d", account.Data.AccountID)
}
```

SDK가 REST 요청과 개인 WS 연결에 timestamp·서명을 붙입니다. 별도 nonce 카운터를 운영하지 않습니다. 공개 조회만 사용할 때는 키를 생략할 수 있습니다.

| 기능 | 메서드 |
| --- | --- |
| 시스템·통화·마켓 | CheckHealth, GetReadiness, GetTime, ListCurrencies, ListMarkets, GetMarket |
| 시세 | GetTicker, ListTickers, GetOrderBook, ListTrades, ListCandles |
| 계정·지갑 | GetAccount, ListWallets, ListBalances |
| 주문·체결 | CreateOrder, GetOrder, ListOpenOrders, ListOrderHistory, CancelOrder, CancelOrders, ListFills |
| 공개 스트림 | StreamTickers |
| 개인 이벤트 | StreamUser |
| 양방향 개인 세션 | OpenUserStream → Snapshot, Events, CreateOrder, CancelOrder |

Feed API는 REST로 직접 호출합니다. 현재 Go SDK에는 Feed 전용 메서드가 없습니다.

## Node.js와 Python

아래 예제는 표준 라이브러리만 사용하며 기본 동작은 서명된 계정 조회입니다. Node.js 22.12 이상 또는 Python 3.9 이상을 사용하세요.

- [Node.js 서명·조회 예제](/api-docs/examples/signed-request.mjs)
- [Python 서명·조회 예제](/api-docs/examples/signed_request.py)

먼저 키 없이 서명 구현을 검증합니다.

```sh
node signed-request.mjs --self-test
python signed_request.py --self-test
```

비밀 관리 도구가 프로세스에 `BTX_API_KEY`, `BTX_SECRET_KEY`를 주입한 뒤 실행합니다.

```sh
node signed-request.mjs
python signed_request.py
```

로컬 서버를 사용할 때는 주소만 변경합니다.

```sh
node signed-request.mjs --base-url http://localhost:10005
python signed_request.py --base-url http://localhost:10005
```

다른 API에 적용하려면 메서드·경로·쿼리·실제 본문 바이트를 `signRequest` 또는 `sign_request`에 전달하고, 그 값으로 요청을 보냅니다. 두 예제는 운영 주문을 생성하거나 자동 재시도하지 않습니다.

## 개인 WS와 Go 세션

```go
session, err := client.OpenUserStream(ctx)
if err != nil { return err }
defer session.Close()

snapshot := session.Snapshot()
// snapshot을 반영한 뒤 session.Events()의 이벤트를 계속 소비합니다.
_ = snapshot
```

주문 전송은 [WS 명령](/api-docs/websocket/commands.md)을 확인하세요. `OpenUserStream`은 결과가 불명확한 주문을 자동으로 재전송하지 않습니다.

## 레퍼런스의 생성 예제

Scalar의 일반 HTTP 예제는 요청 형식을 보여줍니다. 개인 API는 그 요청에 BTX HMAC 서명을 추가해야 합니다. 문서 사이트는 키를 입력받지 않으며 요청 실행 버튼을 제공하지 않습니다. 위 SDK와 로컬 예제로 실제 요청을 검증합니다.
