https://econoverse.ring-team.ru/api/v1Econoverse Public API — это HTTP REST API, позволяющий сторонним приложениям подключаться к экономике Econoverse (Telegram-бот): получать баланс пользователя, историю транзакций, совершать переводы, взаимодействовать с компаниями.
https://econoverse.ring-team.ru/api/v1"ok": true, ошибка — "ok": false, "error": "...", "code": "...".Используется двухуровневая схема:
/newapp. Нужны только для обмена кода привязки на токен.Заголовки всех запросов (кроме oauth/exchange):
X-Api-Key: eco_pk_XXXXXXXXXXXXXXXXXXXX Authorization: Bearer eco_ut_YYYYYYYYYYYYYYYYYYYY
/newapp My Cool App → получает api_key и api_secret./mycode → получает 8-символьный код (действует 10 минут).POST /api/v1/oauth/exchange вместе с api_key и api_secret.X-Api-Key и Authorization: Bearer.Обменяет код привязки на токен доступа пользователя. Заголовки авторизации не требуются.
| Поле | Тип | Описание |
|---|---|---|
api_key | string | Публичный ключ приложения |
api_secret | string | Секрет приложения |
code | string | 8-символьный код от пользователя |
{
"ok": true,
"access_token": "eco_ut_XXXXXXXXXXXXXX",
"token_type": "Bearer",
"app": {"id": 12, "name": "My Cool App"},
"user": {"id": 3, "telegram_id": 123456, "username": "alice"}
}
Профиль текущего пользователя, включая баланс и компанию.
{
"ok": true,
"user": {
"id": 3,
"telegram_id": 123456,
"username": "alice",
"balance": 1250.0,
"is_banned": false,
"warnings": 0,
"join_date": "2026-05-10T12:00:00"
},
"company": {"id": 4, "name": "RingCorp", "is_owner": true, "balance": 8000.0}
}
Текущий баланс пользователя.
{"ok": true, "balance": 1250.0, "currency": "RUB", "username": "alice"}
История транзакций. Параметр limit: 1–500 (по умолчанию 30).
{
"ok": true,
"items": [
{
"id": 88,
"direction": "in",
"peer": "bob",
"amount": 500,
"created_at": "2026-08-10T14:22:11",
"comment": "payment"
}
]
}
Перевод другому пользователю по username.
| Поле | Тип | Описание |
|---|---|---|
to_username | string | Username получателя (без @) |
amount | number | Сумма в ₽ (> 0) |
comment | string? | Комментарий (до 120 символов) |
{
"ok": true,
"transaction": {
"amount": 100,
"to_username": "bob",
"comment": "for coffee",
"new_balance": 1150.0
}
}
Компания текущего пользователя и её участники. Если пользователь вне компании, вернётся company: null.
Перевод на баланс компании по названию.
| Поле | Тип | Описание |
|---|---|---|
company_name | string | Точное название компании |
amount | number | Сумма (> 0) |
comment | string? | Комментарий |
Приложение отзывает свой токен для текущего пользователя. После отзыва потребуется новый код привязки.
| HTTP | code | Значение |
|---|---|---|
| 400 | bad_request, invalid_amount, missing_receiver, missing_code, self_transfer | Проблема в параметрах |
| 401 | invalid_api_key, invalid_api_secret, missing_token, invalid_token | Ошибка авторизации |
| 402 | insufficient_funds | Недостаточно средств |
| 403 | user_banned | Пользователь заблокирован |
| 404 | code_not_found, receiver_not_found, company_not_found, user_not_found | Ресурс не найден |
| 409 | code_used | Код уже был использован |
| 410 | code_expired | Код устарел |
const BASE = 'https://econoverse.ring-team.ru/api/v1';
// 1) Обмен кода на токен (только на вашем бэкенде!)
async function link(code) {
const r = await fetch(BASE + '/oauth/exchange', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
api_key: process.env.ECO_API_KEY,
api_secret: process.env.ECO_API_SECRET,
code,
}),
});
return r.json();
}
// 2) Запросы от имени пользователя
async function apiCall(path, method='GET', body=null, userToken) {
return fetch(BASE + path, {
method,
headers: {
'Content-Type': 'application/json',
'X-Api-Key': process.env.ECO_API_KEY,
'Authorization': 'Bearer ' + userToken,
},
body: body ? JSON.stringify(body) : undefined,
}).then(r => r.json());
}
const me = await apiCall('/me', 'GET', null, userToken);
const tx = await apiCall('/transfer', 'POST', {to_username: 'bob', amount: 100, comment: 'hi'}, userToken);