Registers an end-user under the authenticated partner. KYC is flexible JSON — core fields are required, provider-specific data lives in kyc_data.
kyc_level: "full" before they can quote trades or redemptions.
Core KYC fields (country, full_name, kyc_provider, kyc_level, kyc_verified_at) are structured columns; provider-specific data goes in the free-form kyc_data object. If kyc_data includes id_type and id_number, GRAIL validates the id_number against the regex registered for that country/ID-type pair (advisory — absent regex means no validation is enforced).
PARTNER scope key.user_id). Stored as partner_user_id in GRAIL.gu_. Use this in all subsequent trade and redemption calls.user_id (the partner_user_id).wallet_address.| HTTP | error | When |
|---|---|---|
| 400 | invalid_request | Missing required fields, bad timestamp, bad full_name, kyc_data.id_number doesn’t match the regex |
| 400 | invalid_wallet | wallet_address is not a valid Solana pubkey |
| 400 | kyc_level_insufficient | kyc.kyc_level is not "full" |
| 409 | user_already_exists | wallet_address is already registered, or user_id is already registered for this partner |