TOKEN PAY

API

Документация бесплатного и открытого API системы аутентификации. Интегрируйте единую систему идентификации в ваши сервисы и приложения через OAuth 2.0, REST API и SDK.

Base URL: https://id.tokenpay.space/api/v1

API использует JSON для всех запросов и ответов. Все запросы должны содержать заголовок Content-Type: application/json.

Быстрый старт

Для начала работы с API вам нужно:

1. Создать аккаунт TOKEN PAY ID
2. Получить API ключи в личном кабинете
3. Использовать секретный ключ для серверных запросов

cURL
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:

HTTP
Authorization: Bearer tpid_sk_7f3a9b2ce4d18...
Важно: Никогда не используйте секретный ключ (sk) в клиентском коде. Для фронтенда используйте публичный ключ (pk) и OAuth 2.0 flow.

OAuth 2.0 Bearer Token

Для пользовательских запросов используйте access_token полученный через OAuth 2.0 flow:

HTTP
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...

Лимиты запросов

API имеет следующие ограничения:

Тарифный планЗапросов/минЗапросов/день
Free6010,000
Pro300100,000
Enterprise1,000Unlimited

Заголовки ответа содержат информацию о лимитах:

Headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1678886400

Коды ошибок

API возвращает стандартные HTTP коды и JSON-объект ошибки:

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 к авторизации

Перенаправьте пользователя на страницу авторизации:

URL
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_idstringrequired — Публичный ключ
redirect_uristringrequired — URL для редиректа
response_typestringrequired — Только code
scopestringЗапрашиваемые разрешения (по умолч. profile)
statestringCSRF-токен (рекомендуется)
promptstringlogin — принудительная переавторизация, consent, none
login_hintstringEmail для предзаполнения формы входа
code_challengestringPKCE challenge (рекомендуется для SPA/мобильных)
code_challenge_methodstringS256 или plain

Шаг 2: Обмен кода на токен

После авторизации пользователь будет перенаправлен на ваш redirect_uri с параметром code. Обменяйте его на access_token:

POST /oauth/token

POST /api/v1/oauth/token

Обмен authorization code на access token.

ПараметрТипОписание
grant_typestringrequiredauthorization_code или refresh_token
codestringrequired — Authorization code
client_idstringrequired — Ваш публичный ключ
client_secretstringrequired — Ваш секретный ключ
redirect_uristringrequired — Должен совпадать с исходным
cURL
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"
  }'

Ответ

