Документация Пространства Cloud и совместная работа

Пространства Cloud и совместная работа

Пространство (Space) — явный контекст совместной работы в Mockarty Cloud. Кабинет показывает все Пространства, которыми вы владеете или к которым присоединились, и запоминает текущий выбор в браузере. Если доступно несколько Пространств, выберите нужное перед работой с командой, биллингом, средами, Desktop или аудитом: Mockarty не подставляет первое Пространство владельца.

Создание Пространства

Первое Пространство создаётся вместе с аккаунтом — оно личное. Чтобы завести
ещё одно личное совместное Пространство, откройте Cloud cabinet → Обзор, введите
название в поле Название нового Пространства и нажмите Создать
Пространство
. Больше ничего вводить не нужно: короткий идентификатор в адресе
Mockarty составит сам, в том числе для названия на русском.

У нового личного Пространства свои участники, приглашения и данные, а оплата остаётся
общей с личным аккаунтом. Сразу после создания кабинет переключается на него.
Оплачиваемые Пространства Team относятся к отдельному аккаунту Team и создаются
кнопкой Создать Team Space в разделе Использование; см. Обзор организации.

Сколько личных Пространств можно создать, зависит от личного тарифа. Для
Пространств Team действует отдельная вместимость Team. Когда личные места заняты, кнопка
выключена и рядом написано, сколько их даёт тариф и сколько уже занято, —
освободите одно или перейдите на тариф, где Пространств больше.

Достигнутый лимит Пространств не блокирует аккаунт и не удаляет существующие
Пространства. Обзор показывает предупреждение о квоте. Если после понижения
тарифа личных Пространств больше, чем разрешает новый тариф, лишние остаются
доступными для чтения и экспорта. В Обзоре кабинета Cloud найдите блок
Активные личные Пространства и выберите, в каких можно продолжать изменения. Первое личное
Пространство всегда остаётся активным. Для принадлежащих вам Пространств и
тех, куда вас пригласили, действуют отдельные лимиты; оба видны в панели.
Пока превышен лимит личных Пространств, нельзя создать новое или пригласить
новых участников. При повышении тарифа подходящие существующие Пространства
снова становятся доступны без удаления данных.
Пока вы устраняете превышение, можно выйти из Пространства, удалить участника
или отозвать ожидающее приглашение; переименование и другие изменения
возобновятся, когда Пространство снова станет активным.

Выбор сохраняется по показанной в кабинете ревизии. Если другая вкладка успела
изменить его раньше, проверьте обновлённый список и сохраните ещё раз. Для
этой настройки аккаунта нужна сессия Cloud; API-токена недостаточно.
Автоматизациям менять её не требуется.
На время согласования новых правил доступа Cloud с общим узлом кабинет может
показать Подтверждаем ограничения. До завершения действует прежний выбор;
не считайте новый набор активным, пока подтверждение не закончится. Если за
это время изменился тариф или состав Пространств, проверьте выбор и сохраните
его заново.
После неудачного подтверждения кабинет сохраняет отмеченный вами выбор: его
можно поправить, не начиная заново. До повторного сохранения он не применяется.

GET /api/v1/cloud/personal/active-set
PUT /api/v1/cloud/personal/active-set
Content-Type: application/json

{"revision":7,"active_space_ids":["11111111-1111-4111-8111-111111111111"]}

GET возвращает названия Пространств, признак владения, статус writable и
pending_transition_id, пока идёт подтверждение. PUT возвращает 202 с ID
перехода. Повторяйте GET, пока ожидающий ID не исчезнет, затем сравните
last_transition_id с ответом PUT: только last_transition_status: "committed"
подтверждает применение этого выбора. Статус "aborted" означает, что тариф
или состав Пространств изменился; проверьте сохранённый черновик и повторите.
Одного увеличения ревизии недостаточно: её могло изменить другое действие.
В PUT нужно включить первое личное Пространство и не превысить текущие лимиты
своих и гостевых Пространств. Устаревшая ревизия даёт 409 active_set_stale:
обновите выбор перед повторной попыткой. SDK и CLI намеренно не включают
это интерактивное решение владельца.

Удаление Пространства и его возврат

Удаление Пространства не уничтожает его сразу. Оно остаётся восстановимым
7 дней, и точная дата видна рядом с ним в кабинете — на экране Пространств,
в блоке Недавно удалённые Пространства. Нажмите там Восстановить, и
Пространство вернётся с участниками и данными в прежнем виде.

Занятое им место освобождается сразу: создать другое Пространство можно тут же
после удаления, ждать окончания срока не нужно.

За сутки до конца срока владелец Пространства получает письмо о том, какое
Пространство будет удалено и до какого числа. Если вы удалили что-то случайно и
не заметили, это письмо — последняя возможность вмешаться.

После окончания срока содержимое Пространства удаляется и восстановлению не
подлежит, а его имя освобождается для нового Пространства. Восстановление после
этого момента отклоняется, а не возвращает пустое Пространство под старым именем.

Что стоит знать до удаления:

  • Пространство Команды по умолчанию нельзя удалить, пока оно держит Команду.
    Сначала назначьте Пространством по умолчанию другое.
  • Пока удалённое Пространство ещё восстановимо, его имя остаётся занятым —
    именно это позволяет вернуть его под знакомым вам именем.

Если вы подписаны на вебхуки, событие space.deleted несёт reversible: true
и recoverable_until, поэтому интеграция может запланировать свою уборку на
момент после окончания срока, а не выполнять её сразу по факту удаления.

Роли

  • Владелец приглашает участников, меняет роли, удаляет участников и управляет биллингом.
  • Администратор приглашает и удаляет участников, кроме владельца.
  • Редактор работает с ресурсами и просматривает список участников.
  • Наблюдатель получает доступ только для чтения.
  • Менеджер биллинга управляет биллингом без администрирования команды.

Кабинет скрывает или отключает недоступные текущей роли действия. Те же права проверяет API; состояние кнопок не является границей безопасности. Владелец и администратор могут изменить видимое пользователям название в разделе Cloud cabinet -> Пространство. Стабильный slug и коммерческие идентификаторы при переименовании не меняются.

Для Пространства Team изменение названия, приглашений, состава участников и владения также требует действующих Team, аккаунта, членства и закреплённого места. Приостановленный участник не может входить в Пространства Team или использовать платные полномочия Team. Его назначения в Пространства сохраняются в неактивном состоянии для безопасного возобновления, а собственное членство остаётся видно в центре Team, чтобы он мог выйти.
Пространство Team по умолчанию нельзя удалить, пока оно служит основой Team.

Приглашение участника

Откройте Cloud cabinet → Команда, выберите нужное Пространство, укажите email и роль, затем нажмите Отправить приглашение. Получатель открывает ссылку и видит карточку приглашения с приглашённым адресом, ролью и сроком действия. Тот, кто ещё не вошёл, попадает на форму регистрации с уже подставленным адресом — приглашение обычно приходит раньше аккаунта, — а на вход можно переключиться одним нажатием, если аккаунт уже есть. На телефоне карточка находится под формой, а не поверх неё, поэтому доступны обе.

Ссылка содержит одноразовый токен: передайте её только получателю и не сохраняйте в логах или задачах. Владелец и администратор могут отозвать неиспользованное приглашение на этой же странице.

