Skip to main content
An individual’s email is the first thing Stableyard verifies, and identity verification cannot start without it. A business account does not use this step.

Email policy

Your app environment uses exactly one policy, reported at capabilities.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-Key with 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:
A correct code returns 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 under partner_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

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.