Меню документации

Регистрация — Справочник API

Создание аккаунта до получения учетных данных: челлендж адреса, его проверка, создание аккаунта и чтение депозитного адреса до выпуска первого API-ключа.

МетодПутьОписание
POST/v1/accounts/challengeЗапрос челленджа для подписи адресом TRON
POST/v1/accounts/challenge/verifyПроверка подписанного челленджа и получение bootstrap-токена
POST/v1/accountsСоздание аккаунта
GET/v1/accounts/deposit-addressДепозитный адрес до создания первого API-ключа

Сгенерировано из openapi.yaml во время сборки. Базовый URL https://api.tenergy.me/v1 или https://api-nile.tenergy.me/v1 в сети Nile (Окружения). Каждый запрос ниже подписывается в соответствии с разделом Аутентификация, если в строке Аутентификация не указано иное.

Запрос челленджа для подписи адресом TRON

POST /v1/accounts/challenge · createAccountChallenge

Аутентификация: Публичный — учетные данные не требуются.

Шаг 1 модели регистрации и восстановления через челлендж адреса — единственной модели платформы: владение аккаунтом подтверждается подписью одноразового числа (nonce) адресом TRON вне нашей инфраструктуры. Мы никогда не видим приватные ключи, и здесь нечего перехватить фишингом — подпись подтверждает только контроль над адресом.

Возвращаемая строка message понятна человеку и привязана к домену (бренд, цель, nonce, срок действия), чтобы подписывающий в кошельке точно видел, на что соглашается. Подпишите её в формате личной подписи TIP-191; подпись должна восстанавливать исходный address.

Анонимный вызов, лимитируется по IP и адресу. Вызов для адреса, у которого уже есть аккаунт, ничем не отличается от вызова для нового адреса — эндпоинт намеренно не раскрывает факт существования аккаунта.

Тело запроса

JSON (AccountChallengeRequest), обязательно.

ПолеТипОбязательноеОписание
addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
purposeenum: signup, login, recoveryНазначение подписи; указывается в тексте подписываемого сообщения.

Пример тела запроса из контракта (значения для иллюстрации):

json
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","purpose":"signup"}

Ответы

СтатусЗначение
201Челлендж сформирован.
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
429Слишком много запросов.
500Ошибка на нашей стороне.

Поля ответа (AccountChallenge)

ПолеТипОбязательноеОписание
noncestringдаОдноразовый
addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
purposeenum: signup, login, recovery
messagestringдаТочная строка для подписи в формате TIP-191 personal-sign. Привязана к домену и понятна человеку. Подписывайте эти байты в неизменном виде — без переносов, обрезки и перекодирования.
issued_atstring (date-time)да
expires_atstring (date-time)да10 минут с момента выпуска. Истекший nonce вызывает 1010 challenge_invalid.

Пример ответа 201 из контракта (значения для иллюстрации):

json
{
  "nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
  "address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
  "purpose": "signup",
  "message": "tenergy.me wants you to prove control of this address.\nPurpose: signup\nAddress: TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE\nNonce: 9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e\nExpires: 2026-09-11T18:14:05.123Z\nSigning this creates no transaction and moves no funds.\n",
  "issued_at": "2026-09-11T18:04:05.123Z",
  "expires_at": "2026-09-11T18:14:05.123Z"
}

Проверка подписанного челленджа и получение bootstrap-токена

POST /v1/accounts/challenge/verify · verifyAccountChallenge

Аутентификация: Публичный — учетные данные не требуются.

Шаг 2. Проверяет, что signature восстанавливает address из текста сообщения челленджа message, и возвращает короткоживущий bootstrap-токен — учетные данные, сопровождающие пользователя на этапе от «нет аккаунта» до «первый API-ключ».

Bootstrap-токен передается в заголовке Authorization: Bearer abt_… и открывает ровно четыре операции: POST /v1/accounts, GET /v1/accounts/deposit-address, GET /v1/account и POST /v1/api-keys. Срок действия составляет 15 минут, привязан к одному аккаунту и не заменяет API-ключ.

Если у адреса уже есть аккаунт на этой платформе, возвращаются account_id и account_status — только вызвавшей стороне, подтвердившей подпись.