Для Free кабинет показывает принятых участников и ожидающие приглашения вместе с текущим лимитом. Один человек может участвовать не более чем в трёх совместных Free Пространствах. На платных тарифах используется число доступных платных мест. При достижении лимита ответ сообщает, какое место нужно освободить или какой тариф обновить; неуспешный приём не создаёт частичное членство.

Месячный объём Free-пространства — запросы, минуты раннера и трафик — принадлежит владельцу пространства. Приглашённый участник может открыть пространство и его общий узел, но его собственные запросы к общим проектам и синхронизации пространства получают отказ с объяснением, что объём Free принадлежит владельцу. Чтобы вместе работать с общими проектами, перейдите на Team: каждый участник Team расходует пакет команды.

Изменения участников и приглашений появляются в других открытых сессиях кабинета без перезагрузки страницы. Кабинет держит один аутентифицированный поток GET /api/v1/cloud/spaces/events, а после события resync полностью перечитывает список Пространств текущего пользователя и команду выбранного Пространства. После переподключения также выполняется полное обновление, поэтому временный разрыв соединения не оставляет устаревшее членство на экране. При конфликте с более новой ревизией кабинет обновляет текущее Пространство перед следующей попыткой.

Если список команды не загрузился, кабинет показывает кнопку «Повторить», а не бесконечную загрузку или неполный список как окончательный. При переключении Пространств запоздавший ответ или сетевая ошибка прежнего Пространства не подменяет состав новой команды.

Если активное Пространство изменилось, пока вы подтверждали удаление участника, передачу владения, удаление SAML или отзыв десктопа, кабинет отменяет действие. Выберите нужное Пространство и начните действие заново.

Поток событий служит транспортом инвалидации для браузерного кабинета, а не лентой записей. Автоматизации через SDK и CLI должны использовать канонические списковые операции и их курсоры, поэтому поток намеренно не представлен отдельным методом SDK или CLI.

Автоматизация

Используйте API-токен пользователя, чья роль в Пространстве должна авторизовать операцию. Каждый scoped-путь содержит явный space_id:

Новое Пространство создаётся одним названием — короткий идентификатор Mockarty
составит сам, а при совпадении добавит суффикс:

POST /api/v1/cloud/workspaces
Content-Type: application/json

{"name": "Команда QA"}
GET /api/v1/cloud/spaces?limit=25
GET /api/v1/cloud/spaces/{space_id}
GET /api/v1/cloud/spaces/{space_id}/members?limit=25
GET /api/v1/cloud/spaces/{space_id}/invites?limit=25

Списки возвращают items, has_more и непрозрачный next_cursor. Верхнеуровневый список Пространств также возвращает монотонную collection_revision. Передавайте курсор в следующий запрос без изменений. Ответ Пространства содержит ревизию и ETag, например "space-…-r7".

Курсор действует 15 минут и привязан к аутентифицированному пользователю, коллекции, Пространству и соответствующей ревизии совместной работы или доступного набора Пространств. Не декодируйте и не изменяйте курсор, не используйте курсор участников для приглашений или другого Пространства. После cursor_expired или cursor_stale начните пагинацию заново.

Для переименования и любого изменения приглашения, роли или членства обязательны оба заголовка:

If-Match: "space-…-r7"
Idempotency-Key: стабильный-ключ-этого-точного-изменения

Получатель приглашения, который ещё не состоит в Пространстве, получает текущий
precondition из заголовка ETag или поля etag ответа GET /api/v1/cloud/invites/{token}, а
затем передаёт это точное значение в POST /api/v1/cloud/invites/{token}/accept.
Если ревизия Пространства изменилась, обновите preview и повторите запрос с новым
idempotency key.

После неоднозначного таймаута или серверной ошибки повторите тот же путь, тело, ETag и ключ. Mockarty вернёт исходный успешный ответ. Повторное использование ключа для другого запроса даёт 409 idempotency_conflict, устаревший ETag — 412 space_revision_conflict. Ответы 429 и 503 содержат Retry-After и retryable.

Пути изменений:

PATCH  /api/v1/cloud/spaces/{space_id}
POST   /api/v1/cloud/spaces/{space_id}/invites
DELETE /api/v1/cloud/spaces/{space_id}/invites/{invite_id}
POST   /api/v1/cloud/invites/{token}/accept
PATCH  /api/v1/cloud/spaces/{space_id}/members/{member_id}
DELETE /api/v1/cloud/spaces/{space_id}/members/{member_id}

Тело запроса переименования содержит только новое видимое название:

{"name":"Разработка платформы"}

Тот же явный контекст и precondition доступны во всех SDK:

space, _ := client.CloudSpaces().Get(ctx, spaceID)
etag := fmt.Sprintf("\"space-%s-r%d\"", space.ID, space.Revision)
renamed, err := client.CloudSpaces().Rename(ctx, space.ID,
    "Разработка платформы", etag, "rename-platform-2026-08")
created, err := client.CloudSpaces().CreateInvite(ctx, space.ID,
    mockarty.CloudSpaceInviteRequest{Email: "teammate@example.com", Role: "editor"},
    etag, "invite-teammate-2026-08")
space = client.cloud_spaces.get(space_id)["space"]
etag = f'"space-{space["id"]}-r{space["revision"]}"'
renamed = client.cloud_spaces.rename(
    space["id"], "Разработка платформы", etag, "rename-platform-2026-08"
)
created = client.cloud_spaces.create_invite(
    space["id"], "teammate@example.com", "editor", etag, "invite-teammate-2026-08"
)
Map<String, Object> envelope = client.cloudSpaces().get(spaceId);
Map<String, Object> space = (Map<String, Object>) envelope.get("space");
String etag = "\"space-" + space.get("id") + "-r" + space.get("revision") + "\"";
Map<String, Object> renamed = client.cloudSpaces().rename(
    spaceId, "Разработка платформы", etag, "rename-platform-2026-08");
Map<String, Object> created = client.cloudSpaces().createInvite(
    spaceId, "teammate@example.com", "editor", 0, etag, "invite-teammate-2026-08");

Для принятия приглашения сначала вызовите PreviewInvite / preview_invite / previewInvite и передайте полученный etag в метод принятия. CLI выполняет preview автоматически, если --etag не указан:

mockarty-cli cloud-spaces preview "$INVITE_TOKEN"
mockarty-cli cloud-spaces accept "$INVITE_TOKEN" --idempotency-key accept-invite-2026-08

CLI предоставляет те же отобранные операции. Используйте --cursor для list, members и invites, а при точном повторе не меняйте --idempotency-key:

mockarty-cli cloud-spaces list --limit 25
mockarty-cli cloud-spaces rename --space "$SPACE_ID" --name 'Разработка платформы' --etag "$ETAG" --idempotency-key rename-platform-2026-08
mockarty-cli cloud-spaces members --space "$SPACE_ID" --cursor "$NEXT_CURSOR"
mockarty-cli cloud-spaces invite --space "$SPACE_ID" --email teammate@example.com --role editor --etag "$ETAG" --idempotency-key invite-teammate-2026-08
mockarty-cli cloud-spaces role "$MEMBER_ID" --space "$SPACE_ID" --role viewer --etag "$ETAG" --idempotency-key role-change-2026-08

Go-, Python- и Java-SDK предоставляют CloudSpaces/cloud_spaces/cloudSpaces; команда CLI — mockarty-cli cloud-spaces. Встроенный MCP-сервер намеренно не зеркалирует эти ручки: он не умеет делегировать principal Cloud-кабинета и поэтому не может доказать ту же роль в Пространстве.

Операции лояльности и поддержки внутри Пространства описаны в разделе Лояльность, поддержка и продуктовые операции Cloud.

Отмена и возобновление плана

Если план куплен с автопродлением, экран Подписка показывает дату следующего списания и платёжного провайдера (renewal в GET /api/v1/cloud/subscriptions); остановить следующее списание — значит отменить подписку. Без автопродления план просто заканчивается вместе с периодом.

Если прежний баланс счёта покрывает всю стоимость покупки, списания с карты нет и карта не сохраняется. Автопродление для такой покупки включить нельзя: выключите его и купите следующий период после окончания текущего. Тот же Pro или Pro+ нельзя купить повторно до окончания оплаченного периода (same_plan_period_active), чтобы оставшиеся дни не пропали. При частичном покрытии остаток оплачивается картой и может создать сохранённый платёжный мандат.

Владелец Пространства отменяет план на экране Подписка в кабинете (а также POST /api/v1/cloud/subscriptions/cancel с X-Cloud-Space). Больше ничего не списывается, а оплаченный период не возвращается: план действует до конца этого периода, затем Пространство переходит на Free, владелец получает письмо «Подписка отменена» с этой датой.

Пока период не закончился, владелец может возобновить план на том же экране (POST /api/v1/cloud/subscriptions/reactivate) — всё останется как есть — включая автопродление: сохранённый способ оплаты возвращается, и дата следующего списания снова видна на экране Подписка. После окончания периода API отказывает — 410 subscription_period_expired, пока отменённая запись ещё видна, и 404 no_active_subscription после того, как свип перевёл Пространство на план Free, — а путь назад — выбрать план заново.

Подписки Enterprise и on-premise управляются договором с организацией и отдельным запросом на развёртывание. Retail-кабинет не запускает и не возобновляет для Enterprise оплату плана, пакет Team, смену пакета, ручной счёт, пополнение баланса или автоматическое продление. Попытка купить план Enterprise получает contract_required, а новая retail-команда для аккаунта, уже управляемого Enterprise-договором, — enterprise_contract_managed. История биллинга остаётся доступной. Точный повтор retail-операции, сохранённой до Enterprise-договора, остаётся идемпотентным; владелец также может отключить её автопродление. Это закрывает прежнее retail-обязательство и не создаёт новое биллинговое полномочие Enterprise.

Когда оплаченный период заканчивается без подтверждённого продления, платные возможности прекращаются в оплаченную дату, хотя подписка сначала переходит в трёхдневный льготный период для оплаты. Владелец получает письмо и уведомление в кабинете с датой окончания этого периода. Если оплата не поступит, подписка истечёт; Пространство останется на плане Free, моки, тесты и данные сохранятся, а привязанные к Пространству десктопные лицензии будут отозваны. При других окончаниях периода владелец тоже получает уведомление:

Письмо Когда Следующий шаг
Пробный период закончился истёк пробный период выбрать план
Для восстановления плана нужна оплата оплаченный период закончился без продления открыть оплату до конца льготного периода
План приостановлен льготный период после пропущенного продления закончился без оплаты выбрать план снова
План завершён отменённый план дошёл до конца периода выбрать план, когда понадобится

Каждое письмо приходит на языке уведомлений владельца — на почту и как уведомление в кабинете.

Баланс счёта, переход на другой пакет и отмена

Отмена не возвращает деньги. План действует до конца оплаченного периода, затем Пространство переходит на Free.

Баланс счёта. Если оплаченный период Personal Pro заканчивается раньше срока, потому что вы вступаете в Team, неиспользованная часть периода возвращается на баланс счёта. В личном Пространстве раздел Подписка → Баланс счёта показывает сумму и выписку: что поступило и на что потрачено. Баланс автоматически идёт в счёт следующих платежей — раньше карты. При покупке или продлении Pro, а также при оплате по счёту списывается всё, что есть на балансе (но не больше цены), а карта или перевод покрывают только остаток. Если баланс покрывает цену целиком, план оформляется сразу, без карты, и в письме сказано, что он оплачен с баланса. Покупка бонусными деньгами тратит только бонусы. Вывести баланс нельзя. Участник Team может также потратить его на AI- или инфраструктурные юниты своей Team (см. Пространства оплачиваемой Team).

Возвраты. При полном возврате оплаты за период оплаченная картой часть возвращается на карту, а неиспользованная часть более раннего периода, которую этот платёж зачёл, становится деньгами на балансе счёта и идёт в счёт следующих списаний этого счёта. Возвраты оформляет поддержка Mockarty, а не кабинет.

Переход Team на больший пакет сразу. В оплате Team блок «Перейти сейчас» показывает бо́льшие пакеты, и для каждого три суммы: полную цену пакета, зачёт неиспользованной части текущего периода и сумму к оплате. После оплаты больший пакет и новый полный период начинают действовать сразу. Меньший пакет начинает действовать со следующего продления — выберите его в поле «Пакет со следующего продления». Если за Team платит другой человек, для перехода нужно его согласие, поэтому выберите пакет со следующего продления.

Своя Team при действующем Pro. Если вы сами платите за собственную Team, пока идёт оплаченный период Personal Pro, неиспользованная часть этого периода засчитывается в первый платёж за Team. Карта оплачивает только разницу, а Personal Pro завершается, когда платёж за Team пройдёт. Если неиспользованная часть стоит больше Team, она оплачивает Team целиком, карта не нужна, а остаток зачисляется на ваш баланс счёта. Если за Team платит организация, она оплачивает полную цену, а неиспользованный период Pro возвращается на ваш баланс счёта.

Какие потолки отклоняются, а какие только измеряются

Тариф задаёт потолки по нескольким осям, и ведут они себя по-разному. Что именно — говорит сам ответ: GET /api/v1/cloud/quota возвращает по каждой метрике measured (можно ли вообще посчитать ось в этой установке) и enforced_by (кто отклоняет запись сверх потолка, либо none).

Для количества макетов и месячных потоковых показателей GET /api/v1/cloud/quota?space_id=<идентификатор-выбранного-пространства> показывает биллинг-аккаунт выбранного Пространства. Без space_id эти строки относятся к вашему личному Пространству. Выбранное Пространство должно быть вам доступно, а для Team Space нужно действующее именное место; переход в Team Space не переносит его лимит в личный аккаунт. Макет, который при переносе есть и в Cloud, и на общем узле, считается один раз. Пока инвентарь принимающего аккаунта не сверен, использование макетов помечено как недоступное, а не показано частичным числом. Количество личных Пространств и лимит их создания всегда относятся к вашему личному биллинг-аккаунту, даже при выборе Team Space. Пространства Team, которыми вы владеете, не расходуют личные места.

Дневные запуски фаззинга и нагрузочных тестов относятся к тому же принимающему аккаунту. День начинается в 00:00 UTC. Запуск учитывается при допуске Cloud; если затем он завершится с ошибкой или будет остановлен, место за этот запуск остаётся израсходованным. Повтор того же задания не списывает второе место. До начала первого полного дня централизованного учёта кабинет показывает использование дневных запусков как недоступное, а общий узел их не допускает.

Для скриптов и CI используйте Cloud API-токен со scope workspace:read и явно указывайте Пространство, когда нужен лимит макетов или потоковых показателей его биллинг-аккаунта:

personal, err := client.CloudCustomer().GetQuota(ctx)
selected, err := client.CloudCustomer().GetQuota(ctx, spaceID)
personal = client.cloud_customer.get_quota()
selected = client.cloud_customer.get_quota(space_id)
Map<String, Object> personal = client.cloudCustomer().getQuota();
Map<String, Object> selected = client.cloudCustomer().getQuota(spaceId);
mockarty-cli cloud-customer quota
mockarty-cli cloud-customer quota --space "$SPACE_ID"
  • Отклоняется на границе. Создание Пространства упирается в число Пространств, разрешённых тарифом, — отказ называет и потолок, и текущее число; добавление участника упирается в места тарифа, когда Пространство уже заняло свои платные места. Для этих осей enforced_by называет гейт.
  • Количество моков. Cloud sync считает моки всех Пространств оплачиваемой Team вместе и отклоняет новый мок, если общий лимит занят. Для других Пространств количество может показываться без отказа на стороне Cloud. Проверяйте enforced_by у нужной метрики: само число рядом с лимитом ещё не означает отказ записи.
  • Месячный потоковый лимит. Запросы, минуты раннера и трафик расходуют лимит биллинг-аккаунта Пространства. Оплаченная Team использует один общий пул для всех своих Пространств, рассчитанный по числу купленных мест; личный лимит участника не увеличивает лимит чужого Пространства. Runtime резервирует небольшие блоки до выполнения работы и отклоняет дальнейшую работу при исчерпании месячного пула. Показатель used считает зарезервированные блоки, поэтому может быть немного больше фактически завершённой работы. До запуска учёта оператором с первого полного месяца UTC эти строки остаются недоступными и не показывают ложный ноль.
  • Не измеряется. Операции AI и стоимость остаются недоступными с пояснением, пока для них не подключён отдельный источник учёта.

Обзор организации

Экран Использование показывает число моков, только если удалось прочитать актуальное количество во всех принадлежащих вам Пространствах. Если подсчёт временно недоступен, экран сообщает об этом вместо ошибочного нуля; попробуйте позже. Другие показатели, которые пока не измеряются, также отмечены как недоступные, а не показываются как остаток лимита.

Если вы владелец биллинг-аккаунта выбранного Пространства, в разделе Использование появляется блок Ваша организация для этого аккаунта. Администратор действующей Team с назначенным местом тоже видит её участников, ожидающие приглашения, общий счётчик мест и доступные ему Пространства. Активность участников в этом блоке видит только владелец Team; раздел биллинга доступен лишь биллинговым ролям. При переключении между личным и командным Пространствами блок тоже переключается. Для обычного аккаунта видны все его Пространства, купленные и занятые места в каждом из них и общие лимиты. Лимит личных Пространств определяется тарифом личного аккаунта: вступление в оплачиваемую Team его не повышает. Пространства Team расходуют общий лимит аккаунта Team.

Блок отвечает на вопрос «почему коллегу не получается добавить»: видно, в каком именно Пространстве места кончились и упирается ли человек в лимит числа Пространств. Пространство с безлимитным тарифом показано как «без ограничения» и не участвует в сумме купленных мест.

На бесплатном аккаунте дополнительно виден общий бесплатный пул участников. Для розничной Team вместо него видны текущие участники и их роли, а также единое число мест на всю команду. Ожидающие приглашения показаны с адресом получателя, ролью и сроком действия: владелец или администратор Team видит, кто резервирует места. Секрет приглашения не показывается. Приглашение резервирует место, но не открывает доступ до принятия. На других платных аккаунтах действуют места подписки, а не бесплатный пул.

Для оплаченной Team показатель «Хранение синхронизированных данных» учитывает синхронизированные объекты, изменения и записи конфликтов во всех её Пространствах. Пакет даёт 200 МиБ на каждое оплаченное место в общем пуле аккаунта; для одного Пространства действует предел 1 ГиБ. В обзоре организации видны оба предела. Пока существующие записи сверяются, доступный объём указан как неизвестный: неполный подсчёт не показывается как остаток. Если данные уже превышают лимит, участники могут читать и удалять их; новые данные можно добавлять после освобождения места. Личные Пространства не расходуют хранилище Team.

Пространства оплачиваемой Team

Промобаланс оплачивает только один период Team. Сохранённого разрешения на
списание с карты при этом нет, поэтому автоматическое продление недоступно.
Кабинет выключает этот выбор при оплате промобалансом; для автопродления
выберите карту. Если неиспользованный период Pro и/или баланс счёта покрыли
покупку целиком, разрешение на списание с карты тоже не появляется: запрос с
auto_renew: true отклоняется с кодом team_renewal_needs_card до списания денег.
Выключите автопродление и купите следующий период после конца оплаченного периода. При частичном
покрытии остаток можно оплатить картой и сохранить разрешение на продление.

Покупка пакета Team создаёт отдельный биллинг-аккаунт и первое Пространство Team. В разделе Использование владелец или администратор Team с действующим местом может создать ещё одно Пространство в пределах общего лимита Team. Режим Все участники Team открывает его всем действующим владельцам мест; режим Только приглашённые участники Team оставляет доступ только указанным участникам. Доступ к Пространству Все участники Team следует составу Team и не добавляется и не удаляется отдельным приглашением в Пространство: чтобы добавить или убрать человека, используйте управление составом всей Team. Закрытое Пространство всё равно относится к той же Team и использует общий пакет. Его приглашение в Пространство работает только для действующего участника Team с именным Seat, и это условие повторно проверяется при принятии ссылки. Обычное приглашение в Пространство не превращает постороннего в участника оплачиваемой Team, не назначает Seat и не меняет личную подписку. Пользователь может состоять только в одной оплачиваемой Team. Его личные Пространства сохраняются при вступлении и выходе.

Оформите Team из раздела Подписка, выбрав личное Пространство. Кабинет предлагает опубликованные пакеты на 5, 10 или 20 мест и до оплаты показывает полную цену. Плательщиком может быть человек или организация; для организации нужно указать юридическое наименование и подтвердить полномочия. Team активируется только после завершения платежа. В действующей Team раздел Использование → Биллинг Team показывает плательщика, пакет, занятые и зарезервированные места, счета, состояние продления и общие остатки юнитов. Просматривать биллинг могут владелец и менеджер биллинга. Для плательщика-организации этим биллинговым ролям показывается защищённое юридическое наименование. Организация-плательщик является стороной расчётов, а не участником продукта: она не получает доступ к Пространствам, лицензию Team или Seat. Все Пространства Team читают тариф и состояние подписки из одного биллинг-аккаунта Team, поэтому при переходе во вторичное Пространство не появляется выдуманный тариф Free. История платежей относится ко всему аккаунту и остаётся доступна только владельцу и менеджеру биллинга Team. Больший пакет можно подключить сразу — с зачётом неиспользованного периода, меньший подтверждается для следующего продления (см. Баланс счёта, переход на другой пакет и отмена). Нынешний пакет действует, пока новая покупка не оплачена. Оформление, счета и покупка юнитов остаются в кабинете, поскольку требуют интерактивной оплаты и полномочий плательщика; эти действия не вынесены в SDK, CLI или MCP.

