Пользователи и профиль
В 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 — только префикс и даты, сам токен здесь не бывает никогда; null — токена нет.
Изменить
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. Аватар — Gravatar по почте, своей загрузки нет.
Токен
# выпустить заново — единственный раз, когда токен виден
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}'
Перевыпуск убивает прежний токен сразу, отзыв оставляет без токена (revoked: true, если было что отзывать). В дашборде то же самое: меню пользователя → «Настройки» → «API-ключи» (https://onpress.pro/dashboard/settings/api), блоки «Токен API» и «Отзыв токена». Подробно про свойства токена — доступ.