Перед початком
Ласкаво просимо у офіційну документацію WestWallet API.
Change docs language: UA EN DE RU
Авторизируйтесь, щоб отримати API-ключ у налаштуваннях профілю.
Готові бібліотеки для мов програмування: Python JavaScript Golang PHP
Авторизація
import json
import hashlib
import hmac
import time
import requests
# Get transaction info
api_key = "your_public_key"
secret_key = "your_private_key"
data = {"id": 435}
timestamp = int(time.time())
if data:
dumped = json.dumps(data, ensure_ascii=False)
else:
dumped = ""
sign = hmac.new(secret_key.encode('utf-8'),
"{}{}".format(timestamp, dumped)
.encode('utf-8'), hashlib.sha256).hexdigest()
headers = {
"Content-Type": "application/json",
"X-API-KEY": api_key,
"X-ACCESS-SIGN": sign,
"X-ACCESS-TIMESTAMP": str(timestamp)
}
resp = requests.post("https://api.westwallet.io/wallet/transaction",
data=json.dumps(data),
headers=headers)
print(resp.json())
WestWallet API очікує отримати у заголовках кожного вашого запиту X-API-KEY
, X-ACCESS-SIGN
и X-ACCESS-TIMESTAMP
.
X-API-KEY
- ваш публічний ключ;
X-ACCESS-TIMESTAMP
- часова мітка (використовуйте unix timestamp);
X-ACCESS-SIGN
- HMAC-sha256-підпис тіла запиту (що складається з рядку,
що містить мітку часу і JSON-уявлення даних тіла запиту),
підписана вашим приватним ключем. Для GET запитів аналогічно необхідно
сформувати JSON-уявлення query-параметрів.
Продивіться приклад, як сформувати рядок для генерації підпису у вкладці прикладів коду на python
Гаманець
Дані про валюти
GET https://api.westwallet.io/wallet/currencies_data
Запит для отримання списку доступних валют і їхніх обмежень.
- name - назва валюти
- address_regex - регулярний вираз, що використовується для валідації адреси перед створенням транзакції відправки
- require_dest_tag - чи потребує валюта вказувати тег призначення
- tickers - список допустимих тікерів валюти для передачі в запитах
- min_receive - мінімальний депозит
- min_withdraw - мінімальна сума виводу
- max_withdraw_per_transaction - максимальна сума виводу за одну транзакцію
- max_withdraw_transactions_per_day - максимальна кількість відправок на день
HTTP запит
GET /wallet/currencies_data
[
{
"name": "Bitcoin",
"address_regex": "^([13][a-km-zA-HJ-NP-Z1-9]{25,34})|^(bc1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]{39}|[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{59}))$",
"require_dest_tag": false,
"tickers": [
"BTC",
],
"min_receive": 0.0005,
"min_withdraw": 0.0001,
"max_withdraw_per_transaction": 5,
"max_withdraw_transactions_per_day": 1000000
},
{
"name": "USDT TRC-20",
"address_regex": "^[T][a-km-zA-HJ-NP-Z1-9]{25,34}$",
"require_dest_tag": false,
"tickers": [
"USDTTRC",
],
"min_receive": 10,
"min_withdraw": 1,
"max_withdraw_per_transaction": 100000,
"max_withdraw_transactions_per_day": 1000000
}
]
Вивід коштів
POST https://api.westwallet.io/wallet/create_withdrawal
{
"id": 123123,
"amount": 0.1,
"address": "35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ",
"dest_tag": "",
"currency": "BTC",
"status": "pending",
"blockchain_hash": "72648cefcc47b4371f28dc3328bc863918913eebf81b40d4a97d577b96c1ce53",
"fee": "0.0001",
"error": "ok"
}
# Send 0.1 ETH to 0x57689002367b407f031f1BB5Ef2923F103015A32
from westwallet_api import WestWalletAPI
from westwallet_api.exceptions import InsufficientFundsException, BadAddressException
client = WestWalletAPI("your_public_key", "your_private_key")
try:
sent_transaction = client.create_withdrawal(
"ETH", "0.1", "0x57689002367b407f031f1BB5Ef2923F103015A32"
)
except InsufficientFundsException:
# handle this case
pass
except BadAddressException:
# handle also this case
pass
else:
print(sent_transaction.__dict__)
const westwallet = require('westwallet-api');
const westwalletErrors = require('westwallet-api/lib/errors');
const publicKey = "yourPublicKey";
const privateKey = "yourPrivateKey";
let client = new westwallet.WestWalletAPI(
publicKey,
privateKey
);
client.createWithdrawal("ETH", "0.1", "0x57689002367b407f031f1BB5Ef2923F103015A32")
.then((data) => {
console.log(data);
}).catch((error) => {
if (error instanceof westwalletErrors.InsufficientFundsError) {
console.log("Insufficient funds");
} else if (error instanceof westwalletErrors.BadAddressError) {
console.log("Bad address regex");
} else {
console.log(error);
}
});
package main
import (
"fmt"
westwallet "github.com/westwallet/westwallet-golang-api"
)
// Sending 0.1 ETH to 0x57689002367b407f031f1BB5Ef2923F103015A32
client := westwallet.APIClient{
Key: "your_public_key",
Secret: "your_private_key",
}
transaction, err := client.CreateWithdrawal(
"ETH", "0.1", "0x57689002367b407f031f1BB5Ef2923F103015A32", "", ""
)
fmt.Println(err)
if err != nil {
panic(err)
}
fmt.Println(transaction)
<?php
require_once 'vendor/autoload.php';
use WestWallet\WestWallet\Client;
use WestWallet\WestWallet\InsufficientFundsException;
$client = new Client("your_public_key", "your_private_key");
// Send 0.1 ETH to 0x57689002367b407f031f1BB5Ef2923F103015A32
try {
$tx = $client->createWithdrawal("ETH", "0.1", "0x57689002367b407f031f1BB5Ef2923F103015A32");
print(implode("|", $tx)."\n");
} catch(InsufficientFundsException $e) {
print("You don't have enough funds to make this withdrawal"."\n");
}
Вивести кошти з потрібного вам гаманця.
HTTP запит
POST /wallet/create_withdrawal
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currency | BTC | так | Валюта для відправки |
amount | 0.1 | так | Сума для відправки |
address | 35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ | так | Адреса отримувача |
dest_tag | 1390985919 | ні | Тег призначення (необхідний для деяких валют) |
description | ні | Мітка для подальшої ідентифікації у особистому кабінеті | |
priority | medium | ні | Пріорітет транзакції - low, medium або high (тільки для BTC). Стандартне значення - medium. |
Відправка кількох транзакцій
POST https://api.westwallet.io/wallet/create_withdrawal/many
# Request
{
"currency": "BTC",
"priority": "high",
"transactions": [
{
"address": "39iUBiSKuqUtMSSEgimuEkXyrmPP2YnuB5",
"amount": "5",
"description": "40124"
},
{
"address": "3KJFvx88XUtqUgannLDZFm7XzHXACGLuJL",
"amount": "0.015",
"description": "40125"
},
{
"address": "35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ",
"amount": "0.010",
"description": "40126"
}
]
}
# Response
{
"error": "ok",
"results": [
{
"address": "39iUBiSKuqUtMSSEgimuEkXyrmPP2YnuB5",
"amount": "5.00000000",
"description": "40124",
"error": "insufficient_funds"
},
{
"address": "3KJFvx88XUtqUgannLDZFm7XzHXACGLuJL",
"amount": "0.01500000",
"blockchain_hash": "72648cefcc47b4371f28dc3328bc863918913eebf81b40d4a97d577b96c1ce53",
"currency": "BTC",
"error": "ok",
"fee": "0.00027500",
"id": 611438237,
"status": "pending",
"description": "40125"
},
{
"address": "35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ",
"amount": "0.01000000",
"blockchain_hash": "72648cefcc47b4371f28dc3328bc863918913eebf81b40d4a97d577b96c1ce53",
"currency": "BTC",
"error": "ok",
"fee": "0",
"id": 611438238,
"status": "pending",
"description": "40126"
}
]
}
Надіслати кілька транзакцій із потрібного вам гаманця (не більше трьох за один запит). При цьому використовуються знижки на комісію мережі.
При надсиланні з пріоритетом medium для другої та всіх наступних транзакцій застосовується знижка 50% від фіксованої комісії.
При надсиланні з пріоритетом high (тільки для BTC) комісія без знижки застосовується лише до першої транзакції, решта всіх звільняються від фіксованої комісії та комісії API.
Першою транзакцією вважається транзакція із найбільшою сумою.
Метод працює тільки для валют з можливістю масового надсилання: BTC, BCH, BTG, BSV, ADA, DASH, DOGE, LTC, XMR, ZEC.
HTTP запрос
POST /wallet/create_withdrawal/many
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currency | BTC | так | Валюта для відправки |
priority | medium | ні | Пріорітет транзакції - low, medium або high (тільки для BTC). Стандартне значення - medium. |
transactions | так | Масив (список) даних про транзакції. Структура полів наведена нижче |
Post параметри структури transactions
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
amount | 0.1 | так | Сума для відправки |
address | 35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ | так | Адреса отримувача |
description | ні | Мітка для подальшої ідентифікації у особистому кабінеті |
Статус транзакції
Можливі статуси:
- "completed" - транзакція успішно виконана.
- "pending" - транзакці прийнята у обробку і знаходиться в пулі з іншими транзакціями і скоро буде виконана.
- "sending" - відправка була виконана, але не було відповіді від ноди. Це проміжковий статус. Після автоматичної перевірки нашим оператором статус буде змінено на "completed" або "network_error".
- "network_error" - помилка відправки, пов'язана з blockchain.
POST https://api.westwallet.io/wallet/transaction
{
"id": 123123,
"type": "send",
"amount": 0.1,
"address": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg",
"dest_tag": "755785168",
"label": "your_label",
"currency": "XRP",
"status": "completed",
"blockchain_confirmations": 1,
"blockchain_hash": "BC07C0937F2B12D8DF8F90B5A421957DC690DC8512F97925217726E6A28F0A93",
"fee": "0.0001",
"error": "ok"
}
from westwallet_api import WestWalletAPI
client = WestWalletAPI("your_public_key", "your_private_key")
transaction = client.transaction_info(19)
print(transaction.__dict__)
const westwallet = require('westwallet-api');
const westwalletErrors = require('westwallet-api/lib/errors');
const publicKey = "yourPublicKey";
const privateKey = "yourPrivateKey";
let client = new westwallet.WestWalletAPI(
publicKey,
privateKey
);
client.transactionInfo(1284).then((data) => {
console.log(data);
}).catch((error) => {
if (error instanceof westwalletErrors.TransactionNotFoundError) {
console.log("Transaction not found");
}
});
package main
import (
"fmt"
westwallet "github.com/westwallet/westwallet-golang-api"
)
client := westwallet.APIClient{
Key: "your_public_key",
Secret: "your_private_key",
}
transaction, err := client.TransactionInfo(145);
fmt.Println(err)
if err != nil {
panic(err)
}
fmt.Println(transaction)
<?php
require_once 'vendor/autoload.php';
use WestWallet\WestWallet\Client;
use WestWallet\WestWallet\TransactionNotFoundException;
$client = new Client("your_public_key", "your_private_key");
try {
$tx = $client->transactionInfo(134);
print(implode("|", $tx)."\n");
} catch(TransactionNotFoundException $e) {
print("Transaction not found"."\n");
}
Дізнатись статус заявки.
HTTP запит
POST /wallet/transaction
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
id | 123123 | так | ID транзакції у сервісі WestWallet |
Історія транзакцій
POST https://api.westwallet.io/wallet/transactions
{
"error": "ok",
"result": [{
"id": 123123,
"created_at": "2019-12-29 15:07:13",
"updated_at": "2019-12-29 15:12:43",
"type": "send",
"amount": 0.1,
"address": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg",
"dest_tag": "755785168",
"label": "your_label",
"currency": "XRP",
"status": "completed",
"description": "your custom description",
"blockchain_confirmations": 1,
"blockchain_hash": "BC07C0937F2B12D8DF8F90B5A421957DC690DC8512F97925217726E6A28F0A93",
"fee": "0.0001"
}]
}
Переглянути історію транзакцій.
HTTP запит
POST /wallet/transactions
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currency | BTC | ні | Код валюти, для якої необхідно отримати список транзакцій. Якщо не вказаний - ви отримаєте список транзакцій для всіх валют. |
limit | 10 | ні | Кількість транзакцій у відповідь на запит (не більше 100). Якщо не вказано - за замовчуванням - 10. |
offset | 20 | ні | Зміщення |
type | send | ні | Тип транзакцій: send або receive. Якщо не вказано, то ви отримаєте список всіх. |
order | desc | ні | Порядок сортування: desc - від нових транзакцій до старих, asc - від старих до нових. |
status | pending | ні | Статус транзакцій для фильтрації (pending або completed) |
Баланс гаманця
GET https://api.westwallet.io/wallet/balance?currency=BTC
{
"balance": 0.55,
"currency": "BTC"
}
from westwallet_api import WestWalletAPI
client = WestWalletAPI("your_public_key", "your_private_key")
balance = client.wallet_balance("BTC")
print(balance.balance)
const westwallet = require('westwallet-api');
const westwalletErrors = require('westwallet-api/lib/errors');
const publicKey = "yourPublicKey";
const privateKey = "yourPrivateKey";
let client = new westwallet.WestWalletAPI(
publicKey,
privateKey
);
client.walletBalance("BTC").then((data) => {
console.log(data);
}).catch((error) => {
if (error instanceof westwalletErrors.CurrencyNotFoundError) {
console.log("No such currency");
}
});
package main
import (
"fmt"
westwallet "github.com/westwallet/westwallet-golang-api"
)
client := westwallet.APIClient{
Key: "your_public_key",
Secret: "your_private_key",
}
balance, err := client.WalletBalance("BTC");
fmt.Println(err)
if err != nil {
panic(err)
}
fmt.Println(balance)
<?php
require_once 'vendor/autoload.php';
use WestWallet\WestWallet\Client;
use WestWallet\WestWallet\CurrencyNotFoundException;
$client = new Client("your_public_key", "your_private_key");
try {
$balance = $client->walletBalance("BTC");
print(implode("|", $balance)."\n");
} catch(CurrencyNotFoundException $e) {
print("No such currency"."\n");
}
Дізнатись баланс гаманця
HTTP запит
GET /wallet/balance?currency=BTC
Query параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currency | BTC | так | Валюта гаманця |
Баланси всіх гаманців
GET https://api.westwallet.io/wallet/balances
{
"ETH": 3.22,
"ETC": 34,
"LTC": 40,
"BTC": 1.11,
"XLM": 319.11,
"XMR": 15.12
}
from westwallet_api import WestWalletAPI
client = WestWalletAPI("your_public_key", "your_private_key")
balances = client.wallet_balances()
print(balances.__dict__)
const westwallet = require('westwallet-api');
const westwalletErrors = require('westwallet-api/lib/errors');
const publicKey = "yourPublicKey";
const privateKey = "yourPrivateKey";
let client = new westwallet.WestWalletAPI(
publicKey,
privateKey
);
client.walletBalances().then((data) => {
console.log(data);
}).catch((error) => {
console.log(error);
});
package main
import (
"fmt"
westwallet "github.com/westwallet/westwallet-golang-api"
)
client := westwallet.APIClient{
Key: "your_public_key",
Secret: "your_private_key",
}
balances, err := client.WalletBalances();
fmt.Println(err)
if err != nil {
panic(err)
}
fmt.Println(balance)
<?php
require_once 'vendor/autoload.php';
use WestWallet\WestWallet\Client;
use WestWallet\WestWallet\CurrencyNotFoundException;
$client = new Client("your_public_key", "your_private_key");
$balances = $client->walletBalances();
print(implode("|", $balances)."\n");
Дізнатись баланси всіх гаманців
HTTP запит
GET /wallet/balances
Адреси
Згенерувати адресу
POST https://api.westwallet.io/address/generate
{
"address": "rw2ciyaNshpHe7bCHo4bRWq6pqqynnWKQg",
"dest_tag": "755785168",
"currency": "XRP",
"label": "your_label",
"error": "ok"
}
from westwallet_api import WestWalletAPI
client = WestWalletAPI("your_public_key", "your_private_key")
address = client.generate_address("XRP", "https://yourwebsite.com/ipn_url", "your_address_label")
print(address.address, address.dest_tag)
const westwallet = require('westwallet-api');
const westwalletErrors = require('westwallet-api/lib/errors');
const publicKey = "yourPublicKey";
const privateKey = "yourPrivateKey";
let client = new westwallet.WestWalletAPI(
publicKey,
privateKey
);
client.generateAddress("BTC", "https://yourwebsite.com/ipn_url", "your_address_label")
.then((data) => {
console.log(data);
}).catch((error) => {
if (error instanceof westwalletErrors.CurrencyNotFoundError) {
console.log("No such currency");
}
});
package main
import (
"fmt"
westwallet "github.com/westwallet/westwallet-golang-api"
)
client := westwallet.APIClient{
Key: "your_public_key",
Secret: "your_private_key",
}
address, err := client.GenerateAddress("BTC", "https://yourwebsite.com/ipn_url", "your_address_label")
if err != nil {
panic(err)
}
fmt.Println(address.Address)
<?php
require_once 'vendor/autoload.php';
use WestWallet\WestWallet\Client;
use WestWallet\WestWallet\CurrencyNotFoundException;
$client = new Client("your_public_key", "your_private_key");
try {
$address = $client->generateAddress("BTC");
print(implode("|", $address)."\n");
} catch(CurrencyNotFoundException $e) {
print("No such currency"."\n");
}
HTTP запрос
POST /address/generate
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currency | BTC | так | Валюта адреси, яку ви збираєтесь генерувати |
ipn_url | https://yourwebsite.com/payment_secret_token?tx_id=123321 | ні | Instant Payment Notification URL. На цю адресу ви отримаєте сповіщення як тільки хтось зарахує кошти на цю адресу. |
label | tx54543 | ні | Вкажіть мітку для адреси для подальшої ідентифікації (не більше 30 символів) |
Платіжна сторінка (інвойс)
POST https://api.westwallet.io/address/create_invoice
{
"allowed_currencies_data": [{"address": "35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ",
"amount": 0.00211364,
"currency_code": "BTC",
"dest_tag": ""},
{"address": "rn97Zbg9V6hiqJoK6EQ8RtuaLUTYHSFXyw",
"amount": 0.02658667,
"currency_code": "XRP",
"dest_tag": "10000324245"}],
"expire_at": "2022-01-31 19:36:14",
"token": "0b4ab755b42b6ff7fcb01100e42ec3",
"url": "https://westwallet.io/payment/0b4ab755b42b6ff7fcb01100e42ec3",
"error": "ok"
}
HTTP запит
POST /address/create_invoice
Post параметри
Параметр | Приклад | Обов'язковий | Опис |
---|---|---|---|
currencies | ["BTC", "XRP"] | так | Список дозволених криптовалют для оплати. |
amount | 100 | так | Сума зарахування. Якщо вказано більше одної валюти у полі currencies, то сума обов'язково має бути в USD. |
amount_in_usd | true | ні | Використовуйте це поле у випадку, якщо необхідно вказати суму в USD, коли вказана одна валюта в полі currencies. Це поле буде автоматично true, якщо вказано більше 1 валюти в полі currencies. |
ipn_url | https://yourwebsite.com/payment_secret_token?tx_id=123321 | так | Instant Payment Notification URL. На цю адресу ви отримаєте сповіщення як тільки хтось зарахує кошти на адресу, згенеровану для інвойсу. |
success_url | https://yourwebsite.com/thank_you | ні | URL для переадресації після успішної оплати |
description | Payment 1234 | ні | Опис платежу. Текстова інформація, яка буде відображатись на сторінці оплати. |
label | 1234 | ні | Вкажіть мітку для адреси для подальшої ідентифікації (не більше 30 символів) |
ttl | 15 | ні | Час життя заявки у хвилинах. Максимум 15 хвилин. Після закінчення цього часу на сторінці заявки перестане відображатись інтерфейс для оплати (адреси, QR і т.д.). |
Сповіщення про платежі
Приклади сповіщення про платежі
{
"id": 123123,
"amount": 0.1,
"address": "35NjwZg8T4F12ESdEo3rQeYQ8ZiTyDYoTJ",
"dest_tag": "",
"label": "312321",
"currency": "BTC",
"status": "completed",
"blockchain_confirmations": 1,
"fee": "0.0001",
"blockchain_hash": "72648cefcc47b4371f28dc3328bc863918913eebf81b40d4a97d577b96c1ce53"
}
Після того, як ви згенерували адресу, вказав для неї ipn_url
і отримали валюту на цю адресу,
ви отримаєте POST-запит на цей url з такою структурою даних
Можливі статуси у тілі запиту: pending
, completed
.
Ми відправляємо запит із заголовком Content-Type: application/x-www-form-urlencoded
.
HTTP запит
GET /ipn/example
Можливі помилки
У відповіді на кожен запит присутнє поле "error". Якщо "error" != "ok", тоді у вас одна із наступних помилок:
- "wrong_auth" - публічний ключ некоректний
- "ip_not_allowed" - IP, з якого виконується запит не у списку дозволених
- "wrong_hmac" - публічний ключ коректний, HMAC підпис некоректний
- "not_allowed_by_api_key" - цьому ключу заборонено виконувати цей тип дій
- "account_blocked" - акаунт заблоковано
- "bad_address" - адреса не відповідає regex-виразу перевірки коректності адреси
- "insufficient_funds" - на балансі недостатньо коштів
- "max_withdraw_error" - сума більша ніж максимально дозволена для виводу
- "min_withdraw_error" - сума менша ніж мінімально дозволена для виводу
- "currency_not_found" - валюта не знайдена
- "deposit_not_allowed" - отримання не дозволено
- "not_found" - транзакція не знайдена
- "wrong_ipn_url" - IPN URL вказаний некоректно
- "self_address" - спроба відправити кошти на адресу, яка належить вашому акаунту
Помилки
WestWallet API використовує такі коди помилок для всіх запитів:
Код помилки | Значення |
---|---|
400 | Bad Request - Некоректно вказані поля запиту, пояснення у полі errors . |
401 | Unauthorized - API-ключ некоректний або не вказаний зовсім. |
404 | Not Found - Ресурс не знайдено. Перевірте по документації. |
405 | Method Not Allowed - Ви намагаєтесь зробити запит за допомогою недозволеного HTTP-методу. |
429 | Too Many Requests - Надто багато запитів з вашого боку. |
500 | Internal Server Error - Проблема на стороні нашого серверу. Будь ласка, повідомте про це нашу підтримку. |
У випадку успішного запиту ви отримаєте статус 200
.