Скрипты могут читать пакеты Team и сводку биллинга через Cloud API-токен со scope team:read. Владелец подтверждённого личного Пространства получает предложения через GET /api/v1/cloud/team/packages?space_id={personal_space_id}. У предложения есть срок действия; чтение не резервирует цену и не начинает покупку. Текущий владелец или менеджер биллинга Team получает сводку через GET /api/v1/cloud/team/billing?space_id={team_space_id}. Объект billing содержит пакет, тип плательщика, места, последние счета и общие остатки юнитов. Помимо scope токена сервер проверяет роль в Team. Для обоих чтений нужен явный ID Пространства; личное Пространство не даёт доступ к биллингу чужой Team.

quotes, err := client.CloudSpaces().ListTeamPackages(ctx, personalSpaceID)
billing, err := client.CloudSpaces().GetTeamBilling(ctx, teamSpaceID)
quotes = client.cloud_spaces.list_team_packages(personal_space_id)
billing = client.cloud_spaces.get_team_billing(team_space_id)
List<Map<String, Object>> quotes = client.cloudSpaces().listTeamPackages(personalSpaceId);
Map<String, Object> billing = client.cloudSpaces().getTeamBilling(teamSpaceId);
mockarty-cli cloud-spaces team-packages --space "$PERSONAL_SPACE_ID"
mockarty-cli cloud-spaces team-billing --space "$TEAM_SPACE_ID"

Если владелец Team запрашивает пакет с более дорогим следующим продлением, а первоначальный плательщик — другой человек, запрос направляется этому плательщику. В кабинете он видит Team, прежнюю и новую сумму продления, размер пакета и период, после чего может подтвердить или отклонить точную цену с повторным подтверждением личности. Более дорогой пакет вступает в силу только после согласия плательщика. При отказе или истечении запроса прежние условия продления сохраняются. Смена владельца Team сама по себе не разрешает увеличить списание у первоначального плательщика.

Действующий именной участник с текущим оплаченным периодом Team может потратить собственный баланс счёта на AI-кредиты или инфраструктурные юниты этой Team в разделе Использование → Баланс счёта для юнитов Team. Перед подтверждением экран показывает выбранную Team, цену юнита и точное списание. Ответ покупки содержит квитанцию purchase с получателем Team и Пространством, валютой, точной суммой списания в минимальных денежных единицах, количеством юнитов и зафиксированной версией цены; точный повтор возвращает ту же квитанцию с replayed. Деньги списываются только с баланса счёта участника, а юниты поступают на счёт Team и остаются там после его выхода. Во время работы Team личные юниты автоматически не расходуются. После истечения или полного возврата оплаты Team сохраняет состав и Пространства для чтения в течение периода хранения, но не может получить новую покупку с баланса счёта участника. Оплачиваемые через провайдера пополнения Team централизованы: начать их может только владелец или менеджер биллинга Team с текущим именным Seat. Роль, выданная только внутри одного Пространства Team, не даёт полномочий плательщика всей Team. Если списание продления или возврат за текущий период уже выполняется, вторая операция откладывается до конечного результата первой, прежде чем можно отправить новый запрос провайдеру.

Отмена, истечение и завершённый полный возврат сбрасывают будущий выбор пакета и неотвеченный запрос плательщику. После конца оплаченного периода владелец может заново активировать тот же аккаунт Team: GET /api/v1/cloud/team/reactivation/offers?space_id={team_space_id} возвращает пакеты для сохранённого рынка Team, а POST /api/v1/cloud/team/{team_id}/reactivate начинает оплату точного пакета. Пакет должен вмещать всех сохранённых участников, ожидающие приглашения и активные или зарезервированные Seats. ID Team, состав, Пространства и данные сохраняются; платный доступ и новая вместимость возвращаются только после подтверждённого провайдером платежа. Если у владельца есть действующий период Personal Pro, его неиспользованная стоимость учитывается так же, как при первой покупке Team: засчитывается в платёж, когда владелец платит сам, иначе возвращается на баланс счёта, а если период был оплачен бонусами — в бонусный кошелёк.

Та же оплата Team доступна в трёхдневный льготный период past_due, а не только после статуса expired. Незавершённый платёж не возвращает платный доступ. После подтверждения существующие Team и Пространства получают один новый полный период с момента оплаты; точный повтор возвращает результат прежнего платежа, не создавая второго списания. Подписку, полностью оплаченную зачётами или промобалансом, нужно продлевать вручную.

Когда заканчивается оплаченный период Team

Владелец Team получает письма и уведомления в кабинете за семь дней и за 24 часа до конца оплаченного периода, в момент его окончания и за семь дней до закрытия доступа на чтение. После успешной оплаты приходит уведомление о восстановлении доступа. Напоминание само по себе не списывает деньги с карты; для автопродления нужно отдельное ранее выданное согласие на списание.

В момент paid_until Team переходит в past_due на три дня. Действующие участники могут читать прежние данные, но новая работа приостановлена. Следующие 30 дней действует retained_read с тем же доступом на чтение. В момент read_until (через 33 дня после paid_until) Team переходит в archived: рабочее пространство имён закрывается, но данные сохраняются. Если участник вышел из Team или был удалён, его доступ заканчивается раньше. Подтверждённое продление или повторная активация возвращает прежнюю Team и её Пространства; незавершённая оплата доступа не возвращает.

Режим чтения также останавливает выдачу работы подключённым раннерам и привязанным устройствам: опрос следующего UI-, голосового, replay- или grid-задания не забирает задание из очереди Пространства Team. Долговечные задания остаются доступными после восстановления оплаты; истёкшую за это время команду устройству отправьте заново.

В Cloud-кабинете выберите Пространство Team и откройте Подписка, чтобы увидеть даты окончания оплаты и чтения. Владельцу показано действие для оплаты; остальным действующим участникам предложено обратиться к владельцу. Счета и историю платежей по-прежнему видят только владелец и менеджер биллинга. Действующий участник также может получить сроки доступа без платёжных данных через Cloud API после входа:

GET /api/v1/cloud/team/access?workspace_id={team_space_id}

Ответ содержит mode (active, past_due, retained_read или archived), paid_until, read_until и can_pay. ID выбранного Пространства обязателен. Для Cloud API-токена нужен scope team:read, а пользователь должен оставаться участником Team; неизвестное Пространство и удалённый участник получают 404. Этот статус доступен только для чтения: он не запускает оплату и не раскрывает историю счетов.

ID аккаунта Team находится в поле account_id ответа GET /api/v1/cloud/organization?space_id={team_space_id}. Передайте его как team_id при создании ещё одного Пространства. Для точного повторения запроса сохраняйте Idempotency-Key:

POST /api/v1/cloud/team/spaces
Idempotency-Key: create-team-space-2026-09
Content-Type: application/json

{"team_id":"<uuid-аккаунта-team>","name":"Проверка релиза","audience":"team"}

Ответ содержит space_id и team_id. Для закрытого Пространства задайте audience равным restricted; при необходимости можно указать slug. Та же операция доступна через SDK и CLI:

created, err := client.CloudSpaces().CreateTeamSpace(ctx, mockarty.CloudTeamSpaceRequest{
    TeamID: teamID, Name: "Проверка релиза", Audience: "team",
}, "create-team-space-2026-09")
created = client.cloud_spaces.create_team_space(
    team_id, "Проверка релиза", "team", "create-team-space-2026-09"
)
Map<String, Object> created = client.cloudSpaces().createTeamSpace(
    teamId, "Проверка релиза", "team", "", "create-team-space-2026-09");
mockarty-cli cloud-spaces team-space-create --team "$TEAM_ID" --name 'Проверка релиза' --audience team --idempotency-key create-team-space-2026-09

Чтобы пригласить нового коллегу, выберите Пространство оплаченной Team и нажмите Подписка → Пригласить участника Team либо откройте Использование → Ваша организация → Пригласить в Team. Форма откроется с курсором в поле почты. Выберите роль и отправьте приглашение; коллега должен принять его из письма или уведомления в кабинете. В Пространстве «Все участники Team» страница «Пространство и команда» ведёт к этой форме вместо отдельного приглашения в Пространство.

В действующей оплаченной Team владелец или администратор с назначенным местом может нажать «Пригласить в Team» в этом разделе. Любая роль Team, включая менеджера биллинга, резервирует одно оплаченное место. Приглашение действует 72 часа; существующий пользователь получит уведомление в кабинете и письмо. Получатель открывает отдельную Team-ссылку, входит или создаёт аккаунт с приглашённым адресом, проверяет команду и роль, затем явно принимает приглашение. До принятия вошедший получатель видит предварительную компенсацию за остаток личной Pro, если она положена. Итоговая сумма пересчитывается при принятии. Личные пространства сохраняются. Если действует подходящий оплаченный период личного Pro, при вступлении эта подписка заменяется, а стоимость неиспользованного периода зачисляется в личный кошелёк. Незавершённый платёж личного Pro или членство в другой Team блокирует вступление.

У Team-приглашений отдельный API, отличный от приглашений в Пространство. Создать приглашение может владелец или администратор действующей Team, указав Idempotency-Key. Ответ 202 не содержит токена: ссылка доставляется получателю. Публичный предпросмотр показывает команду, роль и срок без адреса получателя. Подтверждённый получатель может посмотреть свой переход через GET /api/v1/cloud/team/invite-links/{token}/transition; чужая компенсация не выдаётся. Принятие требует входа под аккаунтом с подтверждённым совпадающим адресом и собственного Idempotency-Key:

POST /api/v1/cloud/team/invites
Idempotency-Key: <стабильный-ключ-запроса>
Content-Type: application/json

{"space_id":"<uuid-пространства-team>","email":"person@example.com","role":"member"}

GET /api/v1/cloud/team/invite-links/{token}
GET /api/v1/cloud/team/invite-links/{token}/transition
POST /api/v1/cloud/team/invite-links/{token}/accept
Idempotency-Key: <стабильный-ключ-принятия>

Для отправки Team-приглашения через SDK или CLI используйте выбранное Пространство Team. В ответе подтверждается отправка, но нет ссылки и её токена:

err := client.CloudSpaces().InviteTeamMember(ctx, mockarty.CloudTeamMemberInviteRequest{
    SpaceID: spaceID, Email: "person@example.com", Role: "member",
}, "invite-team-member-2026-09")
client.cloud_spaces.invite_team_member(
    space_id, "person@example.com", "member", "invite-team-member-2026-09"
)
client.cloudSpaces().inviteTeamMember(
    spaceId, "person@example.com", "member", "invite-team-member-2026-09");
mockarty-cli cloud-spaces team-invite --space "$SPACE_ID" --email person@example.com --role member --idempotency-key invite-team-member-2026-09

Приглашённый пользователь после входа может посмотреть собственный переход. Ответ ready_credit содержит предварительную сумму в минимальных денежных единицах, валюту и credit_destination: personal_cash, если Personal Pro оплачен через платёжного провайдера, либо personal_bonus, если использован промобаланс. При ready_free компенсации нет. Если вступление пока невозможно, возвращается причина. До принятия сумма может измениться.

transition, err := client.CloudSpaces().PreviewTeamTransition(ctx, inviteToken)
transition = client.cloud_spaces.preview_team_transition(invite_token)
Map<String, Object> transition = client.cloudSpaces().previewTeamTransition(inviteToken);
mockarty-cli cloud-spaces team-transition "$INVITE_TOKEN"

После проверки перехода получатель может явно принять приглашение в Team. При неопределённом результате повторите запрос с тем же ключом идемпотентности. При принятии остаток оплаченного периода Personal Pro пересчитывается, а сам Personal Pro завершается в той же транзакции. Стоимость периода, оплаченного деньгами, зачисляется на баланс счёта получателя. Стоимость периода, оплаченного промобалансом, возвращается в бонусный кошелёк исходного личного Пространства и остаётся промосредствами; возврат через платёжного провайдера не создаётся. Денежная компенсация доступна только тогда, когда исходную оплату Personal Pro подтвердил сам получатель; оплата, подтверждённая другим человеком, блокирует переход и не переносит деньги плательщика в кошелёк получателя.

err := client.CloudSpaces().AcceptTeamInvite(ctx, inviteToken, "accept-team-2026-09", true)
client.cloud_spaces.accept_team_invite(invite_token, "accept-team-2026-09", confirm_transition=True)
client.cloudSpaces().acceptTeamInvite(inviteToken, "accept-team-2026-09", true);
mockarty-cli cloud-spaces team-accept "$INVITE_TOKEN" --confirm-transition --idempotency-key accept-team-2026-09

Владелец или администратор Team может нажать «Отозвать» рядом с ожидающим приглашением и подтвердить действие. Зарезервированное место освободится. Участник, уже принявший приглашение, останется в Team: действие относится только к ожидающим приглашениям.

Владелец или администратор Team также может нажать «Удалить из Team» рядом с доступным для удаления действующим участником и подтвердить действие. Освободится его место Team, прекратится доступ ко всем пространствам Team и подключение Desktop к Team. Ожидающие ссылки приглашений в закрытые Пространства и неиспользованные ссылки входа на общий узел этой Team отзываются в той же операции. Личные Пространства и личные учётные данные участника сохранятся. Перед выходом из Team владелец должен передать владение: действующего владельца удалить нельзя.

Каждый участник Team, кроме владельца, включая администратора, менеджера биллинга и приостановленного участника, видит собственное членство при выборе доступного пространства Team и может нажать «Выйти из Team». Выход выполняется той же транзакцией для всей Team: освобождает место, удаляет доступ ко всем пространствам Team и отзывает Desktop-учётные данные Team. После этого кабинет возвращается в собственное Personal Space. Личные пространства, денежный остаток и личные юниты остаются у пользователя. Владелец Team сначала должен передать владение.

Владелец Team или администратор в пределах своей роли может «Приостановить доступ» другого участника и затем «Возобновить доступ». Приостановка обратима: именное место остаётся занятым, принадлежность к одной Team сохраняется, существующие назначения в Пространства становятся неактивными, а Пространства Team и платные полномочия недоступны до возобновления. Действующие Team-учётные данные Desktop отзываются сразу; после возобновления доступа участник подключает этот Desktop заново. Чтобы освободить место, используйте «Удалить из Team». Участник, владеющий Пространством Team, сначала должен передать это Пространство. Команды записываются в аудит и требуют Idempotency-Key:

PATCH /api/v1/cloud/team/members/{member_id}/status?space_id={team_space_id}
Idempotency-Key: stable-retry-key
Content-Type: application/json

{"status":"suspended"}

То же обратимое изменение статуса доступно скриптам администрирования Team.
Значение active возобновляет доступ, suspended приостанавливает его; ни одно
из них не освобождает место:

err := client.CloudSpaces().SetTeamMemberStatus(ctx, spaceID, memberID, "suspended", "status-2026-09")
client.cloud_spaces.set_team_member_status(space_id, member_id, "suspended", "status-2026-09")
client.cloudSpaces().setTeamMemberStatus(spaceId, memberId, "suspended", "status-2026-09");
mockarty-cli cloud-spaces team-member-status "$MEMBER_ID" --space "$SPACE_ID" --status suspended --idempotency-key status-2026-09

Общий MCP-сервер не зеркалирует управление составом Team, потому что не умеет
делегировать principal Cloud-кабинета. MCP сервисного аккаунта Team также не
получает эту операцию: машинный principal не может приостанавливать или
возобновлять человека.

Отдельное Пространство Team можно передать только другому активному участнику Team с действующим именным местом. Меняется роль владельца этого Пространства; владелец Team, плательщик, кошелёк и подписка не меняются. Retail Personal Space нельзя на месте передать другому пользователю: его BillingAccount и коммерческая история принадлежат владельцу. Во время беты прежний запрос передачи получает 409 workspace_transfer_migration_required; содержимое нужно переносить отдельным копированием или импортом. Аккаунт под Enterprise-договором получает 409 enterprise_contract_managed и следует условиям договора организации.

Для передачи владения Team текущий владелец выбирает «Передать владение Team» рядом с активным участником и подтверждает действие. Прежний владелец становится администратором Team. Меняется управляющий аккаунтом Team; плательщик и владельцы отдельных Пространств остаются прежними. Приостановленному участнику передать владение нельзя. Клиент автоматизации может вызвать POST /api/v1/cloud/team/owner-transfer со стабильным Idempotency-Key и телом JSON {"space_id":"<uuid-пространства-team>","successor_user_id":"<uuid-участника>"}.

Для автоматизации обоих действий укажите ID Пространства Team. При повторе после неопределённого ответа сохраните прежний ключ идемпотентности. Участник выходит из Team той же операцией удаления; действующий владелец сначала передаёт владение.

err := client.CloudSpaces().RemoveTeamMember(ctx, spaceID, memberID, "remove-member-2026-09")
err = client.CloudSpaces().TransferTeamOwner(ctx, spaceID, successorID, "transfer-owner-2026-09")
client.cloud_spaces.remove_team_member(space_id, member_id, "remove-member-2026-09")
client.cloud_spaces.transfer_team_owner(space_id, successor_id, "transfer-owner-2026-09")
client.cloudSpaces().removeTeamMember(spaceId, memberId, "remove-member-2026-09");
client.cloudSpaces().transferTeamOwner(spaceId, successorId, "transfer-owner-2026-09");
mockarty-cli cloud-spaces team-remove-member "$MEMBER_ID" --space "$SPACE_ID" --idempotency-key remove-member-2026-09
mockarty-cli cloud-spaces team-transfer-owner "$SUCCESSOR_ID" --space "$SPACE_ID" --idempotency-key transfer-owner-2026-09

Владелец Team и действующие администраторы видят полный список участников и ожидающих приглашений. Другие текущие участники Team получают только собственное членство и уже доступные им пространства Team, поэтому могут выйти без раскрытия адресов других участников. В списке участников владелец видит последнюю активность, замеченную в пространствах этой Team или в подключённом к ним Desktop. Работа человека в Personal и чужих пространствах сюда не попадает. Отсутствие активности не доказывает, что участник перестал работать: работа Desktop без сети может появиться позже.

Аудит Team

Вкладка кабинета Аудит отличается от аудита Team: она показывает недавние события выбранного Пространства его владельцу или администратору. Загруженные события можно отобрать по действию и автору, а также найти по тексту. Фильтры не ищут по всей истории; на странице указано, сколько загруженных событий совпало. Индикатор целостности относится ко всей полученной цепочке аудита, а не только к отфильтрованным строкам.

Использование → Аудит Team показывает недавние действия аккаунта Team и всех его Пространств в одном списке, начиная с новых событий. Личные Пространства и общие события входа в него не входят. Читать активность участников может только владелец Team с назначенным местом, в том числе когда оплата Team приостановлена. Менеджер биллинга видит закрытые данные оплаты, но не получает журнал активности. Остальные участники и посторонние не получают историю Team.

Экран также показывает результат проверки цепочек аудита аккаунта Team и его Пространств. Если цепочка нарушена, сохраните показанные область и номер события для поддержки; такой журнал не выдаётся за исправный. В списке видны действие, время, ID автора, цель и область, но не приватное содержимое событий.

Автоматизация может прочитать ограниченную страницу по ID выбранного Пространства Team:

GET /api/v1/cloud/team/audit?space_id={team_space_id}&limit=50
GET /api/v1/cloud/team/audit?space_id={team_space_id}&limit=50&before_id={next_before_id}

По умолчанию limit равен 50, допустимо 1–200. before_id — исключающий курсор по ID события: передавайте next_before_id без изменений, только если has_more равен true. Ответ содержит team_id, records, has_more, next_before_id, chain_ok, broken_at и broken_scope_id. Если проверка целостности не прошла, ответ содержит chain_ok: false и область с номером нарушения; при временной недоступности аудита API возвращает 503, а не неполную страницу. Отсутствующая или недоступная пользователю Team даёт 404.

Полный состав и ожидающие приглашения видят владелец Team и действующие администраторы. Текущий участник Team видит только своё членство и доступные ему пространства Team. Посторонний получает 404 и не может выяснить, к какому аккаунту относится Пространство. Приватный биллинг Team отдельно доступен только владельцу Team и менеджеру биллинга; активность участников и аудит Team доступны только владельцу.

Текущий авторизованный участник Team или владелец Personal-аккаунта может прочитать те же данные через автоматизацию, явно указав выбранное Пространство:

GET /api/v1/cloud/organization?space_id={space_id}
organization, err := client.CloudSpaces().Organization(ctx, spaceID)
organization = client.cloud_spaces.organization(space_id)["organization"]
Map<String, Object> organization = client.cloudSpaces().organization(spaceId);
mockarty-cli cloud-spaces organization --space "$SPACE_ID"

Ответ содержит seats_assigned, seats_reserved, seats_used и seats_total, а также вычисленные сервером возможности can_manage_team, can_read_activity, can_transfer_owner и can_leave_team. У каждого возвращённого участника также есть can_remove, can_leave, owns_team_space и необязательный removal_blocked_reason. Владелец Пространства Team сначала должен передать это Пространство, и только владелец Team может удалить другого администратора. Назначенное место есть только у текущего участника Team; действующее ожидающее приглашение учитывается как резерв. Клиент должен использовать эти возможности, а не выводить права из роли в отдельном Пространстве. Посторонний получает 404.

Для отзыва ожидающего приглашения Team через автоматизацию возьмите его id из ответа организации. При точном повторе сохраняйте тот же ключ идемпотентности. Отзывать могут владелец и администратор Team; чужое приглашение или Пространство дают 404.

