Users
Create User
Registers an end-user under the authenticated partner. KYC is flexible JSON — core fields are required, provider-specific data lives in kyc_data.
POST
Overview
Registers an end-user under the authenticated partner and stores their KYC record. The user must havekyc_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).
Headers
A valid
PARTNER scope key.Request Body
Your internal identifier for this user. Unique within your partner (two users cannot share the same
user_id). Stored as partner_user_id in GRAIL.The user’s Solana wallet address. Must be a valid pubkey, and globally unique across all GRAIL users.
The user’s KYC record.
Response
GRAIL’s identifier for the user, prefixed
gu_. Use this in all subsequent trade and redemption calls.Echo of your
user_id (the partner_user_id).Echo of
wallet_address.ISO-8601 timestamp of user creation.
Errors
| 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 |
