Пользователи и профиль
В v2 у сайта одна роль — администратор этого сайта. Добавить человека на сайт — значит сделать его администратором; ролей «редактор» или «читатель» в API нет. Суперадмин сети отличается охватом (видит все сайты и делает сетевые операции), а не правами на сайте.
Пользователи сайта
Ручки под $API/site/$SITE/users; доступны администратору этого сайта и суперадмину.
Список
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/users" | jq '{total, users: [.users[] | {id, invite_id, email, name, status, added_at, last_login_at}]}'
{
"total": 2,
"users": [
{ "id": 42, "invite_id": null, "email": "anna@example.com", "name": "Anna", "status": "active", "added_at": "2026-09-22T18:14:41.000Z", "last_login_at": "2026-09-25T09:02:10.000Z" },
{ "id": null, "invite_id": 12, "email": "new@example.com", "name": "Новый человек", "status": "invited", "added_at": "2026-09-25T20:25:37.000Z", "last_login_at": null }
]
}
Строка двух видов, форма одна:
| Поле | Смысл |
|---|---|
status | active — человек сети, состоящий на сайте; invited — приглашённая почта, учётной записи ещё нет |
id | id пользователя; у приглашения null |
invite_id | id приглашения; у человека null |
email, name, avatar | почта, отображаемое имя, аватар Gravatar |
is_super_admin | суперадмин сети |
added_at | когда добавлен на сайт (у давних — дата регистрации), у приглашения — когда приглашён |
last_login_at | последний вход; отсчёт начат 22.09.2026, у входивших раньше null |
invited_by | кто пригласил (у приглашения) |
Сначала идут участники, затем приглашения. Суперадмин, которого не добавляли на сайт, в списке не появляется: доступ у него есть, но участником сайта он не является.
Добавить
curl -s -X POST "$API/site/$SITE/users" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"email": "new@example.com", "name": "Новый человек"}' | jq '{user: .user | {id, invite_id, status}, created, invited, already_member}'
{ "user": { "id": null, "invite_id": 12, "status": "invited" }, "created": true, "invited": true, "already_member": false }
Два исхода:
- почта уже есть в сети — человек сразу становится администратором сайта:
created: false,invited: false, вuserего карточка; - почты в сети нет — создаётся только приглашение (
201,created: true,invited: true). Ни учётной записи, ни пароля, ни письма. Как только человек войдёт с этой почтой любым способом (дашборд через Firebase, форма входа, регистрация), он получит роль администратора на всех пригласивших его сайтах, а приглашения закроются сами.
Письмо платформа не шлёт — сообщите человеку адрес дашборда сами: https://onpress.pro/dashboard/.
Отказы: 400 invalid_email (не адрес, длиннее 100 символов или запрещённый домен), 400 invalid_name, 409 already_member, 409 already_invited (в теле — карточка).
Снять с сайта
curl -s -X DELETE "$API/site/$SITE/users/42" -H "Authorization: Bearer $OP_TOKEN" | jq .removed # человек
curl -s -X DELETE "$API/site/$SITE/users/invite-12" -H "Authorization: Bearer $OP_TOKEN" | jq .removed # приглашение
Человек снимается с сайта, но не удаляется из сети — он может состоять на других сайтах. Запреты: себя снять нельзя (409 cannot_remove_self), последнего администратора — нельзя (409 last_admin), суперадмина может снять только суперадмин (403 insufficient_role). Нет такого — 404 not_member или 404 invite_not_found; путь не id и не invite-<id> — 400 invalid_user_id.
Свой профиль
/me — сетевые ручки: префикса сайта нет, blog_id и заголовки выбора сайта не читаются. Каждый видит и правит только себя. Работают и с токеном, и с сессией дашборда.
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/me" | jq .
{
"success": true,
"user": {
"id": 42,
"name": "Anna",
"email": "anna@example.com",
"avatar": "https://secure.gravatar.com/avatar/…?s=96&d=mm&r=g",
"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" }
}
sites_count — сколько живых сайтов вы администрируете (у суперадмина — вся сеть). api_token — только префикс и даты, сам токен здесь не бывает никогда (его отдаёт GET /me/api-token); null — токена нет.
avatar — фото аккаунта Google, если вы входили через Google, иначе фото Telegram, иначе Gravatar по почте (серый силуэт, если на Gravatar картинки нет). Фото Google обновляется при каждом входе. Тот же адрес — в строках списка пользователей сайта.
Изменить
curl -s -X PATCH "$API/me" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"name": "Анна", "dashboard_lang": "ru"}' | jq .user
| Поле | Правило |
|---|---|
name | отображаемое имя, не пустое, до 250 символов |
email | адрес, свободный во всей сети (409 email_taken); меняется сразу, без письма-подтверждения |
dashboard_lang | язык интерфейса дашборда: en или ru; "" — сбросить выбор (дашборд снова угадывает по браузеру). Это не язык сайта и не язык содержимого |
Пустое тело — 400 nothing_to_update. Ответ — тот же вид, что у GET /me. Пароля в профиле нет: вход идёт через Firebase. Своей загрузки аватара нет.
Токен
# показать свой действующий токен
curl -s "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN" | jq -r .token
# выпустить заново: новый токен в поле token
curl -s -X POST "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN" | jq '{prefix: .api_token.prefix, token}'
# отозвать
curl -s -X DELETE "$API/me/api-token" -H "Authorization: Bearer $OP_TOKEN" | jq '{revoked, api_token}'
Показать можно токен, выпущенный с 1 октября 2026 года; более старый отвечает 409 token_not_recoverable — его нужно один раз выпустить заново. Перевыпуск убивает прежний токен сразу, отзыв оставляет без токена (revoked: true, если было что отзывать). В дашборде то же самое: меню пользователя → «Настройки» → «API-ключи» (https://onpress.pro/dashboard/settings/api), блоки «Токен API» и «Отзыв токена». Подробно про свойства токена — доступ.