feat: add external account ownership verification - #806
Conversation
Add verify-ownership and verify-ownership/confirm endpoints for customer and platform external accounts, supporting wallet-signature and liveness verification methods. Adds an ownershipVerificationStatus field to ExternalAccount, EXTERNAL_ACCOUNT.OWNERSHIP_VERIFICATION_* webhook types, new error codes, and an expanded ownershipType description. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
|
|
The latest updates on your projects. Learn more about Vercel for GitHub. 2 Skipped Deployments
|
✱ Stainless preview builds for gridThis PR will update the cli go kotlin openapi php python ruby typescript Edit this comment to update them. They will appear in their respective SDK's changelogs. ✅ grid-typescript studio · code · diff
✅ grid-openapi studio · code · diff
✅ grid-ruby studio · code · diff
✅ grid-go studio · code · diff
|
| 💡 Model/Recommended: We recommend you use a model for `#/components/schemas/WalletSignatureOwnershipVerification` |
| 💡 Model/Recommended: We recommend you use a model for `#/components/schemas/LivenessOwnershipVerification` |
| 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member. |
| 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member. |
| 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member. |
✅ grid-python studio · code · diff
Your SDK build had at least one new note diagnostic, which is a regression from the base state.
generate ✅→build ❗→lint ❗→test ❗New diagnostics (2 note)
💡 Model/Recommended: We recommend you use a model for `#/components/schemas/WalletSignatureOwnershipVerification` 💡 Model/Recommended: We recommend you use a model for `#/components/schemas/LivenessOwnershipVerification`
✅ grid-php studio · code · diff
Your SDK build had at least one new note diagnostic, which is a regression from the base state.
generate ✅→lint ✅(prev:lint ❗) →test ✅(prev:test ❗)New diagnostics (5 note)
💡 Model/Recommended: We recommend you use a model for `#/components/schemas/WalletSignatureOwnershipVerification` 💡 Model/Recommended: We recommend you use a model for `#/components/schemas/LivenessOwnershipVerification` 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member. 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member. 💡 Schema/EnumHasOneMember: Confirm intentional use of `enum` with single member.
✅ grid-cli studio · code · diff
Your SDK build had at least one new note diagnostic, which is a regression from the base state.
generate ⚠️→build ❗→lint ❗→test ❗New diagnostics (2 note)
💡 Model/Recommended: We recommend you use a model for `#/components/schemas/WalletSignatureOwnershipVerification` 💡 Model/Recommended: We recommend you use a model for `#/components/schemas/LivenessOwnershipVerification`
This comment is auto-generated by GitHub Actions and is automatically kept up to date as you push.
If you push custom code to the preview branch, re-run this workflow to update the comment.
Last updated: 2026-08-06 15:48:20 UTC
…consistency Payments fire webhooks for their creation-time state (OUTGOING_PAYMENT.PENDING), so ownership verification does the same: NOT_REQUIRED and REQUIRED join the async transitions, giving webhook consumers the full lifecycle. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ions resource
Replace the external-account verb endpoints (verify-ownership +
verify-ownership/confirm under /customers and /platform) with a top-level
Ownership Verifications API mirroring the KYC/KYB Verifications pattern:
- POST /ownership-verifications, GET /ownership-verifications (filter by
externalAccountId/status with cursor pagination),
GET /ownership-verifications/{verificationId}, and
POST /ownership-verifications/{verificationId}/confirm
- OwnershipVerification is a oneOf on method: WalletSignatureOwnershipVerification
(messageToSign, confirmed synchronously) and LivenessOwnershipVerification
(verificationLink + token, completes asynchronously)
- Drop ExternalAccount.ownershipVerificationStatus; add the
PENDING_OWNERSHIP_VERIFICATION external-account status for FIRST_PARTY
self-custody wallets on platforms subject to EU Travel Rule requirements
- Replace EXTERNAL_ACCOUNT.OWNERSHIP_VERIFICATION_* webhooks with
OWNERSHIP_VERIFICATION.{PENDING_REVIEW,VERIFIED,FAILED} resource webhooks
and a new EXTERNAL_ACCOUNT.STATUS_UPDATED webhook
- Trim removed error codes and extend AMOUNT_OUT_OF_RANGE description
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…less resource - Revert AMOUNT_OUT_OF_RANGE description to its original text - Rename WALLET_VERIFICATION_REQUIRED to EXTERNAL_ACCOUNT_VERIFICATION_REQUIRED - Document EXTERNAL_ACCOUNT.STATUS_UPDATED as firing on every status transition, not only ownership verification - Register the ownership_verifications resource in .stainless/stainless.yml so the endpoints reach the documented spec and SDKs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Summary
Adds a first-class Ownership Verifications API for verifying that a customer (or the platform) controls a
FIRST_PARTYself-custody crypto wallet external account.Endpoints
POST /ownership-verifications— begin a verification for an external accountPOST /ownership-verifications/{verificationId}/confirm— submit the wallet signature (WALLET_SIGNATUREonly)GET /ownership-verifications/{verificationId}— fetch a verificationGET /ownership-verifications— list, filterable byexternalAccountIdandstatus, with cursor paginationResource shape
OwnershipVerificationis aoneOfdiscriminated bymethod:WALLET_SIGNATURE— returns amessageToSign; completes synchronously via the confirm endpointLIVENESS— returns a hostedverificationLinkplus an embedtoken; completes asynchronously (webhooks or polling)Per-attempt statuses:
PENDING,PENDING_REVIEW,VERIFIED,FAILED(failed attempts are retried by starting a new verification).External account changes
PENDING_OWNERSHIP_VERIFICATIONexternal-account status. It only ever appears forFIRST_PARTYself-custody wallet accounts on platforms subject to EU Travel Rule requirements, so existing integrations are unaffected. Accounts in this status can be used below regulatory transfer thresholds; completing ownership verification moves them toACTIVE.ownershipTypefield description.Webhooks
OWNERSHIP_VERIFICATION.PENDING_REVIEW,OWNERSHIP_VERIFICATION.VERIFIED, andOWNERSHIP_VERIFICATION.FAILEDevents carrying the full verification object.EXTERNAL_ACCOUNT.STATUS_UPDATEDevent carrying the full external account object (e.g.,PENDING_OWNERSHIP_VERIFICATION→ACTIVE).Error codes
WALLET_VERIFICATION_REQUIRED; removedOWNERSHIP_TYPE_REQUIRED,THIRD_PARTY_TRANSFER_LIMIT_EXCEEDED, andLIGHTNING_TRANSFER_LIMIT_EXCEEDED; extended theAMOUNT_OUT_OF_RANGEdescription.Testing
make buildbundles cleanly;redocly lintpasses (52 warnings, all pre-existing) andspectral lintreports 0 errors.🤖 Generated with Claude Code