This is a comprehensive wrapper around the Upbit exchange CLI for spot trading, balances, and withdrawals. It handles the full API surface including market data, order placement with multiple types (limit, market, best), Korean won deposits, and multi-chain withdrawals. The skill is bilingual and detects whether you're working in English or Korean, translating terminology accordingly. It walks you through IP allowlisting and API key setup when credentials are missing, which is table stakes for Upbit's stricter security model. One nice touch is the pre-flight check it runs before first orders on a new market to confirm minimums and fees. Requires your Upbit access and secret keys to do anything beyond public market data.
npx -y skills add starchild-ai-agent/official-skills --skill upbit --agent claude-codeInstalls into .claude/skills of the current project.
Use the upbit CLI binary for all Upbit REST API interactions.
When UPBIT_ACCESS_KEY / UPBIT_SECRET_KEY are not set, or an authenticated command returns 401:
In a single turn, do ALL of the following in this exact order:
bash("curl -s https://api.ipify.org") to get the outbound IP.<ip> with the real IP from step 1):Upbit only accepts API calls from IP addresses you explicitly allow. Add this IP:
<ip>
<ip>Enter your Access Key and Secret Key in the secure input card below.
Detect the user's language and respond accordingly:
references/glossary.md (e.g., 주문, 매수, 잔고, 체결, 호가)When explaining API fields or command output, always translate field names into the user's language using the glossary. For example, if the user asks in Korean, explain bid as "매수", ask as "매도", balance as "보유 잔고".
Load references/glossary.md when translating terminology or explaining response fields.
If upbit is not installed or credentials are not configured, load references/setup.md and follow the steps there.
Check if upbit is available:
upbit --version
Private endpoints require credentials. Configure via the CLI (recommended):
upbit config set
Credentials are saved to ~/.upbit/config and automatically used for all CLI commands.
Alternatively, set via environment variables:
export UPBIT_ACCESS_KEY=<your-access-key>
export UPBIT_SECRET_KEY=<your-secret-key>
Or pass inline per command:
upbit <resource> <command> --access-key <key> --secret-key <secret>
Private (require auth): accounts, api-keys, orders, withdraws, deposits, travel-rule, wallet-status
Public (no auth): tickers, orderbooks, trades, candles, trading-pairs
Before executing any write operation, show the full command and ask the user to type CONFIRM.
Write operations:
orders create, orders cancel, orders cancel-and-new, orders cancel-by-uuids, orders cancel-openwithdraws create-withdrawal, withdraws create-krw-withdrawal, withdraws cancel-withdrawaldeposits deposit-krw, deposits create-coin-addresstravel-rule verify-deposit-by-txid, travel-rule verify-deposit-by-uuidorders test-create is a dry-run — no CONFIRM needed.
market{QUOTE}-{BASE} — quote currency first, base asset second-), not slash (/)KRW, BTC, USDT{BASE}-{QUOTE} or {BASE}/{QUOTE} — Upbit reverses the conventional order used by most exchanges| Market | Meaning |
|---|---|
KRW-BTC | BTC priced in KRW; Upbit uses KRW-BTC, not BTC/KRW or BTC-KRW |
KRW-ETH | ETH priced in KRW |
KRW-XRP | XRP priced in KRW |
BTC-ETH | ETH priced in BTC |
USDT-XRP | XRP priced in USDT |
Each entry from accounts list:
| Field | Description |
|---|---|
currency | Asset code (e.g., KRW, BTC, ETH) |
balance | Available balance (not in any open order) |
locked | Balance currently locked in open orders or withdrawals |
avg_buy_price | Average purchase price (decimal string) |
unit_currency | Currency avg_buy_price is denominated in (e.g., KRW, BTC) |
Total holdings = balance + locked
ord_type)ord_type | Description | Required | Must NOT set |
|---|---|---|---|
limit | Limit order at specified price | price, volume | — |
price | Market buy — spend a fixed quote amount | price | volume |
market | Market sell — sell a fixed base amount | volume | price |
best | Best available price (see rules below) | see below | see below |
best order rules:
time_in_force must be ioc or fok (NOT post_only)side=bid (buy): requires price, must omit volumeside=ask (sell): requires volume, must omit pricepost_only + smp_type conflict: these two are mutually exclusive — do not set both.
side | Meaning |
|---|---|
bid | Buy |
ask | Sell |
| State | Meaning |
|---|---|
wait | Pending execution |
watch | Pending reservation (stop order) |
done | Fully executed |
cancel | Cancelled |
| Field | Description |
|---|---|
reserved_fee | Total fee reserved when order was placed |
paid_fee | Fee already charged (for partial fills) |
remaining_fee | reserved_fee - paid_fee |
locked | Amount locked for this order (quote currency for buys, base asset for sells) |
Before placing an order on an unfamiliar market, run orders retrieve-chance to confirm:
bid.min_total, ask.min_total)bid_types, ask_types)bid_fee, ask_fee, maker_bid_fee, maker_ask_fee)upbit orders retrieve-chance --market "KRW-BTC"
For assets available on multiple networks (e.g., USDT), net_type is required to specify the blockchain. Use withdraws list-coin-addresses to see supported networks and addresses before withdrawing:
upbit withdraws list-coin-addresses --currency "USDT"
Some assets require a secondary address (Destination Tag, Memo, etc.) in addition to the main address. Always check the registered address via withdraws list-coin-addresses to see if secondary_address is present before sending.
withdraw_address_not_registered)When withdraws create-withdrawal returns a 400 error with name: withdraw_address_not_registered, the address has not been registered in the Upbit Open API withdrawal allowlist.
To register a withdrawal address, visit the allowlist management page for your environment:
After registering, run withdraws list-coin-addresses to confirm the address appears before retrying.
| State | Meaning |
|---|---|
PROCESSING | In progress |
ACCEPTED | Completed |
CANCELLED | Cancelled |
REJECTED | Rejected |
TRAVEL_RULE_SUSPECTED | Awaiting Travel Rule verification |
REFUNDING | Refund in progress |
REFUNDED | Refund completed |
When a deposit is in TRAVEL_RULE_SUSPECTED state, use travel-rule commands to verify.
wallet-status list returns per-asset network status:
wallet_state | Meaning |
|---|---|
working | Both deposits and withdrawals available |
withdraw_only | Deposits suspended |
deposit_only | Withdrawals suspended |
paused | Both suspended |
unsupported | Not supported |
1, 3, 5, 10, 15, 30, 60, 240 onlycount: default 1, max 200 per requestcount: max 500 per requestcursor: pass sequential_id from last result to page forwarddays_ago: integer 1–7 (UTC-based day offset)| Field | Description |
|---|---|
trade_price | Current (last) price |
acc_trade_price_24h | 24-hour accumulated trade value |
acc_trade_volume_24h | 24-hour accumulated trade volume |
change | RISE, EVEN, or FALL vs. previous day close |
signed_change_price | Signed absolute change (negative if falling) |
highest_52_week_price / lowest_52_week_price | 52-week range |
change, ask_bid)change value | Meaning |
|---|---|
RISE | Price higher than previous close |
EVEN | Same as previous close |
FALL | Price lower than previous close |
ask_bid value | Meaning |
|---|---|
ASK | Trade initiated by a sell order |
BID | Trade initiated by a buy order |
| Value | Unit | Format |
|---|---|---|
volume | Base asset quantity | Decimal string (e.g., "0.01") |
price (limit) | Per-unit price in quote currency | Decimal string (e.g., "140000000") |
price (market buy) | Total quote amount to spend | Decimal string (e.g., "10000") |
| Fee fields | Quote currency amount | Decimal string |
timestamp | Milliseconds since epoch | Integer |
created_at / done_at | ISO 8601 with KST offset | String (e.g., 2024-01-01T09:00:00+09:00) |
trade_date | UTC date | String yyyyMMdd |
trade_time | UTC time | String HHmmss (24-hour) |
| Fee rates | Decimal (0.05% = "0.0005") | Decimal string |
Day boundaries (opening_price, acc_trade_price, etc.) are based on UTC 00:00, not KST.
When you need detailed flag information for a resource, read the corresponding reference file.
| Resource | Subcommands | Reference |
|---|---|---|
orders | create, test-create, retrieve, list-open, list-closed, list-by-uuids, cancel, cancel-and-new, cancel-by-uuids, cancel-open, retrieve-chance | references/orders.md |
tickers | list-by-quote-currencies, list-by-trading-pairs | references/tickers.md |
candles | list-minutes, list-days, list-weeks, list-months, list-years, list-seconds | references/candles.md |
orderbooks | list, list-instruments | references/orderbooks.md |
trades | list | references/trades.md |
trading-pairs | list | references/trading-pairs.md |
withdraws | retrieve, list, cancel-withdrawal, create-withdrawal, create-krw-withdrawal, list-coin-addresses, retrieve-chance | references/withdraws.md |
deposits | retrieve, list, create-coin-address, deposit-krw, list-coin-addresses, retrieve-chance, retrieve-coin-address | references/deposits.md |
travel-rule | list-vasps, verify-deposit-by-txid, verify-deposit-by-uuid | references/travel-rule.md |
accounts / api-keys / wallet-status | list | references/account.md |
| Output & Filtering | --format, --transform, GJSON, debug, auto-paging | references/output.md |
| Korean ↔ English Glossary | Term translations, field name Korean ↔ English mapping | references/glossary.md |
| CLI Setup & Credentials | Installation, environment selection, API key setup, config set | references/setup.md |
For flags not listed in reference files, run: upbit <resource> <command> --help
upbit accounts list # kr (default)
upbit accounts list --environment sg # sg | id | th
upbit accounts list --base-url <url> # custom base URL
sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot