---
title: "Join Room By Code"
method: POST
path: "/api/v1/rooms/join"
tags: ["rooms"]
---

# Join Room By Code

`POST /api/v1/rooms/join`

## Request

- Base URL: `https://core.mnemoverse.com`
- URL: `https://core.mnemoverse.com/api/v1/rooms/join`
- Auth: API key in header `X-Admin-Key`

Redeem a one-time share code and join its room as the authenticated account.

The joiner is ALWAYS the verified session account (``user_<sub>``), NEVER the
request body — the same anti-spoof invariant as the data-plane
``/memory/rooms/join``, exposed here on the session-auth management plane so the
console ``/join`` landing can redeem for a signed-in user. The code IS the grant
(role baked in at mint), so there is no owner gate — anyone signed in with a
valid code may join. Idempotent: an account already a member returns
``already_member=true`` without consuming a use. ``reason`` maps to HTTP status:
not_found -> 404; used/expired/revoked -> 409.

## Request body

- JoinByCodeRequest
  - `code` string, required: One-time share code (starts with 'mnvr_').

## Response `200`

Successful Response

- JoinedByCodeInfo
  - `room_id` string, required
  - `name` string, required
  - `scope` string, required
  - `already_member` boolean, required

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `422`: Validation Error
- `429`: Rate limited
- `500`: Internal server error
- `503`: Service unavailable

---

[API](https://skmtc.dev/mnemoverse/apis/mnemoverse-core.md) · [All operations](https://skmtc.dev/mnemoverse/apis/mnemoverse-core/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemoverse/apis/mnemoverse-core/revisions/1f5e0048f017?raw)
