---
title: "Exchange token for JWT"
method: POST
path: "/api/v1/auth/token"
tags: ["Auth"]
---

# Exchange token for JWT

`POST /api/v1/auth/token`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/auth/token`
- Auth: none declared

Exchange a one-time callback token for a JWT. Solves WebView cookie isolation — frontend can store the returned JWT directly.

## Request body

- ExchangeTokenRequest: Request body for exchanging a one-time token for JWT
  - `token` string, required: One-time callback token

## Response `200`

Token exchanged for JWT

- ExchangeTokenResponse: Token exchange response
  - `success` boolean, required
  - `jwt` string, required: JWT token
  - `expiresAt` string, date-time, required

## Other responses

- `400`: Invalid or expired token
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/proof/apis/proof-holdings-api.md) · [All operations](https://skmtc.dev/proof/apis/proof-holdings-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proof/apis/proof-holdings-api/revisions/6b8d61ee354f?raw)
