uChecker Аутентификация API
Вход, регистрация, управление JWT-токенами и API ключами, привязка Telegram
Вход, регистрация, управление JWT-токенами и API ключами, привязка Telegram
openapi: 3.2.0
info:
title: UChecker Аутентификация API
description: "\n## О сервисе\n\nUChecker — платформа валидации email-адресов для маркетологов, ESP-провайдеров и разработчиков. Проверяйте email поштучно или массово — до миллионов адресов за одну задачу. API определяет существование почтового ящика на уровне SMTP, DNS/MX и провайдера, возвращая однозначный результат: `good` или `bad`.\n\nБазовый URL: `https://api.uchecker.net`\n\n---\n\n## Быстрый старт\n\n**Шаг 1.** Получите API ключ — он доступен в [личном кабинете](https://app.uchecker.net) сразу после регистрации.\n\n**Шаг 2.** Отправьте запрос на валидацию:\n```bash\ncurl -X POST https://api.uchecker.net/api/v1/validate/single \\\n -H \"x-api-key: ваш_ключ\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\": \"user@example.com\"}'\n```\n\n**Шаг 3.** Получите результат по `task_id` из ответа:\n```bash\ncurl https://api.uchecker.net/api/v1/tasks/123/results \\\n -H \"x-api-key: ваш_ключ\"\n```\n\n---\n\n## Аутентификация\n\nAPI поддерживает два равноценных способа аутентификации. Используйте любой из них — оба дают полный доступ ко всем эндпоинтам.\n\n### API Key (рекомендуется для интеграций)\n\nПередайте ключ в заголовке `x-api-key`. Ключ не истекает и действует до ручного сброса.\n\n```\nx-api-key: uk_xxxxxxxxxxxxx\n```\n\n### Bearer Token (рекомендуется для фронтенд-приложений)\n\nПолучите JWT через `POST /auth/login`, передайте в заголовке `Authorization`.\n\n```\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIs...\n```\n\n| Токен | Время жизни | Назначение |\n|-------|-------------|------------|\n| access_token | 1 час | Аутентификация запросов |\n| refresh_token | 7 дней | Обновление access_token через `POST /auth/refresh` |\n\n> **Совет:** при серверной интеграции используйте API Key — это проще и не требует управления токенами.\n\n---\n\n## Лимиты и тарификация\n\nUChecker работает по кредитной модели. Каждая проверка одного email-адреса списывает **1 кредит** с вашего баланса.\n\n- **Rate limits отсутствуют** — вы можете отправлять запросы с любой частотой.\n- Кредиты списываются в момент постановки email в очередь.\n- Email с невалидным синтаксисом (при массовой отправке) **не тарифицируются** и возвращаются в поле `invalid_details`.\n- Текущий баланс доступен через `GET /api/v1/account/balance`.\n\n---\n\n## Результаты валидации\n\nКаждый email получает одно из двух значений `validation_result`:\n\n| Результат | Описание |\n|-----------|----------|\n| `good` | Почтовый ящик существует и принимает почту. Адрес безопасен для рассылки. |\n| `bad` | Почтовый ящик не существует, отключён, или домен не принимает почту. |\n\nДля адресов со статусом `bad` в поле `result` указывается детальная причина: `mailbox_not_found`, `domain_not_found`, `smtp_rejected` и другие.\n\n---\n\n## Жизненный цикл задачи\n\nКаждый запрос на валидацию создаёт задачу (task), которая проходит через состояния:\n\n```\npending → processing → completed\n ↘ failed\n```\n\n| Состояние | Код | Описание |\n|-----------|-----|----------|\n| `pending` | 0 | Задача создана, ожидает начала обработки |\n| `processing` | 1 | Email-адреса проверяются. Прогресс доступен в поле `progress_percent` |\n| `completed` | 3 | Все адреса проверены. Результаты доступны для скачивания |\n| `failed` | -1 | Произошла ошибка. Обратитесь в поддержку с `task_id` |\n\n**Рекомендуемый polling-интервал:** каждые 5–10 секунд через `GET /api/v1/tasks/:taskId`. Или укажите `webhook_url` при создании задачи — мы отправим POST-запрос с результатами, когда задача завершится.\n\n---\n\n## Обработка ошибок\n\nAPI возвращает стандартные HTTP-коды и JSON-ответы:\n\n| Код | Значение | Когда возникает |\n|-----|----------|-----------------|\n| 200 | Успех | Запрос выполнен |\n| 400 | Ошибка запроса | Невалидные параметры, неверный формат данных |\n| 401 | Не авторизован | Отсутствует или неверный API ключ / JWT токен |\n| 403 | Доступ запрещён | Недостаточно кредитов на балансе |\n| 404 | Не найдено | Задача не существует или не принадлежит вашему аккаунту |\n| 500 | Внутренняя ошибка | Ошибка сервера — повторите запрос позже |\n\nТело ошибки всегда содержит поля `success: false` и `error` с человекочитаемым описанием.\n\n---\n\n## Поддержка\n\nПо вопросам интеграции и техническим вопросам: **support@uchecker.net**\n "
version: 1.0.0
contact: {}
servers:
- url: https://api.uchecker.net
description: Production
tags:
- name: Аутентификация
description: Вход, регистрация, управление JWT-токенами и API ключами, привязка Telegram
paths:
/auth/login:
post:
description: 'Аутентификация по email и паролю. При успешном входе возвращает набор данных для работы с API.
**Что возвращается:**
- `access_token` — JWT токен для аутентификации запросов (время жизни: **1 час**). Передавайте в заголовке `Authorization: Bearer <token>`.
- `refresh_token` — токен для обновления access_token (время жизни: **7 дней**). Используйте `POST /auth/refresh`.
- `api_key` — персональный API ключ для программного доступа. Не истекает.
- `user` — информация об аккаунте.
**Рекомендация:**
Для серверных интеграций используйте API ключ (`x-api-key`) вместо JWT — это проще и не требует логики обновления токенов. JWT подходит для фронтенд-приложений, где нужна сессия с ограниченным временем жизни.'
operationId: AuthController_login
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LoginDto'
responses:
'200':
description: Успешная аутентификация. Ответ содержит JWT токены, API ключ и данные аккаунта.
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'401':
description: Неверный email или пароль.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
summary: Вход по email и паролю
tags:
- Аутентификация
/auth/refresh:
post:
description: 'Обменивает действующий refresh token на новую пару access + refresh токенов. Используется для продления сессии без повторного ввода пароля.
**Ротация токенов:**
При каждом вызове старый refresh token **немедленно аннулируется**, и выдаётся новый. Это обеспечивает безопасность: если refresh token скомпрометирован, он может быть использован только один раз.
**Когда вызывать:**
Вызывайте этот эндпоинт, когда access token истёк (ответ `401`) или заблаговременно — например, за 5 минут до истечения. Refresh token действует 7 дней.
**Важно:** для вызова этого эндпоинта необходимо передать текущий access token в заголовке `Authorization`, даже если он просрочен — сервер проверяет его подпись, но не срок действия.'
operationId: AuthController_refresh
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RefreshTokenDto'
responses:
'200':
description: Новая пара токенов. Старый refresh token аннулирован.
content:
application/json:
schema:
$ref: '#/components/schemas/RefreshTokenResponse'
'401':
description: Refresh token недействителен, просрочен или уже был использован.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
security:
- bearer: []
summary: Обновить JWT токены
tags:
- Аутентификация
/auth/telegram-login:
post:
description: 'Аутентификация по Telegram chat ID. Предназначен для интеграции с Telegram-ботом UChecker.
**Как это работает:**
1. Пользователь взаимодействует с Telegram-ботом UChecker.
2. Бот получает `chat_id` пользователя и вызывает этот эндпоинт.
3. Если аккаунт с таким `chat_id` существует — возвращаются JWT токены и API ключ (аналогично `POST /auth/login`).
**Требования:**
Аккаунт должен быть предварительно привязан к Telegram через `POST /auth/link-telegram` или создан через бота. Если аккаунт не найден — возвращается ошибка 400.
**Область применения:** этот эндпоинт используется внутренним Telegram-ботом и не предназначен для прямого вызова из пользовательских приложений.'
operationId: AuthController_telegramLogin
parameters: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
telegram_id:
type: string
example: '123456789'
description: Telegram chat ID пользователя (числовой, передаётся как строка)
required:
- telegram_id
responses:
'200':
description: Успешная аутентификация. Ответ идентичен `POST /auth/login`.
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'400':
description: Аккаунт с указанным Telegram chat ID не найден. Необходима привязка.
summary: Вход через Telegram
tags:
- Аутентификация
/auth/forgot-password:
post:
description: 'Инициирует процесс восстановления пароля. Если указанный email зарегистрирован, на него отправляется письмо со ссылкой для сброса (через тот же канал, что и подтверждение регистрации — Rusender).
**Защита от перебора:**
Эндпоинт всегда возвращает одно и то же сообщение, независимо от того, зарегистрирован email или нет. Это защищает от перечисления существующих аккаунтов.
**Срок действия ссылки:** 60 минут с момента отправки письма. Повторный вызов выпускает новый токен — старая ссылка перестаёт работать.
**Что происходит после сброса:**
После успешной смены пароля (`POST /auth/reset-password`) все активные сессии аккаунта инвалидируются — refresh_token обнуляется. На всех устройствах потребуется повторный вход.'
operationId: AuthController_forgotPassword
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ForgotPasswordDto'
responses:
'200':
description: Запрос принят. Если email зарегистрирован — письмо отправлено.
summary: Запросить сброс пароля
tags:
- Аутентификация
/auth/reset-password:
post:
description: 'Завершает процесс сброса пароля. Принимает одноразовый токен из письма и новый пароль.
**Поведение:**
- Токен валидируется по сроку действия (60 минут). Просроченный или несуществующий токен — `400`.
- При успехе пароль заменяется, токен обнуляется, все активные сессии завершаются (refresh_token = null).
- Эндпоинт **не возвращает JWT** — пользователь должен войти с новым паролем через `POST /auth/login`.'
operationId: AuthController_resetPassword
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ResetPasswordDto'
responses:
'200':
description: Пароль успешно изменён.
'400':
description: Токен недействителен или истёк.
summary: Установить новый пароль по токену из письма
tags:
- Аутентификация
/auth/reset-api-key:
post:
description: 'Генерирует новый API ключ и **немедленно аннулирует** предыдущий. Все запросы со старым ключом начнут возвращать `401 Unauthorized`.
**Когда использовать:**
- Подозрение на компрометацию ключа.
- Ротация ключей в рамках политики безопасности.
- Передача доступа другому разработчику.
**Важные моменты:**
- Требуется JWT аутентификация (`Authorization: Bearer <token>`). API ключ нельзя использовать для его собственного сброса.
- Новый ключ возвращается в ответе **один раз**. Сохраните его — в дальнейшем он отображается только в маскированном виде.
- Все активные интеграции, использующие старый ключ, перестанут работать. Обновите ключ во всех системах.'
operationId: AuthController_resetApiKey
parameters: []
responses:
'200':
description: Новый API ключ сгенерирован. Старый ключ аннулирован.
content:
application/json:
schema:
$ref: '#/components/schemas/ResetApiKeyResponse'
'401':
description: JWT токен отсутствует, невалиден или просрочен.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
security:
- bearer: []
summary: Сбросить и перегенерировать API ключ
tags:
- Аутентификация
/auth/link-telegram:
post:
description: 'Начинает процесс привязки Telegram-аккаунта к веб-аккаунту UChecker. После привязки пользователь сможет входить через Telegram-бота и управлять задачами из мессенджера.
**Пошаговый процесс привязки:**
1. Пользователь пишет команду `/link` в Telegram-бот UChecker и получает 6-значный код.
2. Пользователь вводит этот код в личном кабинете на сайте — приложение вызывает данный эндпоинт.
3. Бот отправляет пользователю запрос на подтверждение в Telegram.
4. Пользователь подтверждает в боте — привязка завершена.
**Ошибки:**
- Неверный или просроченный код — `400`.
- Аккаунт уже привязан к другому Telegram — `400`.
- Telegram-аккаунт уже привязан к другому веб-аккаунту — `400`.'
operationId: AuthController_initiateLinkTelegram
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/InitiateLinkDto'
responses:
'200':
description: Запрос на привязку создан. Ожидается подтверждение в Telegram-боте.
'400':
description: Неверный/просроченный код, аккаунт уже привязан, или Telegram ID уже используется.
security:
- bearer: []
summary: Инициировать привязку Telegram аккаунта
tags:
- Аутентификация
/auth/confirm-link:
post:
description: 'Завершает процесс привязки Telegram-аккаунта. Вызывается Telegram-ботом, когда пользователь нажимает кнопку «Подтвердить» или «Отклонить».
**Внутренний эндпоинт:**
Предназначен для вызова Telegram-ботом, а не пользовательскими приложениями напрямую.
**Параметры:**
- `request_id` — идентификатор запроса на привязку (из callback_data кнопки).
- `chat_id` — Telegram chat ID для дополнительной верификации.
- `confirmed` — `true` для подтверждения, `false` для отклонения.
**Поведение:**
При подтверждении (`confirmed: true`) Telegram chat ID привязывается к веб-аккаунту, и пользователь получает возможность входить через бота. При отклонении запрос аннулируется.'
operationId: AuthController_confirmLink
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ConfirmLinkDto'
responses:
'200':
description: Привязка подтверждена или отклонена.
'400':
description: Запрос на привязку не найден, истёк, или уже обработан.
summary: Подтвердить или отклонить привязку Telegram (для бота)
tags:
- Аутентификация
/auth/confirm-link-simple:
post:
description: 'Упрощённая версия подтверждения привязки Telegram — автоматически находит ожидающий запрос по `chat_id`, не требуя `request_id`.
**Когда использовать:**
Используйте этот эндпоинт вместо `POST /auth/confirm-link`, если у бота нет доступа к `request_id` из callback_data — например, при обработке текстовых команд вместо inline-кнопок.
**Внутренний эндпоинт:**
Предназначен для вызова Telegram-ботом. Если для указанного `chat_id` нет ожидающих запросов — возвращается ошибка 400.'
operationId: AuthController_confirmLinkSimple
parameters: []
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
chat_id:
type: number
example: 123456789
description: Telegram chat ID пользователя
confirmed:
type: boolean
example: true
description: true — подтвердить привязку, false — отклонить
required:
- chat_id
- confirmed
responses:
'200':
description: Привязка подтверждена или отклонена.
'400':
description: Нет ожидающих запросов на привязку для указанного chat_id.
summary: Подтвердить привязку по chat_id (упрощённая версия, для бота)
tags:
- Аутентификация
/auth/pending-links:
get:
description: 'Возвращает список ожидающих (неподтверждённых) запросов на привязку Telegram-аккаунта для указанного `chat_id`.
**Внутренний эндпоинт:**
Используется Telegram-ботом для проверки наличия запросов перед показом кнопок подтверждения пользователю.
**Типичный сценарий:**
1. Бот получает команду или callback от пользователя.
2. Бот вызывает этот эндпоинт, передавая `chat_id`.
3. Если есть ожидающие запросы — бот показывает кнопки «Подтвердить» / «Отклонить».
4. Если нет — бот сообщает, что запросов нет.
Запросы на привязку имеют ограниченный срок действия. Просроченные запросы не возвращаются.'
operationId: AuthController_getPendingLinks
parameters:
- name: chat_id
required: true
in: query
schema:
type: string
responses:
'200':
description: Массив ожидающих запросов на привязку. Пустой массив, если запросов нет.
summary: Проверить ожидающие запросы на привязку (для бота)
tags:
- Аутентификация
/auth/register-with-code:
post:
description: 'Регистрация нового веб-аккаунта с одновременной привязкой к существующему Telegram-аккаунту. Позволяет пользователям бота получить полноценный веб-доступ к платформе.
**Сценарий использования:**
Пользователь начал работу через Telegram-бот и хочет зарегистрироваться на сайте, сохранив свой баланс и историю задач.
**Как это работает:**
1. Пользователь запрашивает 6-значный код в Telegram-боте (команда `/link`).
2. На странице регистрации вводит email, пароль и код.
3. Система создаёт веб-аккаунт и привязывает его к Telegram-аккаунту.
4. Баланс кредитов и история задач из бота становятся доступны в веб-интерфейсе.
**Без кода:**
Если `telegram_code` не передан — создаётся обычный веб-аккаунт без привязки к Telegram.
**Ошибки:**
- `400` — код невалиден или просрочен.
- `409` — email уже зарегистрирован, или Telegram-аккаунт уже привязан к другому веб-аккаунту.'
operationId: AuthController_registerWithCode
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RegisterWithCodeDto'
responses:
'200':
description: Аккаунт создан. Если передан telegram_code — привязка к Telegram выполнена.
'400':
description: Telegram-код невалиден или просрочен.
'409':
description: 'Конфликт: email уже зарегистрирован или Telegram-аккаунт уже привязан.'
summary: Регистрация с привязкой Telegram
tags:
- Аутентификация
/api/v1/billing/history:
get:
description: 'Возвращает постраничный список всех платёжных транзакций для текущего аккаунта, отсортированных по дате — новые первыми.
**Что включено в историю:**
Каждая запись содержит сумму, статус, описание пакета, дату и идентификатор платежа. Отображаются транзакции во всех состояниях.
**Статусы транзакций:**
| Статус | Описание |
|--------|----------|
| `pending` | Платёж инициирован, ожидает подтверждения от платёжной системы |
| `completed` | Платёж успешен, кредиты зачислены на баланс |
| `failed` | Платёж отклонён платёжной системой |
| `cancelled` | Платёж отменён пользователем или по таймауту |
**Пагинация:**
Используйте параметры `page` и `limit`. Ответ содержит объект `pagination` с полями `total` и `totalPages` для навигации.'
operationId: BillingController_getPaymentHistory
parameters:
- name: limit
required: false
in: query
description: 'Количество записей на странице. По умолчанию: 10.'
schema:
example: 10
type: number
- name: page
required: false
in: query
description: 'Номер страницы. Нумерация начинается с 1. По умолчанию: 1.'
schema:
example: 1
type: number
responses:
'200':
description: Постраничный список транзакций с метаданными пагинации.
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentHistoryResponse'
'401':
description: Не авторизован. Проверьте API ключ или JWT токен.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedResponse'
security:
- bearer: []
- api-key: []
summary: Получить историю платежей
tags:
- Аутентификация
/api/v1/referral/click:
post:
description: 'Вызывается из браузера с `credentials: ''include''`. Записывает клик и устанавливает cookie атрибуции `uc_attr` сроком на 30 дней.
Cookie не перезаписывается, если уже установлена: побеждает первый переход (first-click).
Всегда возвращает `204` независимо от того, удалось ли опознать партнёра — иначе перебором можно было бы выяснить, какие коды заняты.'
operationId: ReferralController_trackClick
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TrackClickDto'
responses:
'204':
description: Запрос принят.
summary: Зафиксировать переход по партнёрской ссылке
tags:
- Аутентификация
/api/v1/referral/me:
get:
description: 'Если партнёрская программа для аккаунта не включена, возвращает только `{ enabled: false }` — дашборд по этому призна�
# --- truncated at 32 KB (51 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/uchecker/refs/heads/main/openapi/uchecker-default-api-openapi.yml