cardholder_id. One-step mode collapses the two into one call: omit cardholder_id and put the cardholder data into cardholder_required_fields. The system creates the cardholder and issues the card in the same request.
Use one-step mode when you issue cards on demand — for example, right after a user signs up, or in a single-screen onboarding flow. If you manage a pool of pre-built cardholders, stay with the traditional two-call flow; passing cardholder_id works exactly as before.
For Personal Visa, follow Apply for Personal Visa to prepare the product’s required information and meet its KYC requirements, then create a card using
cardholder_id. Cardholders with an eligible residence and a Red-group nationality must provide proof of address, which does not require a separate approval wait. One-step cardholder_required_fields.identity does not accept proof_of_address or identity_verification; a non-empty value for either attachment returns a parameter error.Prerequisites
- A UQPAY sandbox account with Card Issuance enabled
- An API token from Access Token
- The target card product’s
card_product_id, obtained via List Products
Step 1: Check which fields the product requires
Different card products (BINs) require different cardholder data. List card products and read therequired_fields array on your target product — that is the exact list of cardholder fields you must supply to the create-card call.
required: true must be provided; required: false fields are optional. Object-typed fields such as identity, residential_address, and kyc_verification follow a nested structure — their sub-field rules are given in the product’s fields array.
Step 2: Create the card with cardholder data inline
Put the product’s required fields intocardholder_required_fields and omit cardholder_id:
cardholder_id— the newly-created cardholder. Save this value if you need to manage the cardholder later.card_status: PENDING+order_status: PROCESSING— the card is being provisioned asynchronously. This is not a failure; wait for thecard.create.succeededwebhook before treating the card as active.cardholder_created: true— the cardholder was created inline as part of this request.
Special case: Sumsub IDV
If the product’srequired_fields list kyc_verification, and you ask UQPAY to run identity verification through Sumsub (method: SUMSUB_REDIRECT), the response carries an IDV URL:
idv_verification_url before idv_url_expires_at. Once Sumsub confirms verification, the order you already requested follows its existing execution flow, including checks for region, applicable POA, and other issuance requirements. Confirm the final result through the card webhook. Uploading POA does not request a new card or reopen a failed request.
If you have already run KYC on your side and want to submit a proof directly, use method: THIRD_PARTY with a kyc_proof block; the response returns verification_status: VERIFIED without any redirect. See Enhanced KYC Card Issuance for the full details.
Waiting for async completion
For every one-step request, the initial HTTP response is only an acknowledgement. The card’s real activation (and the cardholder’s final state) happens asynchronously. Subscribe to these two webhooks before calling the endpoint:- Cardholder KYC Status Changed — cardholder KYC review completed
- Card Created — card activated or creation failed
Error handling
Two errors are specific to one-step mode. Both return HTTP 400.cardholder_missing_info
Neither cardholder_id nor cardholder_required_fields was provided.
cardholder_incomplete_fields
cardholder_required_fields was provided but missing one or more required keys (for example, email, first_name). The response carries a missing_fields array so you can display a targeted error to your user.
email_duplicated, phone_number_duplicated, invalid_phone_number, etc.) are the standard cardholder_error codes. See the Create Card API reference for the full list.

