---
title: "Link external account"
method: POST
path: "/external-accounts/processor-token"
tags: ["External Accounts"]
---

# Link external account

`POST /external-accounts/processor-token`

Link or refresh a bank account using a Plaid processor token

## Headers

- `Idempotency-Key` string, required
- `X-Agent-ID` string, nullable
- `X-Instance-ID` string, nullable

## Request body

- object
  - `data` object, required
    - `attributes` object, required
      - `partyId` string, required — Party that will own the account.
      - `processorToken` string, required — Plaid processor token created for Natural and scoped to one account.
      - `institutionName` string, nullable — Institution display name to store with the linked external account.

## Response `201`

Successful Response

- object
  - `data` object[], required — External accounts linked or refreshed by the request.
    - `type` 'externalAccount', required
    - `id` string, required — External account ID (eac_*).
    - `attributes` object, required
      - `lastFour` string, required — Last four digits of the external bank account.
      - `status` 'pending' | 'new' | 'active' | 'disabled' | 'deleted' | 'unknown', required — Lifecycle status of the external account.
      - `connectionStatus` 'active' | 'login_required' | 'disconnected', required — Provider connection health for this external account.
      - `availableMethods` string[], required — Withdrawal delivery methods currently available for this external account.
      - `createdAt` string, date-time, required — Time when the external account was linked.
      - `bankName` string, nullable, required — Bank institution name, when available.
      - `accountName` string, nullable, required — Bank account display name, when available.
      - `accountType` 'checking' | 'savings' | 'unknown', nullable, required — Bank account type, when available.
    - `relationships` object, required
      - `party` object, required — Party that owns the external account.
        - `data` object, required — Related resource identifier.
          - `type` 'party', required
          - `id` string, required
  - `meta` object, required
    - `pagination` object, required
      - `hasMore` boolean, required — Whether more results are available.
      - `nextCursor` string, nullable, required — Cursor for the next page, or null when there are no more results.
    - `rejectedAccounts` object[], required — Accounts reviewed during linking but not linked.
      - `accountId` string, required — Provider account identifier for the rejected account.
      - `accountName` string, nullable, required — Display name of the rejected account.
      - `accountMask` string, nullable, required — Last-four mask of the rejected account.
      - `reason` 'profile_identity_missing' | 'bank_identity_unavailable' | 'bank_account_name_mismatch' | 'bank_account_address_mismatch' | 'bank_account_ownership_mismatch' | 'bank_account_verification_failed', required — Reason code explaining why the account was not linked.

## Other responses

- `400` — Validation Error
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not Found. Returned when the resource does not exist, or when it exists but is not accessible to your account. The two cases are intentionally indistinguishable, so that resource IDs cannot be enumerated by probing.
- `409` — Conflict
- `422` — Validation Error
- `428` — Precondition Required
- `429` — Too Many Requests
- `500` — Internal Server Error
- `501` — Not Implemented
- `502` — Bad Gateway
- `503` — Service Unavailable

---

[API](https://skmtc.net/natural/apis/natural-api.md) · [All operations](https://skmtc.net/natural/apis/natural-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/natural/natural-api/versions/0bb9c54b1f61/schema)
