---
title: "Create Plaid Link"
method: POST
path: "/v1/instances/{instance_id}/customers/{customer_id}/bank-accounts/plaid"
tags: ["Bank Accounts"]
---

# Create Plaid Link

`POST /v1/instances/{instance_id}/customers/{customer_id}/bank-accounts/plaid`

## Request

- Base URL: `https://blindpay.com` (the document declares no server; this is the origin it was published from)
- URL: `https://blindpay.com/v1/instances/{instance_id}/customers/{customer_id}/bank-accounts/plaid`
- Auth: HTTP bearer

## Path parameters

- `instance_id` string, required
- `customer_id` string, required: Customer ID

## Request body

- CreatePlaidLinkIn
  - `redirect_url` string, uri, nullable: Where to send the customer once the bank account is connected. BlindPay appends bank_account_ids (comma separated) as a query parameter. Leave empty to show a confirmation screen instead.

## Response `200`

BlindPay hosted Plaid Link URL, carrying a signed short-lived token, to embed in an iframe or open in a new tab

- PlaidLinkOut
  - `url` string, uri, required: BlindPay hosted page that runs Plaid Link for this customer. Embed it in an iframe or open it in a new tab. The token in the URL is signed, single use, and expires in at most 4 hours. Sandbox instances get a Plaid sandbox session, production instances a Plaid production session.

## Other responses

- `400`: Possible error codes: `BANK_ACCOUNTS_PLAID_NOT_ENABLED`, `CUSTOMERS_KYC_TYPE_NOT_AVAILABLE`, `VALIDATION_FAILED`. See the Error responses section for retry semantics.
- `401`: Possible error codes: `AUTH_UNAUTHORIZED`. See the Error responses section for retry semantics.
- `403`: Possible error codes: `AUTH_FORBIDDEN`. See the Error responses section for retry semantics.
- `404`: Possible error codes: `BANK_ACCOUNTS_PLAID_LINK_SESSION_INVALID`, `CUSTOMERS_NOT_FOUND`. See the Error responses section for retry semantics.
- `429`: Possible error codes: `AUTH_RATE_LIMITED`. See the Error responses section for retry semantics.
- `500`: Possible error codes: `INTERNAL_ERROR`. See the Error responses section for retry semantics.

## Changes

- **2026-09-07** `2765f23c8d02`: 2 breaking, 2 info
  - removed the required property `expiration` from the response with the `200` status
  - removed the required property `link_token` from the response with the `200` status
  - added optional request body
  - added the required property `url` to the response with the `200` status

[Operation history](https://skmtc.dev/blindpay/apis/blindpay-api/changes/v1/instances/:instance_id/customers/:customer_id/bank-accounts/plaid/post.md)

---

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