Nonce одноразовый. Повторный, истекший или неверно подписанный nonce возвращает единую ошибку 1010 challenge_invalid, чтобы ошибки не раскрывали информацию о существовании аккаунтов.

Тело запроса

JSON (AccountChallengeVerifyRequest), обязательно.

ПолеТипОбязательноеОписание
addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
noncestringда
signaturestringдаШестнадцатеричная подпись под message. Должна восстанавливать address; префикс 0x опционален.

Пример тела запроса из контракта (значения для иллюстрации):

json
{
  "address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
  "nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
  "signature": "1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b"
}

Ответы

СтатусЗначение
200Подпись действительна.
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
4011010 challenge_invalid — неизвестный, истекший или уже использованный nonce, либо подпись не восстанавливает адрес. Получите новый челлендж.
429Слишком много запросов.
500Ошибка на нашей стороне.

Поля ответа (BootstrapToken)

ПолеТипОбязательноеОписание
bootstrap_tokenstringдаПередавайте как Authorization: Bearer abt_…. Время жизни 15 минут, четыре разрешенные операции, без возможности заказа и списания средств. Сохраняйте только на время процедуры регистрации.
expires_atstring (date-time)да
account_idstring | nullАккаунт, уже принадлежащий этому адресу, или null, если его еще нет.
account_statusenum: unfunded, active, suspended, closed | null

Пример ответа 200 из контракта (значения для иллюстрации):

json
{
  "bootstrap_token": "abt_3f8c2d1e9b7a4c6e8f0a2b4d6e8f0a2b",
  "expires_at": "2026-09-11T18:19:05.123Z",
  "account_id": "acc_01J9Z4K2M7Q8",
  "account_status": "active"
}

Создание аккаунта

POST /v1/accounts · createAccount

Аутентификация: Bootstrap-токен или публичный.

Шаг 3. Создает аккаунт, принадлежащий подписавшему адресу, и возвращает его вместе с депозитным адресом. Аккаунт создается в статусе status: "unfunded": он существует, доступен для чтения, может принимать депозиты и выпускать API-ключи, но не может тратить средства до подтверждения пополнения.

Аутентифицируйтесь либо с помощью bootstrap-токена из POST /v1/accounts/challenge/verify, либо передав nonce + signature в теле запроса для создания в один вызов. Оба способа подтверждают одно и то же.

Идемпотентно по адресу. Если у адреса уже есть аккаунт на этой платформе, возвращается существующий аккаунт с кодом HTTP 200 без создания дубликата.

Поле email опционально и не проверяется здесь — это канал для восстановления и квитанций, привязываемый позже из панели управления. Вход по email-ссылке и Telegram — это дополнительные способы входа для людей в тот же аккаунт, а не отдельная модель регистрации.

API-ключи не ждут депозита (с 2026-09-26). Расходование средств блокируется балансом, а не отсутствием ключа: POST /v1/orders возвращает 4001 insufficient_funds, пока на балансе нет подтвержденных средств.

Тело запроса

JSON (AccountCreateRequest), обязательно.

ПолеТипОбязательноеОписание
addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
noncestring
signaturestring
emailstring (email) | nullНеобязательный контакт для восстановления и счетов. Не проверяется здесь и не обязателен.
labelstring | null

Пример тела запроса из контракта (значения для иллюстрации):

json
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}

Ответы

СтатусЗначение
200Адрес уже владеет аккаунтом; возвращен существующий.
201Аккаунт создан, статус unfunded.
400Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип.
4011010 challenge_invalid или 1011 bootstrap_token_expired.
422Синтаксически корректный запрос, но действие невозможно.
429Слишком много запросов.
500Ошибка на нашей стороне.

Поля ответа (AccountCreated)

