Справочник: пользователи и профиль
Здесь все эндпоинты пользователей сайта (/site/$SITE/users) и своего профиля (/me) с параметрами, ответами и отказами; зачем они и как ими пользоваться — на странице «Пользователи и профиль».
Во всех примерах API — https://onpress.pro/api/v2, SITE — id сайта (SITE_ID), OP_TOKEN — токен op_XXXX. Эндпоинты /me пишутся без /site/$SITE: они про вас, а не про сайт. Как получить токен и в какой форме приходят отказы — на странице «Доступ и токен».
Пользователи сайта
У сайта одна роль — администратор: каждый пользователь сайта читает и правит его целиком. Все три эндпоинта доступны только администратору сайта, остальным — 403 insufficient_role.
GET /users
Отдаёт пользователей сайта и приглашения: сначала пользователи по id, за ними приглашения по времени. Например:
curl -s "$API/site/$SITE/users" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"site_id": "x9HTLHECq",
"total": 2,
"users": [
{ "id": 42, "invite_id": null, "email": "anna@example.com", "name": "Anna", "avatar": "https://lh3.googleusercontent.com/…", "added_at": "2026-09-20T10:00:00.000Z", "last_login_at": "2026-10-27T09:02:10.000Z", "status": "active", "invited_by": null },
{ "id": null, "invite_id": 12, "email": "boris@example.com", "name": "Boris", "avatar": "https://secure.gravatar.com/avatar/…?s=96&d=mm&r=g", "added_at": "2026-10-25T20:25:37.000Z", "last_login_at": null, "status": "invited", "invited_by": 42 }
]
}
| Поле | Описание |
|---|---|
id | id пользователя; у приглашения null |
invite_id | id приглашения; у пользователя null |
email, name | почта и имя |
avatar | фото, как в профиле |
added_at | когда добавлен или приглашён |
last_login_at | последний вход; null — входов не было |
status | active — пользователь, invited — приглашение ещё не принято |
invited_by | id того, кто пригласил |
can_impersonate в корне ответа — служебный признак консоли, агенту он не нужен.
POST /users
Добавляет человека на сайт администратором по почте. Если у почты уже есть учётная запись, человек сразу становится администратором сайта; если нет — создаётся приглашение, и он станет администратором после первого входа. Ответ приходит со статусом 201. Например, пригласить Бориса:
curl -s -X POST "$API/site/$SITE/users" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"email": "boris@example.com", "name": "Boris"}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
email | string | — | почта, до 100 символов |
name | string | "" | имя для приглашения, до 250 символов |
{ "success": true, "site_id": "x9HTLHECq", "user": { "id": null, "invite_id": 12, "email": "boris@example.com", "status": "invited", "…": "…" }, "created": true, "already_member": false, "invited": true }
invited: true — создано приглашение; invited: false — почта уже была на платформе, человек добавлен сразу.
| Код | Статус | Когда | Что делать |
|---|---|---|---|
invalid_email | 400 | не адрес почты или длиннее 100 символов | исправьте email |
invalid_name | 400 | name не строка или длиннее 250 символов | исправьте name |
insufficient_role | 403 | вы не администратор этого сайта | — |
already_member | 409 | человек уже на сайте; карточка в user | ничего делать не нужно |
already_invited | 409 | приглашение уже есть; карточка в user | ничего делать не нужно |
DELETE /users/{id}
Снимает пользователя с сайта или отзывает приглашение; учётная запись на платформе остаётся. {id} — id пользователя или invite-<id> приглашения. Например, отозвать приглашение 12:
curl -s -X DELETE "$API/site/$SITE/users/invite-12" -H "Authorization: Bearer $OP_TOKEN"
{ "success": true, "site_id": "x9HTLHECq", "removed": { "id": null, "invite_id": 12, "email": "boris@example.com", "name": "Boris" } }
| Код | Статус | Когда | Что делать |
|---|---|---|---|
invalid_user_id | 400 | в пути не число и не invite-<id> | исправьте путь |
insufficient_role | 403 | вы не администратор этого сайта | — |
not_member | 404 | такого пользователя на сайте нет | проверьте id в GET /users |
invite_not_found | 404 | такого приглашения нет | проверьте invite_id |
cannot_remove_self | 409 | снять себя нельзя | попросите другого администратора |
last_admin | 409 | это последний администратор сайта | сначала добавьте другого |
Свой профиль
GET /me
Отдаёт ваш профиль, число ваших сайтов и сведения о токене. Например:
curl -s "$API/me" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"user": { "id": 42, "name": "Anna", "email": "anna@example.com", "avatar": "…", "is_super_admin": false, "registered": "2025-03-01T10:00:00.000Z", "last_login_at": "2026-09-25T09:02:10.000Z", "dashboard_lang": "ru" },
"sites_count": 3,
"api_token": { "prefix": "op_xxxxxxxx", "created_at": "2026-09-16T13:04:25.000Z", "last_used_at": "2026-09-25T20:11:36.000Z" },
"impersonated_by": null
}
| Поле | Описание |
|---|---|
user.dashboard_lang | язык консоли: en, ru или "" — по языку браузера |
sites_count | сколько у вас сайтов |
api_token | префикс, дата выпуска и последнего обращения; null — токена нет. Сам токен отдаёт GET /me/api-token |
Аватар
user.avatar — фото аккаунта Google, если вы входили через Google; иначе фото Telegram, если входили через Telegram; иначе Gravatar по почте (серый силуэт, если картинки на Gravatar нет). Фото Google обновляется при каждом входе через Google. Тот же адрес отдают строки GET /users. Своей загрузки аватара нет. Картинки Google не открываются со сторонним Referer — выводите их с referrerpolicy="no-referrer".
PATCH /me
Меняет имя, почту или язык консоли; передайте одно поле или несколько. Ответ — как у GET /me. Например, сменить имя:
curl -s -X PATCH "$API/me" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "Anna"}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
name | string | — | не пустое, до 250 символов |
email | string | — | адрес почты, свободный на платформе |
dashboard_lang | string | — | en, ru или "" — по языку браузера |
| Код | Статус | Когда | Что делать |
|---|---|---|---|
nothing_to_update | 400 | нет ни одного поля | передайте name, email или dashboard_lang |
invalid_name | 400 | пустое или длиннее 250 символов | исправьте name |
invalid_email | 400 | не адрес почты | исправьте email |
invalid_dashboard_lang | 400 | язык не поддерживается; допустимые — в allowed | возьмите значение из allowed |
email_taken | 409 | почта занята другой учётной записью | выберите другую |
Вход и пароль
Оба эндпоинта работают с входом того пользователя, чьим токеном или сессией сделан запрос. Если служба входа временно недоступна, они отвечают 503 firebase_admin_key_missing или 503 auth_not_configured — повторите позже.
GET /me/auth
Отдаёт, чем вы на самом деле входите: есть ли пароль и подключён ли Google. Ответ не кэшируется. Например:
curl -s "$API/me/auth" -H "Authorization: Bearer $OP_TOKEN"
{
"success": true,
"email": "anna@example.com",
"last_login_at": "2026-10-07T10:04:19.000Z",
"firebase": "linked",
"has_password": true,
"google": { "email": "anna@example.com" }
}
| Поле | Описание |
|---|---|
email | почта учётной записи |
last_login_at | последний вход; null — входов не было |
firebase | linked — аккаунт входа найден; none — входа ещё нет |
has_password | можно ли войти по почте с паролем |
google | {email} — вход через Google подключён; null — нет |
firebase: "none", has_password: false и google: null вместе — не ошибка, а честное «входа ещё нет»: пароль можно задать через POST /me/password.
POST /me/password
Задаёт вам новый пароль. Пароль был — он заменяется; пароля не было (вход только через Google) — он добавляется, а вход через Google сохраняется. Подтверждение вторым полем и прежний пароль не нужны: правом служит сам токен или сессия. Не больше 20 запросов в минуту. Например:
curl -s -X POST "$API/me/password" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"password": "NEW_PASSWORD"}'
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
password | string | — | от 8 до 4096 символов |
{ "success": true, "user": { "id": 42, "email": "anna@example.com", "name": "Anna" } }
| Код | Статус | Когда | Что делать |
|---|---|---|---|
weak_password | 400 | короче 8 символов или слишком простой | возьмите пароль сложнее |
invalid_password | 400 | длиннее 4096 символов | сократите |
user_not_found | 404 | учётной записи нет или она заблокирована | напишите в поддержку |
no_email | 409 | у учётной записи нет почты | задайте почту через PATCH /me |
firebase_email_taken | 409 | эту почту уже занял другой аккаунт входа | напишите в поддержку |
firebase_admin_error | 502 | служба входа отказала, код в firebase_code | повторите позже |
Токен API
GET /me/api-token
Отдаёт ваш действующий токен целиком — например, чтобы передать его агенту. Токен хранится зашифрованным, поэтому показывается сколько угодно раз, но только выпущенный с 1 октября 2026 года: у более старых сохранён только отпечаток, их нужно один раз выпустить заново. Ответ с Cache-Control: no-store. Например:
curl -s "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN"
{ "success": true, "token": "op_XXXX" }
| Код | Статус | Когда | Что делать |
|---|---|---|---|
token_missing | 404 | токена нет | выпустите его через POST /me/api-token |
token_not_recoverable | 409 | токен выпущен до 1 октября 2026 года | выпустите заново |
POST /me/api-token
Выпускает токен заново. Прежний токен перестаёт работать сразу — у всех скриптов и агентов, которые им пользуются. Ответ — как у GET /me плюс token — новый токен целиком; потом его можно снова получить через GET /me/api-token. Например:
curl -s -X POST "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN"
DELETE /me/api-token
Отзывает токен: войти по нему больше нельзя. Ответ — как у GET /me с api_token: null и revoked — true, если было что отзывать. Например:
curl -s -X DELETE "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN"