---
title: "Invite a member"
method: PUT
path: "/projects/{projectId}/user-testing/scenarios/{scenarioId}/members"
tags: ["User testing"]
---

# Invite a member

`PUT /projects/{projectId}/user-testing/scenarios/{scenarioId}/members`

Upsert by email, so re-inviting somebody is not an error. Only meaningful while `mode` is `invited_only`.

## Request body

- ScenarioMemberRequest — UPSERT by email, so re-inviting somebody is not an error.
  - `email` string, required
  - `sendInviteEmail` boolean — OFF by default: adding somebody quietly is not the same as inviting them.

## Response `200`

The member list was updated.

- UserTestingScenario — Scenario metadata after an update. Deliberately WITHOUT `accessVersion`: a mode change bumps it upstream, but the envelope this route re-reads does not carry the new value — reporting a stale one would document a revocation signal the response cannot deliver. The publish response carries the real one.
  - `id` string, required
  - `projectId` string, required
  - `name` string, nullable, required
  - `description` string, nullable, required
  - `mode` 'project_members' | 'invited_only' | 'anyone_with_link' | 'null', nullable, required

## Other responses

- `400` — Malformed body or parameters.
- `401` — Missing, invalid, revoked, or orphaned key (`UNAUTHORIZED`) — or the **target MCP server** needs an OAuth grant (`OAUTH_REQUIRED`), which is a property of the server, not your key.
- `403` — Key is valid but not allowed to do this.
- `404` — Unknown project, server, or resource.
- `429` — Per-key rate limit exceeded (60 requests/minute sustained, bursts up to 10). Honor `Retry-After` and back off with jitter.
- `500` — Something failed on MCPJam's side.

---

[API](https://skmtc.net/mcpjam/apis/mcpjam-api.md) · [All operations](https://skmtc.net/mcpjam/apis/mcpjam-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/mcpjam/mcpjam-api/revisions/f338eb09898f/schema)
