# 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/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://support.backpack.exchange/support-docs/vn/san-giao-dich/api-and-tai-lieu-danh-cho-nha-phat-trien/huong-dan-su-dung-api-python-cua-backpack-exchange.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