JSON — 200 OK
{
  "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

POST /api/v1/oauth/revoke

Отзыв access или refresh токена.

ПараметрТипОписание
tokenstringrequired — Токен для отзыва
token_type_hintstringaccess_token или refresh_token

GET /oauth/userinfo

GET /api/v1/oauth/userinfo

Получить профиль пользователя по OAuth access token. Возвращает данные в зависимости от запрошенного scope.

cURL
curl -X GET https://tokenpay.space/api/v1/oauth/userinfo \
  -H "Authorization: Bearer ACCESS_TOKEN"
JSON — 200 OK
{
  "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

POST /api/v1/oauth/cancel

Уведомить enterprise о том, что пользователь закрыл окно согласия (вызывается автоматически через sendBeacon). Запускает webhook user.oauth_cancel.

ПараметрТипОписание
client_idstringrequired
reasonstringПричина: window_closed, user_cancel

POST /oauth/deny

POST /api/v1/oauth/deny

Пользователь явно отклонил запрос на авторизацию. Запускает webhook user.oauth_deny и перенаправляет с ошибкой access_denied.

ПараметрТипОписание
client_idstringrequired
redirect_uristringrequired
statestringПередаётся обратно в redirect

GET /oauth/branding

GET /api/v1/oauth/branding

Получить конфигурацию кнопок, иконки и готовый код для интеграции виджета TOKEN PAY ID. Не требует аутентификации.

JSON — 200 OK (сокращённо)
{
  "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

GET /api/v1/users/me

Получить профиль текущего авторизованного пользователя.

JSON — 200 OK
{
  "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

PUT /api/v1/users/me

Обновить профиль пользователя.

ПараметрТипОписание
namestringИмя пользователя
avatar_urlstringURL аватара

GET /users/activity

GET /api/v1/users/activity

История активности пользователя: входы, API вызовы, изменения безопасности.

ПараметрТипОписание
limitintegerКоличество записей (по умолчанию 50, максимум 200)
offsetintegerСмещение для пагинации
typestringФильтр: auth, api, security

GET /users/sessions

GET /api/v1/users/sessions

Список активных сессий пользователя.

JSON — 200 OK
{
  "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

POST /api/v1/auth/send-code

Отправить 6-значный код верификации на email. Используется перед регистрацией и при входе.

ПараметрТипОписание
emailstringrequired — Email адрес
typestringrequiredregister или login
Rate limit: 1 код в 60 секунд на email. Код действителен 10 минут.
JSON — 200 OK
{
  "success": true,
  "message": "Verification code sent",
  "expires_in": 600
}

POST /auth/verify

POST /api/v1/auth/verify

Верификация access токена. Используется сторонними сервисами для проверки авторизации пользователя.

ПараметрТипОписание
tokenstringrequired — Access token для проверки
JSON — 200 OK
{
  "valid": true,
  "user_id": "tpid_usr_a1b2c3d4",
  "email": "user@example.com",
  "scopes": ["profile", "email"],
  "expires_at": 1678886400
}

POST /auth/register

POST /api/v1/auth/register

Регистрация нового пользователя. Требуется предварительная отправка кода через /auth/send-code.

ПараметрТипОписание
emailstringrequired
passwordstringrequired — Минимум 8 символов
namestringrequired
email_codestringrequired — 6-значный код из email (от /auth/send-code)
Обязательно: Перед регистрацией необходимо отправить код верификации через POST /auth/send-code с type: "register".

POST /auth/login

POST /api/v1/auth/login

Двухэтапная авторизация. Первый вызов с email+password отправляет код на почту и возвращает requires_email_code: true. Второй вызов с email+password+email_code завершает авторизацию.

ПараметрТипОписание
emailstringrequired
passwordstringrequired
email_codestring6-значный код из email (обязателен на втором шаге)
two_factor_codestringTOTP код, если 2FA включена

Шаг 1 — отправка пароля:

JSON — 200 OK
{
  "requires_email_code": true,
  "requires_2fa": false,
  "message": "Verification code sent to your email"
}

Шаг 2 — подтверждение кода:

Повторите запрос, добавив email_code. При успехе возвращается access/refresh token и данные пользователя.

POST /auth/refresh

POST /api/v1/auth/refresh

Обновление access токена с помощью refresh токена.

ПараметрТипОписание
refresh_tokenstringrequired

API ключи

GET /keys

GET /api/v1/keys

Получить список API ключей пользователя.

POST /keys

POST /api/v1/keys

Создать новый API ключ.

ПараметрТипОписание
namestringrequired — Название ключа
scopesstring[]Массив разрешений
Важно: Секретный ключ показывается только один раз при создании. Сохраните его в безопасном месте.

DELETE /keys/:id

DEL /api/v1/keys/:key_id

Отозвать (удалить) API ключ. Все запросы с этим ключом немедленно перестанут работать.

Webhooks

Webhooks позволяют получать уведомления о событиях TOKEN PAY ID в реальном времени. Настройте URL вашего сервера в личном кабинете.

Каждый webhook запрос содержит подпись в заголовке X-TPID-Signature для верификации подлинности.

JSON — Webhook Payload
{
  "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.enabled2FA включена
user.2fa.disabled2FA отключена
key.createdСоздан новый API ключ
key.revokedAPI ключ отозван
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.

CDN: https://tokenpay.space/sdk/tpid-widget.js
Версия 1.2.0 — автообновления, без кэширования.

Минимальная интеграция (1 строка)

HTML
<script src="https://tokenpay.space/sdk/tpid-widget.js"
        data-client-id="tpid_pk_ваш_ключ"></script>

Виджет автоматически создаст кнопку «Войти через TOKEN PAY» на странице.

Три варианта кнопок

ВариантАтрибутОписание
standarddata-tpid-button="standard"Полная кнопка с иконкой щита + текст «Войти через TOKEN PAY». Подходит для основных CTA.
icondata-tpid-button="icon"Круглая кнопка с иконкой щита. Идеально для навбара рядом с Google/Apple.
logodata-tpid-button="logo"Кнопка без фона — только логотип + текст. Для минималистичного дизайна.
HTML — Все 3 варианта
<!-- Стандартная кнопка -->
<div data-tpid-button="standard"></div>

<!-- Круглая иконка -->
<div data-tpid-button="icon"></div>

<!-- Логотип без фона -->
<div data-tpid-button="logo"></div>

OAuth Popup Flow (Promise API)

Метод TPID.loginWithOAuth() открывает popup, проводит OAuth flow и возвращает Promise с authorization code.

JavaScript
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);
  });
prompt=login гарантирует, что пользователь увидит форму входа, даже если уже авторизован. Это решает проблему «залогиненного админа».

Программный 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).

CDN (auto-sync): https://tokenpay.space/sdk/tpid-auth.js
Обновления автоматически доходят до интеграторов — файл не кэшируется.

Два типа кнопок

ТипВидОписание
icondata-mode="icon"Круглая иконка (щит TOKEN PAY) — как у Google/Apple. Размеры: 36×36 / 44×44 / 54×54 px
logodata-mode="logo"Прямоугольная кнопка с иконкой + текст «Войти через TOKEN PAY». Min/max ширина ограничена.

1. Быстрое подключение (data-атрибуты)

HTML — Кнопка LOGO (прямоугольная)
<!-- Прямоугольная кнопка с текстом -->
<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>
HTML — Кнопка ICON (круглая)
<!-- Круглая иконка -->
<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

JavaScript
// Инициализация
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
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
curl -X GET https://tokenpay.space/api/v1/oauth/userinfo \
  -H "Authorization: Bearer ACCESS_TOKEN"
JSON — 200 OK
{
  "id": "tpid_usr_a1b2c3d4e5f6",
  "email": "user@example.com",
  "name": "Иван",
  "email_verified": true,
  "created_at": "2026-01-15T12:00:00Z"
}

Параметры

Параметр / АтрибутТипОписание
clientId / data-client-idstringrequired — Публичный ключ API (tpid_pk_...)
redirectUri / data-redirect-uristringrequired — URL для редиректа после авторизации
mode / data-modestringТип кнопки: icon (круглая) или logo (прямоугольная, по умолчанию)
theme / data-themestringТема: dark (белая кнопка), light (тёмная кнопка), auto
size / data-sizestringРазмер: small (36px), medium (44px), large (54px)
lang / data-langstringЯзык: ru или en
scope / data-scopestringOAuth scope (по умолчанию openid email profile)
onSuccessfunctionCallback: ({code, state, type}) => {}
onErrorfunctionCallback при ошибке

Ограничения размеров

РежимSmallMediumLarge
icon36×36 px44×44 px54×54 px
logoh:36, w:180–320 pxh:44, w:220–400 pxh:54, w:260–480 px

SDK — Python

Install
pip install tokenpay-id
Python
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

Install
go get github.com/tokenpay/id-go
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

Нужна помощь?

Свяжитесь с нашей командой разработчиков

dev@tokenpay.space Обратная связь