business account does not use this step.
Email policy
Your app environment uses exactly one policy, reported atcapabilities.accounts.emailVerification in GET /v2/partners/config:
The policies do not mix. An assertion under
stableyard_email_otp is refused with 403, and a code request under partner_asserted is refused with 400.
Under stableyard_email_otp the customer receives two emails from Stableyard that name your app: the code, then a welcome email. Asserting the email sends neither. See Branding and your frontend.
Request a code
- The code is single-use and valid for ten minutes.
- A new challenge replaces the old one. Requesting a code expires any pending challenge on the account.
- A replay sends nothing. The same
Idempotency-Keywith the same email returns the original challenge without emailing another code. Use a new key for a new code.
Confirm the code
Send the code your customer typed to the challenge:contact.status: "verified" and nextAction.type: "start_kyc_session", and Stableyard sends the customer a welcome email. Confirming a challenge that is already verified returns the same result.
A wrong code returns 401 and lowers attemptsRemaining. After five wrong codes, or ten minutes, the challenge is over: request a new one with a new Idempotency-Key.
Assert an email you already verified
Only underpartner_asserted:
The contact is verified at once with
verificationMethod: "partner_asserted", and the response carries nextAction.type: "start_kyc_session".
You can supply the email at creation instead. On POST /v2/accounts, email alone starts the code flow, and email with emailVerified: true asserts it. The same policy rules apply.
Read the email status
contact is null until an email has been requested or asserted. API responses always mask the address.
A managed Vault’s initial policy code verifies this same contact, with verificationMethod: "managed_policy_email_otp". Stableyard keeps no separate email identity for fiat or Vaults.
Email states
A verified email is final through the API. Requesting the same address again is a no-op that returns
nextAction.type: "none"; a different address is refused with 409. Corrections go through Stableyard operations.
Errors
Webhooks
Related
Individual KYC
The next gate: identity verification on a hosted page.
Onboarding overview
Every gate between an account and a fiat rail.
Branding and your frontend
What the code and welcome emails show your customer.
Idempotency
How replays and changed bodies behave for every keyed call.