DELETE /api/v1/cloud/team/invites/{invite_id}?space_id={space_id}
Idempotency-Key: revoke-team-invite-2026-09
err := client.CloudSpaces().RevokeTeamInvite(ctx, spaceID, inviteID, "revoke-team-invite-2026-09")
client.cloud_spaces.revoke_team_invite(space_id, invite_id, "revoke-team-invite-2026-09")
client.cloudSpaces().revokeTeamInvite(spaceId, inviteId, "revoke-team-invite-2026-09");
mockarty-cli cloud-spaces team-revoke-invite "$INVITE_ID" --space "$SPACE_ID" --idempotency-key revoke-team-invite-2026-09

Общий Mockarty

У каждого Пространства есть namespace на общем Mockarty; он открывается из Mockarty в облаке → Открыть Mockarty под учётной записью кабинета. Доступ к модулям одновременно зависит от действующего тарифа Пространства и личной лицензии участника. Купленные именные места Team действуют во всех её Пространствах без повторного расходования. См. Общий Mockarty.

Свои раннеры

Тариф включает некоторое число раннер-минут на нашей общей мощности. Кроме
этого можно привязать машины, которыми управляете вы сами, — работа на них
эти минуты не расходует: за железо вы уже платите.

Откройте в кабинете Среда выполнения → Ваши раннеры и привяжите раннер:

  1. Укажите название, регион и сколько задач он выполняет одновременно.
    Параллельность — это ваш предел на ваших же машинах.
  2. Подтвердите действие. Кабинет один раз покажет строку подключения с
    кнопкой Копировать строку подключения. Сохраните её там, где храните учётные данные: в ней
    секрет раннера, и прочитать её снова нельзя.
  3. Используйте строку подключения на машине, которая будет выполнять работу
    (см. ниже). В списке раннер сразу появится со статусом Берёт задачи.

Под каждым раннером кабинет показывает, подключена ли к нему машина прямо сейчас:

  • На связи — прямо сейчас берёт задачи: машина со строкой подключения этого
    раннера в сети.
  • Не на связи · последний раз …: раннер включён, но уже несколько минут ни
    одна машина не выходила на связь — например, ноутбук закрыт. Работу он снова
    начнёт брать, как только машина вернётся.
  • Ещё не подключался: строкой подключения пока никто не воспользовался.

После Сменить секрет раннер показан как не подключённый, пока машина не
подключится с новой строкой.

Строка подключения — одно значение, начинающееся с mkrunner1.. В нём есть
всё, что нужно раннеру: адрес Cloud, где он обменивает секрет, адрес среды
выполнения, откуда он берёт работу, идентификатор раннера и сам секрет.
Использовать её можно двумя способами.

На своём компьютере, в Mockarty Desktop. Откройте панель управления
Desktop, выберите «Выполнять задачи пространства на этом компьютере» и вставьте строку.

На сервере или в CI, через mockarty-runner. Передайте строку в одной
переменной окружения:

MOCKARTY_RUNNER_CONNECTION='mkrunner1.…' ./mockarty-runner

MOCKARTY_RUNNER_CONNECTION нельзя сочетать с отдельными переменными
провайдера — задайте что-то одно.

В том же окне показан и сам bootstrap-секрет — для раннеров, которые вы
уже настроили отдельными переменными. Если кабинет сообщает, что строку
подключения выдать не удалось, у Cloud нет публичного адреса среды выполнения,
пригодного для раннера; bootstrap-секрет при этом работает, а адрес может
исправить оператор Cloud.

Если строка подключения потеряна или вы подозреваете утечку, нажмите
Сменить секрет. Кабинет покажет новую строку подключения, а прежняя
перестанет работать сразу. Уже выданные учётные данные истекают сами в течение
нескольких минут, поэтому текущая работа не прерывается.

Как отвязать раннер

Нажмите Отвязать рядом с раннером и подтвердите. Статус сменится на
Приостановлен, работа ему больше не поступает, а все выданные для него
строки подключения перестают работать при следующем обмене — включая копии,
которые вы передали коллегам или положили в переменные CI. Уже выданные
учётные данные истекают в течение нескольких минут. Повторное отвязывание
ничего не ломает.

Отвязанный раннер остаётся в списке под своим именем. Чтобы снова им
пользоваться, нажмите Привязать снова: кабинет выдаст новую строку
подключения, и раннер снова начнёт брать задачи. Старые строки подключения
остаются недействительными.

Что стоит учесть:

  • Привязка своих машин требует платного тарифа для этого Пространства. На
    бесплатном доступна только наша общая мощность.
  • Раннер, привязанный из кабинета, берёт API-тесты, нагрузочные тесты и
    фаззинг, которые входят в тариф. Поручить раннеру можно только работу из
    тарифа; запрос на другое отклоняется со списком того, что в тариф входит, —
    а не принимается, чтобы потом молча простаивать.

Если у Пространства есть и свои раннеры, и наша общая мощность, сначала
используются ваши машины.

Когда минуты тарифа закончились

По умолчанию раннер-минуты тарифа — жёсткий стоп: как только месячный лимит
израсходован, новые запуски на нашей общей мощности отклоняются до начала
следующего месяца. Ничего не списывается, и счёт, которого вы не выбирали, не
появляется.

На платном тарифе можно выбрать, чтобы запуски продолжались. Откройте
Использование → Минуты раннеров сверх плана, отметьте Оплачивать лишние
минуты из предоплаченного баланса
, задайте Месячный потолок (минуты) и
сохраните. Сохранение нужно подтвердить — так же, как лимит трат. Менять
настройку могут владелец и billing-менеджеры Пространства.

Как это работает:

  • Оплачиваются только минуты сверх тарифа. Запуск, который пересекает границу,
    платит за минуты, не покрытые тарифом, а не за весь запуск.
  • Одна минута стоит одну инфраструктурную единицу из предоплаченного баланса
    инфраструктурных единиц аккаунта. В долг ничего не списывается: если баланса
    не хватает, запуск отклоняется; чтобы продолжить, пополните баланс.
  • Потолок — настоящий потолок. После него запуски отклоняются до конца месяца
    точно так же, как без переключателя.
  • Рядом с переключателем панель показывает цифры текущего месяца: сколько минут
    израсходовано из лимита тарифа, сколько уже оплачено сверх него и какой
    предоплаченный баланс.
  • На тарифе Free жёсткий стоп остаётся: подключите свой раннер или перейдите на
    платный тариф, чтобы работать сверх лимита.

Если панель сообщает, что оплата лишних минут пока не открыта, переключатель
можно сохранить, но запуски упираются в жёсткий стоп, пока инфраструктурные
единицы не поступят в продажу.

Развёртывание on-premise

Облако держит все Пространства на нашей общей инфраструктуре: разворачивать и поддерживать что-либо самостоятельно не нужно. Если Mockarty нужен внутри вашего периметра — на ваших серверах, в вашей сети, по вашей политике безопасности — это развёртывание on-premise: его согласуют и лицензируют по отдельному договору. На вкладке Mockarty в облаке в кабинете есть кнопка Связаться с продажами, с неё начинается этот разговор.

Совместимость

Существующие клиенты /workspaces, /members и /invites продолжают поддерживаться. Для новых интеграций используйте канонические пути /spaces, явный выбор Пространства, keyset-пагинацию и precondition по ревизии.