# Hướng dẫn sử dụng API Python của Backpack Exchange

#### Điều Kiện Tiên Quyết

Lấy API keys của bạn nếu bạn sẽ sử dụng các account endpoints: \
<https://backpack.exchange/settings/api-keys>

Cài đặt các thư viện Python cần thiết:

* cryptography - dùng cho X-Signature (chỉ dành cho [account endpoints](https://docs.backpack.exchange/#tag/Account))
* requests - dùng để thực hiện các HTTP request (hoặc aiohttp nếu bạn ưu tiên async)

```
pip3 install cryptography requests 
```

Cài đặt dotenv-python để quản lý keys của bạn một cách an toàn bằng environment variables nếu bạn sẽ sử dụng [account endpoints](https://docs.backpack.exchange/#tag/Account)

```
pip3 install python-dotenv
```

Tạo file .env và lưu keys của bạn như sau:

```
PUBLIC_KEY=zDIJj9qneWIY0IYZ5aXoHcNMCm+XDhVcTssiT0HyY0A=
SECRET_KEY=4odxgSUxFrC/zsKWZF4OQwYAgnNu9hnWH3NxWfLAPz4=
```

Tạo file .gitignore và thêm .env để loại trừ file này khỏi version control.

```
.env
```

Đối với tất cả các ví dụ, chúng tôi sẽ sử dụng thư viện requests theo chế độ đồng bộ. Hãy import như sau:

```
import requests
```

#### Public endpoints&#x20;

Đối với public endpoints, chỉ cần gửi một GET request.

Không yêu cầu API keys.

**Ví dụ: Truy Cập Dữ Liệu Công Khai**

```
# https://docs.backpack.exchange/#tag/Markets/operation/get_open_interest
BASE_URL: str = "https://api.backpack.exchange/"  # base api url for all endpoints
symbol: str = "SOL_USDC_PERP" # let's specify the symbol
result_url: str = f"{BASE_URL}api/v1/openInterest?symbol={symbol}"  # add your argument as a query string. For GET requests you need only query string
```

```
from json import JSONDecodeError

response = requests.get(url=result_url) # make a get request
print(f"response status code: {response}")
if response.status_code == 200:
    # make your code safe in case you receive unexpected data
    try:
        print(f"response json: {response.json()}") 

        open_interest: str = response.json()[0]["openInterest"]
        print(f"open interest: {open_interest}")
    except JSONDecodeError:
        print(f"response text if response isn't json: {response.text}")
else:
    ...
```

\
**Lưu ý:** Nếu bạn có nhiều hơn một tham số, hãy nối chúng bằng ký hiệu &.

#### Private endpoints&#x20;

Đối với private endpoints, chúng ta cần tạo các headers cụ thể và request body (đối với POST requests). Việc này yêu cầu xác thực bằng API keys của bạn.

```
import base64  # for base64 encoding the signature
from time import time  # for timestamp generation
import os  # to access environment variables

from cryptography.hazmat.primitives.asymmetric import ed25519  # to create a private key for signing
# from dotenv import load_dotenv, find_dotenv  # to load environment variables from .env file
```

```
# In production code, use this approach:
# load_dotenv(find_dotenv())
# public_key: str = os.getenv("PUBLIC_KEY")
# secret_key: str = os.getenv("SECRET_KEY")

# For demonstration purposes only - don't hardcode keys in production
public_key: str = "5+yQgwU0ZdJ/9s+GXfuPFfo7yQQpl9CgvQedJXne30o="
secret_key: str = "TDSkv44jf/iD/QCKkyCdixO+p1sfLXxk+PZH7mW/ams="  

# Create private key from secret key
private_key = ed25519.Ed25519PrivateKey.from_private_bytes(
            base64.b64decode(secret_key)
        )
```

**Ví dụ: Lấy Địa Chỉ Nạp Tiền**&#x20;

Hãy xem cách lấy địa chỉ nạp tiền bằng API:\
<https://docs.backpack.exchange/#tag/Capital/operation/get_deposit_address>

```
# Generate timestamp and window parameters
timestamp = int(time() * 1e3)  # Unix time in milliseconds
window: str = "5000"  # Time window in milliseconds that the request is valid for
```

Bây giờ chúng ta đã có các thành phần xác thực sẵn sàng (`X-Timestamp`, `X-Window`, và `X-API-Key`), hãy tạo chữ ký.

```
# Define the instruction for this API call
instruction: str = "depositAddressQuery"
sign_str = f"instruction={instruction}"

# This endpoint requires the "blockchain" parameter
params: dict = {
    "blockchain": "Solana",
}

# Generate a valid query string from parameters
sorted_params_list = []
for key, value in sorted(params.items()):
    if isinstance(value, bool):  # boolean variables should be lowercase in query strings
        value = str(value).lower()
    sorted_params_list.append(f"{key}={value}")
sorted_params = "&".join(sorted_params_list)

# Combine all parts of the signature string
if sorted_params:
    sign_str += "&" + sorted_params
sign_str += f"&timestamp={timestamp}&window={window}" 

print(f"Signature string: {sign_str}")
```

**Ký Request**&#x20;

Bây giờ hãy ký request bằng private key của chúng ta:

```
# Sign the string with our private key
signature_bytes = private_key.sign(sign_str.encode())
encoded_signature = base64.b64encode(signature_bytes).decode()
print(f"Base64 encoded signature: {encoded_signature}")
```

**Tạo Headers**&#x20;

Tạo các headers cần thiết cho API request:

```
# Prepare the headers with all required authentication parameters
headers = {
    "X-API-Key": public_key,
    "X-Signature": encoded_signature,
    "X-Timestamp": str(timestamp),
    "X-Window": window,
    "Content-Type": "application/json; charset=utf-8",
}
```

**Gửi Request**&#x20;

Bây giờ chúng ta có thể gửi request đã xác thực đến API:

```
# Send the GET request with our authentication headers
url = "https://api.backpack.exchange/wapi/v1/capital/deposit/address"
response = requests.get(url=url, headers=headers, params=params)
print(response.json())
```

#### Sử Dụng POST Requests&#x20;

Đối với `POST` requests, bạn cần đưa JSON body vào và dùng phương thức `post()` thay vì `get()`.

**Ví dụ: Thực Thi Lệnh**&#x20;

Hãy xem cách gửi một lệnh đến matching engine để thực thi bằng API: <https://api.backpack.exchange/api/v1/order>

```
# Generate timestamp and window parameters
timestamp = int(time() * 1e3)  # Unix time in milliseconds
window = "5000"  # Time window in milliseconds that the request is valid for

# Define the instruction for this API call
instruction = "orderExecute"
sign_str = f"instruction={instruction}"

# Create the order request body
order_params = {
    "symbol": "SOL_USDC",       # Required: The market for the order
    "side": "Bid",              # Required: "Bid" (buy) or "Ask" (sell)
    "orderType": "Limit",       # Required: "Market" or "Limit"
    "price": "170.50",           # The order price (required for limit orders)
    "quantity": "1.0",          # The order quantity
    "timeInForce": "GTC",       # "GTC" (Good Till Cancelled), "IOC" (Immediate or Cancel), "FOK" (Fill or Kill)
    "clientId": 123456,         # Custom order ID (optional)
    "selfTradePrevention": "RejectTaker"  # Optional: "RejectTaker", "RejectMaker", "RejectBoth"
}

# Generate a valid query string from parameters
sorted_params_list = []
for key, value in sorted(order_params.items()):
    if isinstance(value, bool):  # boolean variables should be lowercase in query strings
        value = str(value).lower()
    sorted_params_list.append(f"{key}={value}")
sorted_params = "&".join(sorted_params_list)

# Combine all parts of the signature string
if sorted_params:
    sign_str += "&" + sorted_params
sign_str += f"&timestamp={timestamp}&window={window}" 

print(f"Signature string: {sign_str}")
```

```
# Sign the string with our private key
signature_bytes = private_key.sign(sign_str.encode())
encoded_signature = base64.b64encode(signature_bytes).decode()
print(f"Base64 encoded signature: {encoded_signature}")
```

```
# Prepare the headers with all required authentication parameters
headers = {
    "X-API-Key": public_key,
    "X-Signature": encoded_signature,
    "X-Timestamp": str(timestamp),
    "X-Window": window,
    "Content-Type": "application/json; charset=utf-8",
}
```

```
# Send the POST request with our authentication headers and order parameters
url = "https://api.backpack.exchange/api/v1/order"
response = requests.post(url=url, headers=headers, json=order_params)
print(f"Response status code: {response.status_code}")
try:
    print(f"Response JSON: {response.json()}")
except JSONDecodeError:
    print(f"Response text: {response.text}")
```

#### Nguồn

SDK giúp quá trình phát triển trở nên dễ dàng hơn.

Ví dụ SDK: <https://github.com/sndmndss/bpx-py>

Để biết thêm thông tin, hãy truy cập tài liệu chính thức: <https://docs.backpack.exchange/>
