Skip to main content
POST
Pass your own stable externalUserId and the subject’s legal classification in subjectType (individual or business). Stableyard returns the canonical account.id that every account-scoped endpoint uses. Classify the real subject the UPA represents, not the owner of a connected wallet. You can also pass initial wallets, a handle and an email. If you send wallets and none is marked isPreferredSettlement, the first settlement-supported wallet becomes the settlement wallet. Sending email with emailVerified is equivalent to calling Verify or link an account email right after creation: emailVerified: true asserts you already verified the address and requires partner-asserted verification to be enabled for the app environment, while false starts Stableyard’s own OTP flow. The call is create-only: an externalUserId that already has a UPA returns 409 account_already_exists. Idempotency-Key is required. Retrying with the same key and identical input returns the original account; different input returns 409 idempotency_conflict. Change wallets, settlement and the handle later through their dedicated endpoints. See Universal Payment Account for what the account controls.

Authorizations

Authorization
string
header
required

HTTP Basic auth. Username is the Stableyard app ID. Password is the app secret. The optional Stableyard-Version request header must match the environment pin.

Headers

Idempotency-Key
string
required

Required retry key for account creation. Reusing the same key with identical input returns the original account; reusing it with different input returns 409 idempotency_conflict.

Required string length: 1 - 256
Pattern: ^[ -~]+$
Example:

"account-user-123-v1"

Stableyard-Version
enum<string>

Optional contract-version assertion. Omit it to use the app environment's pinned version. A different supported version is accepted only after that environment is explicitly migrated.

Available options:
2026-09-09

Body

application/json
externalUserId
string
required

Stable partner-owned identifier. Unicode control characters are rejected.

Maximum string length: 128
Example:

"user_123"

subjectType
enum<string>
required

Required legal classification of the UPA subject. This is explicit and is never inferred from identifiers, wallets, metadata, or payment behavior.

Available options:
individual,
business
Example:

"individual"

handle
string
Maximum string length: 105
Example:

"alice"

displayProfile
object

Optional payer-facing recipient identity. It is separate from app branding and can be updated later with the versioned display-profile endpoint.

wallets
object[]

Optional connected wallets to link during account creation. If one settlement-supported wallet is sent, it becomes settlement. If multiple wallets are sent, mark one with isPreferredSettlement; otherwise the first settlement-supported wallet becomes settlement.

Minimum array length: 1
email
string<email>

Optional UPA email, linked during account creation. Requires emailVerified.

Maximum string length: 320
emailVerified
boolean

Set with email. true asserts you already verified this address yourself, using the same partner_asserted contract as POST /accounts/{id}/email/verification-challenges — Stableyard trusts the assertion without sending its own OTP, and only if partner-asserted verification is enabled for this app environment. false or omitted starts Stableyard's own OTP flow to that address.

Example:

true

metadata
object

Optional partner metadata. Must be JSON-safe, at most 4096 bytes, depth 3, 25 keys per object, 512 characters per string, and 50 items per array.

Response

UPA created, or the original result of an identical idempotent retry

account
object
required
connectedWallets
object[]
required
paymentHandle
object
settlementProfile
object