# Integrate the KYC tier system for the headless onramp Learn about KYC verification tiers, the information required for each, and how to detect when a user's purchase amount is limited by their verification level. All users must pass KYC verification before they can buy crypto with the onramp. Users can provide additional information to increase their purchase limits. This guide covers the KYC tiers, the information required for each tier, and how you can detect when a user’s purchase amount is limited by the amount of KYC information provided. ## Before you begin Before you begin, complete the [Headless Onramp Integration Guide](https://docs.stripe.com/crypto/onramp/embedded.md) to set up your base integration. ## KYC tier comparison The following table summarizes the requirements for each KYC tier. | KYC tier | User inputs | | -------- | --------------------------- | | L0 | Name, phone, email, address | | L1 | + Date of birth, SSN | | L2 | + Photo ID, selfie | ## KYC API ### Use collectKycInfo for L0 and L1 KYC Call `collectKycInfo` to initiate the L0 and L1 KYC verification processes for a user. The fields collected by `collectKycInfo` depend on the tier: - **L0**: `firstName`, `lastName`, `address` - **L1**: All L0 fields, plus `dateOfBirth`, `idNumber`, `idType` L0 and L1 verification are asynchronous. Your backend must call the [Retrieve a CryptoCustomer](https://docs.stripe.com/crypto/onramp/embedded-components-integration-guide.md#retrieve-a-cryptocustomer) API with the `customerId`. The API returns the L0 verification status in `phone_verified`. The API returns the L1 verification status in `kyc_verified`. ### Use verifyIdentity for L2 KYC Call `verifyIdentity` to present a Stripe-hosted flow where the user uploads an identity document and a selfie. L2 verification is asynchronous. Your backend must call the [Retrieve a CryptoCustomer](https://docs.stripe.com/crypto/onramp/embedded-components-integration-guide.md#retrieve-a-cryptocustomer) API with the `customerId`. The API returns the L2 verification status in `id_document_verified`. ### Interpreting limit errors from CryptoOnrampSession Your backend must call the [Create a CryptoOnrampSession](https://docs.stripe.com/api/crypto/onramp_sessions/create.md) API to create a [CryptoOnrampSession](https://docs.stripe.com/api/crypto/onramp_sessions/object.md). If the user reaches a purchase limit, the `Create a CryptoOnrampSession` API returns an HTTP `400` error with a JSON object that describes the error. Your application can use these errors to request more information from the user so they can complete the transaction. | Error code | Meaning | Next step | | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | `crypto_onramp_missing_minimum_identity_verification` | L0 verification failed. The customer didn’t pass the minimum identity check required to create a session. | Prompt the user to provide valid L0 KYC information, including name, phone, email, and address. | | `crypto_onramp_missing_identity_verification` | L1 verification is required. Either L1 verification failed, or the user provided L0 data but the transaction requires L1 verification. | Prompt the user to provide valid L1 KYC information, including date of birth and Social Security number. | | `crypto_onramp_missing_document_verification` | L2 verification is required. The customer must provide a photo ID and selfie to complete the transaction. | Prompt the user to complete L2 KYC verification with `verifyIdentity`. |