ПолеТипОбязательноеОписание
account_idstringда
brandstringда
networkenum: mainnet, nileда
statusenum: unfunded, active, suspended, closedда
owner_addressstringдаАдрес, чья подпись владеет данным аккаунтом и может его восстановить.
deposit_addressesarray of object (DepositAddress)да
deposit_addresses[].currencyenum: TRX, USDTда
deposit_addresses[].addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
deposit_addresses[].memostring | nullВсегда null с 2026-09-26: у каждого аккаунта индивидуальный адрес, memo не требуется и игнорируется. Сохранено для обратной совместимости.
deposit_addresses[].confirmations_requiredintegerКоличество блоков подтверждения до зачисления депозита.
deposit_addresses[].contractstring | nullКонтракт TRC-20, принимаемый на этот адрес (только строка USDT; null для TRX).
deposit_addresses[].rate_nownull | objectТолько для строки USDT. Текущий курс SunSwap (или фиксированный) TRX за USDT ДО спреда, кэшируется на 60 с. null, если курс сейчас недоступен; депозит все равно принимается и тарифицируется в момент зачисления.
deposit_addresses[].rate_now.trx_per_usdtstringда
deposit_addresses[].rate_now.sourceenum: sunswap_v3, fixed_envда
deposit_addresses[].rate_now.atstring (date-time)да
deposit_addresses[].spread_bpsinteger | nullТолько для строки USDT: базисные пункты спреда от курса (5 = 0,05 %).
deposit_addresses[].minstring | nullТолько для строки USDT: минимальный зачисляемый депозит в USDT; меньшие суммы удерживаются (held_below_min).
deposit_addresses[].maxstring | nullТолько для строки USDT: максимальный автозачисляемый депозит в USDT; большие суммы отправляются на проверку (held_for_review).
nextobjectМашиночитаемая инструкция о следующем шаге для агентов и автоматических скриптов.
next.actionstring
next.addressstringTRON-адрес Base58Check (начинается с T, 34 символа).
next.reasonstring
created_atstring (date-time)да

Депозитный адрес до создания первого API-ключа

GET /v1/accounts/deposit-address · getSignupDepositAddress

Аутентификация: Bootstrap-токен.

Адрес для пополнения, перевод на который переводит аккаунт в статус active и позволяет выпустить ключ. Доступен по bootstrap-токену, поэтому только что создавший аккаунт агент может сообщить адрес и минимум пользователю без сохранения долгосрочных ключей.

После создания ключа используйте GET /v1/deposit-addresses, возвращающий те же адреса.

Параметры

ПараметрГдеТипОбязательныйОписание
currencyqueryenum: TRX, USDT

Ответы

СтатусЗначение
200OK
401Отсутствуют, некорректны или отклонены учетные данные.
429Слишком много запросов.
500Ошибка на нашей стороне.

Поля ответа

ПолеТипОбязательноеОписание
account_idstringда
statusenum: unfunded, active, suspended, closedда
dataarray of object (DepositAddress)да
data[].currencyenum: TRX, USDTда
data[].addressstringдаTRON-адрес Base58Check (начинается с T, 34 символа).
data[].memostring | nullВсегда null с 2026-09-26: у каждого аккаунта индивидуальный адрес, memo не требуется и игнорируется. Сохранено для обратной совместимости.
data[].confirmations_requiredintegerКоличество подтверждений блоков перед зачислением депозита.
data[].contractstring | nullКонтракт TRC-20, принимаемый на этот адрес (только строка USDT; null для TRX).
data[].rate_nownull | objectТолько для строки USDT. Текущий курс SunSwap (или фиксированный) TRX за USDT ДО спреда, кэшируется на 60 с. null, если курс недоступен; депозит принимается и тарифицируется в момент зачисления.
data[].rate_now.trx_per_usdtstringда
data[].rate_now.sourceenum: sunswap_v3, fixed_envда
data[].rate_now.atstring (date-time)да
data[].spread_bpsinteger | nullТолько для строки USDT: базисные пункты спреда от курса (5 = 0,05 %).
data[].minstring | nullТолько для строки USDT: минимальный зачисляемый депозит в USDT; меньшие суммы удерживаются (held_below_min).
data[].maxstring | nullТолько для строки USDT: максимальный автозачисляемый депозит в USDT; большие суммы отправляются на проверку (held_for_review).
min_deposit_suninteger (int64)Депозиты ниже этого порога удерживаются как невостребованный остаток. Значение настраивается платформой.

Пример ответа 200 из контракта (значения для иллюстрации):

json
{
  "account_id": "acc_01J9Z4K2M7Q8",
  "status": "unfunded",
  "data": [
    {
      "currency": "TRX",
      "address": "TDepositAddressExample1111111111111",
      "memo": null,
      "confirmations_required": 19
    }
  ],
  "min_deposit_sun": 1000000
}

    ↑ ↓ — выбрать · Enter — открыть · Esc — закрыть