---
title: "Confirm trusting a beneficiary"
method: POST
path: "/customers/external-accounts/{externalAccountId}/trust/confirm"
tags: ["Strong Customer Authentication"]
---

# Confirm trusting a beneficiary

`POST /customers/external-accounts/{externalAccountId}/trust/confirm`

Finalize trusting a beneficiary (identified by the `externalAccountId` in the
path) by submitting the SCA proof (`code` for `SMS_OTP` / `TOTP`, or
`passkeyAssertion` + `origin` for `PASSKEY`), echoing the `challengeId` when
one was issued. Returns `trusted: true`.

This endpoint is only meaningful for customers in a region where SCA is required (e.g. EU). For customers outside SCA-regulated regions, this returns `409`.

In sandbox, the SMS/TOTP code is always `123456`.

## Request body

- union — Confirms trusting or untrusting a beneficiary by submitting the SCA proof. Carries the same proof fields as an `ScaAuthorization` (`code` for `SMS_OTP` / `TOTP`, or `passkeyAssertion` + `origin` for `PASSKEY`) and, when the start issued one, the `challengeId`. The beneficiary is identified by the `externalAccountId` in the path — no separate handle is needed.
  - object
    - `challengeId` string, nullable — The challenge handle from the trust start's `scaChallenge`, when one was issued. Omit when the start returned no challenge.
    - `code` string, nullable, required — The one-time code the customer received by SMS, or read from their authenticator app. Provide for `SMS_OTP` / `TOTP`. In sandbox, the code is always `123456`.
    - `passkeyAssertion` object, nullable — Opaque WebAuthn assertion produced by the device from the challenge's assertion options. Required when satisfying a `PASSKEY` challenge.
    - `origin` string, nullable — The WebAuthn origin the `passkeyAssertion` was produced against. Required alongside `passkeyAssertion`; omit it for the `code` path.
  - object
    - `challengeId` string, nullable — The challenge handle from the trust start's `scaChallenge`, when one was issued. Omit when the start returned no challenge.
    - `code` string, nullable — The one-time code the customer received by SMS, or read from their authenticator app. Provide for `SMS_OTP` / `TOTP`. In sandbox, the code is always `123456`.
    - `passkeyAssertion` object, nullable, required — Opaque WebAuthn assertion produced by the device from the challenge's assertion options. Required when satisfying a `PASSKEY` challenge.
    - `origin` string, nullable, required — The WebAuthn origin the `passkeyAssertion` was produced against. Required alongside `passkeyAssertion`; omit it for the `code` path.

## Response `200`

Beneficiary trusted.

- BeneficiaryTrustConfirm — The result of a confirm-trust / confirm-untrust call. `trusted` is `true` after a successful trust and `false` after a successful untrust.
  - `trusted` boolean, required — Whether the beneficiary is now trusted. `true` after a successful trust, `false` after a successful untrust.

## Other responses

- `400` — Invalid or expired proof
- `401` — Unauthorized
- `404` — Customer or external account not found
- `409` — SCA is not required for this customer.
- `500` — Internal service error

## Changes

- **2026-09-03** `f560bb38e8d1` — 1 warning
  - added the new `STABLECOIN_GRID_ENABLEMENT_NOT_REQUESTABLE` enum value to the `code` response property for the response status `409`
- **2026-08-14** `aaa1fb8782c8` — 1 warning
  - added the new `EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED` enum value to the `code` response property for the response status `400`
- **2026-08-13** `df12ec487f0e` — 1 warning
  - added the new `TRANSACTION_SIZE_LIMIT_EXCEEDED` enum value to the `code` response property for the response status `400`
- **2026-08-11** `b06902b6595a` — 4 warning
  - added the new `CARDHOLDER_KYC_NOT_APPROVED` enum value to the `code` response property for the response status `400`
  - added the new `CARD_ALREADY_CLOSED` enum value to the `code` response property for the response status `409`
  - added the new `CARD_NOT_MUTABLE` enum value to the `code` response property for the response status `409`
  - added the new `INVALID_STATE_TRANSITION` enum value to the `code` response property for the response status `409`
- **2026-08-06** `526036c12609` — 1 warning
  - added the new `END_USER_TERMS_VERSION_NOT_FOUND` enum value to the `code` response property for the response status `400`

[Full history](https://skmtc.dev/stainless-api/apis/grid-api/changes/customers/external-accounts/:externalAccountId/trust/confirm/post.md)

---

[API](https://skmtc.dev/stainless-api/apis/grid-api.md) · [All operations](https://skmtc.dev/stainless-api/apis/grid-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/stainless-api/grid-api/revisions/f560bb38e8d1/schema)
