---
title: "Redeem Viewer Sign In"
method: POST
path: "/v2/public/viewer-session/redeem"
tags: ["v2 - SDK"]
---

# Redeem Viewer Sign In

`POST /v2/public/viewer-session/redeem`

## Request

- Base URL: `https://api.jubjubapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.jubjubapp.com/v2/public/viewer-session/redeem`
- Auth: HTTP bearer

Sign in with the code a card mint or top-up answered (Tom, 2026-10-25:
someone who just minted is never asked again). The mint's on-chain
EIP-3009 signature is the proof of the wallet; the code carries it to the
site the viewer returns to. Checks: unconsumed, unexpired, this wallet,
and the page's Origin is the site it was issued for. Then a jj_ viewer
token (scope viewer) and, with a device key, a 30-day remembered sign-in
on this site. 401 with {reason} otherwise; the player signs as usual.

## Request body

- RedeemSignInRequest: A card mint or top-up's one-time sign-in code (card_sign_in), redeemed on the site it was issued for.
  - `sign_in_code` string, required
  - `wallet_address` string, required
  - `device_public_key` object, nullable: P-256 public JWK {kty, crv, x, y} for a remembered sign-in

## Response `200`

Successful Response

- ViewerSessionResponse
  - `session_token` string, required
  - `profile_id` string, required
  - `wallet_address` string, required
  - `remembered_session_id` string, nullable
  - `remembered_until` string, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/jubjubapp/apis/jubjub-api.md) - [All operations](https://skmtc.dev/jubjubapp/apis/jubjub-api/llms.txt) - [OpenAPI document](https://skmtc.dev/jubjubapp/apis/jubjub-api/revisions/353157b296f2?raw)
