Регистрация — Справочник 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), обязательно.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
purpose | enum: signup, login, recovery | Назначение подписи; указывается в тексте подписываемого сообщения. |
Пример тела запроса из контракта (значения для иллюстрации):
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","purpose":"signup"}
Ответы
| Статус | Значение |
|---|---|
201 | Челлендж сформирован. |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
429 | Слишком много запросов. |
500 | Ошибка на нашей стороне. |
Поля ответа (AccountChallenge)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
nonce | string | да | Одноразовый |
address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
purpose | enum: signup, login, recovery | ||
message | string | да | Точная строка для подписи в формате TIP-191 personal-sign. Привязана к домену и понятна человеку. Подписывайте эти байты в неизменном виде — без переносов, обрезки и перекодирования. |
issued_at | string (date-time) | да | |
expires_at | string (date-time) | да | 10 минут с момента выпуска. Истекший nonce вызывает 1010 challenge_invalid. |
Пример ответа 201 из контракта (значения для иллюстрации):
{
"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), обязательно.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
nonce | string | да | |
signature | string | да | Шестнадцатеричная подпись под message. Должна восстанавливать address; префикс 0x опционален. |
Пример тела запроса из контракта (значения для иллюстрации):
{
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE",
"nonce": "9f2a7c1e4b6d8a0f3e5c7b9d1f3a5c7e",
"signature": "1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b"
}
Ответы
| Статус | Значение |
|---|---|
200 | Подпись действительна. |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
401 | 1010 challenge_invalid — неизвестный, истекший или уже использованный nonce, либо подпись не восстанавливает адрес. Получите новый челлендж. |
429 | Слишком много запросов. |
500 | Ошибка на нашей стороне. |
Поля ответа (BootstrapToken)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
bootstrap_token | string | да | Передавайте как Authorization: Bearer abt_…. Время жизни 15 минут, четыре разрешенные операции, без возможности заказа и списания средств. Сохраняйте только на время процедуры регистрации. |
expires_at | string (date-time) | да | |
account_id | string | null | Аккаунт, уже принадлежащий этому адресу, или null, если его еще нет. | |
account_status | enum: unfunded, active, suspended, closed | null |
Пример ответа 200 из контракта (значения для иллюстрации):
{
"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), обязательно.
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
nonce | string | ||
signature | string | ||
email | string (email) | null | Необязательный контакт для восстановления и счетов. Не проверяется здесь и не обязателен. | |
label | string | null |
Пример тела запроса из контракта (значения для иллюстрации):
{"address":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"}
Ответы
| Статус | Значение |
|---|---|
200 | Адрес уже владеет аккаунтом; возвращен существующий. |
201 | Аккаунт создан, статус unfunded. |
400 | Некорректный запрос — невалидный JSON, неизвестное поле или неверный тип. |
401 | 1010 challenge_invalid или 1011 bootstrap_token_expired. |
422 | Синтаксически корректный запрос, но действие невозможно. |
429 | Слишком много запросов. |
500 | Ошибка на нашей стороне. |
Поля ответа (AccountCreated)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
account_id | string | да | |
brand | string | да | |
network | enum: mainnet, nile | да | |
status | enum: unfunded, active, suspended, closed | да | |
owner_address | string | да | Адрес, чья подпись владеет данным аккаунтом и может его восстановить. |
deposit_addresses | array of object (DepositAddress) | да | |
deposit_addresses[].currency | enum: TRX, USDT | да | |
deposit_addresses[].address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
deposit_addresses[].memo | string | null | Всегда null с 2026-09-26: у каждого аккаунта индивидуальный адрес, memo не требуется и игнорируется. Сохранено для обратной совместимости. | |
deposit_addresses[].confirmations_required | integer | Количество блоков подтверждения до зачисления депозита. | |
deposit_addresses[].contract | string | null | Контракт TRC-20, принимаемый на этот адрес (только строка USDT; null для TRX). | |
deposit_addresses[].rate_now | null | object | Только для строки USDT. Текущий курс SunSwap (или фиксированный) TRX за USDT ДО спреда, кэшируется на 60 с. null, если курс сейчас недоступен; депозит все равно принимается и тарифицируется в момент зачисления. | |
deposit_addresses[].rate_now.trx_per_usdt | string | да | |
deposit_addresses[].rate_now.source | enum: sunswap_v3, fixed_env | да | |
deposit_addresses[].rate_now.at | string (date-time) | да | |
deposit_addresses[].spread_bps | integer | null | Только для строки USDT: базисные пункты спреда от курса (5 = 0,05 %). | |
deposit_addresses[].min | string | null | Только для строки USDT: минимальный зачисляемый депозит в USDT; меньшие суммы удерживаются (held_below_min). | |
deposit_addresses[].max | string | null | Только для строки USDT: максимальный автозачисляемый депозит в USDT; большие суммы отправляются на проверку (held_for_review). | |
next | object | Машиночитаемая инструкция о следующем шаге для агентов и автоматических скриптов. | |
next.action | string | ||
next.address | string | TRON-адрес Base58Check (начинается с T, 34 символа). | |
next.reason | string | ||
created_at | string (date-time) | да |
Депозитный адрес до создания первого API-ключа
GET /v1/accounts/deposit-address · getSignupDepositAddress
Аутентификация: Bootstrap-токен.
Адрес для пополнения, перевод на который переводит аккаунт в статус active и позволяет выпустить ключ. Доступен по bootstrap-токену, поэтому только что создавший аккаунт агент может сообщить адрес и минимум пользователю без сохранения долгосрочных ключей.
После создания ключа используйте GET /v1/deposit-addresses, возвращающий те же адреса.
Параметры
| Параметр | Где | Тип | Обязательный | Описание |
|---|---|---|---|---|
currency | query | enum: TRX, USDT |
Ответы
| Статус | Значение |
|---|---|
200 | OK |
401 | Отсутствуют, некорректны или отклонены учетные данные. |
429 | Слишком много запросов. |
500 | Ошибка на нашей стороне. |
Поля ответа
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
account_id | string | да | |
status | enum: unfunded, active, suspended, closed | да | |
data | array of object (DepositAddress) | да | |
data[].currency | enum: TRX, USDT | да | |
data[].address | string | да | TRON-адрес Base58Check (начинается с T, 34 символа). |
data[].memo | string | null | Всегда null с 2026-09-26: у каждого аккаунта индивидуальный адрес, memo не требуется и игнорируется. Сохранено для обратной совместимости. | |
data[].confirmations_required | integer | Количество подтверждений блоков перед зачислением депозита. | |
data[].contract | string | null | Контракт TRC-20, принимаемый на этот адрес (только строка USDT; null для TRX). | |
data[].rate_now | null | object | Только для строки USDT. Текущий курс SunSwap (или фиксированный) TRX за USDT ДО спреда, кэшируется на 60 с. null, если курс недоступен; депозит принимается и тарифицируется в момент зачисления. | |
data[].rate_now.trx_per_usdt | string | да | |
data[].rate_now.source | enum: sunswap_v3, fixed_env | да | |
data[].rate_now.at | string (date-time) | да | |
data[].spread_bps | integer | null | Только для строки USDT: базисные пункты спреда от курса (5 = 0,05 %). | |
data[].min | string | null | Только для строки USDT: минимальный зачисляемый депозит в USDT; меньшие суммы удерживаются (held_below_min). | |
data[].max | string | null | Только для строки USDT: максимальный автозачисляемый депозит в USDT; большие суммы отправляются на проверку (held_for_review). | |
min_deposit_sun | integer (int64) | Депозиты ниже этого порога удерживаются как невостребованный остаток. Значение настраивается платформой. |
Пример ответа 200 из контракта (значения для иллюстрации):
{
"account_id": "acc_01J9Z4K2M7Q8",
"status": "unfunded",
"data": [
{
"currency": "TRX",
"address": "TDepositAddressExample1111111111111",
"memo": null,
"confirmations_required": 19
}
],
"min_deposit_sun": 1000000
}