stakan-js
v0.2.0
Published
TypeScript client for the Stakanex API: RUB ↔ USDT exchange, deposits, withdrawals and partner clients
Readme
stakan-js
TypeScript-клиент Stakanex API: обмен RUB ↔ USDT, пополнения, выводы, KYC и всё для партнёров — клиенты, работа от их имени и наценка.
npm install stakan-jsБез зависимостей, на fetch: Node 18+, Bun, Deno и браузер. ESM и CommonJS, типы в комплекте.
Начало
import { Stakan } from "stakan-js";
const stakan = new Stakan({ apiKey: process.env.STAKAN_API_KEY });
console.log(await stakan.account.balances());
const quote = await stakan.exchange.quote("9000"); // рубли → USDT
const deal = await stakan.exchange.create("9000", quote.rate_version);
console.log(deal.reference, deal.status);Ключ выпускается в кабинете: Настройки → API (нужна 2FA). Права: read,
trade (обмен, пополнение, KYC, клиенты, наценка), withdraw (адреса и вывод).
Держите ключ на сервере — не отдавайте его в браузер.
Партнёрам
Ключ партнёра открывает аккаунты клиентов и работает от их имени —
forClient(id) добавляет к каждому запросу X-Client-Id:
const client = await stakan.partner.clients.create({ email: "[email protected]", externalId: "u-1842" });
const asClient = stakan.forClient(client.id);
const session = await asClient.kyc.start(); // access_token для WebSDK или redirect_url
console.log((await asClient.kyc.status()).status);
const quote = await asClient.exchange.quote("1020"); // курс уже с вашей наценкой
await asClient.exchange.create("1020", quote.rate_version);
const entry = await asClient.addressBook.add({ network: "trc20", address: "TUEZ…", code: "123456" }); // ваш код 2FA
await asClient.withdrawals.create(entry.id, "30");
await stakan.partner.setMarkup("2");
console.log((await stakan.partner.get()).summary.earned);Своя 2FA клиента
Пока её нет, адреса клиента подтверждает ваш код, а вывод идёт без кода. Включите — и вывод и новые адреса клиента пойдут только с его кодом:
const setup = await asClient.totp.setup(); // покажите QR из setup.otpauth_url
const enabled = await asClient.totp.confirm("123456"); // первый код из его приложения
console.log(enabled.backup_codes); // показать клиенту один раз
await asClient.addressBook.add({ network: "trc20", address: "TUEZ…", code: "654321" }); // код клиента
await asClient.withdrawals.create(entry.id, "30", { code: "112233" }); // код клиента
await asClient.totp.disable("ab12-cd34"); // его код или резервныйПотерял телефон и резервные коды — сброс у поддержки Stakanex.
Найти клиента по своему id — stakan.partner.clients.find("u-1842"), обойти всех —
for await (const c of stakan.partner.clients.iter()).
Деньги и повторы
- Суммы — строки (
"1020.50"); число принимается, только если оно целое. - Обмен, пополнение и вывод получают
Idempotency-Keyсами (или ваш —{ idempotencyKey }). При сетевом сбое, 429 и 5xx запрос повторяется с тем же ключом — вторая операция не создастся.maxRetries: 2по умолчанию.
Ошибки
import { RateChanged, Refused } from "stakan-js";
try {
await asClient.exchange.create("1020", quote.rate_version);
} catch (error) {
if (error instanceof RateChanged) {
// курс или наценка сменились — возьмите новую котировку
} else if (error instanceof Refused) {
console.log(error.code, error.message, error.reference);
} else throw error;
}AuthError (401), PermissionDenied (403), NotFound (404), Conflict /
RateChanged (409), Refused (422), RateLimited (429), ServerError (5xx),
ConnectionFailed — ответа не было. У каждой — code, status, reference.
Поля запросов и ответов — как в API (rate_version, next_cursor); полные типы —
components["schemas"]. Документация: https://api.stakanex.io/v1/docs. Лицензия MIT.
