POST /v1/actions/enter or /exit, so your UI shows the right state instead of relying on a failed action request. An RWA yield’s eligibility rules are set by its issuer, per product, and are enforced at two independent layers: the caller’s location and the wallet’s own compliance status.
This guide covers deciding eligibility. To build and submit the enter or exit action once a wallet is eligible, see Deposit and redeem RWAs.
Prerequisites
- A yield.xyz API key, sent as
x-api-keyon every request. - An RWA yield enabled for your project. See Discover yields.
- The wallet address you’re checking eligibility for.
1
Discover the yield and read its requirements
Query
GET /v1/yields?types=real_world_asset for the RWA yields enabled for your project, project-scoped like every yield endpoint, then read the yield’s mechanics.requirements block:cURL
Response (excerpt)
mechanics.requirements.kycRequired tells you whether this product gates entry behind off-chain verification at all. When it’s true, mechanics.requirements.kyc carries the rest: kycMode (how the issuer’s flow is delivered), authorizeUrl (where to send the user), and eligibility (defaultPolicy, the country and subdivision lists, usPersonAllowed, geoBlockingEnforced, investorEligibility tiers, and accepted subjectTypes). See KYC for what every field in this block means; the blocked-country list above is Nest’s own, not a fixed rule.2
Check the wallet's KYC status
Call
GET /v1/yields/{yieldId}/kyc/status with the wallet’s address as a query parameter. It returns a status for every RWA yield, including ones that don’t require KYC:cURL
Response (excerpt)
kycStatus is one of not_required, not_started, pending, approved, or rejected; see KYC for what each one means. pending is declared but no current issuer returns it. authorizeUrl is optional: it is present only when the issuer provides an onboarding page, typically with not_started or rejected.3
Route the wallet on the result
not_requiredorapproved: the wallet can proceed. Move on to building the enter action.not_started: send the wallet toauthorizeUrl, if present, to complete the issuer’s onboarding, then poll this endpoint again before retrying the action. Treatpendingthe same way if you handle it, although no current issuer returns it.rejected: the issuer has declined the wallet, or (for a yield withkycRequired: false) its module screened the address against an on-chain deny-list. Don’t offer an enter or exit button.authorizeUrlis present for some issuers and absent for others, so check for it before linking.
Distinguish a geo-block from a KYC rejection
Both failures reach you as an error on the action call itself, but they mean different things and carry different HTTP status codes:
Not every issuer’s pre-flight rejection looks the same:
- Most KYC-gated issuers (Midas, Nest, Ondo, Securitize, Superstate) return a
412whose details carry anauthorizeUrl, so you can route the user straight to onboarding. - Dinari’s USD+ has
kycRequired: false; there’s no onboarding flow at all. Instead, yield.xyz checks the address against USD+‘s on-chain deny-list before building a transaction, and a restricted address gets a412withaddressandprotocolbut noauthorizeUrl. There’s nowhere to send that wallet. - Not every RWA module runs a pre-flight check at all. Where one doesn’t, an ineligible wallet only finds out when the built transaction reverts on-chain, not from a
412on the action request. Readmechanics.requirements.kycbefore assuming an issuer’s absence from this list means the yield is unconditionally open.
These two error shapes aren’t a documented API contract you should pattern-match on: treat the HTTP status (
403 vs 412) as the reliable signal, and use /kyc/status ahead of time so you show the right state instead of parsing a rejection.A permissionless yield can still reject a wallet
kycRequired: false means there’s no off-chain verification step, not that every wallet can transact. Midas sets kycRequired: false on mTBILL and mROX, but still checks every wallet against that product’s on-chain greenlist (where the issuer has one enabled), blacklist, and sanctions list before building a transaction; a blocked wallet gets the same 412 shape as a KYC-gated Midas product, without a URL to send it to. Nest’s own KYC metadata describes its flow as “permissionless for eligible users”: there’s no manual review queue, but every wallet is still screened on-chain by Plume’s AML and Predicate policy before Nest builds a transaction. In both cases, the issuer’s own metadata lists what’s blocked, and that policy is set by the issuer, not by yield.xyz.
Next steps
Deposit and redeem RWAs
Build the enter action once the wallet is eligible, then track the position through exit.
KYC
The full eligibility model: every field in the
kyc metadata block and what it describes.Geo-blocking
Configure your project’s own region restrictions on top of yield.xyz’s mandatory list.
Issuers
Which issuers require KYC per product, and which don’t.

