API
Документация бесплатного и открытого API системы аутентификации. Интегрируйте единую систему идентификации в ваши сервисы и приложения через OAuth 2.0, REST API и SDK.
https://id.tokenpay.space/api/v1
API использует JSON для всех запросов и ответов. Все запросы должны содержать заголовок Content-Type: application/json.
Быстрый старт
Для начала работы с API вам нужно:
1. Создать аккаунт TOKEN PAY ID
2. Получить API ключи в личном кабинете
3. Использовать секретный ключ для серверных запросов
curl -X GET https://id.tokenpay.space/api/v1/users/me \ -H "Authorization: Bearer tpid_sk_your_secret_key" \ -H "Content-Type: application/json"
Аутентификация
TOKEN PAY ID API поддерживает два метода аутентификации:
API ключи
Используйте секретный ключ (tpid_sk_...) в заголовке Authorization:
Authorization: Bearer tpid_sk_7f3a9b2ce4d18...
OAuth 2.0 Bearer Token
Для пользовательских запросов используйте access_token полученный через OAuth 2.0 flow:
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Лимиты запросов
API имеет следующие ограничения:
| Тарифный план | Запросов/мин | Запросов/день |
|---|---|---|
| Free | 60 | 10,000 |
| Pro | 300 | 100,000 |
| Enterprise | 1,000 | Unlimited |
Заголовки ответа содержат информацию о лимитах:
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 45 X-RateLimit-Reset: 1678886400
Коды ошибок
API возвращает стандартные HTTP коды и JSON-объект ошибки:
{
"error": {
"code": "invalid_token",
"message": "The access token is invalid or expired",
"status": 401
}
}
| Код | Описание |
|---|---|
| 400 | Некорректный запрос |
| 401 | Неавторизован — неверный или отсутствующий токен |
| 403 | Запрещено — недостаточно прав |
| 404 | Ресурс не найден |
| 429 | Превышен лимит запросов |
| 500 | Внутренняя ошибка сервера |
OAuth 2.0 — Авторизация
TOKEN PAY ID поддерживает стандартный OAuth 2.0 Authorization Code flow для безопасной авторизации пользователей в сторонних сервисах.
Шаг 1: Redirect к авторизации
Перенаправьте пользователя на страницу авторизации:
https://id.tokenpay.space/api/v1/oauth/authorize? client_id=tpid_pk_your_public_key& redirect_uri=https://yourapp.com/callback& response_type=code& scope=profile email& state=random_csrf_token& prompt=login& code_challenge=SHA256_HASH& code_challenge_method=S256
| Параметр | Тип | Описание |
|---|---|---|
| client_id | string | required — Публичный ключ |
| redirect_uri | string | required — URL для редиректа |
| response_type | string | required — Только code |
| scope | string | Запрашиваемые разрешения (по умолч. profile) |
| state | string | CSRF-токен (рекомендуется) |
| prompt | string | login — принудительная переавторизация, consent, none |
| login_hint | string | Email для предзаполнения формы входа |
| code_challenge | string | PKCE challenge (рекомендуется для SPA/мобильных) |
| code_challenge_method | string | S256 или plain |
Шаг 2: Обмен кода на токен
После авторизации пользователь будет перенаправлен на ваш redirect_uri с параметром code. Обменяйте его на access_token:
POST /oauth/token
Обмен authorization code на access token.
| Параметр | Тип | Описание |
|---|---|---|
| grant_type | string | required — authorization_code или refresh_token |
| code | string | required — Authorization code |
| client_id | string | required — Ваш публичный ключ |
| client_secret | string | required — Ваш секретный ключ |
| redirect_uri | string | required — Должен совпадать с исходным |
curl -X POST https://id.tokenpay.space/api/v1/oauth/token \ -H "Content-Type: application/json" \ -d '{ "grant_type": "authorization_code", "code": "abc123...", "client_id": "tpid_pk_...", "client_secret": "tpid_sk_...", "redirect_uri": "https://yourapp.com/callback" }'
Ответ
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "tpid_rt_8a7b6c5d...",
"scope": "profile email",
"user": {
"id": "tpid_usr_a1b2c3d4",
"email": "user@example.com",
"name": "Иван",
"email_verified": true
}
}
POST /oauth/revoke
Отзыв access или refresh токена.
| Параметр | Тип | Описание |
|---|---|---|
| token | string | required — Токен для отзыва |
| token_type_hint | string | access_token или refresh_token |
GET /oauth/userinfo
Получить профиль пользователя по OAuth access token. Возвращает данные в зависимости от запрошенного scope.
curl -X GET https://tokenpay.space/api/v1/oauth/userinfo \ -H "Authorization: Bearer ACCESS_TOKEN"
{
"id": "tpid_usr_a1b2c3d4e5f6",
"email": "user@example.com",
"name": "Иван",
"role": "user",
"email_verified": true,
"locale": "ru",
"theme": "dark",
"telegram_linked": true,
"cupol_balance": 150,
"cupol_subscription_active": true,
"created_at": "2026-01-15T12:00:00Z"
}
POST /oauth/cancel
Уведомить enterprise о том, что пользователь закрыл окно согласия (вызывается автоматически через sendBeacon). Запускает webhook user.oauth_cancel.
| Параметр | Тип | Описание |
|---|---|---|
| client_id | string | required |
| reason | string | Причина: window_closed, user_cancel |
POST /oauth/deny
Пользователь явно отклонил запрос на авторизацию. Запускает webhook user.oauth_deny и перенаправляет с ошибкой access_denied.
| Параметр | Тип | Описание |
|---|---|---|
| client_id | string | required |
| redirect_uri | string | required |
| state | string | Передаётся обратно в redirect |
GET /oauth/branding
Получить конфигурацию кнопок, иконки и готовый код для интеграции виджета TOKEN PAY ID. Не требует аутентификации.
{
"provider": "TOKEN PAY ID",
"widget_url": "https://tokenpay.space/sdk/tpid-widget.js",
"widget_version": "1.2.0",
"icon": { "shield_svg": "<svg ...>" },
"buttons": {
"standard": { "label": "Войти через TOKEN PAY", ... },
"icon": { "shape": "circle", ... },
"logo": { "background": "transparent", ... }
},
"integration": {
"quick_start": "<script src=... data-client-id=...>",
"oauth_popup": "TPID.loginWithOAuth().then(...);"
},
"themes": ["dark", "light", "auto"],
"languages": ["ru", "en"]
}
Пользователи
GET /users/me
Получить профиль текущего авторизованного пользователя.
{
"id": "tpid_usr_a1b2c3d4",
"email": "user@example.com",
"name": "Иван Чернов",
"email_verified": true,
"two_factor_enabled": false,
"telegram_linked": true,
"created_at": "2025-01-15T10:30:00Z",
"last_login": "2026-03-13T09:45:00Z"
}
PUT /users/me
Обновить профиль пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| name | string | Имя пользователя |
| avatar_url | string | URL аватара |
GET /users/activity
История активности пользователя: входы, API вызовы, изменения безопасности.
| Параметр | Тип | Описание |
|---|---|---|
| limit | integer | Количество записей (по умолчанию 50, максимум 200) |
| offset | integer | Смещение для пагинации |
| type | string | Фильтр: auth, api, security |
GET /users/sessions
Список активных сессий пользователя.
{
"sessions": [
{
"id": "ses_abc123",
"device": "Chrome — Windows",
"ip": "192.168.1.1",
"location": "Saint Petersburg, RU",
"last_active": "2026-03-13T12:00:00Z",
"current": true
}
]
}
Auth
POST /auth/send-code
Отправить 6-значный код верификации на email. Используется перед регистрацией и при входе.
| Параметр | Тип | Описание |
|---|---|---|
| string | required — Email адрес | |
| type | string | required — register или login |
{
"success": true,
"message": "Verification code sent",
"expires_in": 600
}
POST /auth/verify
Верификация access токена. Используется сторонними сервисами для проверки авторизации пользователя.
| Параметр | Тип | Описание |
|---|---|---|
| token | string | required — Access token для проверки |
{
"valid": true,
"user_id": "tpid_usr_a1b2c3d4",
"email": "user@example.com",
"scopes": ["profile", "email"],
"expires_at": 1678886400
}
POST /auth/register
Регистрация нового пользователя. Требуется предварительная отправка кода через /auth/send-code.
| Параметр | Тип | Описание |
|---|---|---|
| string | required | |
| password | string | required — Минимум 8 символов |
| name | string | required |
| email_code | string | required — 6-значный код из email (от /auth/send-code) |
POST /auth/send-code с type: "register".
POST /auth/login
Двухэтапная авторизация. Первый вызов с email+password отправляет код на почту и возвращает requires_email_code: true. Второй вызов с email+password+email_code завершает авторизацию.
| Параметр | Тип | Описание |
|---|---|---|
| string | required | |
| password | string | required |
| email_code | string | 6-значный код из email (обязателен на втором шаге) |
| two_factor_code | string | TOTP код, если 2FA включена |
Шаг 1 — отправка пароля:
{
"requires_email_code": true,
"requires_2fa": false,
"message": "Verification code sent to your email"
}
Шаг 2 — подтверждение кода:
Повторите запрос, добавив email_code. При успехе возвращается access/refresh token и данные пользователя.
POST /auth/refresh
Обновление access токена с помощью refresh токена.
| Параметр | Тип | Описание |
|---|---|---|
| refresh_token | string | required |
API ключи
GET /keys
Получить список API ключей пользователя.
POST /keys
Создать новый API ключ.
| Параметр | Тип | Описание |
|---|---|---|
| name | string | required — Название ключа |
| scopes | string[] | Массив разрешений |
DELETE /keys/:id
Отозвать (удалить) API ключ. Все запросы с этим ключом немедленно перестанут работать.
Webhooks
Webhooks позволяют получать уведомления о событиях TOKEN PAY ID в реальном времени. Настройте URL вашего сервера в личном кабинете.
Каждый webhook запрос содержит подпись в заголовке X-TPID-Signature для верификации подлинности.
{
"event": "user.login",
"timestamp": "2026-03-13T12:00:00Z",
"data": {
"user_id": "tpid_usr_a1b2c3d4",
"ip": "192.168.1.1",
"device": "Chrome — Windows"
}
}
Доступные события
| Событие | Описание |
|---|---|
| user.register | Новая регистрация пользователя |
| user.login | Успешный вход в аккаунт |
| user.logout | Выход из аккаунта |
| user.updated | Профиль обновлён |
| user.deleted | Аккаунт удалён |
| user.2fa.enabled | 2FA включена |
| user.2fa.disabled | 2FA отключена |
| key.created | Создан новый API ключ |
| key.revoked | API ключ отозван |
| session.created | Новая сессия |
| session.revoked | Сессия завершена |
| token.refreshed | Токен обновлён |
| user.oauth_connect | Пользователь одобрил OAuth авторизацию |
| user.oauth_cancel | Пользователь закрыл окно OAuth |
| user.oauth_deny | Пользователь отклонил OAuth запрос |
Widget SDK v1.2 — Быстрый старт
Виджет TOKEN PAY ID предоставляет три варианта кнопок для интеграции: стандартная, круглая иконка и прозрачный логотип. Все кнопки автоматически работают с OAuth 2.0 + PKCE.
https://tokenpay.space/sdk/tpid-widget.jsВерсия 1.2.0 — автообновления, без кэширования.
Минимальная интеграция (1 строка)
<script src="https://tokenpay.space/sdk/tpid-widget.js" data-client-id="tpid_pk_ваш_ключ"></script>
Виджет автоматически создаст кнопку «Войти через TOKEN PAY» на странице.
OAuth Popup Flow (Promise API)
Метод TPID.loginWithOAuth() открывает popup, проводит OAuth flow и возвращает Promise с authorization code.
TPID.loginWithOAuth({ prompt: 'login' })
.then(function(result) {
console.log('Auth code:', result.code);
console.log('State:', result.state);
// Отправьте code на ваш сервер для обмена на токен
})
.catch(function(err) {
console.error('OAuth error:', err);
});
Программный API (TPID)
| Метод | Описание |
|---|---|
| TPID.init(opts) | Инициализация с clientId, redirectUri, onSuccess, onError, lang, autoButton |
| TPID.open() | Открыть окно авторизации (redirect flow) |
| TPID.loginWithOAuth(opts) | OAuth popup flow → Promise<{code, state}> |
| TPID.renderButton(el, opts) | Рендер стандартной кнопки в контейнер |
| TPID.renderIconButton(el, opts) | Рендер круглой иконки |
| TPID.renderLogoButton(el, opts) | Рендер прозрачной кнопки-логотипа |
| TPID.version | Текущая версия виджета (1.2.0) |
SDK — JavaScript (Legacy tpid-auth.js)
Устаревший виджет. Рекомендуется использовать новый Widget SDK v1.2 (tpid-widget.js).
https://tokenpay.space/sdk/tpid-auth.jsОбновления автоматически доходят до интеграторов — файл не кэшируется.
Два типа кнопок
| Тип | Вид | Описание |
|---|---|---|
| icon | data-mode="icon" | Круглая иконка (щит TOKEN PAY) — как у Google/Apple. Размеры: 36×36 / 44×44 / 54×54 px |
| logo | data-mode="logo" | Прямоугольная кнопка с иконкой + текст «Войти через TOKEN PAY». Min/max ширина ограничена. |
1. Быстрое подключение (data-атрибуты)
<!-- Прямоугольная кнопка с текстом --> <script src="https://tokenpay.space/sdk/tpid-auth.js" data-client-id="tpid_pk_ваш_ключ" data-redirect-uri="https://ваш-сайт.com/callback" data-mode="logo" data-theme="dark" data-size="medium" data-lang="ru"> </script>
<!-- Круглая иконка --> <script src="https://tokenpay.space/sdk/tpid-auth.js" data-client-id="tpid_pk_ваш_ключ" data-redirect-uri="https://ваш-сайт.com/callback" data-mode="icon" data-theme="light" data-size="large"> </script>
2. Программный API
// Инициализация TokenPayAuth.init({ clientId: 'tpid_pk_ваш_ключ', redirectUri: 'https://ваш-сайт.com/callback', theme: 'dark', lang: 'ru', onSuccess: function(data) { console.log('Код:', data.code); } }); // Рендер кнопки в контейнер TokenPayAuth.renderButton('#my-container', { mode: 'logo', // 'icon' | 'logo' theme: 'dark', // 'dark' | 'light' | 'auto' size: 'medium', // 'small' | 'medium' | 'large' lang: 'ru' }); // Или запуск OAuth вручную TokenPayAuth.startAuth();
3. Обмен кода на токен (серверная сторона)
curl -X POST https://tokenpay.space/api/v1/oauth/token \ -H "Content-Type: application/json" \ -d '{ "grant_type": "authorization_code", "code": "tpid_code_...", "client_id": "tpid_pk_...", "client_secret": "tpid_sk_...", "redirect_uri": "https://ваш-сайт.com/callback", "code_verifier": "PKCE_VERIFIER" }'
4. Получение профиля пользователя
curl -X GET https://tokenpay.space/api/v1/oauth/userinfo \ -H "Authorization: Bearer ACCESS_TOKEN"
{
"id": "tpid_usr_a1b2c3d4e5f6",
"email": "user@example.com",
"name": "Иван",
"email_verified": true,
"created_at": "2026-01-15T12:00:00Z"
}
Параметры
| Параметр / Атрибут | Тип | Описание |
|---|---|---|
| clientId / data-client-id | string | required — Публичный ключ API (tpid_pk_...) |
| redirectUri / data-redirect-uri | string | required — URL для редиректа после авторизации |
| mode / data-mode | string | Тип кнопки: icon (круглая) или logo (прямоугольная, по умолчанию) |
| theme / data-theme | string | Тема: dark (белая кнопка), light (тёмная кнопка), auto |
| size / data-size | string | Размер: small (36px), medium (44px), large (54px) |
| lang / data-lang | string | Язык: ru или en |
| scope / data-scope | string | OAuth scope (по умолчанию openid email profile) |
| onSuccess | function | Callback: ({code, state, type}) => {} |
| onError | function | Callback при ошибке |
Ограничения размеров
| Режим | Small | Medium | Large |
|---|---|---|---|
| icon | 36×36 px | 44×44 px | 54×54 px |
| logo | h:36, w:180–320 px | h:44, w:220–400 px | h:54, w:260–480 px |
SDK — Python
pip install tokenpay-id
from tokenpay_id import TokenPayID client = TokenPayID( client_id="tpid_pk_your_public_key", client_secret="tpid_sk_your_secret_key" ) # Verify a user's token result = client.verify(access_token) print(result.user_id) # tpid_usr_... # Get user profile user = client.get_user(access_token) print(user.email) # user@example.com # Webhook signature verification is_valid = client.verify_webhook( payload=request.body, signature=request.headers["X-TPID-Signature"] )
SDK — Go
go get github.com/tokenpay/id-go
package main import ( tpid "github.com/tokenpay/id-go" ) func main() { client := tpid.NewClient(tpid.Config{ ClientID: "tpid_pk_your_public_key", ClientSecret: "tpid_sk_your_secret_key", }) // Verify token result, err := client.Verify(accessToken) if err != nil { log.Fatal(err) } fmt.Println(result.UserID) // tpid_usr_... }
Changelog
v2.1.0 — 18 марта 2026
OAuth 2.0
— Добавлена поддержка prompt=login для принудительной переавторизации
— Добавлена поддержка login_hint для предзаполнения email
— Исправлен баг BUG-01: при OAuth входе показывался admin аккаунт вместо пользователя
— Добавлена повторная валидация redirect_uri в /oauth/approve
— Новый эндпойнт: GET /oauth/branding — конфигурация кнопок и интеграционный код
Widget SDK v1.2.0
— 3 варианта кнопок: standard, icon (круглая), logo (прозрачная)
— Inline SVG иконка щита — без внешних зависимостей
— Новый метод TPID.loginWithOAuth() — OAuth popup flow с Promise API
— Автоматический рендер кнопок через data-tpid-button атрибуты
— Поддержка тем dark/light/auto
Безопасность
— Удалены hardcoded fallback-пароли из конфигурации
— Consent page очищает токены при prompt=login
— Login page: force=1 параметр полностью сбрасывает сессию
API
— OpenID Discovery обновлён: branding_endpoint, prompt_values_supported
— SDK версия обновлена до 1.2.0
— API версия обновлена до 2.1.0
