---
title: "POST /api/v1/user/access/activate"
method: POST
path: "/api/v1/user/access/activate"
tags: ["User"]
---

# POST /api/v1/user/access/activate

`POST /api/v1/user/access/activate`

## Request

- Base URL: `https://api.ekiden.fi`
- URL: `https://api.ekiden.fi/api/v1/user/access/activate`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/ekidenfi/apis/ekiden-gateway/docs/api/v1/user/access/activate/post.ts> (a function with typed inputs; its response is checked against the schema)

## Request body

- ActivateAccessRequest: `POST /user/access/activate` — redeem a closed-launch code for the authenticated wallet. Identity is the session, so the body carries nothing but the code. This replaces the pre-auth signature ceremony below, which custodial (Auth0) wallets could never satisfy: they hold no signing key.
  - `code` string, required: Plaintext access code. Normalized (trim + uppercase) and hashed server-side; the plaintext is never persisted (S1-D5).

## Response `200`

Wallet activated

- AccessActivateResponse
  - `activated` boolean, required
  - `badge` boolean, required
  - `multiplier_bps` integer, required

## Other responses

- `400`: Invalid, expired, or revoked code
- `403`: Bound sub-account session
- `404`: Access module disabled
- `409`: Code already used or wallet already activated
- `429`: Rate limited

## Changes

- **2026-09-10** `fad9eecaba2e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ekidenfi/apis/ekiden-gateway/changes/api/v1/user/access/activate/post.md)

---

[API](https://skmtc.dev/ekidenfi/apis/ekiden-gateway.md) - [All operations](https://skmtc.dev/ekidenfi/apis/ekiden-gateway/llms.txt) - [OpenAPI document](https://skmtc.dev/ekidenfi/apis/ekiden-gateway/revisions/fad9eecaba2e?raw)
