---
title: "Exchange Plaid public token for stored item"
method: POST
path: "/plaid/exchange-public-token"
tags: ["Plaid Integration"]
---

# Exchange Plaid public token for stored item

`POST /plaid/exchange-public-token`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/plaid/exchange-public-token`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://riskmodels.app/oauth/authorize`, token URL `https://riskmodels.app/api/oauth/token`, scopes: `mcp:read`)

Exchanges the short-lived `public_token` from Plaid Link for an access token, encrypted and stored server-side. Repeat connections create/update one row per Plaid `item_id`. **No per-request charge.**

## Request body

- object
  - `public_token` string, required: From Plaid Link onSuccess.

## Response `200`

Item stored.

- object
  - `item_id` string
  - `request_id` string

## Other responses

- `400`: Missing or invalid body.
- `401`: Unauthorized.
- `500`: Plaid or storage error.

---

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